home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
556b.lha
/
Defender
/
defender.src
< prev
next >
Wrap
Text File
|
1980-01-02
|
28KB
|
1,436 lines
'
' ***** DEFENDER *****
'
DIM mh(1279),mo(1),mx(1),my(1),mxs(1),md(1),ms(1),xo(1),x2(1),xo2(1)
DIM ax(99),ay(99),axs(99),ays(99),at(99),as(99),ae(99),ac(99)
DIM ad1(99),ad2(99)
DIM lf(1),mx2(1),lives(1),killme(1),score(1),smart(1),bang(1),smarts(1)
DIM bx(2,1),by(2,1),ba(2,1),bs(2,1),sx(1)
DIM hinames$(8,1,23),hiscores(1,23)
DMA 0:kk2=1
sl0=44-(NTSC*12)
p$=""
FLOAD p$+"font.def"
GOSUB loadhis
QUEUE 0,512:QUEUE 1,512
QUEUE 2,32
POINTER 0:SPRITE 0
GOSUB loadbl:GOSUB loadsp
a=1 TO 8:SLOAD p$+"sound"+STR$(a)+".def",a+9:NEXT
.intro:VWAIT:DMA 0:SLICE END:SLICE 0,sl0:COLOUR 1,0
k=0 TO 6:FREE SCREEN k:NEXT
SCREEN 0,320,224,3:SCREEN 1,320,224,3
SCREEN 2,320,224,3
DISPLAY 320,224,0,1,1,0,2:SHOWF 0:SHOWB 2
c=8:a=1:y=0 TO 63
RGB 1,c,15,0,y:c=c+a
IF c=15 THEN a=-a
IF c=8 THEN a=-a
NEXT:RGB 1,15,15,15,y:c=2:a=1
y=96 TO 130
RGB 0,c,c,c,y:c=c+a
IF c=8 THEN a=-a
IF c=2 THEN a=-a
NEXT:RGB 0,0,0,0,y:c=8:a=1
y=23*8 TO 28*8-1
RGB 1,c,c,15,y:c=c+a
IF c=15 THEN a=-a
IF c=8 THEN a=-a
NEXT
BLOAD "titlecols.def",99,0,0
BLOAD "gamecols.def",99,0,8
db=0:VWAIT:DMA 1
LOCATE 0,0:t$="MARK SIBLY":GOSUB text
t$="PROUDLY PRESENTS":GOSUB text
t$="A BLITZ BASIC PROGRAM.....":GOSUB text
SCREEN TO 1
intloop
SOUND 11,0:a=7 TO -1 STEP -1
b=1 TO 5:VWAIT:NEXT:SHOWF db:db=1-db:UNQUEUE db:USE SCREEN db
c=66+a:IF c<66 THEN c=66
QBLIT db,c,72,80
IF JOYB(1)>0 THEN a=-1
NEXT:SOUND 16,0
USE SCREEN 1-db
LOCATE 4,23:PRINT "LANDER 150 MUTANT 150 POD 1000";
LOCATE 3,27:PRINT "SWARMER 100 BOMBER 250 BAITER 200";
USE SCREEN 2:j=0
a=1 TO 250:b=1 TO 3:VWAIT:NEXT:UNQUEUE 2
y=0 TO 1:x=0 TO 2
c=y*3+x*5:IF c>0 THEN c=c+5
QBLIT 2,c+j,x *96+60,y ASL 5+172
j=j+1:IF j=5 THEN j=0
NEXT:NEXT
IF JOYB(1)>0 THEN a=251
NEXT:IF a=252 THEN GOTO gameon
.hiscores
GOSUB hishow
a=1 TO 500:VWAIT
IF JOYB(1)>0 THEN a=501
NEXT:IF a=501 THEN GOTO intro
.gameon:VWAIT:DMA 0:SLICE END:SLICE 0,sl0
SCREEN 0,320,224,3
DISPLAY 320,224,0,0,0,0:SHOW 0:USE SCREEN 0
BLOAD "modecols.def",99,0,0
y=0 TO 3:BLIT y+74,135,y*40+24:NEXT
c=8:a=1:y=192 TO 199
RGB 1,c,c,0,y:c=c+a:IF c=15 THEN a=-a
IF c=8 THEN a=-a
NEXT
COLOUR 1,0:LOCATE 12,24:PRINT "SELECT GAME MODE"
gmode=1
jw2:IF JOYB(1)<>0 THEN GOTO jw2
VWAIT:DMA 1
gonl:BLIT 78,131,gmode*40+20
jw:IF JOYB(1)<>0 THEN GOTO allgo
jy=JOYY(1)
IF jy<>0
BMODE 3:BLIT 78,131,gmode*40+20:BMODE 0
gmode=gmode+jy & 3
joywait:VWAIT
IF JOYY(1)<>0 THEN GOTO joywait
GOTO gonl
ENDIF
GOTO jw
.allgo:VWAIT:DMA 0:SLICE END:SLICE 0,sl0
BLOAD "gamecols.def",99,0,32
SCREEN 0,288+64,96+32,3
SCREEN 1,288+64,96+32,3
SCREEN 2,288+64,96+32,3
SCREEN 3,288+64,96+32,3
SCREEN 4,320,28,3
SCREEN 5,320+16,28,3
SCREEN 6,1280+320,96,3
smart(0)=10:smart(1)=32:' smart bomb ascii's
'gmode=2:' game MODe. 0=solo, 1=team, 2=mean, 3=evil
swave=1:' start wave
wave=0
.newgame:
gameova=0
score(0)=0:score(1)=0
lives(0)=-1:lives(1)=2
IF gmode>0 THEN lives(0)=2
smarts(0)=3:smarts(1)=3
diff1=.5:diff2=.1:diff3=.999:diff4=.998
diff5=2:diff6=1:diff7=8:diff8=256
diff9=.995:diff10=.5:diff11=1:diff12=.96
diff13=6:diff14=.99:diff15=10:diff16=5120:diff17=1024
sl1=96+sl0+2:sl2=sl0+96+32
SLICE 0,sl0
USE SLICE 0:SPRITE 0:GOSUB colrmnts
DISPLAY 288,96,0,1,1,0,6
SHOWF 0,32,16:SHOWB 6
SLICE 1,sl1:USE SLICE 1
RGB 9,0,2,9
DISPLAY 320,28,0,1,0,4,5
SHOWF 4:SHOWB 5
PLOAD "scancols.def",0,0,0
USE SCREEN 4
USE SCREEN 5:PLOAD "scorebar.def",0,0,8
SLICE 2,sl2:USE SLICE 2:SPRITE 0:GOSUB colrmnts
DISPLAY 288,96,0,1,1,2,6
SHOWB 6:SHOWF 2,32,16
GOSUB makemnts
j=0 TO 2 STEP 2
USE SLICE j
IF j=2 OR gmode>0
a=0 TO 12 STEP2:RGB 15,15-a,15-a,15-a,a/2+16:NEXT:RGB 15,0,0,0,16+7
IF j=0
a=0 TO 12 STEP2:RGB 15,15,15-a,0,a/2+24:NEXT:RGB 15,0,0,0,24+7
ENDIF
a=0 TO 12 STEP2:RGB 15,15-a,15-a,15-a,a/2+32:NEXT:RGB 15,0,0,0,32+7
IF j=2
a=0 TO 12 STEP2:RGB 15,0,15-a,15,a/2+40:NEXT:RGB 15,0,0,0,40+7
ENDIF
ENDIF
a=0 TO 31:RGB a,0,0,0:NEXT
NEXT:COLOUR 7:RGB 0,0,0,0,96
USE SLICE 1
j=0 TO 12 STEP 2:RGB 15,15,15-j,0,j/2:NEXT
j=0 TO 12 STEP 2:RGB 15,0,15-j,15,j/2+16:NEXT
humes=10
.newwave:
VBLANK
VWAIT:DMA 0:USE SCREEN 4:CLS
a=0 TO 1
md(a)=0:IF lives(a)>=0 THEN GOSUB newman
NEXT
GOSUB lshow
'
gowave:wave=wave+1
IF wave MOD5=0 THEN humes=10:GOSUB colrmnts
'
'lander settings
diff1=LIMIT(diff1+.125,0,12):diff2=LIMIT(diff2+.125,0,4)
diff3=LIMIT(diff3-.001,.5,10)
diff4=LIMIT(diff4-.001,.5,10):diff8=LIMIT(diff8-32,64,1024)
diff7=LIMIT(diff7+4,0,25)
'
'bomber settings
diff10=LIMIT(diff10+.125,0,4):diff11=LIMIT(diff11+.25,0,6)
diff12=LIMIT(diff12-.001,.5,10)
'
'swarmer settings
diff5=LIMIT(diff5+.25,0,6)
diff6=LIMIT(diff6+.125,0,4)
diff9=LIMIT(diff9-.001,.5,10)
'
'baiter settings
diff13=LIMIT(diff13+.25,0,12)
diff14=LIMIT(diff14-.001,.5,10)
diff15=LIMIT(diff15-.5,2,10)
diff16=LIMIT(diff16-16,512,512)
diff17=LIMIT(diff17-8,128,512)
IF wave<swave THEN GOTO gowave
'
GOSUB clraliens:aliens=diff7
'
IF humes=0
n=diff7:GOSUB addmutants:landleft=0
ELSE
n=humes:GOSUB addhumes:landleft=diff7
ENDIF
n=wave-1:IF n>3 THEN n=3
IF n>0 THEN GOSUB addpods
n=wave-1 ASL1:IF n>5 THEN n=5
IF n>0 THEN GOSUB addbomber
'
wt=0:bwait=diff16
frame=1:anim1=0:anim1a=1:landin=diff8
aland=0:pflag=1:space=0:mutants=0
GOSUB drawmnts:GOSUB scoreup
VWAIT:DMA 1
VBLANK vrout
IF gmode>0 THEN VWAIT:USE SLICE 0:FADEIN 0
VWAIT:USE SLICE 2:FADEIN 0
.main:
main2:IF frame>1 THEN GOTO main
fref=1:VWAIT:frame=3
'
j=0 TO 1
IF bang(j)>0
IF bang(j)=1
IF smarts(j)>0
USE SLICE j ASL1
RGB 0,15,15,15
bang(j)=2
smarts(j)=smarts(j)-1:pflag=1
ELSE
bang(j)=0
ENDIF
ELSE
USE SLICE j ASL1
RGB 0,0,0,0
bang(j)=0
ENDIF
ENDIF
NEXT
'
UNQUEUE db
'
IF landleft>0
IF aland=0 THEN GOTO runout
landin=landin-1
IF landin=0
runout
landin=diff8
n=landleft:IF n>4 THEN n=4
landleft=landleft-n
aland=aland+n
GOSUB addlanders
ENDIF
ENDIF
bwait=bwait-1
IF bwait=0
bwait=diff17
GOSUB addbait
ENDIF
anim1=anim1+anim1a
IF anim1=4 THEN anim1a=-anim1a
IF anim1=0 THEN anim1a=-anim1a
j=0 TO 78
IF at(j)>0
IF at(j)<1024
IF at(j)<128
IF at(j)>4
l=0 TO 1
IF md(l)<>0
k=x2(l)+mx2(l):m=my(l)+16
IF ax(j)>k-9
IF ax(j)<k+16
IF ay(j)>m-4
IF ay(j)<m+7
IF at(j)>4
IF at(j)<9
ouch:lshot=1-l
aliens=aliens-1
IF at(j)=5 THEN aland=aland-1
ENDIF
ENDIF
SOUND 16,1
k=j:GOSUB blowup
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
NEXT
ENDIF
osx=ax(j)ASR3+80:osy=LIMIT(ay(j)-16ASR2,0,23)+2
GOSUB alientab(at(j))
USE SCREEN 4
IF at(j)>127 THEN GOTO unplot
IF at(j)>0
k=ax(j)ASR3+80:l=LIMIT(ay(j)-16ASR2,0,23)+2
PLOT k,l,ac(j)
IF INT(k)<>INT(osx)
unplot
PLOT osx,osy,0
GOTO pdone
ENDIF
IF INT(l)<>INT(osy) THEN GOTO unplot
ELSE
GOTO unplot
ENDIF
pdone
ELSE
GOSUB sxget
s=ae(j):s2=s ASL1:n=as(j):GOSUB sxget:oay=ay(j)
GOSUB aline
ay(j)=LIMIT(oay-s,0,120)
GOSUB aline2
ay(j)=LIMIT(oay+s,0,120)
GOSUB aline2
ay(j)=oay
IF at(j)<256
ae(j)=s+2:IF ae(j)=64 THEN at(j)=0
ELSE
ae(j)=s-2:IF ae(j)=0 THEN at(j)=at(j) & 127
ENDIF
ENDIF
ENDIF
ENDIF
NEXT
'
IF pflag=1 THEN pflag=0:GOSUB lshow
IF pscore=1 THEN pscore=0:GOSUB scoreup
IF space>0
IF space=1
space=2:GOSUB gospace
ELSE
IF at(0)=0
space=0
k=0 TO 78:IF at(k)>1023 THEN at(k)=at(k)-1024
NEXT
n=mutants:GOSUB addmutants
ENDIF
ENDIF
ENDIF
IF space=1 THEN space=0:GOSUB gospace
IF gmode>1
l=0 TO 1
IF killme(l)>0
IF gmode=2 THEN lives(l)=lives(l)+1
killme(l)=0:k=77+l:GOSUB blowup
ax(k)=x2(l)+mx2(l):ay(k)=my(l)+16
ENDIF
NEXT
ENDIF
IF JOYB(0)=2 THEN END
IF aliens>0 THEN GOTO main
wt=wt+1:IF wt<20 THEN GOTO main
IF gameova=1 THEN GOTO gover
IF wt=20 THEN lot=lshot:x2lot=x2(lot)
k=74 TO 76:at(k)=0:NEXT
USE SCREEN 6
bon=wave*100:IF bon>500 THEN bon=500
LOCATE x2lot LSR3+6,2
PRINT "ATTACK WAVE ";wave;" COMPLETED"
IF humes>0
LOCATE x2lot LSR3+12,4
PRINT "BONUS X ";bon
j=0:k=25 TO 34
ax(k)=j+x2lot+80:IF ax(k)>=1280 THEN ax(k)=ax(k)-1280
IF ax(k)<0 THEN ax(k)=ax(k)+1280
ay(k)=64
IF at(k)=2 THEN j=j+12:ad1(k)=0
NEXT
ENDIF
IF wt<80 THEN GOTO main
sa=INT(bon/100)*humes:k=0 TO 1
IF lives(k)>=0 THEN GOSUB addscore
NEXT
'
gover:IF gmode>0 THEN VWAIT:USE SLICE 0:FADEOUT 0
VWAIT:USE SLICE 2:FADEOUT 0:UNQUEUE 0:UNQUEUE 1:UNQUEUE 2
IF gameova=0 THEN GOTO newwave
VBLANK
k=0 TO 6:FREE SCREEN k:NEXT:lshot=0
j=1-SGN(gmode) TO 1
m=0 TO 1
k=0 TO 23
IF score(j)>hiscores(m,k)
VWAIT:DMA 0
SLICE END:SLICE 0,sl0:SCREEN 0,320,224,3:DISPLAY 320,224,0,0,0,0:SHOW 0:USE SCREEN 0
RGB 2,0,0,8:RGB 5,15,15,15:RGB 6,15,15,15
c=8:a=1:y=56 TO 18*8
RGB 1,c,c,15,y:c=c+a
IF c=15 THEN a=-a
IF c=8 THEN a=-a
NEXT:COLOUR 1,0
LOCATE 16,7:PRINT "PLAYER ";j+1;
LOCATE 13,9:PRINT "CONGRATULATIONS";
LOCATE 9,11:PRINT "YOU HAVE QUALIFIED FOR";
IF m=0
LOCATE 9,13:PRINT "!THE BEST OF THE BEST!";
ELSE
LOCATE 13,13:PRINT "!TODAY!S BEST!";
ENDIF
LOCATE 9,15
PRINT "PLEASE ENTER YOUR NAME";
LOCATE 18,17:COLOUR 1,2:PRINT " ";
LOCATE 16,17:VWAIT:DMA 1
n$=EDIT$("",8)
l=22
insloop
IF l>=k
hinames$(m,l+1)=hinames$(m,l):hiscores(m,l+1)=hiscores(m,l)
l=l-1:GOTO insloop
ENDIF
hinames$(m,k)=n$:hiscores(m,k)=score(j)
IF m=0 THEN lshot=1
k=23
ENDIF
NEXT
NEXT
NEXT
IF lshot=1 THEN GOSUB savehis
GOTO hiscores
clraliens
j=0 TO 78:at(j)=0:NEXT:RETURN
lshow:' SHOW lives left
pflag=0:USE SCREEN 5:UNQUEUE 2
j=1-SGN(gmode) TO 1
k=lives(j)
IF k>0
ax=0:y=20:IF j=1 THEN ax=272:y=0
x=ax:IF k>12 THEN k=12
l=1 TO k
QBLIT 2,55,x,y:x=x+8
IF l=6 THEN x=ax:y=y+4
NEXT
ENDIF
k=smarts(j)
IF k>0
IF k>6 THEN k=6
x=0:y=14:IF j=1 THEN x=272:y=10
l=1 TO k:QBLIT 2,56,x,y:x=x+8
NEXT
ENDIF
NEXT
RETURN
.gospace:mutants=aland+landleft+mutants:landleft=0
k=40 TO 47:IF at(k)<>4 THEN at(k)=0
NEXT
j=66 TO 73:IF at(k)<>4 THEN at(k)=0
NEXT
USE SCREEN 4:k=0 TO 76
IF at(k)>0
IF at(k)<128
IF at(k)=5 THEN at(k)=0
PLOT ax(k)LSR 3+80,LIMIT(ay(k)-16LSR 2,0,23)+2,0
at(k)=at(k)| 1024
ENDIF
ENDIF
NEXT
l=0 TO 1
k=0 TO 9
m=l*12+k
ax(m)=k ASL 5+x2(l):IF ax(m)>=1280 THEN ax(m)=ax(m)-1280
ay(m)=mh(ax(m))+16:at(m)=128:ae(m)=0:as(m)=INT(RND*7+37)
ac(m)=0
NEXT
NEXT
USE SCREEN 5:k=2 TO 25
LINE 80,k,239,k,0:NEXT
VBLANK:k=0 TO 2 STEP 2
USE SLICE k:RGB 9,0,0,0:RGB 10,0,0,0:RGB 11,0,0,0
NEXT:RGB 9+32,0,0,0:RGB 10+32,0,0,0:RGB 11+32,0,0,0
VBLANK vrout:RETURN
blowup:
ae(k)=x2(l)+144
ac(k)=0:as(k)=l
md(l)=0:mx(l)=320
at(k)=4:ad1(k)=0:ad2(k)=0
RETURN
scoreup:USE SCREEN 5
IF gmode>0
LOCATE 0,0
PRINT INT(score(0));
ssk=score(0)-INT(score(0))
IF ssk=0
PRINT "00";
ELSE
PRINT ssk*100;
ENDIF
ENDIF
'
LOCATE 33,2
PRINT INT(score(1));
ssk=score(1)-INT(score(1))
IF ssk=0
PRINT "00";
ELSE
PRINT ssk*100;
ENDIF
RETURN
aline2
sx(0)=sx(0)-s2:sx(1)=sx(1)-s2
aline
GOSUB blim2
sx(0)=sx(0)-s2:sx(1)=sx(1)-s2:GOSUB blim2
sx(0)=s2 ASL1+sx(0):sx(1)=s2 ASL1+sx(1):GOTO blim2
sxget:k=0 TO 1:sx(k)=ax(j)-x2(k)
IF sx(k)>=1280 THEN sx(k)=sx(k)-1280
IF sx(k)<0 THEN sx(k)=sx(k)+1280
NEXT:RETURN
alientab:TABLE dead,dead,humanoid,bonus,youdie,lander
TABLE pod,swarmer,bomber,bullet,bomb,baiter
dead:RETURN
.youdie:
GOSUB sxget
IF ad2(j)=0
s=ad1(j)
k=0 TO 340 STEP 22.5
l=QSIN(k)*s:ay=LIMIT(QCOS(k)*s+ay(j),0,120)
n=0 TO 1
ax=sx(n)+l
IF ax>=0
IF ax<288
USE SCREEN n ASL1+db
QBLIT db,54,ax+32,ay
ENDIF
ENDIF
NEXT
NEXT
ad1(j)=s+4
IF s>90
l=as(j)
IF lives(l)=0
lives(l)=-1
IF lives(0)+lives(1)=-2
aliens=0:gameova=1
ENDIF
at(j)=0:USE SCREEN 6
LOCATE x2(l)LSR 3+10,l ASL 1+3
PRINT "GAME OVER PLAYER "l+1:RETURN
ELSE
ad2(j)=1:ax(j)=ae(j):ad1(j)=0:ay(j)=56
RETURN
ENDIF
ENDIF
RETURN
ENDIF
l=as(j)
IF aliens=0
IF lives(l)>0 THEN GOTO reborn
at(j)=0:RETURN
ENDIF
'
n=10-INT(ad1(j) LSR 4)
IF n=0
reborn
killme(l)=0
USE SCREEN 6
LOCATE x2(l)LSR3+18,l ASL1+3:PRINT " ";
pflag=1
lives(l)=lives(l)-1
at(j)=0:md(l)=1:mx(l)=144:mxs(l)=0:my(l)=40
mx2(l)=144
RETURN
ENDIF
IF JOYB(l)>0 THEN lf(l)=1:GOTO reborn
USE SCREEN 6
LOCATE x2(l)LSR3+18,l ASL1+3:PRINT n;" ";
ad1(j)=ad1(j)+1:RETURN
.swarmer:
GOSUB addx:GOSUB sxget
ay(j)=ays(j)*ad2(j)+ay(j)
GOSUB revchk
ad2(j)=ad2(j)+ae(j)
IF ABS(ad2(j))>2.5
ae(j)=-ae(j)
ELSE
IF ABS(ad2(j))<-2.5
ae(j)=-ae(j)
ENDIF
ENDIF
IF ad1(j)=0
'should i go angry
k=0 TO 1
IF md(k)<>0
IF SGN(axs(j))<>md(k)
l=x2(k)+mx2(k)
IF l>ax(j)
IF md(k)=-1
IF l-ax(j)<80
angry:ad1(j)=20
axs(j)=axs(j)ASL1
SOUND 13,3
k=1
ENDIF
ENDIF
ELSE
IF md(k)=1
IF ax(j)-l<80 THEN GOTO angry
ENDIF
ENDIF
ENDIF
ENDIF
NEXT
ELSE
ad1(j)=ad1(j)-1
IF ad1(j)=0
axs(j)=axs(j)ASR 1
ENDIF
IF RND>diff9 THEN GOSUB tryfire
ENDIF
swdone:
n=20+anim1:GOSUB blim
sa=1.00:GOSUB hitme
n=41:GOTO killme
.bomb:ad1(j)=ad1(j)-1:IF ad1(j)=0 THEN at(j)=0:RETURN
GOSUB sxget
n=36:GOTO blim
baithome
m=x2(l)+mx2(l)
IF ax(k)<m
axs(k)=ABS(axs(k))
ELSE
axs(k)=-ABS(axs(k))
ENDIF
IF ay(k)-16<my(l)
ays(k)=ABS(ays(k))
ELSE
ays(k)=-ABS(ays(k))
ENDIF
RETURN
.baiter:
GOSUB addx:GOSUB sxget
ay(j)=ay(j)+ays(j):GOSUB revchk
ad1(j)=ad1(j)-1
IF ad1(j)=0
ad1(j)=diff15
l=ad2(j)
IF sx(l)<320
m=axs(j):axs(j)=ays(j):ays(j)=m
ENDIF
k=j:GOSUB baithome
ENDIF
IF RND>diff14 THEN GOSUB tryfire
n=30+anim1:GOSUB blim
sa=2.00:GOSUB hitme:n=43:GOTO killme2
.bomber:
GOSUB addx:GOSUB sxget
ay(j)=ays(j)*ad2(j)+ay(j)
GOSUB revchk
ad2(j)=ad2(j)+ad1(j)
IF ABS(ad2(j))>diff11
ad1(j)=-ad1(j)
ELSE
IF ABS(ad2(j))<-diff11
ad1(j)=-ad1(j)
ENDIF
ENDIF
bodone:
IF RND>diff12 THEN GOSUB trybomb
n=25+anim1:GOSUB blim
sa=2.50:GOSUB hitme
n=42:GOTO killme
revchk:IF ay(j)<16 THEN ay(j)=16:ays(j)=-ays(j)
IF ay(j)>102 THEN ay(j)=102:ays(j)=-ays(j)
RETURN
.pod:
GOSUB addx:ay(j)=ay(j)+ays(j)
GOSUB revchk
GOSUB sxget
n=15+anim1:GOSUB blim
sa=10.00:GOSUB hitme
n=INT(RND ASL 2)+1:GOSUB addswarm
n=40:GOTO killme
.lander:
l=ad2(j)
IF ad1(j)=0:' cruising
GOSUB addx
IF ABS(ax-ax(l))<4
ad1(j)=1
GOTO ldone
ENDIF
IF INT(ay(j))<mh(ax)-16 THEN ay(j)=ay(j)+ays(j)
IF INT(ay(j))>mh(ax)-16 THEN ay(j)=ay(j)-ays(j)
GOSUB humestill
GOTO ldone
ENDIF
IF ad1(j)=1:' going down...
GOSUB humestill
IF ay(j)>ay(l)-12
SOUND 11,1
ad1(j)=2
ad2(l)=j
ad1(l)=1
GOTO ldone
ENDIF
ay(j)=ay(j)+ays(j)
GOTO ldone
ENDIF
IF ad1(j)=2:'picking up...
IF at(l)<>2 THEN ad1(j)=0:GOTO ldone
ay(j)=ay(j)-ays(j)
IF ay(j)<8
ad1(j)=3:GOSUB pickman:ad2(j)=pgo4:ac(j)=3:' make mutant
aland=aland-1:mutants=mutants+1
axs(j)=ABS(axs(j)ASL1)
ENDIF
GOTO ldone
ENDIF
IF ad1(j)=3
IF ax(j)<x2(l)+mx2(l)
ax(j)=ax(j)+axs(j):m=-1
ELSE
ax(j)=ax(j)-axs(j):m=1
ENDIF
k=my(l)+16
IF m=md(l)
IF ABS(x2(l)+mx2(l)-ax(j))>ABS(k-ay(j))
goaway
ay(j)=LIMIT(ay(j)-(SGN(k-ay(j))*ays(j)),16,104)
GOTO mdone
ELSE
homein
ay(j)=LIMIT(SGN(k-ay(j))*ays(j)+ay(j),16,104)
GOTO mdone
ENDIF
ENDIF
GOTO homein
mdone:
IF ax(j)>=1280
ax(j)=ax(j)-1280
ELSE
IF ax(j)<0
ax(j)=ax(j)+1280
ENDIF
ENDIF
GOSUB sxget
IF RND>diff4 THEN GOSUB tryfire
n=10+anim1:GOSUB blim
sa=1.50:GOSUB hitme
n=39:GOTO killme
ENDIF
ldone:GOSUB sxget
IF RND>diff3 THEN GOSUB tryfire
n=anim1:GOSUB blim
sa=1.50:GOSUB hitme:aland=aland-1
IF ad1(j)=2
ae(ad2(j))=lshot
ENDIF
n=37:GOTO killme
pickman:pgo4=1-pgo4
IF lives(pgo4)<0 THEN pgo4=1-pgo4
RETURN
humestill:IF at(l)<>2 THEN GOTO newhume
IF ad1(l)<>0 THEN GOTO newhume
RETURN
newhume:POP RETURN:ad1(j)=0:k=j:GOSUB findhume
GOTO ldone
addx:ax=ax(j)+axs(j):IF ax<0 THEN ax=ax+1280
IF ax>=1280 THEN ax=ax-1280
ax(j)=ax:RETURN
.humanoid:
IF ad1(j)=1
l=ad2(j):IF at(l)<>5 THEN ad1(j)=2:ays(j)=0:SOUND 15,2:GOTO hdone
IF ad1(l)=3 THEN GOTO hdie
ay(j)=ay(j)-ays(l)
GOTO hdone
ENDIF
IF ad1(j)=2
ay(j)=ay(j)+ays(j)
IF ay(j)>=mh(ax(j))-HBLIT(5)+16
SOUND 17,2
n=44:GOSUB addbonus:sa=2.50:k=ae(j):GOSUB addscore
ad1(j)=0:GOTO hdone
ENDIF
k=0 TO 1
IF md(k)<>0
l=mo(k)+mx(k):IF l>=1280 THEN l=l-1280
IF ax(j)>=l-9
IF ax(j)<l+16
IF ay(j)>my(k)+7
IF ay(j)<my(k)+25
SOUND 17,2
n=49:GOSUB addbonus:sa=5.00:GOSUB addscore
ad1(j)=3:ad2(j)=k:k=1
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
NEXT
ays(j)=ays(j)+.05
GOTO hdone
ENDIF
IF ad1(j)=3
l=ad2(j):IF md(l)=0 THEN ad1(j)=2:ays(j)=0:GOTO hdone
ax(j)=x2(l)+mx2(l)+6
IF ax(j)>=1280
ax(j)=ax(j)-1280
ELSE
IF ax(j)<0
ax(j)=ax(j)+1280
ENDIF
ENDIF
ay(j)=my(l)+24
IF ay(j)>mh(ax(j))-HBLIT(5)+24
SOUND 17,2
n=49:GOSUB addbonus:sa=5.00:k=l:GOSUB addscore
ad1(j)=0:GOTO hdone
ENDIF
GOSUB sxget:n=5+anim1:GOTO blim
ENDIF
hdone:GOSUB sxget:n=5+anim1
GOSUB blim
sa=0:GOSUB hitme
hdie:n=38:humes=humes-1:IF humes=0 THEN space=1
GOTO killme2
'
killme:aliens=aliens-1
killme2: 'set me TO exploding with pixel n
at(j)=128:as(j)=n:ae(j)=0
RETURN
bullet:
ad1(j)=ad1(j)-1:IF ad1(j)=0 THEN at(j)=0:RETURN
GOSUB addx
ay(j)=LIMIT(ay(j)+ays(j),0,120)
GOSUB sxget:n=35:GOTO blim
.bonus:
ad1(j)=ad1(j)-1:IF ad1(j)=0 THEN at(j)=0:RETURN
GOSUB addx
ay(j)=LIMIT(ay(j)+ays(j),0,120)
GOSUB sxget:n=ad2(j)+anim1:GOTO blim
.blim:' BLIT em (n)
k=0 TO 1
IF sx(k)<288
USE SCREEN k ASL1+db
QBLIT db,n,sx(k)+32,ay(j)
ENDIF
NEXT:RETURN
blim2
k=0 TO 1
IF sx(k)>=0
IF sx(k)<288
USE SCREEN k ASL1+db
QBLIT db,n,sx(k)+32,ay(j)
ENDIF
ENDIF
NEXT:RETURN
hitme:' POP me IF i'm not shot
IF sx(0)>=288 THEN IF sx(1)>=288 THEN POP RETURN:RETURN
kf=0:k=0 TO 1
IF bang(k)=2
IF at(j)<>2
IF sx(k)<288
GOSUB kablam
GOTO nxt2
ENDIF
ENDIF
ENDIF
l=0 TO 2:bx2=bx(l,k):by2=by(l,k)+16
IF ba(l,k)<>0
IF by2>=ay(j)
IF by2<ay(j)+10
IF bx2<sx(k)+10
IF bx2+16>sx(k)
GOSUB kablam
bx(l,k)=320
ba(l,k)=1
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
NEXT
nxt2:NEXT:IF kf=0 THEN POP RETURN
RETURN
kablam:GOSUB addscore
lshot=k:kf=1:SOUND 14,2
RETURN
addscore:'add sa TO score of player k
oldt=INT(score(k)/100)
pscore=1:score(k)=score(k)+sa
IF INT(score(k)/100)>oldt
lives(k)=lives(k)+1:smarts(k)=smarts(k)+1
pflag=1
ENDIF
RETURN
.addbait:
k=74 TO 76
IF at(k)=0
at(k)=256+11
ax(k)=RND*1280
ay(k)=RND*48+40
axs(k)=RND+diff13
ays(k)=RND+diff13 ASR 1
ac(k)=3
ae(k)=64
as(k)=43
GOSUB pickman
ad2(k)=pgo4:l=pgo4
GOSUB baithome
ad1(k)=diff15
k=76
ENDIF
NEXT:RETURN
.addswarm:' add n swarmers
kk2=-kk2
k=51 TO 60
IF at(k)=0
aliens=aliens+1
ac(k)=5
ax(k)=ax(j)
ay(k)=ay(j)
axs(k)=diff5+RND*kk2
ays(k)=diff6+RND
at(k)=7
ad1(k)=0
ad2(k)=1
ae(k)=.125
n=n-1:IF n=0 THEN k=60
ENDIF
NEXT:RETURN
.addbomber:' add n bombers
kk=RND*1280:k2=RND ASL 1+2
IF RND>.5 THEN k2=-k2
k=61 TO 65
IF at(k)=0
aliens=aliens+1
ac(k)=6
ax(k)=kk
kk=kk+32:IF kk>=1280 THEN kk=kk-1280
ay(k)=RND*48+40
axs(k)=k2
ays(k)=diff10+RND
at(k)=256+8
ae(k)=64
as(k)=42
ad2(k)=1
ad1(k)=.125
n=n-1:IF n=0 THEN k=65
ENDIF
NEXT:RETURN
.addpods:' add n pods
k=48 TO 50
IF at(k)=0
aliens=aliens+1
ac(k)=4
ax(k)=480+(RND*160)
ay(k)=RND*32+32
axs(k)=RND ASR1
IF RND>.5 THEN axs(k)=-axs(k)
ays(k)=RND ASR1
IF RND>.5 THEN ays(k)=-ays(k)
at(k)=256+6
ad1(k)=0
ad2(k)=0
ae(k)=64
as(k)=40
n=n-1:IF n=0 THEN k=50
ENDIF
NEXT:RETURN
.addmutants
k=0 TO 24
IF at(k)=0
ac(k)=3
ax(k)=RND*1280
ay(k)=32
axs(k)=RND+diff1 ASL 1
ays(k)=RND+diff2
at(k)=256+5
ad1(k)=3
GOSUB pickman
ad2(k)=pgo4
ae(k)=64
as(k)=39
n=n-1:IF n=0 THEN k=24
ENDIF
NEXT:RETURN
.addlanders:' add n landers
k=0 TO 24
IF at(k)=0
ac(k)=1
ax(k)=RND*1280
ay(k)=32
axs(k)=RND+diff1
IF RND>.5 THEN axs(k)=-axs(k)
ays(k)=RND+diff2
at(k)=256+5
ad1(k)=0
ad2(k)=0
ae(k)=64
as(k)=37
GOSUB findhume
n=n-1:IF n=0 THEN k=24
ENDIF
NEXT:RETURN
tryfire:'try TO fire a bullet at player
GOSUB pickman:IF sx(pgo4)>=288 THEN RETURN
'
addbullet:' add a bullet - pgo4 is player TO go FOR
k=40 TO 47
IF at(k)=0
ax(k)=ax(j)
ay(k)=ay(j)
h=x2(pgo4)+mx2(pgo4)-ax(j)
v=my(pgo4)+16-ay(j)
IF ABS(v)>ABS(h)
ays(k)=SGN(v)ASL3:axs(k)=ABS(h)/ABS(v)*SGN(h)ASL3
ELSE
axs(k)=SGN(h)ASL3:ays(k)=ABS(v)/ABS(h)*SGN(v)ASL3
ENDIF
ad1(k)=32
at(k)=9
k=47
SOUND 12,3
ENDIF
NEXT:RETURN
trybomb
IF sx(0)<288 THEN GOTO addbomb
IF sx(1)>=288 THEN RETURN
addbomb
k=66 TO 73
IF at(k)=0
ax(k)=ax(j)
ay(k)=ay(j)
ad1(k)=64
at(k)=10
k=73
ENDIF
NEXT:RETURN
findhume:' find a humanoid FOR lander k TO home in on.
ad2(k)=25:m=25 TO 34
IF at(m)=2
IF ad1(m)=0
ad2(k)=m:m=34
ENDIF
ENDIF
NEXT
RETURN
addhumes:' add n humanoids
k=25 TO 34
IF at(k)=0
ac(k)=2
ax(k)=RND*1280
ay(k)=mh(ax(k))-HBLIT(5)+16
axs(k)=0
ays(k)=0
ad1(k)=0
ad2(k)=0
at(k)=2
n=n-1
IF n=0 THEN k=34
ENDIF
NEXT:RETURN
addbonus:' add a bonus
m=35 TO 39
IF at(m)=0
at(m)=3
ax(m)=ax(j)
ay(m)=ay(j)
axs(m)=RND ASL 1
ays(m)=-RND
ad1(m)=40
ad2(m)=n
m=39
ENDIF
NEXT
RETURN
newman:' start off man a
mo(a)=1280ASR1-144:mx(a)=80:my(a)=a ASL 5+32:mxs(a)=0:md(a)=1:ms(a)=1
RETURN
vrout
'all the follwing happens in the vertical blank!
'
'graphic intensive stuff below!
frame=frame-1
IF fref=1
fref=0
db=1-db
x2(0)=mo(0):x2(1)=mo(1)
xo2(0)=xo(0):xo2(1)=xo(1)
xo(0)=0:xo(1)=0:mx2(0)=mx(0):mx2(1)=mx(1)
ENDIF
db2=1-db
USE SLICE 0:SPRITE ms(0),mx(0),my(0),0
SPRITE 4
IF md(1)<>0
a=mo(1)+mx(1)-mo(0):IF a>=1280 THEN a=a-1280
IF a<0 THEN a=a+1280
IF a<320 THEN SPRITE ms(1),a,my(1),4
ENDIF
SHOWB 6,mo(0),0
SHOWF db2,xo2(0)+32,16
USE SLICE 2:SPRITE ms(1),mx(1),my(1),4
SPRITE 0
IF md(0)<>0
a=mo(0)+mx(0)-mo(1):IF a>=1280 THEN a=a-1280
IF a<0 THEN a=a+1280
IF a<320 THEN SPRITE ms(0),a,my(0),0
ENDIF
SHOWB 6,mo(1),0
SHOWF db2+2,xo2(1)+32,16
a=0 TO 1:b=0 TO 2
IF ba(b,a)<>0
jx=bx(b,a):jb=a ASL2+1+b
USE SLICE a ASL1:SPRITE bs(b,a),jx,by(b,a),jb
jx=mo(a)+jx-mo(1-a)
IF jx>=1280
jx=jx-1280
ELSE
IF jx<0 THEN jx=jx+1280
ENDIF
USE SLICE 1-a ASL1
IF jx<288
SPRITE bs(b,a),jx,by(b,a),jb
ELSE
SPRITE jb
ENDIF
ENDIF
NEXT:NEXT
'
'END of graphics
'
co=co+.5:asc=ASC(INKEY$)
a=0 TO 1
jb=JOYB(a):IF md(a)=0 THEN jb=0
IF jb>0
IF lf(a)=1 THEN jb=0
lf(a)=1
ELSE
lf(a)=0
ENDIF
fl=0:ma=1-a
b=0 TO 2
IF ba(b,a)<>0
bx=bx(b,a)+ba(b,a)
IF bx<-15
killbull
bx=a ASL2+1+b:USE SLICE a ASL1:SPRITE bx
USE SLICE ma ASL1:SPRITE bx
ba(b,a)=0:GOTO morebull
ENDIF
IF bx>=288 THEN GOTO killbull
IF gmode>1
IF md(ma)<>0
IF bx+16+mo(a)>mx(ma)+mo(ma)
IF bx+mo(a)<mx(ma)+16+mo(ma)
by=by(b,a)
IF by>=my(ma)
IF by<my(ma)+9
killme(ma)=1:GOTO killbull
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
bx(b,a)=bx
ba(b,a)=ba(b,a)*1.05
ELSE
IF jb>0
SOUND 10,0
bs(b,a)=17:IF md(a)<0 THEN bs(b,a)=18
ba(b,a)=md(a)ASL 2
bx(b,a)=mx(a)
by(b,a)=my(a)+4
jb=0
ENDIF
ENDIF
morebull:NEXT
IF md(a)<>0
ma=0:ms(a)=a ASL2+2-md(a)
my(a)=LIMIT(JOYY(a)ASL 1+my(a),0,89)
jx=JOYX(a)
IF jx<>0
IF jx=md(a)
ms(a)=co &1+ms(a)+8
IF md(a)>0
IF mx(a)<>136
ma=SGN(mx(a)-136)
mx(a)=mx(a)-ma
ENDIF
ELSE
IF mx(a)<>136
ma=SGN(mx(a)-136)
mx(a)=mx(a)-ma
ENDIF
ENDIF
IF ABS(mxs(a))<7
mxs(a)=md(a)ASR3+mxs(a)
IF ABS(mxs(a))>6
mxs(a)=mxs(a)-SGN(mxs(a))
ENDIF
ENDIF
ELSE
md(a)=jx
ENDIF
ELSE
mxs(a)=SGN(mxs(a))*LIMIT(ABS(mxs(a))-.05,0,32767)
IF md(a)>0
IF mx(a)>80
mx(a)=mx(a)-2:ma=2
ENDIF
ELSE
IF mx(a)<192
mx(a)=mx(a)+2:ma=-2
ENDIF
ENDIF
ENDIF
ma=ma+mxs(a):mo=mo(a)+ma
xo(a)=xo(a)+ma
xo2(a)=xo2(a)+ma
IF mo>=1280 THEN mo=mo-1280
IF mo<0 THEN mo=mo+1280
mo(a)=mo
USE SLICE 1
ma=mo+mx(a):IF ma>=1280 THEN ma=ma-1280
SPRITE 19+a,ma ASR3+79,my(a)ASR2+1,a ASL1
IF asc=smart(a) THEN bang(a)=1
ELSE
USE SLICE 1
SPRITE a ASL1
ENDIF
NEXT
RETURN
colrmnts:'set mountain AND star COLOURs
RGB 9+32,9,9,0
RGB 10+32,6,6,0
RGB 11+32,3,3,0
RETURN
drawmnts:'draw mountains
USE SCREEN 6:CLS:IF humes=0 THEN RETURN
x=0 TO 1279
USE SCREEN 6
PLOT x,mh(x),1:PLOT x,mh(x)+1,2:PLOT x,mh(x)+2,3
IF x<320
PLOT x+1280,mh(x),1
PLOT x+1280,mh(x)+1,2
PLOT x+1280,mh(x)+2,3
ENDIF
IF x & 7=0
IF x=0
osx=80:osy=mh(x) LSR2
ELSE
USE SCREEN 5
LINE osx,osy,x LSR3+80,mh(x) LSR2,4
osx=x LSR3+80:osy=mh(x) LSR2
ENDIF
ENDIF
NEXT:RETURN
makemnts:'make up some random mountains
y=93:a=-2:t=1
x=0 TO 1279
mh(x)=y:IF x>1250 THEN y=LIMIT(y+2,0,93):GOTO mmdone
y=LIMIT(y+a,59,93)
t=t-1
IF t<=0
t=RND*10:a=-a
ENDIF
mmdone
NEXT:RETURN
loadbl
RESTORE dblit
llp:READ a$:IF a$="" THEN RETURN
READ a:BLOAD p$+a$,a,1
GOTO llp
*dblit
DATA "lander.def",0
DATA "humanoid.def",5
DATA "mutant.def",10
DATA "pod.def",15
DATA "swarmer.def",20
DATA "bomber.def",25
DATA "baiter.def",30
DATA "bullet.def",35
DATA "bomb.def",36
DATA "landerpix.def",37
DATA "humanoidpix.def",38
DATA "mutantpix.def",39
DATA "podpix.def",40
DATA "swarmerpix.def",41
DATA "bomberpix.def",42
DATA "baiterpix.def",43
DATA "250.def",44
DATA "500.def",49
DATA "youpix.def",54
DATA "littleman.def",55
DATA "littlesmart.def",56
DATA "hi1.def",57
DATA "hi2.def",58
DATA "hi3.def",59
DATA "hi4.def",60
DATA "hi5.def",61
DATA "hi6.def",62
DATA "hi7.def",63
DATA "hi8.def",64
DATA "hi9.def",65
DATA "title.def",66
DATA "solo.def",74
DATA "team.def",75
DATA "mean.def",76
DATA "evil.def",77
DATA "cursor.def",78
DATA ""
loadsp
SPLOAD p$+"youright.def",1,16+32
SPLOAD p$+"youleft.def",3,20+32
SPLOAD p$+"you2right.def",5,24+32
SPLOAD p$+"you2left.def",7,28+32
SPLOAD p$+"yourightfire1.def",9,16+32
SPLOAD p$+"yourightfire2.def",10,20+32
SPLOAD p$+"youleftfire1.def",11
SPLOAD p$+"youleftfire2.def",12
SPLOAD p$+"you2rightfire1.def",13,24+32
SPLOAD p$+"you2rightfire2.def",14,28+32
SPLOAD p$+"you2leftfire1.def",15
SPLOAD p$+"you2leftfire2.def",16
SPLOAD p$+"yourfireright.def",17
SPLOAD p$+"yourfireleft.def",18
SPLOAD p$+"youscan.def",19
SPLOAD p$+"you2scan.def",20
RETURN
text:LOCATE 20-(LEN(t$)/2),CURSY:PRINT t$:PRINT:PRINT
SOUND 12,0:a=1 TO 100:VWAIT
IF JOYB(1)>0 THEN a=101
NEXT:IF a=101 THEN RETURN
POP RETURN:GOTO gameon
hishow:VWAIT:DMA 0:SLICE END:SLICE 0,sl0:COLOUR 7,5
SCREEN 0,320+16,224,3:DISPLAY 320,224,0,0,0,0:SHOW 0:USE SCREEN 0
c=8:a=1:y=0 TO 223 STEP 2
IF y<16
RGB 7,15,c,0,y
ELSE
RGB 7,0,c,15,y
ENDIF
c=c+a
IF c=15 THEN a=-a
IF c=8 THEN a=-a
NEXT
BLOAD "hicols.def",99,0,0
x=0 TO 1
k=x*20
BLIT 57,k ASL3,16:BLIT 59,k+19 ASL3,16
BLIT 63,k ASL3,27 ASL3:BLIT 65,k+19 ASL3,27 ASL3
a=1 TO 18
BLIT 58,k+a ASL3,16:BLIT 64,k+a ASL3,27 ASL3
NEXT
a=3 TO 26:BLIT 60,k ASL3,a ASL3
j=1 TO 18:BLIT 61,k+j ASL3,a ASL3:NEXT
BLIT 62,k+19 ASL3,a ASL3
NEXT
a=0 TO 23
LOCATE k+1,a+3:PRINT hinames$(x,a);
n$=STR$(INT(hiscores(x,a)))
n=hiscores(x,a)-INT(hiscores(x,a))*100
n$=n$+STR$(n):IF n=0 THEN n$=n$+"0"
LOCATE k+19-LEN(n$),a+3:PRINT n$;
NEXT
NEXT:COLOUR 7,0
LOCATE 2,0:PRINT "BEST OF THE BEST";
LOCATE 24,0:PRINT "TODAY!S BEST";
VWAIT:DMA 1:SOUND 16,0:RETURN
savehis:ERROR nowrite
OPEN p$+"hiscores.def",0,OUTPUT
OUTPUT 0
k=0 TO 23:PRINT hinames$(0,k):PRINT hiscores(0,k):NEXT
CLOSE
nowrite:RETURN
loadhis:ERROR there
OPEN p$+"hiscores.def",0,INPUT:INPUT 0
OPEN "nil:",1,OUTPUT:OUTPUT 1
k=0 TO 23
hinames$(0,k)=EDIT$("",8)
hiscores(0,k)=EDIT(0,8):NEXT
there:ERROR:CLOSE:RETURN
opts10,100,5,5,100,20,2048,80,1,0,0,0,1,