REM Acorn Invaders
REM Packed by MH's BASCrunch v1.31c 30/1/08 On 29 Apr 2008
ONERRORPROCv:END
MODE28:OFF:a$="Acorn Invaders. (c)2008 DynaByte Software":PRINTa$:PRINTSTRING$(LEN(a$),"-"):PRINT:PRINT:PRINT:PRINT:aa%=FALSE:c$="<Invaders$Dir>.":PRINT"Checking files...":IFNOTFNk(c$+"Resources.Gfx0","Sprites")THENaa%=TRUE
IFNOTFNk(c$+"Resources.Gfx1","Charset")THENaa%=TRUE
IFNOTFNk(c$+"Resources.Intro","Music")THENaa%=TRUE
IFNOTFNk(c$+"Resources.Creds","Credits")THENaa%=TRUE
IFaa%THENERROR255,"File Missing!!"
PRINT:PRINT"Initialising Tracker Daemon...":OSCLI"Playmod "+c$+"Resources.Intro":OSCLI"PlayPause":aa%=FALSE:ba%=0:ca%=1:da%=TRUE:ea%=0:DIMa$(10),c%(10):DIMd%(10):PRINT"Initialising Heap Manager (ASH)...":PROCw:SYS"OS_SWINumberFromString",,"OS_SpriteOp"TOfa%
PRINT"Loading Sprites...":ga%=FNo(c$+"Resources.Gfx0"):PRINT"Loading Charset...":ha%=FNo(c$+"Resources.Gfx1"):ia%=ga%:PRINT"Loading Credits...":ja%=OPENIN(c$+"Resources.Creds"):INPUT#ja%,p$:IFp$<>"DERC"THEN
CLOSE#ja%:ERROR255,"Credit screen has been tampered with!!":END
ENDIF
INPUT#ja%,ea%:DIMb$(ea%),e%(ea%):FORi%=1TOea%:INPUT#ja%,e%(i%),b$(i%):NEXTi%:CLOSE#ja%:PRINT"Processing HiTable... ";:i$=c$+"Resources.HiTable":IFFNp(i$)<>1THEN
IFNOTFNq(0,c$)THEN
da%=FALSE:PRINT"Created Read-only HiScore table."
ELSE:PRINT"Created Read/Write HiScore table."
ENDIF
PROCx(da%)
ELSE:IFNOTFNq(1,i$)THEN
da%=FALSE:PRINT"Loaded Read-only HiScore table."
ELSE:PRINT"Loaded Read/Write HiScore table."
ENDIF
PROCy
ENDIF
PRINT"Setting up...":PROCe(150):b%=0:a%=4:f%=8:k%=12:L%=16:M%=20:q%=24:Z%=28:ka%=32:la%=36:ma%=40:na%=44:oa%=48:pa%=52:qa%=56:ra%=60:sa%=64:ta%=16:ua%=20:va%=24:_%=28:V%=32:wa%=16:xa%=20
h%=FNb(36):N%=FNb(24):J%=FNb(16):CLS:PROCm:h%!_%=FNa(8,1):h%!V%=FNa(8,2)+7:N%!f%=FNa(6,1):N%!k%=FNa(6,2):N%!wa%=h%!k%-50:N%!xa%=30:OSCLI"PlayStart":REPEAT:CLS:aa%=FNt:IFNOTaa%THENCLS:PROCz
UNTILaa%:CLS:J%!f%=220:J%!k%=40:J%=FNn(J%,h%):J%!a%-=3:PROCj(J%):PROCn("GOODBYE!!!",10):IFca%=1THEN
FORi%=127TO1STEP-2:OSCLI"PlayVolume "+STR$(i%):PROCe(4):NEXTi%:OSCLI"PlayStop":OSCLI"PlayVolume 127"
ENDIF
PROCo:END
DEFFNt:LOCALi%,H%,I%,A%,S%,d%,T%,ya%:LOCALza%,O%,Aa%,Ba%,Ca%,Da%,x%,y%,R%,s$,a$:H%=FNb(16):I%=FNb(16):A%=FNb(16):d%=FNb(16):T%=FNb(16):O%=FNb(16):H%!f%=FNa(100,1):H%!k%=FNa(40,2):H%!b%=FNc(H%,h%):H%!a%=800
I%!f%=FNa(150,1):I%!k%=FNa(40,2):I%!b%=FNc(I%,h%):I%!a%=H%!a%-I%!k%:A%!f%=640:A%!k%=500:A%!b%=FNc(A%,h%):A%!a%=200:d%!f%=FNa(40,1):d%!k%=FNa(20,2):d%!b%=A%!b%+150:d%!a%=(A%!a%+A%!k%)-160:T%!f%=FNa(20,1):T%!k%=FNa(20,2)
T%!b%=A%!b%+150+FNc(T%,d%):ya%=FNe(T%):za%=FNe(T%):T%!a%=A%!a%+100:ya%!a%=T%!a%+T%!k%+40:za%!a%=ya%!a%+ya%!k%+40:O%!f%=FNa(20,1):O%!k%=FNa(20,2):O%!b%=A%!b%+150+FNc(O%,d%):Aa%=FNe(O%):Ba%=FNe(O%):Da%=FNe(O%):Ca%=FNe(O%)
:O%!a%=(A%!a%+A%!k%)-160:Aa%!a%=O%!a%-60:Ba%!a%=Aa%!a%-60:Da%!a%=Ba%!a%-100:Ca%!a%=Da%!a%-60:PROCg(N%!wa%):PROCg(N%!xa%):FORi%=0-H%!f%TOH%!b%STEP5:WAIT:PROCa("space",i%,H%!a%):PROCe(1):NEXTi%:FORi%=h%!f%TOI%!b%STEP-5:WAIT:PROCa("invaders",i%,I%!a%):PROCe(1):NEXTi%
a$="PRESS SPACE TO PLAY":S%=LEN(a$)*h%!_%:y%=170:PROCb(FNh(S%,h%!f%),y%,a$,11):a$="OR Q TO QUIT":S%=LEN(a$)*h%!_%:y%-=h%!V%:PROCb(FNh(S%,h%!f%),y%,a$,11):WHILENOTINKEY(-99)ANDNOTINKEY(-17)ANDNOTINKEY(-82):y%=A%!a%+A%!k%:FORi%=1TOea%:a$=FNl(b$(i%)):x%=FNd(a$):CASEe%(i%)OF
WHEN-1:y%-=h%!V%
WHEN-2:y%-=(2*h%!V%)
OTHERWISE:y%-=e%(i%)
ENDCASE
PROCb(x%,y%,a$,0):NEXTi%:R%=FNm:IFR%=1THENPROCf:=TRUE
IFR%=2THENPROCf:=FALSE
PROCd(A%):a$="SCORE ADVANCE":x%=FNd(a$):y%=A%!a%+A%!k%-20:PROCb(x%,y%,a$,0):a$="TABLE":y%-=h%!V%:x%=FNd(a$):PROCb(x%,y%,a$,0):x%=d%!b%+d%!f%+10:PROCa("saucer_0",d%!b%,d%!a%):PROCb(x%,d%!a%+10,"= 500 POINTS !",0):PROCa("inv_3",za%!b%,za%!a%)
PROCb(x%,za%!a%+12,"= 100 POINTS !",0):PROCa("inv_2",ya%!b%,ya%!a%):PROCb(x%,ya%!a%+12,"=  75 POINTS !",0):PROCa("inv_1",T%!b%,T%!a%):PROCb(x%,T%!a%+12,"=  50 POINTS !",0):R%=FNm:IFR%=1THENPROCf:=TRUE
IFR%=2THENPROCf:=FALSE
PROCd(A%):a$="KEYBOARD CONTROLS":x%=FNd(a$):y%=A%!a%+A%!k%-20:PROCb(x%,y%,a$,0):x%=O%!b%+O%!f%+10:PROCa("key_z",O%!b%,O%!a%):PROCb(x%,O%!a%+12,": MOVE LEFT",0):PROCa("key_x",Aa%!b%,Aa%!a%):PROCb(x%,Aa%!a%+12,": MOVE RIGHT",0)
PROCa("key_enter",Ba%!b%,Ba%!a%):PROCb(x%,Ba%!a%+12,": FIRE SHELL",0):PROCa("key_m",Da%!b%,Da%!a%):PROCb(x%,Da%!a%,": MUSIC ON/OFF",0):PROCa("key_q",Ca%!b%,Ca%!a%):PROCb(x%,Ca%!a%+12,": END GAME",0):R%=FNm:IFR%=1THENPROCf:=TRUE
IFR%=2THENPROCf:=FALSE
PROCd(A%):a$="TODAY'S":IFda%THENa$="ALL TIME"
x%=FNd(a$):y%=A%!a%+A%!k%-20:PROCb(x%,y%,a$,0):a$="HI SCORES":y%-=h%!V%:x%=FNd(a$):PROCb(x%,y%,a$,0):y%=(A%!a%+A%!k%)-100:a$=" POS."+"  PLAYER."+STRING$(12," ")+"SCORE.":a$+=STRING$(3," ")+"RACK.":x%=FNd(a$):PROCb(x%,y%,a$,0):y%-=2*h%!V%:FORi%=1TO10:IFi%<10THEN
a$="  "+STR$(i%)+".  "
ELSE:a$=" "+STR$(i%)+".  "
ENDIF
s$=FNl(a$(i%)):a$+=FNf(s$,8," ",FALSE):a$+=" .... ":a$+=FNr(STR$(c%(i%)),10):a$+=" ... "+FNr(STR$(d%(i%)),3):x%=FNd(a$):PROCb(x%,y%-(i%*(h%!V%+5)),a$,0):NEXTi%:R%=FNm:IFR%=1THENPROCf:=TRUE
IFR%=2THENPROCf:=FALSE
PROCd(A%):ENDWHILE:PROCf:IFINKEY(-17)THEN=TRUE
=FALSE
DEFFNm:LOCALt%:t%=TIME+750:REPEAT:IFINKEY(-82)THENPROCp
IFINKEY(-102)THENPROCq
UNTILTIME=t%ORINKEY(-17)ORINKEY(-99):IFINKEY(-17)THEN=1
IFINKEY(-99)THEN=2
=0
DEFFNd(a$):LOCALS%:S%=LEN(a$)*h%!_%:=A%!b%+FNh(S%,A%!f%)
DEFPROCf:PROCc(H%):PROCc(I%):PROCc(A%):PROCc(d%):PROCc(T%):PROCc(ya%):PROCc(za%):PROCc(O%):PROCc(Aa%):PROCc(Ba%):PROCc(Ca%):PROCc(Da%):ENDPROC
DEFPROCz:LOCALm%,o%,d%,e%,w%:LOCALD%:LOCALb%(),a%():LOCALY%,Ea%,Fa%,`%:LOCALGa%,Ha%,Ia%,Ja%,Ka%:LOCALLa%,S%,a$,x%,y%,i%,j%:m%=FNb(32):o%=FNb(36):d%=FNb(48):e%=FNb(68):D%=FNb(16):w%=FNb(16):DIMb%(10,6),a%(7):Y%=0:`%=4:Ea%=8:Fa%=12
Ga%=la%:Ha%=na%:Ia%=oa%:Ja%=ra%:Ka%=sa%:m%!f%=FNa(30,1):m%!k%=FNa(15,2):m%!b%=FNc(m%,h%):m%!a%=50:m%!M%=6:m%!L%=m%!M%:D%!f%=FNa(20,1):D%!k%=FNa(20,2):d%!f%=FNa(40,1):d%!k%=FNa(20,2):d%!a%=N%!wa%-(10+d%!k%):d%!M%=5:d%!q%=FALSE:d%!na%=1
o%!f%=FNa(5,1):o%!k%=FNa(20,2):o%!q%=FALSE:o%!M%=10:w%!Ea%=1:w%!`%=0:w%!Y%=3:w%!Fa%=FALSE:e%!Ga%=FNa(20,1):e%!Ha%=10:e%!Ia%=6:e%!q%=TRUE:e%!Ka%=4:FORi%=1TO7:a%(i%)=FNb(44):a%(i%)=FNu(a%(i%),0):a%(i%)!f%=FNa(5,1):a%(i%)!k%=FNa(20,2):NEXTi%
PROCg(N%!wa%):PROCg(N%!xa%):PROCA(0,c%(1),w%!Y%,w%!Ea%):PROCB:PROCa("base",m%!b%,m%!a%):REPEAT:La%=FALSE:IFINKEY(-74)THENPROCC(m%!b%,m%!a%)
IFINKEY(-98)THENPROCD:La%=TRUE
IFINKEY(-67)THENPROCE:La%=TRUE
IFINKEY(-102)THENPROCq
IFINKEY(-82)THENPROCp
IFINKEY(-17)THENPROCF
IFINKEY(-34)THENPROCG
IFINKEY(-35)THENPROCr
IFLa%THEN
m%!b%+=m%!L%:PROCa("base",m%!b%,m%!a%)
ENDIF
IFw%!Y%>0THEN
PROCH:PROCI:PROCJ:PROCK
ENDIF
WAIT:UNTILw%!Y%=0:J%!f%=240:J%!k%=40:J%=FNn(J%,h%):J%!a%-=3:PROCd(J%):PROCj(J%):PROCn("GAME OVER!!!",11):PROCe(750):IFNOTw%!Fa%THEN
IFw%!`%>=c%(10)THEN
PROCL(w%)
ENDIF
ENDIF
PROCc(m%):PROCc(e%):PROCc(d%):PROCc(o%):PROCc(w%):PROCc(D%):FORi%=1TO7:PROCc(a%(i%)):NEXTi%:ENDPROC
DEFPROCD:IFm%!b%<=0THEN
m%!b%=0
ELSE:m%!L%=0-m%!M%
ENDIF
ENDPROC
DEFPROCE:IFm%!b%>=h%!f%-m%!f%THEN
m%!b%=h%!f%-m%!f%
ELSE:m%!L%=0+m%!M%
ENDIF
ENDPROC
DEFPROCC(x%,y%):IFNOTo%!q%THEN
o%!q%=TRUE:o%!b%=x%+(m%!f%/2):o%!a%=y%+m%!k%
ENDIF
ENDPROC
DEFPROCp:REPEAT:UNTILNOTINKEY(-82):OSCLI"ScreenSave <Invaders$Dir>.Dump"+STR$(ba%):ba%+=1:ENDPROC
DEFPROCF:LOCALi%:FORi%=1TO7:a%(i%)!q%=FALSE:NEXTi%:w%!Y%=0:w%!Fa%=TRUE:ENDPROC
DEFPROCq:REPEAT:UNTILNOTINKEY(-102):ca%=FNi(ca%):IFca%=1THENOSCLI"PlayStart"ELSEOSCLI"PlayPause"
ENDPROC
DEFPROCG:IFd%!q%THEN
IFNOTd%!Z%THEN
d%!Z%=TRUE:d%!ka%=d%!la%:PROCa("saucer_2",d%!b%,d%!a%)
ENDIF
ENDIF
ENDPROC
DEFPROCH:LOCALMa%,Na%:Ma%=ka%:IFo%!q%THEN
o%!Ma%=FALSE:IFo%!a%>=N%!wa%-o%!k%THEN
o%!q%=FALSE:o%!Ma%=TRUE
ENDIF
IFo%!Ma%THEN
Na%=FNe(o%):Na%!a%-=2:PROCd(Na%):PROCc(Na%)
ELSE:PROCa("shell",o%!b%,o%!a%)
ENDIF
o%!a%+=o%!M%
ENDIF
ENDPROC
DEFPROCI:LOCALOa%,F%,Pa%,Qa%,f$:Oa%=ka%:F%=la%:Pa%=ma%:Qa%=na%:IFNOTd%!q%THEN
IFFNg(4)ANDFNg(5)THEN
d%!q%=TRUE:d%!Z%=FALSE:d%!Pa%=0:d%!Qa%=0:IFFNg(50)THEN
d%!L%=0-d%!M%:d%!b%=h%!f%
ELSE:d%!L%=0+d%!M%:d%!b%=0-d%!f%
ENDIF
ENDIF
ELSE:d%!Pa%+=1:d%!F%+=1:IFd%!b%<=0-d%!f%ANDSGN(d%!L%)=-1THEN
d%!Oa%=FALSE:d%!q%=FALSE:d%!F%=0:ENDPROC
ENDIF
IFd%!b%>h%!f%ANDSGN(d%!L%)=1THEN
d%!Oa%=FALSE:d%!q%=FALSE:d%!F%=0:ENDPROC
ENDIF
IFNOTd%!Z%THEN
IFFNj(o%,d%)THEN
PROCd(o%):PROCa("saucer_2",d%!b%,d%!a%):d%!Oa%=d%!F%:d%!Z%=TRUE:o%!q%=FALSE:PROCh(500)
ENDIF
ELSE:IFFNj(o%,d%)THEN
PROCd(o%):o%!q%=FALSE
ENDIF
ENDIF
IFNOTd%!Z%THEN
IFd%!Pa%>=1000THENd%!Pa%=0
IFd%!Pa%MOD10=0THEN
d%!Qa%=FNi(d%!Qa%)
ENDIF
f$="saucer_"+STR$(d%!Qa%):PROCa(f$,d%!b%,d%!a%):d%!b%+=d%!L%
ELSE:IFd%!F%>=d%!Oa%+80THEN
PROCd(d%):d%!q%=FALSE:d%!Oa%=FALSE:d%!F%=0:d%!Qa%=TRUE
ELSE:IFd%!F%>=d%!Oa%+60THEN
PROCa("saucer_5",d%!b%,d%!a%)
ELSE:IFd%!F%>=d%!Oa%+40THEN
PROCa("saucer_4",d%!b%,d%!a%)
ELSE:IFd%!F%>=d%!Oa%+20THEN
PROCa("saucer_3",d%!b%,d%!a%)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
DEFPROCJ:LOCALRa%,z%,E%,K%,Sa%,Ta%,Ua%,Va%:LOCALG%,F%,Wa%,Xa%:G%=ka%:F%=ma%:Wa%=pa%:Xa%=qa%:e%!F%+=1:IFe%!F%MOD5=0THENe%!G%=FNi(e%!G%)
IFe%!F%>1000THENe%!F%=0
Ra%=e%!b%+e%!f%:Va%=0-((e%!Wa%-1)*(D%!f%+e%!Ga%)):IFRa%>=h%!f%THEN
e%!L%=0-e%!M%:PROCs
ENDIF
IFe%!b%<=Va%THEN
e%!L%=0+e%!M%:PROCs
ENDIF
Va%=e%!a%+((e%!Ja%-1)*D%!k%):IFVa%<=m%!a%+m%!k%THEN
PROCr:ENDPROC
ENDIF
IFFNj(o%,e%)THEN
z%=D%!f%+e%!Ga%:IF(o%!b%-e%!b%)MODz%<=D%!f%THEN
E%=((o%!a%-e%!a%)DIVD%!k%)+1:K%=((o%!b%-e%!b%)DIVz%)+1:IFSGN(b%(K%,E%))=1THEN
b%(K%,E%)=-5:PROCd(o%):o%!q%=FALSE:e%!Z%+=1:CASEE%OF
WHEN1,2:PROCh(50)
WHEN3,4:PROCh(75)
WHEN5,6:PROCh(100)
ENDCASE
ENDIF
ENDIF
ENDIF
IFe%!Z%>=e%!Ha%*e%!Ia%THEN
w%!Ea%+=1:PROCd(e%):PROCg(N%!xa%):PROCi(w%!Y%):PROCk(w%!Ea%):PROCt
ENDIF
Sa%=TRUE:Ta%=TRUE:FORE%=1TOe%!Ia%:IFb%(e%!Xa%,E%)<>0THENSa%=FALSE
IFb%(e%!Wa%,E%)<>0THENTa%=FALSE
NEXTE%:Ua%=TRUE:FORK%=1TOe%!Ha%:IFb%(K%,e%!Ja%)<>0THENUa%=FALSE
NEXTK%:IFTa%THENe%!Wa%+=1
IFSa%THEN
e%!f%-=(D%!f%+e%!Ga%):e%!Xa%-=1
ENDIF
IFUa%THENe%!Ja%+=1
e%!b%+=e%!L%:PROCl:ENDPROC
DEFPROCK:LOCALF%,G%,Ya%,Za%,i%,j%,x%,y%,_a%,`a%,f$,g$:F%=ka%:G%=la%:Ya%=ma%:FORi%=1TO7:IFNOTa%(i%)!q%THEN
_a%=RND(10):`a%=w%!Ea%+5:IF`a%>100THEN`a%=100:e%!Ka%+=1
IFFNg(`a%)ANDFNg(e%!Ka%)THEN
IFb%(_a%,e%!Ja%)>0THEN
x%=e%!b%+(_a%-1)*(D%!f%+e%!Ga%):y%=e%!a%+(e%!Ja%-1)*D%!k%:a%(i%)!b%=x%+D%!f%/2:a%(i%)!a%=y%:a%(i%)!q%=TRUE:a%(i%)!Z%=FALSE:a%(i%)!F%=0:a%(i%)!Ya%=1:a%(i%)!G%=0:Za%=4:IFFNg(25)THENa%(i%)!Ya%=2:Za%=Za%/2
a%(i%)!M%=Za%:a%(i%)!L%=a%(i%)!M%
ENDIF
ENDIF
ELSE:a%(i%)!F%+=1:IFa%(i%)!F%MOD5=0THEN
a%(i%)!G%=FNi(a%(i%)!G%)
ENDIF
IFa%(i%)!F%>1000THENa%(i%)!F%=0
a%(i%)!a%-=a%(i%)!L%:f$="miss_"+STR$(a%(i%)!Ya%)+STR$(a%(i%)!G%):IFa%(i%)!Ya%<1ORa%(i%)!Ya%>2THEN
g$="Invalid missile type : "+STR$(a%(i%)!Ya%):ERROR255,g$
ENDIF
IFa%(i%)!G%<0ORa%(i%)!G%>1THEN
g$="Invalid missile frame : "+STR$(a%(i%)!G%):ERROR255,g$
ENDIF
PROCa(f$,a%(i%)!b%,a%(i%)!a%):IFa%(i%)!a%<=N%!xa%+(N%!k%+5)THEN
a%(i%)!q%=FALSE:PROCd(a%(i%))
ENDIF
IFFNj(a%(i%),m%)ANDa%(i%)!q%THEN
FORj%=1TO3:PROCa("base_"+STR$(j%),m%!b%,m%!a%):PROCe(20):WAIT:NEXTj%:PROCd(m%):IFo%!q%THEN
PROCd(o%):o%!q%=FALSE
ENDIF
m%!b%=FNc(m%,h%):w%!Y%-=1:PROCi(w%!Y%):PROCd(a%(i%)):a%(i%)!q%=FALSE:PROCa("base",m%!b%,m%!a%)
ENDIF
IFFNj(o%,a%(i%))ANDa%(i%)!q%THEN
IFa%(i%)!Ya%=1THEN
a%(i%)!q%=FALSE:PROCh(5):PROCd(a%(i%))
ENDIF
PROCd(o%):o%!q%=FALSE
ENDIF
ENDIF
NEXTi%:ENDPROC
DEFPROCx(ab%):LOCALi%,n$:FORi%=1TO10:IFi%MOD2=0THENn$="Software"ELSEn$="DynaByte"
a$(i%)=FNl(n$):c%(i%)=(11-i%)*1000:d%(i%)=0:NEXTi%:IFab%THENPROCu
ENDPROC
DEFPROCy:LOCALi%,P%:P%=OPENIN"<Invaders$Dir>.Resources.HiTable":FORi%=1TO10:INPUT#P%,a$(i%),c%(i%):INPUT#P%,d%(i%):NEXTi%:CLOSE#P%:ENDPROC
DEFPROCu:LOCALi%,P%:P%=OPENOUT"<Invaders$Dir>.Resources.HiTable":FORi%=1TO10:PRINT#P%,a$(i%),c%(i%):PRINT#P%,d%(i%):NEXTi%:CLOSE#P%:ENDPROC
DEFPROCL(w%):LOCALI%,H%,bb%,g%,i%,cb%,S%,x%,y%,a$:H%=FNb(16):I%=FNb(16):H%!f%=FNa(100,1):H%!k%=FNa(40,2):H%!b%=FNc(H%,h%):H%!a%=800:I%!f%=FNa(150,1):I%!k%=FNa(40,2):I%!b%=FNc(I%,h%):I%!a%=H%!a%-I%!k%:cb%=0:FORi%=10TO1STEP-1
IFw%!`%>=c%(i%)THENcb%=i%
NEXTi%:FORi%=9TOcb%STEP-1:a$(i%+1)=a$(i%):c%(i%+1)=c%(i%):d%(i%+1)=d%(i%):NEXTi%:c%(cb%)=w%!`%:d%(cb%)=w%!Ea%:CLS:PROCg(N%!wa%):PROCg(N%!xa%):PROCa("space",H%!b%,H%!a%):PROCa("invaders",I%!b%,I%!a%):a$="Congratulations!!! Your score of "+STR$(w%!`%)
a$+=" has earned the rank of "+STR$(cb%)+FNv(cb%):S%=LEN(a$)*h%!_%:x%=FNh(S%,h%!f%):y%=I%!a%-170:PROCb(x%,y%,a$,0):PROCc(H%):PROCc(I%):J%!f%=165:J%!k%=40:J%=FNn(J%,h%):PROCj(J%):x%=J%!b%+20:y%=J%!a%+12:a$="":i%=1:bb%=FALSE
OSCLI"FX 21,0":REPEAT:g%=GET:CASEg%OF
WHEN13:bb%=TRUE
WHEN8:i%-=1:a$=LEFT$(a$,i%-1)
OTHERWISE:IFi%<9ANDFNw(g%)THENi%+=1:a$+=CHR$(g%)
ENDCASE
IFi%<1THENi%=1
PROCb(x%,y%,STRING$(8," "),0):IFa$=""THEN
PROCb(x%,y%," ",0)
ELSE:PROCb(x%,y%,a$,0)
ENDIF
UNTILbb%:IFa$=""ORa$=" "THENa$="Anon ..."
a$(cb%)=FNl(a$):IFda%THENPROCu
ENDPROC
DEFFNw(db%):LOCALMa%:Ma%=FALSE:IFdb%>=32ANDdb%<=126THENMa%=TRUE
=Ma%
DEFPROCA(eb%,fb%,l%,r%):LOCALx%,a$:a$="SCORE :-"+FNf(STR$(eb%),10," ",TRUE):PROCb(0,h%!k%-h%!V%,a$,0):a$="HI SCORE :-":a$+=FNf(STR$(fb%),10," ",TRUE):x%=h%!f%-LEN(a$)*h%!_%:PROCb(x%,h%!k%-h%!V%,a$,0):PROCi(l%):PROCk(r%):ENDPROC
DEFPROCi(gb%):LOCALa$:PROCa("base",0,0):a$=" = "+STR$(gb%):PROCb(m%!f%,0,a$,0):ENDPROC
DEFPROCk(gb%):LOCALx%,a$:a$="RACK :-"+FNf(STR$(gb%),3,"0",TRUE):x%=h%!f%-LEN(a$)*h%!_%:PROCb(x%,0,a$,0):ENDPROC
DEFPROCh(hb%):LOCALx%,a$:w%!`%+=hb%:a$="SCORE :-"+FNf(STR$(w%!`%),10," ",TRUE):PROCb(0,h%!k%-h%!V%,a$,0):IFw%!`%>c%(1)THEN
a$="HI SCORE :-":a$+=FNf(STR$(w%!`%),10," ",TRUE):x%=h%!f%-LEN(a$)*h%!_%:PROCb(x%,h%!k%-h%!V%,a$,0)
ENDIF
ENDPROC
DEFPROCB:LOCALG%,Wa%,Xa%,Ja%:G%=ka%:Wa%=pa%:Xa%=qa%:Ja%=ra%:PROCt:PROCl:ENDPROC
DEFPROCt:LOCALE%,K%,s%:e%!b%=50:e%!a%=550:e%!G%=0:e%!Z%=0:e%!M%=3:e%!L%=e%!M%:e%!Wa%=1:e%!Xa%=e%!Ha%:e%!Ja%=1:s%=(e%!Ha%*D%!f%)+((e%!Ha%-1)*e%!Ga%):e%!f%=s%:e%!k%=e%!Ia%*D%!k%:FORK%=1TOe%!Ha%:FORE%=1TOe%!Ia%
b%(K%,E%)=((E%+1)/2)+(e%!G%*10):NEXTE%:NEXTK%:ENDPROC
DEFPROCl:LOCALE%,K%,x%,y%,v%:v%=FNb(16):FORK%=e%!Wa%TOe%!Xa%:x%=e%!b%+((K%-1)*(D%!f%+e%!Ga%)):FORE%=e%!Ja%TOe%!Ia%:y%=e%!a%+((E%-1)*D%!k%):IFb%(K%,E%)>0THEN
b%(K%,E%)=((E%+1)/2)+(e%!G%*10)
ENDIF
IFb%(K%,E%)<>0THEN
CASESGN(b%(K%,E%))OF
WHEN-1:PROCM(x%,y%,K%,E%)
WHEN1:PROCa("inv_"+STR$(b%(K%,E%)),x%,y%)
ENDCASE
ELSE:v%!b%=x%:v%!a%=y%:v%!f%=D%!f%:v%!k%=D%!k%:PROCd(v%)
ENDIF
NEXTE%:NEXTK%:PROCc(v%):ENDPROC
DEFPROCM(x%,y%,r%,c%):LOCALib%:ib%=FNb(16):b%(r%,c%)+=1:PROCa("inv_4",x%,y%):IFb%(r%,c%)=0THEN
ib%!b%=x%:ib%!a%=y%:ib%!f%=D%!f%:ib%!k%=D%!k%:PROCd(ib%)
ENDIF
PROCc(ib%):ENDPROC
DEFPROCs:LOCALv%,i%:v%=FNb(16):FORi%=1TO3:e%!a%-=D%!k%/3:PROCl:NEXTi%:v%!b%=e%!b%:v%!a%=e%!a%+e%!k%:v%!f%=e%!f%:v%!k%=D%!k%:PROCd(v%):PROCc(v%):ENDPROC
DEFPROCr:LOCALQ%,W%,G%,jb%,M%,i%,h$:M%=1:kb%=24:Q%=FNb(28):W%=FNb(28):PROCd(e%):PROCd(m%):IFo%!q%THEN
PROCd(o%):o%!q%=FALSE
ENDIF
IFd%!q%THEN
PROCd(d%):d%!q%=FALSE
ENDIF
FORi%=1TO7:IFa%(i%)!q%THEN
PROCd(a%(i%)):a%(i%)!q%=FALSE
ENDIF
NEXTi%:m%!b%=FNc(m%,h%):Q%!b%=0-D%!f%:Q%!a%=m%!a%:Q%!L%=M%:W%!b%=h%!f%:W%!a%=m%!a%:W%!L%=0-M%:w%!Y%=0:PROCg(N%!xa%):PROCi(w%!Y%):PROCk(w%!Ea%):PROCa("base",m%!b%,m%!a%):G%=0:jb%=FALSE:REPEAT:Q%!b%+=Q%!L%:Q%!kb%=Q%!b%+D%!f%:W%!b%+=W%!L%:G%+=1
IFG%MOD20=0THENjb%=FNi(jb%)
IFG%>1000THENG%=0
IFjb%THENh$="inv_11"ELSEh$="inv_1"
PROCa(h$,Q%!b%,Q%!a%):PROCa(h$,W%!b%,W%!a%):PROCe(2):WAIT:UNTILQ%!kb%>=m%!b%:FORi%=1TO10:PROCa("inv_1",Q%!b%,Q%!a%):PROCa("inv_1",W%!b%,W%!a%):PROCe(20):PROCa("inv_11",Q%!b%,Q%!a%):PROCa("inv_11",W%!b%,W%!a%):PROCe(20):WAIT:NEXTi%:FORi%=1TO3
PROCa("base_"+STR$(i%),m%!b%,m%!a%):PROCe(20):WAIT:NEXTi%:PROCe(20):PROCd(m%):PROCc(Q%):PROCc(W%):ENDPROC
DEFFNo(j$):LOCALlb%,B%:B%=FNx(j$)+256:lb%=FNb(B%):!lb%=B%:lb%!4=0:lb%!8=16:lb%!12=16:SYSfa%,256+10,lb%,j$:SYSfa%,256+17,lb%:=lb%
DEFPROCb(x%,y%,a$,mb%):LOCALi%,nb%:ia%=ha%:nb%=h%!_%:FORi%=1TOLEN(a$):PROCa(STR$(ASC(MID$(a$,i%,1))),x%+((i%-1)*nb%),y%):IFmb%>0THENPROCe(mb%)
NEXTi%:ia%=ga%:ENDPROC
DEFPROCa(q$,x%,y%):LOCALob%:SYSfa%,256+24,ia%,q$TO,,ob%:SYSfa%,512+34,ia%,ob%,x%,y%,0:ENDPROC
DEFPROCd(p%):GCOL0,0TINT0:RECTANGLEFILLp%!b%,p%!a%,p%!f%,p%!k%:ENDPROC
DEFFNh(pb%,h%):=(h%/2)-(pb%/2)
DEFPROCn(a$,qb%):LOCALS%,y%:S%=LEN(a$)*h%!_%:y%=(h%!k%/2)-(h%!V%/2):PROCb(FNh(S%,h%!f%),y%,a$,qb%):ENDPROC
DEFFNc(rb%,sb%):=(sb%!f%/2)-(rb%!f%/2)
DEFFNn(rb%,sb%):LOCALx%,y%:rb%!b%=(sb%!f%/2)-(rb%!f%/2):rb%!a%=(sb%!k%/2)-(rb%!k%/2):=rb%
DEFPROCg(a%):LOCALi%,tb%:tb%=h%!f%/N%!f%:FORi%=1TOtb%+1:PROCa("rail",(i%-1)*N%!f%,a%):NEXTi%:ENDPROC
DEFPROCj(p%):LOCALx%,y%,ub%,vb%,wb%,xb%,i%:ub%=FNa(3,1):vb%=FNa(3,2):wb%=1:xb%=3:FORi%=1TOp%!f%:x%=p%!b%+((i%-1)*wb%):PROCa("box_x",x%,p%!a%):PROCa("box_x",x%,p%!a%+(p%!k%-(2*xb%))):NEXTi%:x%=p%!b%+(p%!f%-ub%):FORi%=1TOp%!k%-1
PROCa("box_y",p%!b%,p%!a%+((i%-1)*wb%)):PROCa("box_y",x%,p%!a%+((i%-1)*wb%)):NEXTi%:PROCa("box_bl",p%!b%,p%!a%):PROCa("box_tl",p%!b%,(p%!a%+p%!k%)-vb%):PROCa("box_br",p%!b%+(p%!f%-ub%),p%!a%):x%=(p%!b%+p%!f%)-ub%:y%=(p%!a%+p%!k%)-vb%:PROCa("box_tr",x%,y%):ENDPROC
DEFPROCm:LOCALv%:v%=FNb(20):v%!0=4:v%!4=5:v%!8=11:v%!12=12:v%!16=-1:SYS"OS_ReadVduVariables",v%,v%:h%!ta%=v%!0:h%!ua%=v%!4:h%!f%=(v%!8)+1<<v%!0:h%!k%=(v%!12)+1<<v%!4:h%!va%=MODE:PROCc(v%):ENDPROC
DEFFNa(B%,yb%):LOCALzb%,Ab%:Ab%=MODE:IFAb%<>h%!va%THENPROCm
CASEyb%OF
WHEN1:zb%=B%<<h%!ta%
WHEN2:zb%=B%<<h%!ua%
WHEN3:zb%=B%>>h%!ta%
WHEN4:zb%=B%>>h%!ua%
OTHERWISE:ERROR255,"Unknown FNconv_units() operation : "+STR$(yb%)
ENDCASE
=zb%
DEFFNj(p%,Bb%):LOCALCb%,Db%,Eb%,Fb%:Eb%=FALSE:Fb%=FALSE:IFp%!q%ANDBb%!q%THEN
Cb%=Bb%!b%+Bb%!f%:Db%=Bb%!a%+Bb%!k%:IFp%!b%>=Bb%!b%ANDp%!b%<Cb%THENEb%=TRUE
IFp%!a%>=Bb%!a%ANDp%!a%<Db%THENFb%=TRUE
ENDIF
=Eb%ANDFb%
DEFFNe(p%):LOCALVa%,Gb%,B%:B%=FNs(p%):Gb%=FNb(B%):FORVa%=0TOB%-4STEP4:Gb%!Va%=p%!Va%:NEXTVa%:=Gb%
DEFPROCv:LOCALm$:ONERROROFF
m$=" Panic!!!":CASEERROF
WHEN17:m$="Program Terminated."
WHEN254:m$="ASH"+m$
WHEN255:m$="Game"+m$
OTHERWISE:m$="System"+m$
ENDCASE
PRINTm$:PRINTSTRING$(LEN(m$),"="):PRINT:REPORT:PRINT" at line : ";ERL:OSCLI"PlayStop":PROCo:ENDPROC
DEFFNk(r$,k$):LOCALd$,R%,Hb%:Hb%=FALSE:d$=STRING$(10," "):RIGHT$(d$,3)=" : ":LEFT$(d$,LEN(k$))=k$:R%=FNp(r$):IFR%=1THEN
d$+="OK.":Hb%=TRUE
ELSE:d$+="Missing!!"
ENDIF
PRINTd$:=Hb%
DEFFNg(n%):LOCALIb%:Ib%=RND(100):=Ib%<=n%
DEFFNl(a$):LOCALi%,l$:FORi%=1TOLEN(a$):l$+=CHR$(ASC(MID$(a$,i%,1))EOR131):NEXTi%:=l$
DEFPROCe(n%):LOCALt%:t%=TIME+n%:REPEAT:UNTILTIME>=t%:ENDPROC
DEFFNi(n%):=n%EOR1
DEFFNv(n%):LOCALb$,u%:u%=VAL(RIGHT$(STR$(n%),1)):CASEu%OF
WHEN1:b$="st"
WHEN2:b$="nd"
WHEN3:b$="rd"
OTHERWISE:b$="th"
ENDCASE
=b$
DEFFNf(a$,Jb%,o$,Kb%):LOCALLb%,b$:Lb%=Jb%-LEN(a$):IFLb%<=0THEN
b$=LEFT$(a$,Jb%)
ELSE:IFKb%THEN
b$=STRING$(Jb%,o$):RIGHT$(b$,LEN(a$))=a$
ELSE:b$=a$+STRING$(Lb%,o$)
ENDIF
ENDIF
=b$
DEFFNr(a$,Jb%):LOCALb$:b$=STRING$(Jb%," "):RIGHT$(b$,LEN(a$))=a$:=b$
DEFFNp(e$):LOCALHb%:SYS"XOS_File",17,e$TOHb%:=Hb%
DEFFNx(e$):LOCALB%:SYS"XOS_File",5,e$TO,,,,B%:=B%
DEFFNq(yb%,e$):LOCALP%,Mb%,Nb%,Ob%:Ob%=FALSE:CASEyb%OF
WHEN0:P%=OPENUP(e$+"chkfile")
WHEN1:P%=OPENUP(e$)
OTHERWISE:ERROR255,"Unknown FNfs_writeable op :"+STR$(yb%)
ENDCASE
IFP%<>0THEN
SYS"XOS_Args",254,P%TONb%;Mb%:IF(Mb%AND1)THEN
CLOSE#P%:ERROR255,"Unknown FNfs_writeable fault."
ENDIF
IF((Nb%AND(1<<7))<>0)THENOb%=TRUE
CLOSE#P%
ENDIF
=Ob%
DEFPROCw:LOCALPb%:U%=0:Qb%=0:SYS"Wimp_SlotSize",-1,-1TORb%:SYS"XOS_ReadMemMapInfo"TOSb%;Pb%:IFPb%AND1THENSb%=16384
PROCN(Sb%):ENDPROC
DEFPROCo:IFU%THEN
SYS"Wimp_SlotSize",U%-32768,-1TORb%:U%=0:Qb%=0
ENDIF
ENDPROC
DEFFNb(X%):LOCALC%,B%:B%=(X%+15)AND-4:C%=FNy(B%):IFC%ELSEERROR254,"Heap claim failed: no room"
C%!0=&DEADDEAD:C%!4=X%:!(C%-8+(C%!-4))=&DEADDEAD:=C%+8
DEFPROCc(RETURNC%):C%-=8:IFC%!0<>&DEADDEADTHEN
ERROR254,"Block allocation under-run!"
ENDIF
IF!(C%-8+(C%!-4))<>&DEADDEADTHEN
ERROR254,"Block allocation over-run!"
ENDIF
Qb%-=C%!-4:SYS"OS_Heap",3,U%,C%:C%=0:ENDPROC
DEFFNz:=Qb%
DEFFNA:LOCALTb%:Tb%=(Rb%+32768-U%)-Qb%:IFTb%<0THENERROR254,"Heap overflow!"
=Tb%
DEFFNB:=Rb%+32768-U%
DEFFNs(C%):LOCALv%:v%=C%-4:=v%!0
DEFFNu(C%,hb%):LOCALi%,B%:B%=FNs(C%):FORi%=0TOB%-4STEP4:C%!i%=hb%:NEXTi%:=C%
DEFPROCN(B%):IFU%THENERROR254,"You cannot have multiple heaps"
B%=(B%+Sb%-1)ANDNOT(Sb%-1):U%=HIMEM:SYS"Wimp_SlotSize",Rb%+B%,-1TORb%:B%=Rb%+32768-U%:IFB%<1THEN
U%=0:ERROR254,"Could not extend WimpSlot for heap"
ELSE:SYS"OS_Heap",0,U%,,B%
ENDIF
Qb%=0:ENDPROC
DEFPROCO(X%):LOCALUb%:Ub%=Rb%:SYS"Wimp_SlotSize",Rb%+X%,-1TORb%:X%=Rb%-Ub%:IFX%THENSYS"OS_Heap",5,U%,,X%TO,,,X%
ENDPROC
DEFFNy(X%):LOCALC%,Pb%:SYS"XOS_Heap",2,U%,,X%TO,,C%;Pb%:IFPb%AND1THEN
PROCO((X%+Sb%)ANDNOT(Sb%-1)):SYS"XOS_Heap",2,U%,,X%TO,,C%;Pb%:IFPb%AND1THEN=0
ENDIF
Qb%+=C%!-4:=C%