home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib36b.dsk / EXTERMINATORS.bas < prev    next >
BASIC Source File  |  2023-02-26  |  10KB  |  233 lines

  1. 10  REM  ****************************
  2. 20  REM  * EXTERMINATORS            *
  3. 30  REM  * BY DAVID HARRIS          *
  4. 40  REM  * COPYRIGHT(C) 1989        *
  5. 50  REM  * MINDCRAFT PUBL. CORP.    *
  6. 60  REM  * CONCORD, MA 01742        *
  7. 70  REM  ****************************
  8. 80  REM 
  9. 90  REM  ** MAIN PROGRAM **
  10. 100  GOSUB 160: REM  INITIALIZE
  11. 110  GOSUB 330: REM  NEW GAME
  12. 120  GOSUB 590: REM  PLAY GAME
  13. 130  GOSUB 1390: REM  GAME OVER
  14. 140  GOTO 110
  15. 150  REM  ** INITIALIZE **
  16. 160  IF  PEEK(104) = 66  THEN  GOTO 190
  17. 170  POKE 103,1: POKE 104,66: POKE 16896,0
  18. 180  PRINT  CHR$(4);"RUN EXTERMINATORS"
  19. 190  PRINT  CHR$(12); CHR$(21)
  20. 200  HCOLOR= 3: SCALE= 1: ROT= 0
  21. 210  ONERR  GOTO 2180
  22. 220  PRINT  CHR$(4);"BLOAD EXTERM.SHAPES,A$4000"
  23. 230  PRINT  CHR$(4);"BLOAD EXTERM.SOUND"
  24. 240  POKE 216,0: ONERR  GOTO 1760
  25. 250 SD = 0: POKE 842,SD: REM   ENABLE SOUND
  26. 260  POKE 232,0: POKE 233,64
  27. 270 MAXDAL = 50
  28. 280  DIM MA%(19,9)
  29. 290  DIM N$(11),S(11),L(11)
  30. 300  DIM DX%(MAXDAL): DIM DY%(MAXDAL)
  31. 310  RETURN 
  32. 320  REM  ** NEW GAME **
  33. 330 DAL = 5:LEVEL = 1:LS = 0:SCO = 0:DEAD = 0
  34. 340  HOME : INVERSE : HTAB 1: VTAB 21: PRINT " EXTERMINATORS (C) 1989 MINDCRAFT CORP.";: NORMAL 
  35. 350  GOSUB 390
  36. 360  VTAB 24: PRINT "'?' for Instructions, 'ESC' to Quit.";: VTAB 1: PRINT 
  37. 370  RETURN 
  38. 380  REM  ** NEW BOARD **
  39. 390  VTAB 23: HTAB 1: PRINT "Score: ";SCO;"         Level: ";LEVEL: REM    9 SPACES
  40. 400  IF DAL >MAXDAL  THEN DAL = MAXDAL
  41. 410  FOR A = 0 TO 19: FOR B = 0 TO 9:MA%(A,B) = 0: NEXT B: NEXT A
  42. 420 DDAL = 0:S = 0
  43. 430  FOR L = 1 TO DAL
  44. 440 DX%(L) =  INT(20 * RND(1)):DY%(L) =  INT(10 * RND(1))
  45. 450  IF MA%(DX%(L),DY%(L)) >0  THEN  GOTO 440
  46. 460 MA%(DX%(L),DY%(L)) = 2
  47. 470  NEXT L
  48. 480 PX =  INT(18 * RND(1)) +1:PY =  INT(8 * RND(1)) +1
  49. 490 CHK = 0: FOR A =  -1 TO 1: FOR B =  -1 TO 1:CHK = CHK +MA%(PX +A,PY +B): NEXT B: NEXT A
  50. 500  IF CHK >0  THEN  GOTO 480
  51. 510 MA%(PX,PY) = 1
  52. 520  HGR 
  53. 530  VTAB 1: IF OF  THEN  HCOLOR= 3: GOSUB 2310
  54. 540  FOR L = 1 TO DAL: XDRAW 2 AT DX%(L) *14,DY%(L) *16: NEXT L
  55. 550  XDRAW 1 AT PX *14,PY *16
  56. 560  POKE  -16368,0
  57. 570  RETURN 
  58. 580  REM  ** PLAY GAME **
  59. 590  IF   NOT LS  THEN  GOSUB 660: REM  GET PLAYERS MOVE IF NOT LAST STAND
  60. 600  IF DEAD = 1  THEN  GOTO 620
  61. 610  GOSUB 980: REM  MOVE EXTERMINATORS
  62. 620  IF DDAL = DAL  THEN  GOSUB 2090: GOSUB 390
  63. 630  IF   NOT DEAD  THEN  GOTO 590
  64. 640  RETURN 
  65. 650  REM  ** GET PLAYERS MOVE **
  66. 660  VTAB 1
  67. 670 MV = 0: GET M$:M =  ASC(M$): IF M >96  AND M <123  THEN M = M -32
  68. 680  IF M = 71  THEN  GOSUB 2300
  69. 690  IF M = 77  THEN MV = 1
  70. 700  IF M = 44  OR M = 60  THEN MV = 2
  71. 710  IF M = 46  OR M = 62  THEN MV = 3
  72. 720  IF M = 74  THEN MV = 4
  73. 730  IF M = 75  THEN MV = 5
  74. 740  IF M = 76  THEN MV = 6
  75. 750  IF M = 85  THEN MV = 7
  76. 760  IF M = 73  THEN MV = 8
  77. 770  IF M = 79  THEN MV = 9
  78. 780  IF M >48  AND M <58  THEN MV = M -48
  79. 790  IF M = 27  THEN  GOTO 1550
  80. 800  IF M = 19  THEN  GOSUB 2060: GOTO 660
  81. 810  IF M = 83  OR M = 115  THEN E = 1: GOSUB 1240: IF E  THEN  RETURN 
  82. 820  IF M = 84  OR M = 116  THEN  GOSUB 1160: RETURN 
  83. 830  IF M = 63  OR M = 47  THEN  GOSUB 1800: GOTO 660
  84. 840  IF M = 87  OR M = 119  THEN LS = 1: RETURN 
  85. 850  IF M = 32  THEN  RETURN 
  86. 860  IF   NOT MV  THEN  GOTO 670
  87. 870 MA%(PX,PY) = 0
  88. 880  XDRAW 1 AT PX *14,PY *16
  89. 890  IF (MV = 1  OR MV = 4  OR MV = 7)  AND PX >0  THEN PX = PX -1
  90. 900  IF (MV = 9  OR MV = 6  OR MV = 3)  AND PX <19  THEN PX = PX +1
  91. 910  IF (MV = 7  OR MV = 8  OR MV = 9)  AND PY >0  THEN PY = PY -1
  92. 920  IF (MV = 1  OR MV = 2  OR MV = 3)  AND PY <9  THEN PY = PY +1
  93. 930  XDRAW 1 AT PX *14,PY *16
  94. 940  IF MA%(PX,PY) >0  THEN DEAD = 1: RETURN 
  95. 950 MA%(PX,PY) = 1
  96. 960  RETURN 
  97. 970  REM  ** MOVE EXTERMINATORS **
  98. 980  FOR L = 1 TO DAL: IF DX%(L) =  -1  THEN  NEXT L: GOTO 1010
  99. 990  IF MA%(DX%(L),DY%(L)) = 1  THEN DEAD = 1: RETURN 
  100. 1000  XDRAW 2 AT DX%(L) *14,DY%(L) *16:MA%(DX%(L),DY%(L)) = 0: NEXT L
  101. 1010  FOR L = 1 TO DAL
  102. 1020  IF DX%(L) =  -1  THEN  NEXT L: RETURN 
  103. 1030  IF PX >DX%(L)  THEN DX%(L) = DX%(L) +1
  104. 1040  IF PX <DX%(L)  THEN DX%(L) = DX%(L) -1
  105. 1050  IF PY >DY%(L)  THEN DY%(L) = DY%(L) +1
  106. 1060  IF PY <DY%(L)  THEN DY%(L) = DY%(L) -1
  107. 1070  IF MA%(DX%(L),DY%(L)) = 0  THEN  XDRAW 2 AT DX%(L) *14,DY%(L) *16:MA%(DX%(L),DY%(L)) = 2: NEXT L: RETURN 
  108. 1080  IF MA%(DX%(L),DY%(L)) = 1  THEN  XDRAW 2 AT DX%(L) *14,DY%(L) *16:DEAD = 1: RETURN 
  109. 1090  IF MA%(DX%(L),DY%(L)) = 3  THEN DDAL = DDAL +1:DX%(L) =  -1:SCO = SCO +10: VTAB 23: PRINT "Score: ";SCO: POKE 6,255: POKE 8,50: CALL 843: NEXT L: RETURN 
  110. 1100 MA%(DX%(L),DY%(L)) = 3
  111. 1110  XDRAW 2 AT DX%(L) *14,DY%(L) *16
  112. 1120 DDAL = DDAL +2:SCO = SCO +20: VTAB 23: PRINT "Score: ";SCO: FOR C = 1 TO L -1
  113. 1130  IF DX%(C) = DX%(L)  AND DY%(C) = DY%(L)  THEN  XDRAW 3 AT DX%(L) *14,DY%(L) *16:DX%(C) =  -1
  114. 1140  NEXT C:DX%(L) =  -1: POKE 6,255: POKE 8,150: CALL 843: NEXT L: RETURN 
  115. 1150  REM  ** TELEPORT **
  116. 1160 MA%(PX,PY) = 0
  117. 1170  XDRAW 1 AT PX *14,PY *16
  118. 1180 PX =  INT(18 * RND(1)) +1:PY =  INT(8 * RND(1)) +1
  119. 1190  IF MA%(PX,PY) >0  THEN DEAD = 1
  120. 1200 MA%(PX,PY) = 1
  121. 1210  XDRAW 1 AT PX *14,PY *16
  122. 1220  RETURN 
  123. 1230  REM  ** SONIC SCREWDRIVER **
  124. 1240  IF S  THEN E = 0: RETURN 
  125. 1250 S = 1:C = 50
  126. 1260  FOR A =  -1 TO 1: FOR B =  -1 TO 1
  127. 1270 X = PX +A:Y = PY +B: IF X <0  OR Y <0  OR X >19  OR Y >9  OR (A = 0  AND B = 0)  THEN  NEXT B: NEXT A: RETURN 
  128. 1280  XDRAW 4 AT X *14,Y *16: FOR L = 1 TO C: NEXT L
  129. 1290  IF MA%(X,Y) = 2  THEN  POKE 6,255: POKE 8,100: CALL 843
  130. 1300  XDRAW 4 AT X *14,Y *16
  131. 1310  IF MA%(X,Y) < >2  THEN  NEXT B: NEXT A: RETURN 
  132. 1320 MA%(X,Y) = 0: XDRAW 2 AT X *14,Y *16
  133. 1330 DDAL = DDAL +1:SCO = SCO +20: VTAB 23: PRINT "Score: ";SCO
  134. 1340  FOR L = 1 TO DAL
  135. 1350  IF DX%(L) = X  AND DY%(L) = Y  THEN DX%(L) =  -1:L = DAL
  136. 1360  NEXT L: NEXT B: NEXT A
  137. 1370  RETURN 
  138. 1380  REM  ** GAME OVER **
  139. 1390  VTAB 24: PRINT "You were hit...Game over...         ";: VTAB 1: REM  9 SPACES
  140. 1400  GOSUB 2220
  141. 1410  GOSUB 1570: REM  HALL OF FAME
  142. 1420  TEXT : HOME 
  143. 1430  PRINT "You were hit...Game over..."
  144. 1440  PRINT "You reached level ";LEVEL;" scoring ";SCO;"."
  145. 1450  GOSUB 1650
  146. 1460  PRINT : HTAB 14: INVERSE : PRINT "HALL OF FAME": NORMAL : PRINT : PRINT "WINNER","SCORE","LEVEL"
  147. 1470  PRINT 
  148. 1480  FOR L = 1 TO 10: PRINT N$(L),S(L),L(L): NEXT L
  149. 1490  PRINT : PRINT "Play Again (Y/N) ";: FLASH : PRINT "Y";
  150. 1500  NORMAL 
  151. 1510 A =  PEEK( -16368): IF A <128  THEN  GOTO 1510
  152. 1520 P$ =  CHR$(A -128): POKE  -16384,0
  153. 1530  IF P$ = "Y"  OR P$ =  CHR$(121)  OR P$ =  CHR$(13)  THEN  GOTO 110
  154. 1540  IF P$ < >"N"  AND P$ < > CHR$(110)  AND P$ < > CHR$(27)  THEN  GOTO 1510
  155. 1550  TEXT : HOME : PRINT "Play EXTERMINATORS again, soon!": END 
  156. 1560  REM  ** HALL OF FAME **
  157. 1570 EFLAG = 0: ONERR  GOTO 1760
  158. 1580  PRINT  CHR$(4);"VERIFY EXTERM.FAME"
  159. 1590  PRINT  CHR$(4);"OPEN EXTERM.FAME"
  160. 1600  PRINT  CHR$(4);"READ EXTERM.FAME"
  161. 1610  FOR L = 1 TO 10: INPUT N$(L),S(L),L(L): NEXT L
  162. 1620  PRINT  CHR$(4);"CLOSE EXTERM.FAME"
  163. 1630  RETURN 
  164. 1640  REM  ** GET WINNERS NAME **
  165. 1650  FOR L = 1 TO 10: IF SCO <S(L)  THEN  NEXT L: GOTO 1710
  166. 1660  FOR C = 10 TO L  STEP  -1:N$(C +1) = N$(C):S(C +1) = S(C):L(C +1) = L(C): NEXT C
  167. 1670  PRINT : INPUT "Please enter your name: ";N$(L):S(L) = SCO:L(L) = LEVEL
  168. 1680  IF  LEN(N$(L)) >15  THEN  VTAB 3: CALL  -958: VTAB 4: PRINT "(15 letters or less)": VTAB 2: GOTO 1670
  169. 1690 L = 10
  170. 1700  NEXT L
  171. 1710  PRINT  CHR$(4);"OPEN EXTERM.FAME"
  172. 1720  PRINT  CHR$(4);"WRITE EXTERM.FAME"
  173. 1730  FOR L = 1 TO 10: PRINT N$(L): PRINT S(L): PRINT L(L): NEXT L
  174. 1740  PRINT  CHR$(4);"CLOSE EXTERM.FAME"
  175. 1750  RETURN 
  176. 1760 EN =  PEEK(222): IF EN = 6  OR EN = 5  THEN  PRINT  CHR$(4)"OPEN EXTERM.FAME": PRINT  CHR$(4)"CLOSE EXTERM.FAME": GOTO 1420
  177. 1770  IF EN = 8  THEN  HOME : TEXT : VTAB 1: PRINT "I/O ERROR... CHECK DISK DRIVE": END 
  178. 1780  TEXT : HOME : VTAB 1: PRINT "ERROR #"EN" AT LINE #" PEEK(218) +256 * PEEK(219): END 
  179. 1790  REM  ** INSTRUCTIONS **
  180. 1800  TEXT : HOME 
  181. 1810  HTAB 14: INVERSE : PRINT "INSTRUCTIONS": NORMAL : PRINT 
  182. 1820  PRINT " Try to eliminate the EXTERMINATORS"
  183. 1830  PRINT " before they get you!  EXTERMINATORS"
  184. 1840  PRINT " destroy each other when they collide."
  185. 1850  PRINT " Debris is lethal to EXTERMINATORS and"
  186. 1860  PRINT " you.  When cornered, use the Sonic"
  187. 1870  PRINT " Screwdriver to destroy the adjacent"
  188. 1880  PRINT " EXTERMINATORS, or teleport away."
  189. 1890  PRINT " Use the following keys to move:"
  190. 1900  PRINT "       U  I  O           7  8  9": REM  7 AND 11 SPACES
  191. 1910  PRINT "       J  K  L    or     4  5  6"
  192. 1920  PRINT "       M  ,  .           1  2  3"
  193. 1930  PRINT : PRINT " S-Sonic Screwdriver (once per level)"
  194. 1940  PRINT "   Destroys all adjacent EXTERMINATORS": REM  3 SPACES
  195. 1950  PRINT " T-Teleport-Randomly relocates you"
  196. 1960  PRINT " W-Last Stand-Stand until end of level"
  197. 1970  PRINT " G-Toggles grid on/off"
  198. 1980  PRINT : PRINT " CTRL-S-Toggles sound on/off"
  199. 1990  VTAB 24: HTAB 8: INVERSE : PRINT "PRESS A KEY TO CONTINUE";
  200. 2000  POKE  -16368,0: WAIT  -16384,128: POKE  -16368,0: POKE  -16304,0
  201. 2010  HOME : INVERSE : VTAB 21: PRINT " EXTERMINATORS (C) 1989 MICROSPARC, INC.";: NORMAL 
  202. 2020  VTAB 23: HTAB 1: PRINT "Score: ";SCO;"         Level: ";LEVEL: REM    9 SPACES
  203. 2030  VTAB 24: PRINT "'?' for Instructions, 'ESC' to Quit.";: VTAB 1: PRINT 
  204. 2040  RETURN 
  205. 2050  REM  ** SOUND ON/OFF **
  206. 2060  IF SN  THEN SN = 0: POKE 842,0: RETURN 
  207. 2070 SN = 1: POKE 842,255: RETURN 
  208. 2080  REM  ** LEVEL COMPLETE **
  209. 2090 LS = 0:DAL = DAL +3:LEVEL = LEVEL +1
  210. 2100  POKE 6,38: POKE 8,157: CALL 843
  211. 2110  POKE 6,64: POKE 8,116: CALL 843
  212. 2120  POKE 6,75: POKE 8,93: CALL 843
  213. 2130  POKE 6,255: POKE 8,77: CALL 843
  214. 2140  POKE 6,75: POKE 8,93: CALL 843
  215. 2150  POKE 6,255: POKE 8,77: CALL 843
  216. 2160  HGR 
  217. 2170  RETURN 
  218. 2180  REM  ** ERROR LOADING FILE **
  219. 2190  IF  PEEK(222) = 6  THEN  HOME : PRINT "File not found.": PRINT "Make sure EXTERM.SHAPES and EXTERM.SOUND": PRINT "are on the disk.": END 
  220. 2200  PRINT "Error loading file...": END 
  221. 2210  REM  ** DIRGE **
  222. 2220  RESTORE 
  223. 2230  HCOLOR= 0: DRAW 1 AT PX *14,PY *16: HCOLOR= 3: DRAW 2 AT PX *14,PY *16
  224. 2240  FOR A = 1 TO 11: READ PITCH,DUR
  225. 2250  POKE 8,PITCH +125: POKE 6,DUR *31
  226. 2260  XDRAW 1 AT PX *14,PY *16: XDRAW 2 AT PX *14,PY *16
  227. 2270  CALL 843: NEXT A
  228. 2280  DATA  121,4,121,3,121,1,121,4,108,4,113,1,121,2,121,1,121,2,128,1,121,8
  229. 2290  RETURN 
  230. 2300 OF =   NOT OF: HCOLOR= 3 *OF
  231. 2310  FOR X = 13 TO 158  STEP 16: HPLOT 0,X TO 279,X: NEXT 
  232. 2320  FOR X = 12 TO 270  STEP 14: HPLOT X,0 TO X,157: NEXT 
  233. 2330  RETURN