home *** CD-ROM | disk | FTP | other *** search
/ Between Heaven & Hell 2 / BetweenHeavenHell.cdr / 100 / 23 / dunplay.bas < prev    next >
BASIC Source File  |  1985-03-26  |  32KB  |  727 lines

  1. 10 'DUNPLAY  THE QUEST
  2. 20    DEFINT A-Z
  3. 30      RANDOMIZE TIMER
  4. 40    GOSUB 400 'PLAY A TURN
  5. 50    IF LP  = 0 THEN GOSUB 2890
  6. 60    GOTO 40
  7. 70 'END
  8. 80     CLOSE
  9. 90     END
  10. 100 'GET A MONSTER
  11. 110    DEP = R(RX,3)-R(RX,1)
  12. 120    WID = R(RX,4)-R(RX,2)
  13. 130    SIZ=(DEP-1)*(WID-1)
  14. 140    WK.LV =((INT(RX/4)+LV.ADJ)-1)
  15. 150    MX = (INT(RND*4)+1)+(4*(WK.LV)): IF MX>40 THEN MX=40
  16. 160    WK = MX+60
  17. 170    NBR = INT(RND*M.NBR(MX,2))+M.NBR(MX,1)
  18. 180    IF NBR > M.NBR(MX,2) THEN NBR=M.NBR(MX,2)
  19. 190    IF NBR > SIZ THEN NBR = SIZ-4
  20. 200    FOR ZZ = 1 TO NBR
  21. 210      V = (INT(RND*DEP)+1)+R(RX,1)
  22. 220      H = (INT(RND*WID)+1)+R(RX,2)
  23. 230      IF M(V,H) <> 32 GOTO 210
  24. 240      ML.MAX=ML.MAX+1: ML(ML.MAX,1)=V: ML(ML.MAX,2)=H
  25. 250      ML(ML.MAX,3)=RX: ML(ML.MAX,4)=INT((MX/4)+1)
  26. 260      M(V,H) = WK
  27. 270      M.H=(H*8)-8: M.V=(V*8)-8: DRAW "C3"
  28. 280      DRAW "BM=M.H;,=M.V;": DRAW "BR3;D4;F2;H2;G2"
  29. 290      DRAW "BM=M.H;,=M.V;": DRAW "BR3;D2;L2;R4"
  30. 300      R(RX,5)=MX: R(RX,6)=1
  31. 310    NEXT
  32. 320 RETURN
  33. 330 'MATCH TO SUPPLY FILE
  34. 340    LX=LEN(SK$)
  35. 350    FOR S = 1 TO SMAX
  36. 360      IF (SK$ = LEFT$(S.NAME$(S),LX)) AND (S(S,P+2) <> 0)                                         THEN FOUND=1: GOTO 390
  37. 370    NEXT
  38. 380    FOUND = 0: MSG$="YOU DON'T OWN A "+SK$: GOSUB 4460: MSG$="": GOSUB 4460:         GOTO 390
  39. 390 RETURN
  40. 400 'PLAY A TURN
  41. 410    LP=0: ATTACK=2
  42. 420    FOR P = 1 TO 9
  43. 430            IF P.NAME$(P) = "" THEN GOTO 610
  44. 440            LP=LP+1
  45. 450            GOSUB 4540 'CHECK PLAYERS LOCATION
  46. 460            IF TIMER < SV.TIMER! THEN GOTO 460
  47. 470            LOCATE 25,1: PRINT SPACE$(39);: LOCATE 25,1: PRINT P.NAME$(P);
  48. 480            DEF SEG=0: POKE(1050),PEEK(1052) 'CLEAR KEYBOARD BUFFER
  49. 490            AV=0: OVER.LOAD=0
  50. 500            IF P(P,10)<1 GOTO 530
  51. 510            P(P,10)=P(P,10)-1
  52. 520            IF P(P,10)<1 THEN GOSUB 2740 'THE LIGHTS WENT OUT
  53. 530            IF P(P,13)>0 THEN MSG$="YOU ARE RESTING": GOSUB 4460:                            P(P,13) = P(P,13)-1: GOTO 610
  54. 540            MV=(4-INT(P(P,1)/400))*ATTACK
  55. 550            IF HS>1 THEN MV=MV+MV
  56. 560            IF MV<1 THEN MV=1: MSG$="YOU ARE OVERLOADED & CAN'T MOVE":                       GOSUB 4460: OVER.LOAD=1
  57. 570            FOR T = 1 TO MV
  58. 580                    GOSUB 2470 'PLAY A PLAYERS TURN
  59. 590            NEXT T
  60. 600            GOSUB 4540 'CHECK PLAYERS LOCATION
  61. 610    NEXT P
  62. 620    FOR D = 1 TO 3
  63. 630            IF D(D,1)=0 THEN GOTO 690
  64. 640            V=D(D,2): H=D(D,3)
  65. 650            IF M(V,H) <> 32 THEN GOTO 690
  66. 660            LOCATE V,H: PRINT CHR$(D(D,1));
  67. 670            M(V,H)=D(D,1)
  68. 680            D(D,1)=0
  69. 690    NEXT D
  70. 700    GOSUB 4950 'PLAY MONSTERS
  71. 710    IF TE>0 THEN TE=TE-1
  72. 720    IF HS>0 THEN HS=HS-1
  73. 730 RETURN
  74. 740 'SAVE THE CURRENT SCREEN
  75. 750     GET (0,0)-(319,199),SV
  76. 760 RETURN
  77. 770 'RESTORE CURRENT SCREEN
  78. 780     PUT (0,0),SV,PSET
  79. 790 RETURN
  80. 800 'GET A REPLY
  81. 810    REPLY$=INKEY$: IF REPLY$=""  THEN GOTO 810
  82. 820    IF LEN(REPLY$)=1 THEN GOTO 880
  83. 830    REPLY$=RIGHT$(REPLY$,1)
  84. 840    IF ASC(REPLY$)=72 THEN REPLY$=CHR$(30): GOTO 880
  85. 850    IF ASC(REPLY$)=80 THEN REPLY$=CHR$(31): GOTO 880
  86. 860    IF ASC(REPLY$)=77 THEN REPLY$=CHR$(28): GOTO 880
  87. 870    IF ASC(REPLY$)=75 THEN REPLY$=CHR$(29)
  88. 880 RETURN
  89. 890 'HELP SCREEN
  90. 900    GOSUB 740 'SAVE CURRENT SCREEN
  91. 910    CLS
  92. 920    PRINT "        COMMANDS"
  93. 930    PRINT "USE THE CURSOR KEYS TO MOVE UP, DOWN,"
  94. 940    PRINT "RIGHT OR LEFT ON THE SCREEN"
  95. 950    PRINT
  96. 960    PRINT "THE FOLLOWING COMMANDS ARE AVAILABLE "
  97. 970    PRINT "  A = ATTACK (YOU MUST BE NEXT TO A "
  98. 980    PRINT "     MONSTER)"
  99. 990    PRINT "  T = THROW AWAY (IT'S GONE FOR GOOD)"
  100. 1000    PRINT "  L = LIGHT (TORCH OR LANTERN)
  101. 1010    PRINT "  H = HELP (DISPLAY COMMANDS)"
  102. 1020    PRINT "  O = OPEN DOOR"
  103. 1030    PRINT "  G = GET SOMETHING (FROM ANYWHERE)"
  104. 1040    PRINT "  P = PUT (IN PACK, SCABBORD, ETC)"
  105. 1050    PRINT "  R = RUN (FROM MONSTERS)
  106. 1060    PRINT "  I = INVENTORY (WHAT YOU HAVE)"
  107. 1070    PRINT "  Q = QUIT                     "
  108. 1080    PRINT "  S = SEARCH (FOR TRAPS ETC)   "
  109. 1090    PRINT "  C = CAST A SPELL"
  110. 1100    LOCATE 25,1: PRINT "HIT ANY KEY TO CONTINUE";
  111. 1110    GOSUB 800 'WAIT
  112. 1120    GOSUB 770 'RESTORE CURRENT SCREEN
  113. 1130 RETURN
  114. 1140 'MOVE
  115. 1150    IF OVER.LOAD=1 THEN MSG$="YOU CAN'T MOVE": GOSUB 4460: GOTO 1290
  116. 1160    IF ASC(REPLY$)=28 THEN NH=P(P,7)+1: NV=P(P,6)
  117. 1170    IF ASC(REPLY$)=29 THEN NH=P(P,7)-1: NV=P(P,6)
  118. 1180    IF ASC(REPLY$)=30 THEN NV=P(P,6)-1: NH=P(P,7)
  119. 1190    IF ASC(REPLY$)=31 THEN NV=P(P,6)+1: NH=P(P,7)
  120. 1200    IF NV < 1 OR NV > 24 OR NH <1 OR NH > 39 THEN BEEP: GOTO 1290
  121. 1210    IF M(NV,NH) <> 32 GOTO 1270 'SOMETHING THERE
  122. 1220    M(NV,NH)=M(P(P,6),P(P,7)): M(P(P,6),P(P,7)) = 32 'MOVE PLAYER & RESTORE TO BLANK
  123. 1230    LOCATE P(P,6),P(P,7): PRINT CHR$(M(P(P,6),P(P,7)))
  124. 1240    P(P,6)=NV: P(P,7)=NH
  125. 1250    LOCATE P(P,6),P(P,7): PRINT CHR$(M(NV,NH));
  126. 1260    GOTO 1290
  127. 1270    IF M(NV,NH) <> 0 THEN BEEP: GOTO 1290
  128. 1280    GOSUB 3670: GOTO 1220 'A TRAP
  129. 1290 RETURN
  130. 1300 'LIGHT (TORCH OR LANTERN)
  131. 1310    S=P(P,8)
  132. 1320    IF S=13 OR S=14 THEN GOTO 1370
  133. 1330    S=P(P,9)
  134. 1340    IF S=13 OR S=14 THEN GOTO 1370
  135. 1350    MSG$="YOU DON'T HAVE TORCH OR LANTERN IN HAND": GOSUB 4460
  136. 1360    GOTO 1440
  137. 1370    IF S(15,P+2) <> 0 THEN GOTO 1410
  138. 1380    MSG$="YOU DON'T HAVE A TINDER BOX": GOSUB 4460
  139. 1390    IF P(P,8)=13 OR P(P,8)=14 THEN P(P,8)=0: GOTO 1440    'DUMP IT
  140. 1400    IF P(P,9)=13 OR P(P,9)=14 THEN P(P,9)=0: GOTO 1440    'DUMP IT
  141. 1410    IF P(P,8)=14 OR P(P,9)=14 THEN P(P,10)=P(P,10)+10: GOTO 1430
  142. 1420    IF P(P,8)=13 OR P(P,9)=13 THEN P(P,10)=P(P,10)+40
  143. 1430    T=MV+1
  144. 1440 RETURN
  145. 1450 'GET
  146. 1460    LOCATE 25,1: PRINT SPACE$(39);
  147. 1470    LOCATE 25,1: PRINT "GET WHAT? ";
  148. 1480    GOSUB 7110 'GET REPLY
  149. 1490    IF W$="TREASURE"  THEN GOSUB 3210: GOTO 1580
  150. 1500    SK$=W$
  151. 1510    GOSUB 330
  152. 1520    IF FOUND = 0 THEN GOTO 1560
  153. 1530    IF P(P,8) = 0 THEN P(P,8) = S: S(S,P+2)=S(S,P+2)-1: MSG$="OK": GOTO 1560
  154. 1540    IF P(P,9) = 0 THEN P(P,9) = S: S(S,P+2)=S(S,P+2)-1: MSG$="OK": GOTO 1560
  155. 1550    MSG$="YOUR HANDS ARE FULL": GOSUB 4460: GOTO 1580
  156. 1560    GOSUB 4460: IF S=4 THEN P(P,5)=P(P,5)+1  'SHIELD
  157. 1570    IF S=13 OR S=14 OR S=16 THEN GOSUB 1300 'LIGHT IT
  158. 1580 RETURN
  159. 1590 'OPEN
  160. 1600    IF T <> 1 THEN MSG$="THE DOOR WON'T OPEN": GOSUB 4460: GOTO 1810
  161. 1610    IF TO.OPEN = 0 THEN TO.OPEN = INT(RND*6)+1 ELSE TO.OPEN=0
  162. 1620    ZZ = INT(RND*6) + ((P(P,2)/3)-3)
  163. 1630    IF P.CLASS$(P) = "THIEF     " THEN ZZ=ZZ+P(P,4)
  164. 1640    IF ZZ < TO.OPEN THEN MSG$="THE DOOR WON'T OPEN": GOSUB 4460: GOTO 1810
  165. 1650    V=P(P,6): H=P(P,7)
  166. 1660    LV=V-1: HV=V+1: LH=H-1: HH=H+1
  167. 1670    FOR V = LV TO HV
  168. 1680      FOR H = LH TO HH
  169. 1690            IF M(V,H) <> 179 AND M(V,H) <> 196 THEN GOTO 1780
  170. 1700            FOR D=1 TO 3
  171. 1710              IF D(D,1)=0 THEN D(D,1)=M(V,H): D(D,2)=V: D(D,3)=H: GOTO 1730
  172. 1720            NEXT D
  173. 1730           M(V,H)=M(P(P,6),P(P,7)): M(P(P,6),P(P,7)) = 32 'MOVE PLAYER
  174. 1740           LOCATE P(P,6),P(P,7): PRINT CHR$(M(P(P,6),P(P,7)))
  175. 1750           P(P,6)=V: P(P,7)=H
  176. 1760           LOCATE P(P,6),P(P,7): PRINT CHR$(M(V,H));
  177. 1770           GOTO 1810
  178. 1780      NEXT H
  179. 1790    NEXT V
  180. 1800    MSG$="YOU ARE NOT BY A DOOR": GOSUB 4460: GOTO 1810
  181. 1810    T=MV+1: TO.OPEN=0
  182. 1820 RETURN
  183. 1830 'THROW AWAY
  184. 1840    LOCATE 25,1: PRINT SPACE$(39);
  185. 1850    LOCATE 25,1: PRINT "THROW WHAT? ";
  186. 1860    GOSUB 7110 'GET REPLY
  187. 1870    LX=LEN(W$)
  188. 1880 '
  189. 1890    FOR S=1 TO SMAX
  190. 1900            IF W$ = LEFT$(S.NAME$(S),LX) THEN GOTO 1930
  191. 1910    NEXT
  192. 1920    MSG$="A WHAT?": GOSUB 4460: GOTO 2030
  193. 1930    IF P(P,8) = S THEN P(P,8) = 0: GOTO 1970
  194. 1940    IF P(P,9) = S THEN P(P,9) = 0: GOTO 1970
  195. 1950    MSG$="IS'S NOT IN YOUR HAND": GOSUB 4460
  196. 1960    GOTO 2030
  197. 1970    P(P,1) = P(P,1)-S(S,2)
  198. 1980    IF S=4 THEN P(P,5)=P(P,5)-1  'SHIELD
  199. 1990    IF S=13 THEN P(P,10) = P(P,10)-40
  200. 2000    IF S=14 THEN P(P,10) = P(P,10)-10
  201. 2010    IF P(P,10) < 1 THEN P(P,10)=0
  202. 2020    MSG$="OK IT'S GONE": GOSUB 4460
  203. 2030 RETURN
  204. 2040 'PUT
  205. 2050    LOCATE 25,1: PRINT SPACE$(39);
  206. 2060    LOCATE 25,1: PRINT "PUT WHAT? ";
  207. 2070    GOSUB 7110 'GET REPLY
  208. 2080    LX=LEN(W$)
  209. 2090 '
  210. 2100    FOR S = 1 TO SMAX
  211. 2110            IF W$ = LEFT$(S.NAME$(S),LX) THEN GOTO 2140
  212. 2120    NEXT
  213. 2130    GOTO 2220
  214. 2140    IF P(P,8) = S THEN P(P,8) = 0: S(S,P+2)=S(S,P+2)+1: MSG$="OK":                    GOTO 2170
  215. 2150    IF P(P,9) = S THEN P(P,9) = 0: S(S,P+2)=S(S,P+2)+1: MSG$="OK":                    GOTO 2170
  216. 2160    MSG$="IS'S NOT IN YOUR HAND": GOSUB 4460: GOTO 2220
  217. 2170    GOSUB 4460
  218. 2180    IF S=4 THEN P(P,5)=P(P,5)-1 'SHIELD
  219. 2190    IF S=13 THEN P(P,10) = P(P,10)-40
  220. 2200    IF S=14 THEN P(P,10) = P(P,10)-10
  221. 2210    IF P(P,10) < 1 THEN P(P,10)=0
  222. 2220 RETURN
  223. 2230 'RUN
  224. 2240    MSG$=P.NAME$(P)+" IS RUNNING": GOSUB 4460
  225. 2250    GOSUB 800: P(P,13)=2
  226. 2260    GOSUB 1140: GOSUB 1140: GOSUB 1140 'MOVE 3 TIMES NORMAL RATE
  227. 2270 RETURN
  228. 2280 'INVENTORY
  229. 2290    GOSUB 740 'SAVE CURRENT SCREEN
  230. 2300    CLS: ZZ=0
  231. 2310    PRINT "          INVENTORY"
  232. 2320    PRINT: PRINT "HIT POINTS ";P(P,3);" LIGHT ";P(P,10)
  233. 2330    PRINT "WEIGHT YOU ARE CARRYING ";P(P,1)
  234. 2340    PRINT
  235. 2350    IF P(P,8) = 0 THEN PRINT "YOUR RIGHT HAND IS EMPTY"                               ELSE PRINT "IN YOUR RIGHT HAND IS A ";S.NAME$(P(P,8))
  236. 2360    IF P(P,9) = 0 THEN PRINT "YOUR LEFT HAND IS EMPTY"                               ELSE PRINT "IN YOUR LEFT HAND IS A ";S.NAME$(P(P,9))
  237. 2370    FOR S = 1 TO SMAX
  238. 2380            IF S(S,P+2) = 0 THEN GOTO 2430
  239. 2390            PRINT S.NAME$(S);S(S,P+2)
  240. 2400            ZZ=CSRLIN: IF ZZ < 23 THEN GOTO 2430
  241. 2410            LOCATE 25,1: PRINT "HIT ANY KEY TO CONTINUE";
  242. 2420            GOSUB 800: CLS: ZZ=0
  243. 2430    NEXT S
  244. 2440    LOCATE 25,1: PRINT "HIT ANY KEY TO CONTINUE";: GOSUB 800
  245. 2450    GOSUB 770
  246. 2460 RETURN
  247. 2470  'PLAY A TURN
  248. 2480    GOSUB 800 'GET COMMAND
  249. 2490    IF REPLY$ <>"A" THEN AV=0
  250. 2500    IF REPLY$ = " " THEN GOTO 2650
  251. 2510    IF ASC(REPLY$) > 27 AND ASC(REPLY$) < 32 THEN GOSUB 1140: GOTO 2650
  252. 2520    IF REPLY$ = "A" THEN GOSUB 3940: GOTO 2650
  253. 2530    IF REPLY$ = "C" THEN GOSUB 5870: GOTO 2650
  254. 2540    IF REPLY$ = "S" THEN GOSUB 2940: GOTO 2650
  255. 2550    IF REPLY$ = "O" THEN GOSUB 1590: GOTO 2650
  256. 2560    IF REPLY$ = "G" THEN GOSUB 1450: GOTO 2650
  257. 2570    IF REPLY$ = "L" THEN GOSUB 1300: GOTO 2650
  258. 2580    IF REPLY$ = "P" THEN GOSUB 2040: GOTO 2650
  259. 2590    IF REPLY$ = "R" THEN GOSUB 2230: GOTO 2650
  260. 2600    IF REPLY$ = "H" THEN GOSUB 890: GOTO 2650
  261. 2610    IF REPLY$ = "I" THEN GOSUB 2280: GOTO 2650
  262. 2620    IF REPLY$ = "T" THEN GOSUB 1830: GOTO 2650
  263. 2630    IF REPLY$ = "Q" THEN GOSUB 2890: GOTO 2650
  264. 2640    GOTO 2470
  265. 2650 RETURN
  266. 2660 'DRAW THE ROOM
  267. 2670    IF R(RX,6) < 1 THEN R(RX,5)=0
  268. 2680    IF R(RX,5) <> 0 THEN GOTO 2710
  269. 2690    IF WAN.MON <> 6 THEN GOTO 2730
  270. 2700    GOSUB 100 'GET A WANDERING MONSTER
  271. 2710    SV.MON = R(RX,5)
  272. 2720    MSG$=M.NAME$(SV.MON)+"S!": GOSUB 4460
  273. 2730 RETURN
  274. 2740 'THE LIGHTS WENT OUT
  275. 2750    SV.TIMER!=TIMER+1
  276. 2760    IF TIMER < SV.TIMER! THEN GOTO 2760
  277. 2770    LOCATE 25,1: PRINT SPACE$(38);: LOCATE 25,1: PRINT "YOUR LIGHT WENT OUT";
  278. 2780    P.TOT=0
  279. 2790    SV.TIMER! = TIMER+2
  280. 2800    IF P(P,8)=14 THEN P(P,8)=0
  281. 2810    IF P(P,9)=14 THEN P(P,9)=0
  282. 2820    IF P(P,8)<>13 AND P(P,9)<>13 THEN GOTO 2870
  283. 2830    IF S(16,P+2) = 0 THEN GOTO 2850
  284. 2840    S(16,P+2) = S(16,P+2)-1: GOTO 2870
  285. 2850    IF P(P,8) = 13 THEN P(P,8)=0
  286. 2860    IF P(P,9) = 14 THEN P(P,9)=0
  287. 2870    IF TIMER < SV.TIMER! THEN GOTO 2870
  288. 2880 RETURN
  289. 2890 'QUIT - END GAME
  290. 2900    MSG$="YOU WANT TO QUIT? (Y/N)": GOSUB 4460
  291. 2910    GOSUB 800
  292. 2920    IF REPLY$ <> "Y" THEN RETURN
  293. 2930    CHAIN "DUNEND",10,ALL
  294. 2940 'SEARCH
  295. 2950    IF T <> 1 THEN GOTO 3180
  296. 2960    ROLL = INT(RND*6)+1
  297. 2970    FOUND = 1
  298. 2980    IF P.CLASS$(P) = "DWARF     " THEN FOUND = 2
  299. 2990    IF P.CLASS$(P) = "THIEF     " THEN FOUND=FOUND+P(P,4)
  300. 3000    IF FT<>0 THEN FT=0: FOUND=6
  301. 3010    IF ROLL > FOUND THEN GOTO 3180
  302. 3020    RX=0: SV.MON = 0
  303. 3030    V=P(P,6): H=P(P,7)
  304. 3040    RX = RX+1
  305. 3050    IF R(RX,1) = 0 THEN GOTO 3190
  306. 3060    IF V => R(RX,1) AND V =< R(RX,3) AND H => R(RX,2) AND H =< R(RX,4)                THEN GOTO 3080
  307. 3070    GOTO 3040
  308. 3080    FOR V=R(RX,1) TO R(RX,3)
  309. 3090      FOR H=R(RX,2) TO R(RX,4)
  310. 3100            IF M(V,H) = 0 THEN SV.MON=1:  GOTO 3130
  311. 3110      NEXT H
  312. 3120    NEXT V
  313. 3130    IF SV.MON = 0 THEN GOTO 3180 'NO TRAP
  314. 3140    LOCATE V,H: PRINT "T";
  315. 3150    ROLL = INT(RND*6)+1
  316. 3160    MSG$="YOU FOUND "+TRAP$(ROLL): GOSUB 4460
  317. 3170    GOTO 3190
  318. 3180    MSG$="YOU FIND NOTHING": GOSUB 4460
  319. 3190    T=MV+1
  320. 3200 RETURN
  321. 3210 'GET TREASURE
  322. 3220    IF P(P,8) <> 0 AND P(P,9) <> 0 THEN MSG$="YOUR HANDS ARE FULL":                   GOSUB 4460: GOTO 3660
  323. 3230    V=P(P,6): H=P(P,7)
  324. 3240    LV=V-1: HV=V+1: LH=H-1: HH=H+1
  325. 3250    FOR V = LV TO HV
  326. 3260      FOR H = LH TO HH
  327. 3270            IF M(V,H) > 0 AND M(V,H) < 20 THEN GOTO 3310
  328. 3280      NEXT H
  329. 3290    NEXT V
  330. 3300    MSG$="YOU ARE NOT BY A TREASURE": GOSUB 4460: GOTO 3660
  331. 3310    MX=M(V,H):
  332. 3320    TR = INT((MX-1)/4): TP=((MX-(TR*4))*20)+5: IF TP>100 THEN TP=100
  333. 3330    ROLL = INT(RND*100)+1
  334. 3340    MSG$="THE CHEST IS EMPTY"
  335. 3350    ROLL = INT(RND*20)+1
  336. 3360    IF ROLL = 10 THEN GOSUB 3670 'A TRAP
  337. 3370    IF ROLL > TP THEN GOSUB 4460: TG!=0: GOSUB 3640: GOTO 3410
  338. 3380    S$="IT CONTAINS A"
  339. 3390    TG!=INT(500*(TR)*(TP/100))
  340. 3400    GOSUB 3420 ' THE TREASURE
  341. 3410 RETURN
  342. 3420 'THE TREASURE
  343. 3430    FOR ZZ = 1 TO TR
  344. 3440            S=INT((SMAX-1)*RND)+1
  345. 3450            IF S(S,12) > (1000*(TR+1)) THEN GOTO 3520
  346. 3460            MSG$=S$+" "+S.NAME$(S): SV.TIMER!=TIMER: GOSUB 4460
  347. 3470            IF S=33 THEN P(P,5)=P(P,5)-4: GOTO 3490
  348. 3480            GOSUB 800: IF REPLY$<>"Y" THEN GOTO 3520
  349. 3490            S(S,P+2)=S(S,P+2)+1
  350. 3500            EXPR!=EXPR!+S(S,12)
  351. 3510            P(P,1) = P(P,1)+S(S,2)
  352. 3520    NEXT ZZ
  353. 3530    IF TG! < 1 THEN GOTO 3640
  354. 3540    TJ=0
  355. 3550    IF TG! > 999 THEN TJ = INT(TG!/1000): TG!=TG!-INT(TJ*1000)
  356. 3560    TG=0
  357. 3570    IF TG! > 99 THEN TG = INT(TG!/100): TG!=TG!-INT(TG*100)
  358. 3580    IF TJ >0 THEN MSG$=STR$(TJ)+" JEWELRY": GOSUB 4460
  359. 3590    IF TG >0 THEN MSG$=STR$(TG)+" GEMS": GOSUB 4460
  360. 3600    MSG$=STR$(TG!)+" GOLD PIECES": GOSUB 4460
  361. 3610    GP!=GP!+WG!+(TJ*1000)+(TG*100)
  362. 3620    EXPR!=EXPR!+WG!+(TJ*1000)+(TG*100)
  363. 3630    P(P,1) = P(P,1)+WG!+(TJ*10)+TG
  364. 3640    MSG$=SPACE$(39): GOSUB 4460 'CLEAR MSG LINE
  365. 3650    LOCATE V,H: PRINT " ";: M(V,H)=32 'CLEAR THE TREASURE
  366. 3660 RETURN
  367. 3670 'A TRAP!
  368. 3680    ZZ=0
  369. 3690    ROLL = INT(RND*6)+1
  370. 3700    MSG$="A TRAP!!!": GOSUB 4460
  371. 3710    IF ROLL = 1 OR ROLL = 2 THEN MSG$="A CLOUD OF YELLOW GAS FILLS THE ROOM"
  372. 3720    IF ROLL = 3 THEN MSG$="YOU FALL INTO A HIDDEN PIT"
  373. 3730    IF ROLL = 4 THEN MSG$="A BLOCK FALLS FROM THE CEILING"
  374. 3740    IF ROLL = 5 THEN MSG$="A POISON NEEDLE"
  375. 3750    IF ROLL = 6 THEN MSG$="A DART FIRES AT YOU"
  376. 3760    GOSUB 4460
  377. 3770    IF ROLL = 2 THEN MSG$="IT'S HARMLESS": GOSUB 4460: GOTO 3890
  378. 3780    IF ROLL = 3 THEN ZZ = INT(RND*6)+1: P(P,3)=P(P,3)-ZZ: GOTO 3890
  379. 3790    IF ROLL = 6 THEN ZZ = (INT(RND*6)+1)*(INT(RND*4)+1): P(P,3)=P(P,3)-ZZ:            GOTO 3890
  380. 3800    ZZ = INT(RND*20)+1
  381. 3810    GET #1,P
  382. 3820    IF ROLL <> 4 THEN GOTO 3860
  383. 3830    ZZ = INT(RND*20)+1
  384. 3840    IF ZZ => CVI(SV.STONE$) THEN MSG$="IT MISSED": GOSUB 4460: ZZ = 0: GOTO 3890
  385. 3850    ZZ = INT(RND*10)+1: P(P,3)=P(P,3)-ZZ: GOTO 3890
  386. 3860    ZZ = INT(RND*20)+1
  387. 3870    IF ZZ => CVI(SV.POISON$) THEN MSG$="THE GODS HAVE SPARED YOU":                    GOSUB 4460: ZZ=0: GOTO 3890
  388. 3880    P(P,3)=0
  389. 3890    IF ZZ = 0 THEN GOTO 3930
  390. 3900    IF P(P,3) > 0 THEN MSG$="IT DID "+STR$(ZZ)+" POINTS DAMAGE"
  391. 3910    IF P(P,3) <1 THEN  MSG$=P.NAME$(P)+"IS DEAD": P.NAME$(P) = "":                     V=P(P,6):H=P(P,7): LOCATE V,H: PRINT " ";: M(V,H)=32
  392. 3920    GOSUB 4460
  393. 3930 RETURN
  394. 3940 'ATTACK
  395. 3950    IF ATTACK = 2 THEN T=INT(T*2)
  396. 3960    ATTACK=1: V=P(P,6): H=P(P,7)
  397. 3970 '   CHECK IF NEXT TO A MONSTER
  398. 3980    LV=V-1: HV=V+1: LH=H-1: HH=H+1
  399. 3990    FOR V = LV TO HV
  400. 4000      FOR H = LH TO HH
  401. 4010            IF M(V,H) > 60 AND M(V,H) < 124 THEN GOTO 4050
  402. 4020      NEXT H
  403. 4030    NEXT V
  404. 4040    MSG$="YOU ARE NOT BY A MONSTER": GOSUB 4460: GOTO 4450
  405. 4050    MN=M(V,H)-60
  406. 4060    FOR LX = 1 TO ML.MAX
  407. 4070            IF ML(LX,1)=V AND ML(LX,2)=H THEN GOTO 4090
  408. 4080    NEXT
  409. 4090    S=P(P,8): IF S.CLASS$(S)="W" THEN GOTO 4130
  410. 4100    ZZ=S
  411. 4110    S=P(P,9)
  412. 4120    IF S.CLASS$(S) <> "W" AND S.CLASS$(ZZ) <> "W"                                     THEN MSG$="YOU DON'T HAVE A WEAPON": GOSUB 4460: GOTO 4450
  413. 4130    ROLL=INT(RND*10)+1
  414. 4140    IF S=34 THEN ROLL=ROLL+5
  415. 4150    W$=STR$(M.AC(MN)): W$=RIGHT$(W$,1)
  416. 4160    WK=VAL(W$): IF M.AC(MN)=10 THEN WK=10
  417. 4170    ZZ = 1+(WK-P(P,4)): IF ZZ > 10 THEN ZZ=10
  418. 4180    IF ZZ < 1 THEN ZZ=1
  419. 4190    IF ZZ > ROLL THEN MSG$="YOU MISSED":GOSUB 4460: GOTO 4450
  420. 4200    IF M.AC(MN) < 11 THEN GOTO 4290  'NO SPECIAL WEAPON REQUIRED
  421. 4210    IF M.AC(MN) > 19 THEN GOTO 4230
  422. 4220    IF S=10 THEN GOTO 4290 ELSE MSG$="IT DID NO HARM": GOSUB 4460: GOTO 4450           'MUST USE SILVER DAGGER
  423. 4230    IF M.AC(MN) > 29 THEN GOTO 4250
  424. 4240    IF S=34 THEN GOTO 4290 ELSE MSG$="IT DID NO HARM": GOSUB 4460: GOTO 4450          ,MUST USE MAGIC WEAPON
  425. 4250    IF M.AC(MN) > 39 THEN GOTO 4270
  426. 4260    IF ((S=34) OR (S=14 AND P(P,10) > 0)) THEN GOTO 4290                               ELSE MSG$="IT DID NO HARM": GOSUB 4460: GOTO 4450                              'MUST USE MAGIC OR FIRE
  427. 4270    IF M.AC(MN) > 49 THEN GOTO 4450
  428. 4280    IF S=36 THEN GOTO 4290 ELSE MSG$="IT DID NO HARM": GOSUB 4460: GOTO 4450           'MUST USE STAKES
  429. 4290 '  CHECK FOR DAMAGE
  430. 4300    DM=INT(RND*S(S,1))+1
  431. 4310    IF S=34 THEN DM=DM+10
  432. 4320    ML(LX,4)=ML(LX,4)-DM
  433. 4330    IF MN=32 AND ML(LX,4)<1 AND S<>14 THEN ML(LX,4)=1 'TROLL
  434. 4340    IF ML(LX,4)>0 THEN MSG$="THE "+M.NAME$(MN)+" HAS BEEN WOUNDED":GOSUB 4460:              GOTO 4450
  435. 4350    MSG$="YOU KILLED THE "+M.NAME$(MN): GOSUB 4460:
  436. 4360    RX=ML(LX,3): R(RX,6)=R(RX,6)-1
  437. 4370    LOCATE V,H: PRINT " ";: M(V,H)=32: ML(LX,1)=0:
  438. 4380    MX=(INT(MN/4))+1
  439. 4390    EXPR!=EXPR!+(MX*10)
  440. 4400    S$="IT HAD A"
  441. 4410    TR = INT((MN-1)/4): TP=((MN-(TR*4))*20)+5: IF TP>100 THEN TP=100
  442. 4420    ROLL = INT(RND*100)+1
  443. 4430    IF ROLL > TP THEN GOTO 4450
  444. 4440    GOSUB 3420      'GET MONSTER'S TREASURE
  445. 4450 RETURN
  446. 4460 'MESSAGE
  447. 4470    IF TIMER < SV.TIMER! THEN GOTO 4470
  448. 4480    MS$=SPACE$(39)
  449. 4490    LSET MS$=MSG$
  450. 4500    LOCATE 25,1
  451. 4510    PRINT MS$;
  452. 4520    SV.TIMER!=TIMER+1
  453. 4530 RETURN
  454. 4540 ' GET WHAT ROOM AND DRAW IF LIGHTED
  455. 4550   WAN.MON=INT(RND*24*PLAYERS)+1
  456. 4560    RX=0: SV.MON = 0: P(P,11)=0: P(P,12)=0
  457. 4570    V=P(P,6): H=P(P,7)
  458. 4580    RX = RX+1
  459. 4590    IF R(RX,1) = 0 THEN GOTO 4930
  460. 4600    IF V => R(RX,1) AND V =< R(RX,3) AND H => R(RX,2) AND H =< R(RX,4)                THEN GOTO 4620
  461. 4610    GOTO 4580
  462. 4620    P(P,11)=RX
  463. 4630    HZ=((R(RX,2))*8)
  464. 4640    VZ=((R(RX,1))*8)
  465. 4650    IF P(P,10) > 1 THEN PAINT(HZ,VZ),1,3: GOSUB 2660: GOTO 4740
  466. 4660    IF WAN.MON=6 THEN GOSUB 2660
  467. 4670    FOR PX = 1 TO 9
  468. 4680            IF PX=P GOTO 4710
  469. 4690            IF P(PX,11) = RX AND P(PX,10) > 1 THEN GOTO 4740
  470. 4700            IF P(PX,12) = RX AND P(PX,10) > 1 THEN GOTO 4740
  471. 4710    NEXT PX
  472. 4720    IF (P(P,10) < 1) THEN GOTO 4730 ELSE GOTO 4740
  473. 4730    PAINT(HZ,VZ),2,3
  474. 4740 'CHECK FOR 2ND ROOM
  475. 4750    SV.MON = 0
  476. 4760    V=P(P,6): H=P(P,7)
  477. 4770    RX = RX+1
  478. 4780    IF R(RX,1) = 0 THEN GOTO 4930
  479. 4790    IF V => R(RX,1) AND V =< R(RX,3) AND H => R(RX,2) AND H =< R(RX,4)                THEN GOTO 4810
  480. 4800    GOTO 4610
  481. 4810    P(P,12)=RX
  482. 4820    HZ=((R(RX,2))*8)
  483. 4830    VZ=((R(RX,1))*8)
  484. 4840    IF P(P,10) > 1 THEN PAINT(HZ,VZ),1,3: GOSUB 2660: GOTO 4940
  485. 4850    IF WAN.MON=6 THEN GOSUB 2660
  486. 4860    FOR PX = 1 TO 9
  487. 4870            IF PX=P GOTO 4900
  488. 4880            IF P(PX,11) = RX AND P(PX,10) > 1 THEN GOTO 4930
  489. 4890            IF P(PX,12) = RX AND P(PX,10) > 1 THEN GOTO 4930
  490. 4900    NEXT PX
  491. 4910    IF (P(P,10) < 1) THEN GOTO 4920 ELSE GOTO 4930
  492. 4920    PAINT(HZ,VZ),2,3
  493. 4930    WAN.MON=0
  494. 4940 RETURN
  495. 4950 'PLAY MONSTER
  496. 4960    MSG$="": GOSUB 4460
  497. 4970    M.ACT=INT(RND*6)+1: IF TE<>0 THEN M.ACT=2
  498. 4980    IF M.ACT = 1 THEN GOTO 5070 ' DO NOTHING
  499. 4990    IF M.ACT = 2 THEN M.ACT=-1 ELSE M.ACT=1
  500. 5000    FOR LX = 1 TO ML.MAX
  501. 5010            IF ML(LX,1) = 0 THEN GOTO 5060
  502. 5020            FOR P = 1 TO 9
  503. 5030                    IF P.NAME$(P) = "" THEN GOTO 5050
  504. 5040                    IF ML(LX,3)=P(P,11) OR ML(LX,3)=P(P,12) THEN                                       GOSUB 5080: GOTO 5060
  505. 5050            NEXT P
  506. 5060    NEXT LX
  507. 5070 RETURN
  508. 5080 'MOVE THE MONSTER
  509. 5090   MX=M(ML(LX,1),ML(LX,2))-60
  510. 5100   IF MX=32 AND ML(LX,4) < 8 THEN ML(LX,4)=ML(LX,4)+1  'TROLL
  511. 5110 ' FIND CLOSEST PLAYER
  512. 5120   SV.P=0: SV.D=9999
  513. 5130   FOR P=1 TO 9
  514. 5140           IF (P.NAME$(P)="") OR (P(P,11)<>ML(LX,3) AND P(P,12)<>ML(LX,3))                     THEN GOTO 5170
  515. 5150           D=ABS(ML(LX,1)-P(P,6))+ABS(ML(LX,2)-P(P,7))
  516. 5160           IF D<SV.D THEN SV.P=P: SV.D=D
  517. 5170   NEXT P
  518. 5180   P=SV.P
  519. 5190   FOR T = 1 TO M.MV(MX)
  520. 5200         IF ML(LX,1)<P(P,6) THEN NV=ML(LX,1)+M.ACT: NH=ML(LX,2): GOTO 5240
  521. 5210         IF ML(LX,1)>P(P,6) THEN NV=ML(LX,1)-M.ACT: NH=ML(LX,2): GOTO 5240
  522. 5220         IF ML(LX,2)<P(P,7) THEN NH=ML(LX,2)+M.ACT: NV=ML(LX,1): GOTO 5240
  523. 5230         IF ML(LX,2)>P(P,7) THEN NH=ML(LX,2)-M.ACT: NV=ML(LX,1): GOTO 5240
  524. 5240         IF NV < 1 OR NV> 24 OR NH <1 OR NH > 39 THEN GOTO 5330
  525. 5250         IF M(NV,NH) <> 32 THEN GOTO 5330
  526. 5260         M(NV,NH)=M(ML(LX,1),ML(LX,2)): M(ML(LX,1),ML(LX,2))=32
  527. 5270         LOCATE ML(LX,1),ML(LX,2): PRINT " ";
  528. 5280         M.H=(NH*8)-8: M.V=(NV*8)-8: DRAW "C3"
  529. 5290         DRAW "BM=M.H;,=M.V;": DRAW "BR3;D4;F2;H2;G2"
  530. 5300         DRAW "BM=M.H;,=M.V;": DRAW "BR3;D2;L2;R4"
  531. 5310         ML(LX,1)=NV: ML(LX,2)=NH
  532. 5320   NEXT T
  533. 5330 'MONSTER ATTACKS
  534. 5340   IF M.ACT<1 THEN GOTO 5860
  535. 5350 '  CHECK IF MONSTER NEXT TO PLAYER
  536. 5360   V=ML(LX,1): H=ML(LX,2): LV=V-1:  HV=V+1: LH=H-1: HH=H+1
  537. 5370   IF P(P,6) => LV AND P(P,6) <= HV AND P(P,7) => LH AND P(P,7) <= HH               THEN GOTO 5430 ELSE GOTO 5380
  538. 5380    IF M.DAM(MX,1) < 80 THEN GOTO 5860 'NOT A DRAGON
  539. 5390    MSG$="DRAGON FIRE HITS "+LEFT$(P.NAME$(P),13): GOSUB 4460
  540. 5400    WC=8: WD=0
  541. 5410    GOTO 5530
  542. 5420 '  MAKE ATTACK
  543. 5430   MN=INT((MX+1)/4) +1
  544. 5440   WK=10-MN
  545. 5450   WK=WK+P(P,5): IF WK>10 THEN WK=10
  546. 5460   IF WK<1 THEN WK=1
  547. 5470   ROLL=INT(RND*10)+1
  548. 5480   IF WK > ROLL THEN GOTO 5860 'MISSED
  549. 5490   MSG$="A "+M.NAME$(MX)+" HAS ATTACKED "+LEFT$(P.NAME$(P),13): GOSUB 4460
  550. 5500   IF M.DAM(MX,1) < 10 THEN WD=M.DAM(MX,1): GOTO 5810    'NORMAL ATTACK
  551. 5510    WC=(INT(M.DAM(MX,1)/10))
  552. 5520    WD=M.DAM(MX,1)-(10*WC)
  553. 5530    GET #1,P        'GET PLAYER RECORD TO CHECK SAVING THROWS
  554. 5540    IF WC=1 THEN GOTO 5750                     'POISON
  555. 5550    IF WC=2 THEN P(P,1) = 1200: GOTO 5790      'DISEASE
  556. 5560    IF WC=5 THEN WK=(INT(M.DAM(MX,2)*RND)+WD)+(INT(30*RND)+5)
  557. 5570    IF WC=8 THEN WK=(INT(M.DAM(MX,2)*RND)+WD)+ML(MX,4)
  558. 5580    IF WC=5 OR WC=8 THEN GOTO 5590 ELSE GOTO 5620
  559. 5590    ZZ = INT(RND*20)+1             'DRAGONS BREATH
  560. 5600    IF ZZ => CVI(SV.DRAG$) THEN WK=INT(WK/2)
  561. 5610    GOTO 5830
  562. 5620   IF WC=6 THEN GOTO 5710      'TURN TO STONE
  563. 5630 '  ENERGY DRAIN
  564. 5640   IF WC = 3 THEN ZZ=CVI(LVL$): ZZ=ZZ-1 'ENERGY DRAIN 1 LEVEL
  565. 5650   IF WC = 4 THEN ZZ=CVI(LVL$): ZZ=ZZ-2 'ENERGY DRAIN 2 LEVELS
  566. 5660   IF ZZ<1 THEN P(P,3)=0: GOTO 5850  'PLAYER DEAD
  567. 5670   IF WC=3 THEN LSET EXPR$ = MKS$(INT(CVS(EXPR$)/2)): P(P,1)=1200
  568. 5680   IF WC=4 THEN LSET EXPR$ = MKS$(INT(CVS(EXPR$)/4)): P(P,1)=1200
  569. 5690   LSET LVL$=MKI$(ZZ)
  570. 5700   GOTO 5790
  571. 5710 '  TURN TO STONE
  572. 5720   ZZ = INT(RND*20)+1             'TURN TO STONE
  573. 5730   IF ZZ => CVI(SV.STONE$) THEN MSG$="THE GODS HAVE SPARED YOU":                      GOSUB 4460: WK=0: GOTO 5790
  574. 5740   P(P,3)=0: GOTO 5840
  575. 5750 '  POISON
  576. 5760   ZZ = INT(RND*20)+1             'POISON
  577. 5770   IF ZZ => CVI(SV.POISON$) THEN MSG$="THE GODS HAVE SPARED YOU":                    GOSUB 4460: WK=0: GOTO 5790
  578. 5780   P(P,3)=0: GOTO 5840   'PLAYER DEAD
  579. 5790   PUT #1,P        'REWRITE PLAYERS RECORD
  580. 5800   GOTO 5860
  581. 5810 '  CHECK DAMAGE
  582. 5820   WK=INT(RND*M.DAM(MX,2))+WD
  583. 5830   P(P,3)=P(P,3)-WK
  584. 5840   IF P(P,3)>0 THEN MSG$="IT DID "+STR$(WK)+" POINTS DAMAGE": GOSUB 4460:             GOTO 5860
  585. 5850   IF P(P,3) <1 THEN  MSG$=P.NAME$(P)+"IS DEAD": P.NAME$(P) = "":                    V=P(P,6):H=P(P,7): LOCATE V,H: PRINT " ";: M(V,H)=32: GOSUB 4460
  586. 5860 RETURN
  587. 5870 'CAST A SPELL
  588. 5880   IF T<>1 THEN MSG$="NO TIME": GOSUB 4460: GOTO 6110 'SPELL TAKES FULL TURN
  589. 5890    IF P.CLASS$(P) <> "CLERIC    " AND P.CLASS$(P) <> "ELF       "                     AND P.CLASS$(P) <> "MAGIC-USER"                                                THEN MSG$="YOU CAN'T CAST SPELLS": GOSUB 4460: GOTO 6110
  590. 5900    LOCATE 25,1: PRINT SPACE$(39);
  591. 5910    LOCATE 25,1: INPUT;"WHAT SPELL ",W$
  592. 5920    SK$=W$
  593. 5930    GOSUB 330 'MATCH TO SUPPLY FILE
  594. 5940    IF FOUND=0 THEN GOTO 6110
  595. 5950    S(S,P+2)=S(S,P+2)-1  'SUBTRACT SPELL
  596. 5960    IF S(S,2) > P(P,4) THEN MSG$="YOU CAN'T USE THAT SPELL": GOSUB 4460:              GOTO 6090
  597. 5970    IF (S(S,1) = 1 AND P.CLASS$(P) <> "CLERIC    ")                                     OR (S(S,1)=3 AND P.CLASS$(P) = "CLERIC    ")                                  THEN MSG$="YOU CAN'T USE THAT SPELL": GOSUB 4460: GOTO 6090
  598. 5980   IF S=26 THEN GOSUB 6620: GOTO 6090                    'CLOUDKILL
  599. 5990   IF S=28 OR S=22 THEN GOSUB 6780: GOTO 6090            'DEATH
  600. 6000   IF S=19 OR S=23 THEN P(P,10)=99: GOTO 6090            'LIGHT
  601. 6010   IF S=29 OR S=27 THEN TE=3: GOTO 6090                  'TURN EVIL
  602. 6020   IF S=31 OR S=32 THEN TO.OPEN=6: GOTO 6090             'TO OPEN
  603. 6030   IF S=30 THEN HS=4: GOTO 6090                          'HASTE
  604. 6040   IF S=18 THEN FT=6: GOTO 6090                          'FIND TRAPS
  605. 6050   IF S=24 THEN GOSUB 6370: GOTO 6090                    'LIGHTNING
  606. 6060   IF S=17 OR S=21 OR S=20 OR S=25 THEN GOSUB 6120: GOTO 6090
  607. 6070 ' INVALID SPELL
  608. 6080   MSG$="THATS NOT A VALID SPELL": GOSUB 4460: GOTO 6110
  609. 6090 'END TURN
  610. 6100   T=MV+1
  611. 6110 RETURN
  612. 6120 'CURE WOUNDS/RAISE DEAD/CURE CURSE
  613. 6130   LOCATE 25,1: PRINT SPACE$(39);  'CURE WOUNDS/RAISE DEAD/CURE CURSE
  614. 6140   LOCATE 25,1: PRINT "WHAT PLAYER? ";
  615. 6150    GOSUB 7110 'GET REPLY
  616. 6160    PX=VAL(W$)
  617. 6170   IF S=17 AND P.NAME$(PX)="" THEN MSG$="THAT PLAYER IS DEAD": GOSUB 4460:           GOTO 6360
  618. 6180 '  CHECK FOR SAME ALIGNMENT
  619. 6190    GET #1,P    'GET PLAYER RECORD
  620. 6200    SV.ALIGN$=ALIGN$
  621. 6210    GET #1,PX   'GET OTHER PLAYERS RECORD
  622. 6220    IF SV.ALIGN$ <> ALIGN$ THEN MSG$="YOU WOULDN'T HELP THAT SWINE":                  GOSUB 4460: GOTO 6360
  623. 6230   IF S=20 OR S=25 THEN GOTO 6320  'REMOVE CURSE
  624. 6240   IF S=21 THEN GOTO 6280   'RAISE DEAD
  625. 6250 ' CURE WOUNDS
  626. 6260   IF (CVI(HIT$)-P(PX,3)) < P(P,4) THEN P(PX,3)=CVI(HIT$)                            ELSE P(PX,3)=P(PX,3)+P(P,4)
  627. 6270   GOTO 6360
  628. 6280 ' RAISE DEAD
  629. 6290   P.NAME$(PX)=NM$: P(PX,1)=1600: P(PX,3)=1: P(PX,5)=1: P(PX,8)=0:                   P(PX,9)=0: P(PX,10)=0: M(P(PX,6),P(PX,7))=PX+48
  630. 6300   LOCATE P(PX,6),P(PX,7): PRINT CHR$(M(P(PX,6),P(PX,7)));
  631. 6310   GOTO 6360
  632. 6320 ' REMOVE CURSE
  633. 6330   S(33,PX+2)=0
  634. 6340   P(PX,5)=P(PX,5)+4
  635. 6350   P(PX,1)=P(PX,1)-300
  636. 6360 RETURN
  637. 6370 ' LIGHTNING
  638. 6380   LOCATE 25,1: PRINT SPACE$(39);                 'LIGHTNING/DEATH
  639. 6390   LOCATE 25,1: PRINT "WHAT WAY (U-D-L-R)? ";
  640. 6400    GOSUB 7110 'GET REPLY
  641. 6410   IF W$="U" THEN NV=P(P,6)+1:NH=P(P,7):NH2=P(P,7):NV2=P(P,6+2): GOTO 6460
  642. 6420   IF W$="D" THEN NV=P(P,6)-1:NH=P(P,7):NH2=P(P,7):NV2=P(P,6-2): GOTO 6460
  643. 6430   IF W$="L" THEN NH=P(P,7)-1:NV=P(P,6):NV2=P(P,6):NH2=P(P,7-2): GOTO 6460
  644. 6440   IF W$="R" THEN NH=P(P,7)+1:NV=P(P,6):NV2=P(P,6):NH2=P(P,7+2): GOTO 6460
  645. 6450   GOTO 6380
  646. 6460   FOR LX=1 TO ML.MAX
  647. 6470           IF ML(LX,1)<1 THEN GOTO 6600 'DEAD MONSTER
  648. 6480           IF (ML(LX,1) = NV OR ML(LX,1) = NV2)                                             AND (ML(LX,2) = NH OR ML(LX,2)=NH2)                                               THEN GOTO 6490 ELSE GOTO 6600
  649. 6490           V=ML(LX,1): H=ML(LX,2)
  650. 6500           MN=M(V,H)-60
  651. 6510           DM=INT(6*P(P,4))
  652. 6520           ML(LX,4)=ML(LX,4)-DM
  653. 6530           IF ML(LX,4)>0 THEN MSG$="THE "+M.NAME$(MN)+" HAS BEEN WOUNDED":                    GOSUB 4460: GOTO 6600
  654. 6540           RX=ML(LX,3): R(RX,6)=R(RX,6)-1
  655. 6550           MSG$="YOU KILLED THE "+M.NAME$(MN): GOSUB 4460:
  656. 6560           LOCATE V,H: PRINT " ";: M(V,H)=32: ML(LX,1)=0:
  657. 6570           MX=(INT(MN/4))+1
  658. 6580           RX=ML(LX,3): R(RX,6)=R(RX,6)-1
  659. 6590           EXPR!=EXPR!+(MX*10)
  660. 6600   NEXT LX
  661. 6610 RETURN
  662. 6620 '  CLOUDKILL
  663. 6630   FOR LX=1 TO ML.MAX
  664. 6640           IF ML(LX,1)<1 THEN GOTO 6760 'DEAD MONSTER
  665. 6650           IF ML(LX,3) = P(P,11) OR ML(LX,3) = P(P,12) THEN GOTO 6660                       ELSE GOTO 6760
  666. 6660           V=ML(LX,1): H=ML(LX,2)
  667. 6670           MN=M(V,H)-60
  668. 6680           ROLL=INT(RND*2)+1: IF ROLL=1 THEN DM=1 ELSE DM=5
  669. 6690           ML(LX,4)=ML(LX,4)-DM
  670. 6700           IF ML(LX,4)>0 THEN MSG$="THE "+M.NAME$(MN)+" HAS BEEN WOUNDED":GOSUB 4460:              GOTO 6760
  671. 6710           MSG$="YOU KILLED THE "+M.NAME$(MN): GOSUB 4460:
  672. 6720           RX=ML(LX,3): R(RX,6)=R(RX,6)-1
  673. 6730           LOCATE V,H: PRINT " ";: M(V,H)=32: ML(LX,1)=0:
  674. 6740           MX=(INT(MN/4))+1
  675. 6750           EXPR!=EXPR!+(MX*10)
  676. 6760   NEXT LX
  677. 6770 RETURN
  678. 6780 'DEATH SPELL
  679. 6790   LOCATE 25,1: PRINT SPACE$(39);
  680. 6800   LOCATE 25,1: PRINT "WHAT WAY (U-D-L-R)? ";
  681. 6810   V=P(P,6): H=P(P,7)
  682. 6820    GOSUB 7110 'GET REPLY
  683. 6830   IF W$="U" THEN DIR=-1: GOTO 6880
  684. 6840   IF W$="D" THEN DIR=1: GOTO 6880
  685. 6850   IF W$="L" THEN DIR=-1: GOTO 6920
  686. 6860   IF W$="R" THEN DIR=1: GOTO 6920
  687. 6870   GOTO 6780
  688. 6880 ' LOOK VERT
  689. 6890   V=V+DIR: IF V>24 OR V<1 THEN MSG$="YOU MISSED": GOSUB 4460: GOTO 7100
  690. 6900   IF M(V,H)=<32 THEN GOTO 6880
  691. 6910   GOTO 6950
  692. 6920 '  LOOK HOR
  693. 6930   H=H+DIR: IF H>39 OR H<1 THEN MSG$="YOU MISSED": GOSUB 4460: GOTO 7100
  694. 6940   IF M(V,H)=<32 THEN GOTO 6920
  695. 6950 ' CHECK  WHAT YOU HIT
  696. 6960   IF M(V,H) > 48 AND M(V,H) < 58 THEN GOTO 7060 'HIT A PLAYER
  697. 6970   IF M(V,H) > 60 AND M(V,H) < 124 THEN GOTO 6990 'HIT A MONSTER
  698. 6980   MSG$="YOU MISSED": GOSUB 4460: GOTO 7100
  699. 6990 '  HIT A MONSTER
  700. 7000   FOR LX=1 TO ML.MAX
  701. 7010           IF ML(LX,1)=V AND ML(LX,2)=H THEN GOTO 7030
  702. 7020   NEXT
  703. 7030   MN=M(V,H)-60
  704. 7040   GOSUB 4350
  705. 7050   GOTO 7100
  706. 7060 '  HIT A PLAYER
  707. 7070   PX=M(V,H)-48
  708. 7080   MSG$="YOU KILLED "+P.NAME$(PX): GOSUB 4460
  709. 7090   P.NAME$(PX)="": LOCATE V,H: PRINT " ";: M(V,H)=32
  710. 7100 RETURN
  711. 7110 'GET INPUT VARIABLE
  712. 7120    W$=""
  713. 7130    REPLY$=INKEY$
  714. 7140    IF REPLY$="" THEN GOTO 7130
  715. 7150    IF LEN(REPLY$)=1 THEN GOTO 7220 ELSE REPLY$=RIGHT$(REPLY$,1) 'CHK BACKSP
  716. 7160    IF ASC(REPLY$) <> 75 THEN BEEP: GOTO 7130    'INVALID CHAR
  717. 7170    L=LEN(W$): IF L=0 THEN BEEP: GOTO 7130
  718. 7180    W$=LEFT$(W$,L-1) 'ERASE LAST CHAR FROM INPUT VAR
  719. 7190    L=POS(0): L=L-1: LOCATE 25,L: PRINT " "; 'ERASE LAST CHAR FROM SCREEN
  720. 7200    LOCATE 25,L 'REPOSITION CURSOR
  721. 7210    GOTO 7130
  722. 7220    IF ASC(REPLY$)=13 THEN GOTO 7260 'ENTER WAS HIT
  723. 7230    PRINT REPLY$;
  724. 7240    W$=W$+REPLY$
  725. 7250    GOTO 7130
  726. 7260 RETURN
  727.