home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 556b.lha / Defender / defender.src < prev    next >
Text File  |  1980-01-02  |  28KB  |  1,436 lines

  1. '
  2. ' ***** DEFENDER *****
  3. '
  4.  
  5. DIM mh(1279),mo(1),mx(1),my(1),mxs(1),md(1),ms(1),xo(1),x2(1),xo2(1)
  6. DIM ax(99),ay(99),axs(99),ays(99),at(99),as(99),ae(99),ac(99)
  7. DIM ad1(99),ad2(99)
  8. DIM lf(1),mx2(1),lives(1),killme(1),score(1),smart(1),bang(1),smarts(1)
  9. DIM bx(2,1),by(2,1),ba(2,1),bs(2,1),sx(1)
  10. DIM hinames$(8,1,23),hiscores(1,23)
  11. DMA 0:kk2=1
  12. sl0=44-(NTSC*12)
  13. p$=""
  14. FLOAD p$+"font.def"
  15. GOSUB loadhis
  16. QUEUE 0,512:QUEUE 1,512
  17. QUEUE 2,32
  18. POINTER 0:SPRITE 0
  19. GOSUB loadbl:GOSUB loadsp
  20. a=1 TO 8:SLOAD p$+"sound"+STR$(a)+".def",a+9:NEXT
  21.  
  22. .intro:VWAIT:DMA 0:SLICE END:SLICE 0,sl0:COLOUR 1,0
  23. k=0 TO 6:FREE SCREEN k:NEXT
  24. SCREEN 0,320,224,3:SCREEN 1,320,224,3
  25. SCREEN 2,320,224,3
  26. DISPLAY 320,224,0,1,1,0,2:SHOWF 0:SHOWB 2
  27. c=8:a=1:y=0 TO 63
  28. RGB 1,c,15,0,y:c=c+a
  29. IF c=15 THEN a=-a
  30. IF c=8 THEN a=-a
  31. NEXT:RGB 1,15,15,15,y:c=2:a=1
  32. y=96 TO 130
  33. RGB 0,c,c,c,y:c=c+a
  34. IF c=8 THEN a=-a
  35. IF c=2 THEN a=-a
  36. NEXT:RGB 0,0,0,0,y:c=8:a=1
  37. y=23*8 TO 28*8-1
  38. RGB 1,c,c,15,y:c=c+a
  39. IF c=15 THEN a=-a
  40. IF c=8 THEN a=-a
  41. NEXT
  42. BLOAD "titlecols.def",99,0,0
  43. BLOAD "gamecols.def",99,0,8
  44. db=0:VWAIT:DMA 1
  45. LOCATE 0,0:t$="MARK SIBLY":GOSUB text
  46. t$="PROUDLY PRESENTS":GOSUB text
  47. t$="A BLITZ BASIC PROGRAM.....":GOSUB text
  48. SCREEN TO 1
  49. intloop
  50. SOUND 11,0:a=7 TO -1 STEP -1
  51. b=1 TO 5:VWAIT:NEXT:SHOWF db:db=1-db:UNQUEUE db:USE SCREEN db
  52. c=66+a:IF c<66 THEN c=66
  53. QBLIT db,c,72,80
  54. IF JOYB(1)>0 THEN a=-1
  55. NEXT:SOUND 16,0
  56. USE SCREEN 1-db
  57. LOCATE 4,23:PRINT "LANDER 150  MUTANT 150  POD 1000";
  58. LOCATE 3,27:PRINT "SWARMER 100  BOMBER 250 BAITER 200";
  59. USE SCREEN 2:j=0
  60. a=1 TO 250:b=1 TO 3:VWAIT:NEXT:UNQUEUE 2
  61. y=0 TO 1:x=0 TO 2
  62. c=y*3+x*5:IF c>0 THEN c=c+5
  63. QBLIT 2,c+j,x *96+60,y ASL 5+172
  64. j=j+1:IF j=5 THEN j=0
  65. NEXT:NEXT
  66. IF JOYB(1)>0 THEN a=251
  67. NEXT:IF a=252 THEN GOTO gameon
  68.  
  69. .hiscores
  70. GOSUB hishow
  71. a=1 TO 500:VWAIT
  72. IF JOYB(1)>0 THEN a=501
  73. NEXT:IF a=501 THEN GOTO intro
  74.  
  75. .gameon:VWAIT:DMA 0:SLICE END:SLICE 0,sl0
  76. SCREEN 0,320,224,3
  77. DISPLAY 320,224,0,0,0,0:SHOW 0:USE SCREEN 0
  78. BLOAD "modecols.def",99,0,0
  79. y=0 TO 3:BLIT y+74,135,y*40+24:NEXT
  80. c=8:a=1:y=192 TO 199
  81. RGB 1,c,c,0,y:c=c+a:IF c=15 THEN a=-a
  82. IF c=8 THEN a=-a
  83. NEXT
  84. COLOUR 1,0:LOCATE 12,24:PRINT "SELECT GAME MODE"
  85. gmode=1
  86. jw2:IF JOYB(1)<>0 THEN GOTO jw2
  87. VWAIT:DMA 1
  88. gonl:BLIT 78,131,gmode*40+20
  89. jw:IF JOYB(1)<>0 THEN GOTO allgo
  90. jy=JOYY(1)
  91. IF jy<>0
  92.   BMODE 3:BLIT 78,131,gmode*40+20:BMODE 0
  93.   gmode=gmode+jy & 3
  94.   joywait:VWAIT
  95.   IF JOYY(1)<>0 THEN GOTO joywait
  96.   GOTO gonl
  97. ENDIF
  98. GOTO jw
  99.  
  100. .allgo:VWAIT:DMA 0:SLICE END:SLICE 0,sl0
  101. BLOAD "gamecols.def",99,0,32
  102. SCREEN 0,288+64,96+32,3
  103. SCREEN 1,288+64,96+32,3
  104. SCREEN 2,288+64,96+32,3
  105. SCREEN 3,288+64,96+32,3
  106. SCREEN 4,320,28,3
  107. SCREEN 5,320+16,28,3
  108. SCREEN 6,1280+320,96,3
  109.  
  110. smart(0)=10:smart(1)=32:' smart bomb ascii's
  111. 'gmode=2:' game MODe. 0=solo, 1=team, 2=mean, 3=evil
  112. swave=1:' start wave
  113. wave=0
  114.  
  115. .newgame:
  116. gameova=0
  117. score(0)=0:score(1)=0
  118. lives(0)=-1:lives(1)=2
  119. IF gmode>0 THEN lives(0)=2
  120. smarts(0)=3:smarts(1)=3
  121. diff1=.5:diff2=.1:diff3=.999:diff4=.998
  122. diff5=2:diff6=1:diff7=8:diff8=256
  123. diff9=.995:diff10=.5:diff11=1:diff12=.96
  124. diff13=6:diff14=.99:diff15=10:diff16=5120:diff17=1024
  125. sl1=96+sl0+2:sl2=sl0+96+32
  126. SLICE 0,sl0
  127. USE SLICE 0:SPRITE 0:GOSUB colrmnts
  128. DISPLAY 288,96,0,1,1,0,6
  129. SHOWF 0,32,16:SHOWB 6
  130. SLICE 1,sl1:USE SLICE 1
  131. RGB 9,0,2,9
  132. DISPLAY 320,28,0,1,0,4,5
  133. SHOWF 4:SHOWB 5
  134. PLOAD "scancols.def",0,0,0
  135. USE SCREEN 4
  136. USE SCREEN 5:PLOAD "scorebar.def",0,0,8
  137. SLICE 2,sl2:USE SLICE 2:SPRITE 0:GOSUB colrmnts
  138. DISPLAY 288,96,0,1,1,2,6
  139. SHOWB 6:SHOWF 2,32,16
  140. GOSUB makemnts
  141. j=0 TO 2 STEP 2
  142. USE SLICE j
  143. IF j=2 OR gmode>0
  144.   a=0 TO 12 STEP2:RGB 15,15-a,15-a,15-a,a/2+16:NEXT:RGB 15,0,0,0,16+7
  145.   IF j=0
  146.     a=0 TO 12 STEP2:RGB 15,15,15-a,0,a/2+24:NEXT:RGB 15,0,0,0,24+7
  147.   ENDIF
  148.   a=0 TO 12 STEP2:RGB 15,15-a,15-a,15-a,a/2+32:NEXT:RGB 15,0,0,0,32+7
  149.   IF j=2
  150.     a=0 TO 12 STEP2:RGB 15,0,15-a,15,a/2+40:NEXT:RGB 15,0,0,0,40+7
  151.   ENDIF
  152. ENDIF
  153. a=0 TO 31:RGB a,0,0,0:NEXT
  154. NEXT:COLOUR 7:RGB 0,0,0,0,96
  155. USE SLICE 1
  156. j=0 TO 12 STEP 2:RGB 15,15,15-j,0,j/2:NEXT
  157. j=0 TO 12 STEP 2:RGB 15,0,15-j,15,j/2+16:NEXT
  158. humes=10
  159.  
  160. .newwave:
  161. VBLANK
  162. VWAIT:DMA 0:USE SCREEN 4:CLS
  163. a=0 TO 1
  164. md(a)=0:IF lives(a)>=0 THEN GOSUB newman
  165. NEXT
  166. GOSUB lshow
  167. '
  168. gowave:wave=wave+1
  169.  
  170. IF wave MOD5=0 THEN humes=10:GOSUB colrmnts
  171. '
  172. 'lander settings
  173. diff1=LIMIT(diff1+.125,0,12):diff2=LIMIT(diff2+.125,0,4)
  174. diff3=LIMIT(diff3-.001,.5,10)
  175. diff4=LIMIT(diff4-.001,.5,10):diff8=LIMIT(diff8-32,64,1024)
  176. diff7=LIMIT(diff7+4,0,25)
  177. '
  178. 'bomber settings
  179. diff10=LIMIT(diff10+.125,0,4):diff11=LIMIT(diff11+.25,0,6)
  180. diff12=LIMIT(diff12-.001,.5,10)
  181. '
  182. 'swarmer settings
  183. diff5=LIMIT(diff5+.25,0,6)
  184. diff6=LIMIT(diff6+.125,0,4)
  185. diff9=LIMIT(diff9-.001,.5,10)
  186. '
  187. 'baiter settings
  188. diff13=LIMIT(diff13+.25,0,12)
  189. diff14=LIMIT(diff14-.001,.5,10)
  190. diff15=LIMIT(diff15-.5,2,10)
  191. diff16=LIMIT(diff16-16,512,512)
  192. diff17=LIMIT(diff17-8,128,512)
  193.  
  194. IF wave<swave THEN GOTO gowave
  195. '
  196. GOSUB clraliens:aliens=diff7
  197. '
  198. IF humes=0
  199.   n=diff7:GOSUB addmutants:landleft=0
  200. ELSE
  201.   n=humes:GOSUB addhumes:landleft=diff7
  202. ENDIF
  203. n=wave-1:IF n>3 THEN n=3
  204. IF n>0 THEN GOSUB addpods
  205. n=wave-1 ASL1:IF n>5 THEN n=5
  206. IF n>0 THEN GOSUB addbomber
  207. '
  208. wt=0:bwait=diff16
  209. frame=1:anim1=0:anim1a=1:landin=diff8
  210. aland=0:pflag=1:space=0:mutants=0
  211. GOSUB drawmnts:GOSUB scoreup
  212. VWAIT:DMA 1
  213. VBLANK vrout
  214. IF gmode>0 THEN VWAIT:USE SLICE 0:FADEIN 0
  215. VWAIT:USE SLICE 2:FADEIN 0
  216.  
  217. .main:
  218. main2:IF frame>1 THEN GOTO main
  219. fref=1:VWAIT:frame=3
  220. '
  221. j=0 TO 1
  222. IF bang(j)>0
  223.   IF bang(j)=1
  224.     IF smarts(j)>0
  225.       USE SLICE j ASL1
  226.       RGB 0,15,15,15
  227.       bang(j)=2
  228.       smarts(j)=smarts(j)-1:pflag=1
  229.     ELSE
  230.       bang(j)=0
  231.     ENDIF
  232.   ELSE
  233.     USE SLICE j ASL1
  234.   RGB 0,0,0,0
  235.     bang(j)=0
  236.   ENDIF
  237. ENDIF
  238. NEXT
  239. '
  240. UNQUEUE db
  241. '
  242. IF landleft>0
  243.   IF aland=0 THEN GOTO runout
  244.   landin=landin-1
  245.   IF landin=0
  246.     runout
  247.     landin=diff8
  248.     n=landleft:IF n>4 THEN n=4
  249.     landleft=landleft-n
  250.     aland=aland+n
  251.     GOSUB addlanders
  252.   ENDIF
  253. ENDIF
  254. bwait=bwait-1
  255. IF bwait=0
  256.   bwait=diff17
  257.   GOSUB addbait
  258. ENDIF
  259. anim1=anim1+anim1a
  260. IF anim1=4 THEN anim1a=-anim1a
  261. IF anim1=0 THEN anim1a=-anim1a
  262. j=0 TO 78
  263. IF at(j)>0
  264.   IF at(j)<1024
  265.   IF at(j)<128
  266.     IF at(j)>4
  267.       l=0 TO 1
  268.       IF md(l)<>0
  269.         k=x2(l)+mx2(l):m=my(l)+16
  270.         IF ax(j)>k-9
  271.           IF ax(j)<k+16
  272.             IF ay(j)>m-4
  273.               IF ay(j)<m+7
  274.                 IF at(j)>4
  275.                   IF at(j)<9
  276.                     ouch:lshot=1-l
  277.                     aliens=aliens-1
  278.                     IF at(j)=5 THEN aland=aland-1
  279.                   ENDIF
  280.                 ENDIF
  281.                 SOUND 16,1
  282.                 k=j:GOSUB blowup
  283.               ENDIF
  284.             ENDIF
  285.           ENDIF
  286.         ENDIF
  287.       ENDIF
  288.       NEXT
  289.     ENDIF
  290.     osx=ax(j)ASR3+80:osy=LIMIT(ay(j)-16ASR2,0,23)+2
  291.     GOSUB alientab(at(j))
  292.     USE SCREEN 4
  293.     IF at(j)>127 THEN GOTO unplot
  294.     IF at(j)>0
  295.       k=ax(j)ASR3+80:l=LIMIT(ay(j)-16ASR2,0,23)+2
  296.       PLOT k,l,ac(j)
  297.       IF INT(k)<>INT(osx)
  298.         unplot
  299.         PLOT osx,osy,0
  300.         GOTO pdone
  301.       ENDIF
  302.       IF INT(l)<>INT(osy) THEN GOTO unplot
  303.     ELSE
  304.       GOTO unplot
  305.     ENDIF
  306.     pdone
  307.   ELSE
  308.     GOSUB sxget
  309.     s=ae(j):s2=s ASL1:n=as(j):GOSUB sxget:oay=ay(j)
  310.     GOSUB aline
  311.     ay(j)=LIMIT(oay-s,0,120)
  312.     GOSUB aline2
  313.     ay(j)=LIMIT(oay+s,0,120)
  314.     GOSUB aline2
  315.     ay(j)=oay
  316.     IF at(j)<256
  317.       ae(j)=s+2:IF ae(j)=64 THEN at(j)=0
  318.     ELSE
  319.       ae(j)=s-2:IF ae(j)=0 THEN at(j)=at(j) & 127
  320.     ENDIF
  321.   ENDIF
  322.   ENDIF
  323. ENDIF
  324. NEXT
  325. '
  326. IF pflag=1 THEN pflag=0:GOSUB lshow
  327. IF pscore=1 THEN pscore=0:GOSUB scoreup
  328. IF space>0
  329.   IF space=1
  330.     space=2:GOSUB gospace
  331.   ELSE
  332.     IF at(0)=0
  333.       space=0
  334.       k=0 TO 78:IF at(k)>1023 THEN at(k)=at(k)-1024
  335.       NEXT
  336.       n=mutants:GOSUB addmutants
  337.     ENDIF
  338.   ENDIF
  339. ENDIF
  340. IF space=1 THEN space=0:GOSUB gospace
  341. IF gmode>1
  342.   l=0 TO 1
  343.   IF killme(l)>0
  344.     IF gmode=2 THEN lives(l)=lives(l)+1
  345.     killme(l)=0:k=77+l:GOSUB blowup
  346.     ax(k)=x2(l)+mx2(l):ay(k)=my(l)+16
  347.   ENDIF
  348.   NEXT
  349. ENDIF
  350. IF JOYB(0)=2 THEN END
  351. IF aliens>0 THEN GOTO main
  352. wt=wt+1:IF wt<20 THEN GOTO main
  353. IF gameova=1 THEN GOTO gover
  354. IF wt=20 THEN lot=lshot:x2lot=x2(lot)
  355. k=74 TO 76:at(k)=0:NEXT
  356. USE SCREEN 6
  357. bon=wave*100:IF bon>500 THEN bon=500
  358. LOCATE x2lot LSR3+6,2
  359. PRINT "ATTACK WAVE ";wave;" COMPLETED"
  360. IF humes>0
  361.   LOCATE x2lot LSR3+12,4
  362.   PRINT "BONUS X ";bon
  363.   j=0:k=25 TO 34
  364.   ax(k)=j+x2lot+80:IF ax(k)>=1280 THEN ax(k)=ax(k)-1280
  365.   IF ax(k)<0 THEN ax(k)=ax(k)+1280
  366.   ay(k)=64
  367.   IF at(k)=2 THEN j=j+12:ad1(k)=0
  368.   NEXT
  369. ENDIF
  370. IF wt<80 THEN GOTO main
  371. sa=INT(bon/100)*humes:k=0 TO 1
  372. IF lives(k)>=0 THEN GOSUB addscore
  373. NEXT
  374. '
  375. gover:IF gmode>0 THEN VWAIT:USE SLICE 0:FADEOUT 0
  376. VWAIT:USE SLICE 2:FADEOUT 0:UNQUEUE 0:UNQUEUE 1:UNQUEUE 2
  377. IF gameova=0 THEN GOTO newwave
  378. VBLANK
  379. k=0 TO 6:FREE SCREEN k:NEXT:lshot=0
  380. j=1-SGN(gmode) TO 1
  381. m=0 TO 1
  382. k=0 TO 23
  383. IF score(j)>hiscores(m,k)
  384.   VWAIT:DMA 0
  385.   SLICE END:SLICE 0,sl0:SCREEN 0,320,224,3:DISPLAY 320,224,0,0,0,0:SHOW 0:USE SCREEN 0
  386.   RGB 2,0,0,8:RGB 5,15,15,15:RGB 6,15,15,15
  387.   c=8:a=1:y=56 TO 18*8
  388.   RGB 1,c,c,15,y:c=c+a
  389.   IF c=15 THEN a=-a
  390.   IF c=8 THEN a=-a
  391.   NEXT:COLOUR 1,0
  392.   LOCATE 16,7:PRINT "PLAYER ";j+1;
  393.   LOCATE 13,9:PRINT "CONGRATULATIONS";
  394.   LOCATE 9,11:PRINT "YOU HAVE QUALIFIED FOR";
  395.   IF m=0
  396.     LOCATE 9,13:PRINT "!THE BEST OF THE BEST!";
  397.   ELSE
  398.     LOCATE 13,13:PRINT "!TODAY!S BEST!";
  399.   ENDIF
  400.   LOCATE 9,15
  401.   PRINT "PLEASE ENTER YOUR NAME";
  402.   LOCATE 18,17:COLOUR 1,2:PRINT "   ";
  403.   LOCATE 16,17:VWAIT:DMA 1
  404.   n$=EDIT$("",8)
  405.   l=22
  406.   insloop
  407.   IF l>=k
  408.     hinames$(m,l+1)=hinames$(m,l):hiscores(m,l+1)=hiscores(m,l)
  409.      l=l-1:GOTO insloop
  410.   ENDIF
  411.   hinames$(m,k)=n$:hiscores(m,k)=score(j)
  412.   IF m=0 THEN lshot=1
  413.   k=23
  414. ENDIF
  415. NEXT
  416. NEXT
  417. NEXT
  418. IF lshot=1 THEN GOSUB savehis
  419. GOTO hiscores
  420.  
  421. clraliens
  422. j=0 TO 78:at(j)=0:NEXT:RETURN
  423.  
  424. lshow:' SHOW lives left
  425. pflag=0:USE SCREEN 5:UNQUEUE 2
  426. j=1-SGN(gmode) TO 1
  427. k=lives(j)
  428. IF k>0
  429.   ax=0:y=20:IF j=1 THEN ax=272:y=0
  430.   x=ax:IF k>12 THEN k=12
  431.   l=1 TO k
  432.   QBLIT 2,55,x,y:x=x+8
  433.   IF l=6 THEN x=ax:y=y+4
  434.   NEXT
  435. ENDIF
  436. k=smarts(j)
  437. IF k>0
  438.   IF k>6 THEN k=6
  439.   x=0:y=14:IF j=1 THEN x=272:y=10
  440.   l=1 TO k:QBLIT 2,56,x,y:x=x+8
  441.   NEXT
  442. ENDIF
  443. NEXT
  444. RETURN
  445.  
  446. .gospace:mutants=aland+landleft+mutants:landleft=0
  447. k=40 TO 47:IF at(k)<>4 THEN at(k)=0
  448. NEXT
  449. j=66 TO 73:IF at(k)<>4 THEN at(k)=0
  450. NEXT
  451. USE SCREEN 4:k=0 TO 76
  452. IF at(k)>0
  453.   IF at(k)<128
  454.     IF at(k)=5 THEN at(k)=0
  455.     PLOT ax(k)LSR 3+80,LIMIT(ay(k)-16LSR 2,0,23)+2,0
  456.     at(k)=at(k)| 1024
  457.   ENDIF
  458. ENDIF
  459. NEXT
  460. l=0 TO 1
  461. k=0 TO 9
  462. m=l*12+k
  463. ax(m)=k ASL 5+x2(l):IF ax(m)>=1280 THEN ax(m)=ax(m)-1280
  464. ay(m)=mh(ax(m))+16:at(m)=128:ae(m)=0:as(m)=INT(RND*7+37)
  465. ac(m)=0
  466. NEXT
  467. NEXT
  468. USE SCREEN 5:k=2 TO 25
  469. LINE 80,k,239,k,0:NEXT
  470. VBLANK:k=0 TO 2 STEP 2
  471. USE SLICE k:RGB 9,0,0,0:RGB 10,0,0,0:RGB 11,0,0,0
  472. NEXT:RGB 9+32,0,0,0:RGB 10+32,0,0,0:RGB 11+32,0,0,0
  473. VBLANK vrout:RETURN
  474.  
  475. blowup:
  476. ae(k)=x2(l)+144
  477. ac(k)=0:as(k)=l
  478. md(l)=0:mx(l)=320
  479. at(k)=4:ad1(k)=0:ad2(k)=0
  480. RETURN
  481.  
  482. scoreup:USE SCREEN 5
  483. IF gmode>0
  484.   LOCATE 0,0
  485.   PRINT INT(score(0));
  486.   ssk=score(0)-INT(score(0))
  487.   IF ssk=0
  488.     PRINT "00";
  489.   ELSE
  490.     PRINT ssk*100;
  491.   ENDIF
  492. ENDIF
  493. '
  494. LOCATE 33,2
  495. PRINT INT(score(1));
  496. ssk=score(1)-INT(score(1))
  497. IF ssk=0
  498.   PRINT "00";
  499. ELSE
  500.   PRINT ssk*100;
  501. ENDIF
  502. RETURN
  503.  
  504. aline2
  505. sx(0)=sx(0)-s2:sx(1)=sx(1)-s2
  506. aline
  507. GOSUB blim2
  508. sx(0)=sx(0)-s2:sx(1)=sx(1)-s2:GOSUB blim2
  509. sx(0)=s2 ASL1+sx(0):sx(1)=s2 ASL1+sx(1):GOTO blim2
  510.  
  511. sxget:k=0 TO 1:sx(k)=ax(j)-x2(k)
  512. IF sx(k)>=1280 THEN sx(k)=sx(k)-1280
  513. IF sx(k)<0 THEN sx(k)=sx(k)+1280
  514. NEXT:RETURN
  515.  
  516. alientab:TABLE dead,dead,humanoid,bonus,youdie,lander
  517. TABLE pod,swarmer,bomber,bullet,bomb,baiter
  518.  
  519. dead:RETURN
  520.  
  521. .youdie:
  522. GOSUB sxget
  523. IF ad2(j)=0
  524.   s=ad1(j)
  525.   k=0 TO 340 STEP 22.5
  526.   l=QSIN(k)*s:ay=LIMIT(QCOS(k)*s+ay(j),0,120)
  527.   n=0 TO 1
  528.   ax=sx(n)+l
  529.   IF ax>=0
  530.     IF ax<288
  531.       USE SCREEN n ASL1+db
  532.       QBLIT db,54,ax+32,ay
  533.     ENDIF
  534.   ENDIF
  535.   NEXT
  536.   NEXT
  537.   ad1(j)=s+4
  538.   IF s>90
  539.     l=as(j)
  540.     IF lives(l)=0
  541.       lives(l)=-1
  542.       IF lives(0)+lives(1)=-2
  543.         aliens=0:gameova=1
  544.       ENDIF
  545.       at(j)=0:USE SCREEN 6
  546.       LOCATE x2(l)LSR 3+10,l ASL 1+3
  547.       PRINT "GAME OVER PLAYER "l+1:RETURN
  548.     ELSE
  549.       ad2(j)=1:ax(j)=ae(j):ad1(j)=0:ay(j)=56
  550.       RETURN
  551.     ENDIF
  552.   ENDIF
  553.   RETURN
  554. ENDIF
  555. l=as(j)
  556. IF aliens=0
  557.   IF lives(l)>0 THEN GOTO reborn
  558.   at(j)=0:RETURN
  559. ENDIF
  560. '
  561. n=10-INT(ad1(j) LSR 4)
  562. IF n=0
  563.   reborn
  564.   killme(l)=0
  565.   USE SCREEN 6
  566.   LOCATE x2(l)LSR3+18,l ASL1+3:PRINT "  ";
  567.   pflag=1
  568.   lives(l)=lives(l)-1
  569.   at(j)=0:md(l)=1:mx(l)=144:mxs(l)=0:my(l)=40
  570.   mx2(l)=144
  571.   RETURN
  572. ENDIF
  573. IF JOYB(l)>0 THEN lf(l)=1:GOTO reborn
  574. USE SCREEN 6
  575. LOCATE x2(l)LSR3+18,l ASL1+3:PRINT n;" ";
  576. ad1(j)=ad1(j)+1:RETURN
  577.  
  578. .swarmer:
  579. GOSUB addx:GOSUB sxget
  580. ay(j)=ays(j)*ad2(j)+ay(j)
  581. GOSUB revchk
  582. ad2(j)=ad2(j)+ae(j)
  583. IF ABS(ad2(j))>2.5
  584.   ae(j)=-ae(j)
  585. ELSE
  586.   IF ABS(ad2(j))<-2.5
  587.     ae(j)=-ae(j)
  588.   ENDIF
  589. ENDIF
  590. IF ad1(j)=0
  591.   'should i go angry
  592.   k=0 TO 1
  593.   IF md(k)<>0
  594.     IF SGN(axs(j))<>md(k)
  595.       l=x2(k)+mx2(k)
  596.       IF l>ax(j)
  597.         IF md(k)=-1
  598.           IF l-ax(j)<80
  599.             angry:ad1(j)=20
  600.             axs(j)=axs(j)ASL1
  601.             SOUND 13,3
  602.             k=1
  603.           ENDIF
  604.         ENDIF
  605.       ELSE
  606.         IF md(k)=1
  607.           IF ax(j)-l<80 THEN GOTO angry
  608.         ENDIF
  609.       ENDIF
  610.     ENDIF
  611.   ENDIF
  612.   NEXT
  613. ELSE
  614.   ad1(j)=ad1(j)-1
  615.   IF ad1(j)=0
  616.     axs(j)=axs(j)ASR 1
  617.   ENDIF
  618.   IF RND>diff9 THEN GOSUB tryfire
  619. ENDIF
  620. swdone:
  621. n=20+anim1:GOSUB blim
  622. sa=1.00:GOSUB hitme
  623. n=41:GOTO killme
  624.  
  625. .bomb:ad1(j)=ad1(j)-1:IF ad1(j)=0 THEN at(j)=0:RETURN
  626. GOSUB sxget
  627. n=36:GOTO blim
  628.  
  629. baithome
  630. m=x2(l)+mx2(l)
  631. IF ax(k)<m
  632.   axs(k)=ABS(axs(k))
  633. ELSE
  634.   axs(k)=-ABS(axs(k))
  635. ENDIF
  636. IF ay(k)-16<my(l)
  637.   ays(k)=ABS(ays(k))
  638. ELSE
  639.   ays(k)=-ABS(ays(k))
  640. ENDIF
  641. RETURN
  642.  
  643. .baiter:
  644. GOSUB addx:GOSUB sxget
  645. ay(j)=ay(j)+ays(j):GOSUB revchk
  646. ad1(j)=ad1(j)-1
  647. IF ad1(j)=0
  648.   ad1(j)=diff15
  649.   l=ad2(j)
  650.   IF sx(l)<320
  651.     m=axs(j):axs(j)=ays(j):ays(j)=m
  652.   ENDIF
  653.   k=j:GOSUB baithome
  654. ENDIF
  655. IF RND>diff14 THEN GOSUB tryfire
  656. n=30+anim1:GOSUB blim
  657. sa=2.00:GOSUB hitme:n=43:GOTO killme2
  658.  
  659. .bomber:
  660. GOSUB addx:GOSUB sxget
  661. ay(j)=ays(j)*ad2(j)+ay(j)
  662. GOSUB revchk
  663. ad2(j)=ad2(j)+ad1(j)
  664. IF ABS(ad2(j))>diff11
  665.   ad1(j)=-ad1(j)
  666. ELSE
  667.   IF ABS(ad2(j))<-diff11
  668.     ad1(j)=-ad1(j)
  669.   ENDIF
  670. ENDIF
  671. bodone:
  672. IF RND>diff12 THEN GOSUB trybomb
  673. n=25+anim1:GOSUB blim
  674. sa=2.50:GOSUB hitme
  675. n=42:GOTO killme
  676.  
  677. revchk:IF ay(j)<16 THEN ay(j)=16:ays(j)=-ays(j)
  678. IF ay(j)>102 THEN ay(j)=102:ays(j)=-ays(j)
  679. RETURN
  680.  
  681. .pod:
  682. GOSUB addx:ay(j)=ay(j)+ays(j)
  683. GOSUB revchk
  684. GOSUB sxget
  685. n=15+anim1:GOSUB blim
  686. sa=10.00:GOSUB hitme
  687. n=INT(RND ASL 2)+1:GOSUB addswarm
  688. n=40:GOTO killme
  689.  
  690. .lander:
  691. l=ad2(j)
  692. IF ad1(j)=0:' cruising
  693.  
  694.   GOSUB addx
  695.   IF ABS(ax-ax(l))<4
  696.     ad1(j)=1
  697.     GOTO ldone
  698.   ENDIF
  699.   IF INT(ay(j))<mh(ax)-16 THEN ay(j)=ay(j)+ays(j)
  700.   IF INT(ay(j))>mh(ax)-16 THEN ay(j)=ay(j)-ays(j)
  701.   GOSUB humestill
  702.   GOTO ldone
  703. ENDIF
  704. IF ad1(j)=1:' going down...
  705.  
  706.   GOSUB humestill
  707.   IF ay(j)>ay(l)-12
  708.     SOUND 11,1
  709.     ad1(j)=2
  710.     ad2(l)=j
  711.     ad1(l)=1
  712.     GOTO ldone
  713.   ENDIF
  714.   ay(j)=ay(j)+ays(j)
  715.   GOTO ldone
  716. ENDIF
  717. IF ad1(j)=2:'picking up...
  718.  
  719.   IF at(l)<>2 THEN ad1(j)=0:GOTO ldone
  720.   ay(j)=ay(j)-ays(j)
  721.   IF ay(j)<8
  722.     ad1(j)=3:GOSUB pickman:ad2(j)=pgo4:ac(j)=3:' make mutant
  723.     aland=aland-1:mutants=mutants+1
  724.     axs(j)=ABS(axs(j)ASL1)
  725.   ENDIF
  726.   GOTO ldone
  727. ENDIF
  728. IF ad1(j)=3
  729.   IF ax(j)<x2(l)+mx2(l)
  730.     ax(j)=ax(j)+axs(j):m=-1
  731.   ELSE
  732.     ax(j)=ax(j)-axs(j):m=1
  733.   ENDIF
  734.   k=my(l)+16
  735.   IF m=md(l)
  736.     IF ABS(x2(l)+mx2(l)-ax(j))>ABS(k-ay(j))
  737.       goaway
  738.       ay(j)=LIMIT(ay(j)-(SGN(k-ay(j))*ays(j)),16,104)
  739.       GOTO mdone
  740.     ELSE
  741.       homein
  742.       ay(j)=LIMIT(SGN(k-ay(j))*ays(j)+ay(j),16,104)
  743.       GOTO mdone
  744.     ENDIF
  745.   ENDIF
  746.   GOTO homein
  747. mdone:
  748. IF ax(j)>=1280
  749.   ax(j)=ax(j)-1280
  750. ELSE
  751.   IF ax(j)<0
  752.     ax(j)=ax(j)+1280
  753.   ENDIF
  754. ENDIF
  755. GOSUB sxget
  756. IF RND>diff4 THEN GOSUB tryfire
  757. n=10+anim1:GOSUB blim
  758. sa=1.50:GOSUB hitme
  759. n=39:GOTO killme
  760. ENDIF
  761.  
  762. ldone:GOSUB sxget
  763. IF RND>diff3 THEN GOSUB tryfire
  764.  
  765. n=anim1:GOSUB blim
  766.  
  767. sa=1.50:GOSUB hitme:aland=aland-1
  768. IF ad1(j)=2
  769.   ae(ad2(j))=lshot
  770. ENDIF
  771. n=37:GOTO killme
  772.  
  773. pickman:pgo4=1-pgo4
  774. IF lives(pgo4)<0 THEN pgo4=1-pgo4
  775. RETURN
  776.  
  777. humestill:IF at(l)<>2 THEN GOTO newhume
  778. IF ad1(l)<>0 THEN GOTO newhume
  779. RETURN
  780.  
  781. newhume:POP RETURN:ad1(j)=0:k=j:GOSUB findhume
  782. GOTO ldone
  783.  
  784. addx:ax=ax(j)+axs(j):IF ax<0 THEN ax=ax+1280
  785. IF ax>=1280 THEN ax=ax-1280
  786. ax(j)=ax:RETURN
  787.  
  788. .humanoid:
  789. IF ad1(j)=1
  790.   l=ad2(j):IF at(l)<>5 THEN ad1(j)=2:ays(j)=0:SOUND 15,2:GOTO hdone
  791.   IF ad1(l)=3 THEN GOTO hdie
  792.   ay(j)=ay(j)-ays(l)
  793.   GOTO hdone
  794. ENDIF
  795. IF ad1(j)=2
  796.   ay(j)=ay(j)+ays(j)
  797.   IF ay(j)>=mh(ax(j))-HBLIT(5)+16
  798.     SOUND 17,2
  799.     n=44:GOSUB addbonus:sa=2.50:k=ae(j):GOSUB addscore
  800.     ad1(j)=0:GOTO hdone
  801.   ENDIF
  802.   k=0 TO 1
  803.   IF md(k)<>0
  804.     l=mo(k)+mx(k):IF l>=1280 THEN l=l-1280
  805.     IF ax(j)>=l-9
  806.       IF ax(j)<l+16
  807.         IF ay(j)>my(k)+7
  808.           IF ay(j)<my(k)+25
  809.             SOUND 17,2
  810.             n=49:GOSUB addbonus:sa=5.00:GOSUB addscore
  811.             ad1(j)=3:ad2(j)=k:k=1
  812.           ENDIF
  813.         ENDIF
  814.       ENDIF
  815.     ENDIF
  816.   ENDIF
  817.   NEXT
  818.   ays(j)=ays(j)+.05
  819.   GOTO hdone
  820. ENDIF
  821. IF ad1(j)=3
  822.   l=ad2(j):IF md(l)=0 THEN ad1(j)=2:ays(j)=0:GOTO hdone
  823.   ax(j)=x2(l)+mx2(l)+6
  824.   IF ax(j)>=1280
  825.     ax(j)=ax(j)-1280
  826.   ELSE
  827.     IF ax(j)<0
  828.       ax(j)=ax(j)+1280
  829.     ENDIF
  830.   ENDIF
  831.   ay(j)=my(l)+24
  832.   IF ay(j)>mh(ax(j))-HBLIT(5)+24
  833.     SOUND 17,2
  834.     n=49:GOSUB addbonus:sa=5.00:k=l:GOSUB addscore
  835.     ad1(j)=0:GOTO hdone
  836.   ENDIF
  837.   GOSUB sxget:n=5+anim1:GOTO blim
  838. ENDIF
  839. hdone:GOSUB sxget:n=5+anim1
  840. GOSUB blim
  841. sa=0:GOSUB hitme
  842. hdie:n=38:humes=humes-1:IF humes=0 THEN space=1
  843. GOTO killme2
  844. '
  845. killme:aliens=aliens-1
  846. killme2: 'set me TO exploding with pixel n
  847. at(j)=128:as(j)=n:ae(j)=0
  848. RETURN
  849.  
  850. bullet:
  851. ad1(j)=ad1(j)-1:IF ad1(j)=0 THEN at(j)=0:RETURN
  852. GOSUB addx
  853. ay(j)=LIMIT(ay(j)+ays(j),0,120)
  854. GOSUB sxget:n=35:GOTO blim
  855.  
  856. .bonus:
  857. ad1(j)=ad1(j)-1:IF ad1(j)=0 THEN at(j)=0:RETURN
  858. GOSUB addx
  859. ay(j)=LIMIT(ay(j)+ays(j),0,120)
  860. GOSUB sxget:n=ad2(j)+anim1:GOTO blim
  861.  
  862. .blim:' BLIT em (n)
  863. k=0 TO 1
  864. IF sx(k)<288
  865.   USE SCREEN k ASL1+db
  866.   QBLIT db,n,sx(k)+32,ay(j)
  867. ENDIF
  868. NEXT:RETURN
  869.  
  870. blim2
  871. k=0 TO 1
  872. IF sx(k)>=0
  873.   IF sx(k)<288
  874.     USE SCREEN k ASL1+db
  875.     QBLIT db,n,sx(k)+32,ay(j)
  876.   ENDIF
  877. ENDIF
  878. NEXT:RETURN
  879.  
  880. hitme:' POP me IF i'm not shot
  881. IF sx(0)>=288 THEN IF sx(1)>=288 THEN POP RETURN:RETURN
  882. kf=0:k=0 TO 1
  883. IF bang(k)=2
  884.   IF at(j)<>2
  885.     IF sx(k)<288
  886.       GOSUB kablam
  887.       GOTO nxt2
  888.     ENDIF
  889.   ENDIF
  890. ENDIF
  891. l=0 TO 2:bx2=bx(l,k):by2=by(l,k)+16
  892. IF ba(l,k)<>0
  893.   IF by2>=ay(j)
  894.     IF by2<ay(j)+10
  895.       IF bx2<sx(k)+10
  896.         IF bx2+16>sx(k)
  897.           GOSUB kablam
  898.           bx(l,k)=320
  899.           ba(l,k)=1
  900.         ENDIF
  901.       ENDIF
  902.     ENDIF
  903.   ENDIF
  904. ENDIF
  905. NEXT
  906. nxt2:NEXT:IF kf=0 THEN POP RETURN
  907. RETURN
  908.  
  909. kablam:GOSUB addscore
  910. lshot=k:kf=1:SOUND 14,2
  911. RETURN
  912.  
  913. addscore:'add sa TO score of player k
  914. oldt=INT(score(k)/100)
  915. pscore=1:score(k)=score(k)+sa
  916. IF INT(score(k)/100)>oldt
  917.   lives(k)=lives(k)+1:smarts(k)=smarts(k)+1
  918.   pflag=1
  919. ENDIF
  920. RETURN
  921.  
  922. .addbait:
  923. k=74 TO 76
  924. IF at(k)=0
  925.   at(k)=256+11
  926.   ax(k)=RND*1280
  927.   ay(k)=RND*48+40
  928.   axs(k)=RND+diff13
  929.   ays(k)=RND+diff13 ASR 1
  930.   ac(k)=3
  931.   ae(k)=64
  932.   as(k)=43
  933.   GOSUB pickman
  934.   ad2(k)=pgo4:l=pgo4
  935.   GOSUB baithome
  936.   ad1(k)=diff15
  937.   k=76
  938. ENDIF
  939. NEXT:RETURN
  940.  
  941. .addswarm:' add n swarmers
  942. kk2=-kk2
  943. k=51 TO 60
  944. IF at(k)=0
  945.   aliens=aliens+1
  946.   ac(k)=5
  947.   ax(k)=ax(j)
  948.   ay(k)=ay(j)
  949.   axs(k)=diff5+RND*kk2
  950.   ays(k)=diff6+RND
  951.   at(k)=7
  952.   ad1(k)=0
  953.   ad2(k)=1
  954.   ae(k)=.125
  955.   n=n-1:IF n=0 THEN k=60
  956. ENDIF
  957. NEXT:RETURN
  958.  
  959. .addbomber:' add n bombers
  960. kk=RND*1280:k2=RND ASL 1+2
  961. IF RND>.5 THEN k2=-k2
  962. k=61 TO 65
  963. IF at(k)=0
  964.   aliens=aliens+1
  965.   ac(k)=6
  966.   ax(k)=kk
  967.   kk=kk+32:IF kk>=1280 THEN kk=kk-1280
  968.   ay(k)=RND*48+40
  969.   axs(k)=k2
  970.   ays(k)=diff10+RND
  971.   at(k)=256+8
  972.   ae(k)=64
  973.   as(k)=42
  974.   ad2(k)=1
  975.   ad1(k)=.125
  976.   n=n-1:IF n=0 THEN k=65
  977. ENDIF
  978. NEXT:RETURN
  979.  
  980. .addpods:' add n pods
  981. k=48 TO 50
  982. IF at(k)=0
  983.   aliens=aliens+1
  984.   ac(k)=4
  985.   ax(k)=480+(RND*160)
  986.   ay(k)=RND*32+32
  987.   axs(k)=RND ASR1
  988.   IF RND>.5 THEN axs(k)=-axs(k)
  989.   ays(k)=RND ASR1
  990.   IF RND>.5 THEN ays(k)=-ays(k)
  991.   at(k)=256+6
  992.   ad1(k)=0
  993.   ad2(k)=0
  994.   ae(k)=64
  995.   as(k)=40
  996.   n=n-1:IF n=0 THEN k=50
  997. ENDIF
  998. NEXT:RETURN
  999.  
  1000. .addmutants
  1001. k=0 TO 24
  1002. IF at(k)=0
  1003.   ac(k)=3
  1004.   ax(k)=RND*1280
  1005.   ay(k)=32
  1006.   axs(k)=RND+diff1 ASL 1
  1007.   ays(k)=RND+diff2
  1008.   at(k)=256+5
  1009.   ad1(k)=3
  1010.   GOSUB pickman
  1011.   ad2(k)=pgo4
  1012.   ae(k)=64
  1013.   as(k)=39
  1014.   n=n-1:IF n=0 THEN k=24
  1015. ENDIF
  1016. NEXT:RETURN
  1017.  
  1018. .addlanders:' add n landers
  1019. k=0 TO 24
  1020. IF at(k)=0
  1021.   ac(k)=1
  1022.   ax(k)=RND*1280
  1023.   ay(k)=32
  1024.   axs(k)=RND+diff1
  1025.   IF RND>.5 THEN axs(k)=-axs(k)
  1026.   ays(k)=RND+diff2
  1027.   at(k)=256+5
  1028.   ad1(k)=0
  1029.   ad2(k)=0
  1030.   ae(k)=64
  1031.   as(k)=37
  1032.   GOSUB findhume
  1033.   n=n-1:IF n=0 THEN k=24
  1034. ENDIF
  1035. NEXT:RETURN
  1036.  
  1037. tryfire:'try TO fire a bullet at player
  1038. GOSUB pickman:IF sx(pgo4)>=288 THEN RETURN
  1039. '
  1040. addbullet:' add a bullet - pgo4 is player TO go FOR
  1041. k=40 TO 47
  1042. IF at(k)=0
  1043.   ax(k)=ax(j)
  1044.   ay(k)=ay(j)
  1045.   h=x2(pgo4)+mx2(pgo4)-ax(j)
  1046.   v=my(pgo4)+16-ay(j)
  1047.   IF ABS(v)>ABS(h)
  1048.     ays(k)=SGN(v)ASL3:axs(k)=ABS(h)/ABS(v)*SGN(h)ASL3
  1049.   ELSE
  1050.     axs(k)=SGN(h)ASL3:ays(k)=ABS(v)/ABS(h)*SGN(v)ASL3
  1051.   ENDIF
  1052.   ad1(k)=32
  1053.   at(k)=9
  1054.   k=47
  1055.   SOUND 12,3
  1056. ENDIF
  1057. NEXT:RETURN
  1058.  
  1059. trybomb
  1060. IF sx(0)<288 THEN GOTO addbomb
  1061. IF sx(1)>=288 THEN RETURN
  1062.  
  1063. addbomb
  1064. k=66 TO 73
  1065. IF at(k)=0
  1066.   ax(k)=ax(j)
  1067.   ay(k)=ay(j)
  1068.   ad1(k)=64
  1069.   at(k)=10
  1070.   k=73
  1071. ENDIF
  1072. NEXT:RETURN
  1073.  
  1074. findhume:' find a humanoid FOR lander k TO home in on.
  1075. ad2(k)=25:m=25 TO 34
  1076. IF at(m)=2
  1077.   IF ad1(m)=0
  1078.     ad2(k)=m:m=34
  1079.   ENDIF
  1080. ENDIF
  1081. NEXT
  1082. RETURN
  1083.  
  1084. addhumes:' add n humanoids
  1085. k=25 TO 34
  1086. IF at(k)=0
  1087.   ac(k)=2
  1088.   ax(k)=RND*1280
  1089.   ay(k)=mh(ax(k))-HBLIT(5)+16
  1090.   axs(k)=0
  1091.   ays(k)=0
  1092.   ad1(k)=0
  1093.   ad2(k)=0
  1094.   at(k)=2
  1095.   n=n-1
  1096.   IF n=0 THEN k=34
  1097. ENDIF
  1098. NEXT:RETURN
  1099.  
  1100. addbonus:' add a bonus
  1101. m=35 TO 39
  1102. IF at(m)=0
  1103.   at(m)=3
  1104.   ax(m)=ax(j)
  1105.   ay(m)=ay(j)
  1106.   axs(m)=RND ASL 1
  1107.   ays(m)=-RND
  1108.   ad1(m)=40
  1109.   ad2(m)=n
  1110.   m=39
  1111. ENDIF
  1112. NEXT
  1113. RETURN
  1114.  
  1115. newman:' start off man a
  1116. mo(a)=1280ASR1-144:mx(a)=80:my(a)=a ASL 5+32:mxs(a)=0:md(a)=1:ms(a)=1
  1117. RETURN
  1118.  
  1119. vrout
  1120.  
  1121. 'all the follwing happens in the vertical blank!
  1122. '
  1123. 'graphic intensive stuff below!
  1124.  
  1125. frame=frame-1
  1126. IF fref=1
  1127.   fref=0
  1128.   db=1-db
  1129.   x2(0)=mo(0):x2(1)=mo(1)
  1130.   xo2(0)=xo(0):xo2(1)=xo(1)
  1131.   xo(0)=0:xo(1)=0:mx2(0)=mx(0):mx2(1)=mx(1)
  1132. ENDIF
  1133. db2=1-db
  1134. USE SLICE 0:SPRITE ms(0),mx(0),my(0),0
  1135. SPRITE 4
  1136. IF md(1)<>0
  1137.   a=mo(1)+mx(1)-mo(0):IF a>=1280 THEN a=a-1280
  1138.   IF a<0 THEN a=a+1280
  1139.   IF a<320 THEN SPRITE ms(1),a,my(1),4
  1140. ENDIF
  1141. SHOWB 6,mo(0),0
  1142. SHOWF db2,xo2(0)+32,16
  1143. USE SLICE 2:SPRITE ms(1),mx(1),my(1),4
  1144. SPRITE 0
  1145. IF md(0)<>0
  1146.   a=mo(0)+mx(0)-mo(1):IF a>=1280 THEN a=a-1280
  1147.   IF a<0 THEN a=a+1280
  1148.   IF a<320 THEN SPRITE ms(0),a,my(0),0
  1149. ENDIF
  1150. SHOWB 6,mo(1),0
  1151. SHOWF db2+2,xo2(1)+32,16
  1152. a=0 TO 1:b=0 TO 2
  1153. IF ba(b,a)<>0
  1154.   jx=bx(b,a):jb=a ASL2+1+b
  1155.   USE SLICE a ASL1:SPRITE bs(b,a),jx,by(b,a),jb
  1156.   jx=mo(a)+jx-mo(1-a)
  1157.   IF jx>=1280
  1158.     jx=jx-1280
  1159.   ELSE
  1160.     IF jx<0 THEN jx=jx+1280
  1161.   ENDIF
  1162.   USE SLICE 1-a ASL1
  1163.   IF jx<288
  1164.     SPRITE bs(b,a),jx,by(b,a),jb
  1165.   ELSE
  1166.     SPRITE jb
  1167.   ENDIF
  1168. ENDIF
  1169. NEXT:NEXT
  1170. '
  1171. 'END of graphics
  1172. '
  1173. co=co+.5:asc=ASC(INKEY$)
  1174. a=0 TO 1
  1175. jb=JOYB(a):IF md(a)=0 THEN jb=0
  1176. IF jb>0
  1177.   IF lf(a)=1 THEN jb=0
  1178.   lf(a)=1
  1179. ELSE
  1180.   lf(a)=0
  1181. ENDIF
  1182. fl=0:ma=1-a
  1183. b=0 TO 2
  1184. IF ba(b,a)<>0
  1185.   bx=bx(b,a)+ba(b,a)
  1186.   IF bx<-15
  1187.     killbull
  1188.     bx=a ASL2+1+b:USE SLICE a ASL1:SPRITE bx
  1189.     USE SLICE ma ASL1:SPRITE bx
  1190.     ba(b,a)=0:GOTO morebull
  1191.   ENDIF
  1192.   IF bx>=288 THEN GOTO killbull
  1193.   IF gmode>1
  1194.     IF md(ma)<>0
  1195.       IF bx+16+mo(a)>mx(ma)+mo(ma)
  1196.         IF bx+mo(a)<mx(ma)+16+mo(ma)
  1197.           by=by(b,a)
  1198.           IF by>=my(ma)
  1199.             IF by<my(ma)+9
  1200.               killme(ma)=1:GOTO killbull
  1201.             ENDIF
  1202.           ENDIF
  1203.         ENDIF
  1204.       ENDIF
  1205.     ENDIF
  1206.   ENDIF
  1207.   bx(b,a)=bx
  1208.   ba(b,a)=ba(b,a)*1.05
  1209. ELSE
  1210.   IF jb>0
  1211.     SOUND 10,0
  1212.     bs(b,a)=17:IF md(a)<0 THEN bs(b,a)=18
  1213.     ba(b,a)=md(a)ASL 2
  1214.     bx(b,a)=mx(a)
  1215.     by(b,a)=my(a)+4
  1216.     jb=0
  1217.   ENDIF
  1218. ENDIF
  1219. morebull:NEXT
  1220. IF md(a)<>0
  1221. ma=0:ms(a)=a ASL2+2-md(a)
  1222. my(a)=LIMIT(JOYY(a)ASL 1+my(a),0,89)
  1223. jx=JOYX(a)
  1224. IF jx<>0
  1225.   IF jx=md(a)
  1226.     ms(a)=co &1+ms(a)+8
  1227.     IF md(a)>0
  1228.       IF mx(a)<>136
  1229.         ma=SGN(mx(a)-136)
  1230.         mx(a)=mx(a)-ma
  1231.       ENDIF
  1232.     ELSE
  1233.       IF mx(a)<>136
  1234.         ma=SGN(mx(a)-136)
  1235.         mx(a)=mx(a)-ma
  1236.       ENDIF
  1237.     ENDIF
  1238.     IF ABS(mxs(a))<7
  1239.       mxs(a)=md(a)ASR3+mxs(a)
  1240.         IF ABS(mxs(a))>6
  1241.           mxs(a)=mxs(a)-SGN(mxs(a))
  1242.         ENDIF
  1243.     ENDIF
  1244.   ELSE
  1245.     md(a)=jx
  1246.   ENDIF
  1247. ELSE
  1248.   mxs(a)=SGN(mxs(a))*LIMIT(ABS(mxs(a))-.05,0,32767)
  1249.   IF md(a)>0
  1250.     IF mx(a)>80
  1251.       mx(a)=mx(a)-2:ma=2
  1252.     ENDIF
  1253.   ELSE
  1254.     IF mx(a)<192
  1255.       mx(a)=mx(a)+2:ma=-2
  1256.     ENDIF
  1257.   ENDIF
  1258. ENDIF
  1259. ma=ma+mxs(a):mo=mo(a)+ma
  1260. xo(a)=xo(a)+ma
  1261. xo2(a)=xo2(a)+ma
  1262. IF mo>=1280 THEN mo=mo-1280
  1263. IF mo<0 THEN mo=mo+1280
  1264. mo(a)=mo
  1265. USE SLICE 1
  1266. ma=mo+mx(a):IF ma>=1280 THEN ma=ma-1280
  1267. SPRITE 19+a,ma ASR3+79,my(a)ASR2+1,a ASL1
  1268. IF asc=smart(a) THEN bang(a)=1
  1269. ELSE
  1270.   USE SLICE 1
  1271.   SPRITE a ASL1
  1272. ENDIF
  1273. NEXT
  1274. RETURN
  1275.  
  1276. colrmnts:'set mountain AND star COLOURs
  1277. RGB 9+32,9,9,0
  1278. RGB 10+32,6,6,0
  1279. RGB 11+32,3,3,0
  1280. RETURN
  1281.  
  1282. drawmnts:'draw mountains
  1283. USE SCREEN 6:CLS:IF humes=0 THEN RETURN
  1284. x=0 TO 1279
  1285. USE SCREEN 6
  1286. PLOT x,mh(x),1:PLOT x,mh(x)+1,2:PLOT x,mh(x)+2,3
  1287. IF x<320
  1288.   PLOT x+1280,mh(x),1
  1289.   PLOT x+1280,mh(x)+1,2
  1290.   PLOT x+1280,mh(x)+2,3
  1291. ENDIF
  1292. IF x & 7=0
  1293.   IF x=0
  1294.     osx=80:osy=mh(x) LSR2
  1295.   ELSE
  1296.     USE SCREEN 5
  1297.     LINE osx,osy,x LSR3+80,mh(x) LSR2,4
  1298.     osx=x LSR3+80:osy=mh(x) LSR2
  1299.   ENDIF
  1300. ENDIF
  1301. NEXT:RETURN
  1302.  
  1303. makemnts:'make up some random mountains
  1304. y=93:a=-2:t=1
  1305. x=0 TO 1279
  1306. mh(x)=y:IF x>1250 THEN y=LIMIT(y+2,0,93):GOTO mmdone
  1307. y=LIMIT(y+a,59,93)
  1308. t=t-1
  1309. IF t<=0
  1310.   t=RND*10:a=-a
  1311. ENDIF
  1312. mmdone
  1313. NEXT:RETURN
  1314.  
  1315. loadbl
  1316. RESTORE dblit
  1317. llp:READ a$:IF a$="" THEN RETURN
  1318. READ a:BLOAD p$+a$,a,1
  1319. GOTO llp
  1320.  
  1321. *dblit
  1322. DATA "lander.def",0
  1323. DATA "humanoid.def",5
  1324. DATA "mutant.def",10
  1325. DATA "pod.def",15
  1326. DATA "swarmer.def",20
  1327. DATA "bomber.def",25
  1328. DATA "baiter.def",30
  1329. DATA "bullet.def",35
  1330. DATA "bomb.def",36
  1331. DATA "landerpix.def",37
  1332. DATA "humanoidpix.def",38
  1333. DATA "mutantpix.def",39
  1334. DATA "podpix.def",40
  1335. DATA "swarmerpix.def",41
  1336. DATA "bomberpix.def",42
  1337. DATA "baiterpix.def",43
  1338. DATA "250.def",44
  1339. DATA "500.def",49
  1340. DATA "youpix.def",54
  1341. DATA "littleman.def",55
  1342. DATA "littlesmart.def",56
  1343. DATA "hi1.def",57
  1344. DATA "hi2.def",58
  1345. DATA "hi3.def",59
  1346. DATA "hi4.def",60
  1347. DATA "hi5.def",61
  1348. DATA "hi6.def",62
  1349. DATA "hi7.def",63
  1350. DATA "hi8.def",64
  1351. DATA "hi9.def",65
  1352. DATA "title.def",66
  1353. DATA "solo.def",74
  1354. DATA "team.def",75
  1355. DATA "mean.def",76
  1356. DATA "evil.def",77
  1357. DATA "cursor.def",78
  1358. DATA ""
  1359.  
  1360. loadsp
  1361. SPLOAD p$+"youright.def",1,16+32
  1362. SPLOAD p$+"youleft.def",3,20+32
  1363. SPLOAD p$+"you2right.def",5,24+32
  1364. SPLOAD p$+"you2left.def",7,28+32
  1365. SPLOAD p$+"yourightfire1.def",9,16+32
  1366. SPLOAD p$+"yourightfire2.def",10,20+32
  1367. SPLOAD p$+"youleftfire1.def",11
  1368. SPLOAD p$+"youleftfire2.def",12
  1369. SPLOAD p$+"you2rightfire1.def",13,24+32
  1370. SPLOAD p$+"you2rightfire2.def",14,28+32
  1371. SPLOAD p$+"you2leftfire1.def",15
  1372. SPLOAD p$+"you2leftfire2.def",16
  1373. SPLOAD p$+"yourfireright.def",17
  1374. SPLOAD p$+"yourfireleft.def",18
  1375. SPLOAD p$+"youscan.def",19
  1376. SPLOAD p$+"you2scan.def",20
  1377. RETURN
  1378.  
  1379. text:LOCATE 20-(LEN(t$)/2),CURSY:PRINT t$:PRINT:PRINT
  1380. SOUND 12,0:a=1 TO 100:VWAIT
  1381. IF JOYB(1)>0 THEN a=101
  1382. NEXT:IF a=101 THEN RETURN
  1383. POP RETURN:GOTO gameon
  1384.  
  1385. hishow:VWAIT:DMA 0:SLICE END:SLICE 0,sl0:COLOUR 7,5
  1386. SCREEN 0,320+16,224,3:DISPLAY 320,224,0,0,0,0:SHOW 0:USE SCREEN 0
  1387. c=8:a=1:y=0 TO 223 STEP 2
  1388. IF y<16
  1389.   RGB 7,15,c,0,y
  1390. ELSE
  1391.   RGB 7,0,c,15,y
  1392. ENDIF
  1393. c=c+a
  1394. IF c=15 THEN a=-a
  1395. IF c=8 THEN a=-a
  1396. NEXT
  1397. BLOAD "hicols.def",99,0,0
  1398. x=0 TO 1
  1399. k=x*20
  1400. BLIT 57,k ASL3,16:BLIT 59,k+19 ASL3,16
  1401. BLIT 63,k ASL3,27 ASL3:BLIT 65,k+19 ASL3,27 ASL3
  1402. a=1 TO 18
  1403. BLIT 58,k+a ASL3,16:BLIT 64,k+a ASL3,27 ASL3
  1404. NEXT
  1405. a=3 TO 26:BLIT 60,k ASL3,a ASL3
  1406. j=1 TO 18:BLIT 61,k+j ASL3,a ASL3:NEXT
  1407. BLIT 62,k+19 ASL3,a ASL3
  1408. NEXT
  1409. a=0 TO 23
  1410. LOCATE k+1,a+3:PRINT hinames$(x,a);
  1411. n$=STR$(INT(hiscores(x,a)))
  1412. n=hiscores(x,a)-INT(hiscores(x,a))*100
  1413. n$=n$+STR$(n):IF n=0 THEN n$=n$+"0"
  1414. LOCATE k+19-LEN(n$),a+3:PRINT n$;
  1415. NEXT
  1416. NEXT:COLOUR 7,0
  1417. LOCATE 2,0:PRINT "BEST OF THE BEST";
  1418. LOCATE 24,0:PRINT "TODAY!S BEST";
  1419. VWAIT:DMA 1:SOUND 16,0:RETURN
  1420.  
  1421. savehis:ERROR nowrite
  1422. OPEN p$+"hiscores.def",0,OUTPUT
  1423. OUTPUT 0
  1424. k=0 TO 23:PRINT hinames$(0,k):PRINT hiscores(0,k):NEXT
  1425. CLOSE
  1426. nowrite:RETURN
  1427.  
  1428. loadhis:ERROR there
  1429. OPEN p$+"hiscores.def",0,INPUT:INPUT 0
  1430. OPEN "nil:",1,OUTPUT:OUTPUT 1
  1431. k=0 TO 23
  1432. hinames$(0,k)=EDIT$("",8)
  1433. hiscores(0,k)=EDIT(0,8):NEXT
  1434. there:ERROR:CLOSE:RETURN
  1435. opts10,100,5,5,100,20,2048,80,1,0,0,0,1,
  1436.