; SNEAK ATTACK›››MODULE››BYTE› CHRBASE=756,MAX,BKGRND=710,FATE=53770,LEVEL=[1],CURSIN=752,STICK=632,PS,LOUD=[0],INDX=[0],DOWNL=[0],DOWNR=[0],LOUD1=[0],› SND1=$D208,SND2=$D20F,FREQ=[169],WSYNC=$D40A,COLBK=$D018,NMIEN=$D40E,HARD=[15],CONSOL=53279›››CARD› SCRN=88,RAMSET,HIMEM=$2E5,SCORE=[0],COMP=[300],SDLST=560,VDSLST=512›››CARD ARRAY LINEPT(24)››BYTE ARRAY› CHARSET,CHOPPERSTATUS(30),CHOPPERX(30),CHOPPERY(30),EXPX(60),EXPY(60),EXPSTATUS(60),TRSTATUS(30),TRX(30),TRY(30),MISSTATUS(30),› MISX(30),MISY(30),LL(20),RR(20),DLIST,› SHAPETABLE(0)=› [254 16 124 71 127 12 62 0› 127 8 62 226 254 24 126 0› 96 96 48 48 24 60 231 255› 24 24 24 24 24 60 231 255› 6 6 12 12 24 60 231 255› 128 85 17 66 24 170 91 131› 60 126 255 255 195 66 36 24› 60 36 24 255 60 24 36 102› 0 0 0 0 0 0 0 0› 60 36 24 255 60 24 36 102 › 60 36 219 255 60 24 36 102 › 60 60 24 60 60 24 24 28› 60 60 24 60 60 60 102 195]›››PROC DOWNLOAD()›CARD INDEX›BYTE VAL› RAMSET=(HIMEM-$400)&$FC00› CHRBASE=RAMSET RSH 8› HIMEM=RAMSET› FOR INDEX=0 TO 1023 DO› VAL=PEEK(57344+INDEX)› POKE(RAMSET+INDEX,VAL)› OD› CHARSET=RAMSET›RETURN›››PROC DLINT()› [$48 $8A $48 $98 $48]› WSYNC=1› COLBK=50› [$68 $A8 $68 $AA $68 $40]› ››PROC SCORELINE()› DLIST=SDLST › VDSLST=DLINT› DLIST(27)=130› NMIEN=$C0›RETURN›››PROC UPDATE()› POSITION(1,23)› PRINT("SCORE: ")› POSITION(8,23)› PRINTC(SCORE)› POSITION(18,23)› PRINT("LEVEL: ")› POSITION(25,23)› PRINTB(LEVEL)›RETURN›››PROC TITLE()›BYTE COLPF0=53270,COLPF1=53271,COLPF2=53273,COLPF3=53273,RTCLOCK=20,VCOUNT=54283› GRAPHICS(18)› POSITION(3,4)› PRINTD(6,"SNEAK ATTACK")› POSITION (8,5)› PRINTD(6,"BY")› POSITION(3,7)› PRINTD(6,"DAVID PLOTKIN")› POSITION(3,9)› PRINTD(6,"ÐÒÅÓÓ ÓÔÁÒÔ")› WHILE CONSOL<>6 DO› COLPF3=FATE› WSYNC=0› COLPF0=128-VCOUNT+RTCLOCK RSH 2› COLPF1=VCOUNT+RTCLOCK RSH 2› OD›RETURN››››PROC GR0INIT()›CARD XX› GRAPHICS(0)› CURSIN=1› PRINT(" ")› FOR XX=0 TO 23 DO› LINEPT(XX)=SCRN+(40*XX)› OD› FOR XX=0 TO 29 DO› CHOPPERSTATUS(XX)=0› CHOPPERX(XX)=0› CHOPPERY(XX)=0› MISX(XX)=0› MISY(XX)=0› MISSTATUS(XX)=0› TRSTATUS(XX)=0› OD› FOR XX=0 TO 59 DO› EXPSTATUS(XX)=0› OD› FOR XX=0 TO 19 DO› LL(XX)=0› RR(XX)=0› OD› BKGRND=0› UPDATE()›RETURN››››PROC PLOT0(BYTE X,Y,CH)›BYTE ARRAY LINE› LINE=LINEPT(Y)› LINE(X)=CH›RETURN››››BYTE FUNC LOCATE0(BYTE X,Y)›BYTE ARRAY LINE› LINE=LINEPT(Y)›RETURN(LINE(X))››››PROC NOISE()› IF LOUD=0 AND LOUD1=0 AND FREQ=169 THEN› RETURN› FI› IF LOUD THEN› LOUD==-2› SOUND(0,90,8,LOUD)› FI› IF LOUD1 THEN› LOUD1==-2› SOUND(1,150,8,LOUD1)› FI› IF FREQ<168 THEN› FREQ==+8› SOUND(2,FREQ,10,4)› ELSE› FREQ=169› SOUND(2,0,0,0)› FI›RETURN››››PROC HITCHUTE(BYTE WH)›BYTE LP› FOR LP=0 TO 29 DO› IF MISX(WH)=TRX(LP) AND (MISY(WH)=TRY(LP) OR MISY(WH)=TRY(LP)+1) THEN TRSTATUS(LP)=2› PLOT0(TRX(LP),TRY(LP),0)› PLOT0(TRX(LP),TRY(LP)+1,10)› PLOT0(TRX(LP),TRY(LP)+2,0)› EXIT› FI› OD› IF TRY(LP) LSH 3 < FREQ THEN FREQ=TRY(LP) LSH 3› FI›RETURN››››PROC HITMAN(BYTE WH)›BYTE LP› FOR LP=0 TO 29 DO› IF MISX(WH)=TRX(LP) AND (MISY(WH)=TRY(LP)+1 OR MISY(WH)=TRY(LP)+2) THEN› TRSTATUS(LP)=3› PLOT0(TRX(LP),TRY(LP)+1,6)› PLOT0(TRX(LP),TRY(LP),0)› PLOT0(TRX(LP),TRY(LP)+2,0)› FI› OD› LOUD1=12›RETURN› ›››PROC EXPLODECHOPPER(BYTE LP)›BYTE LQ› FOR LQ=0 TO 59 STEP 2 DO› IF EXPSTATUS(LQ)=0 THEN› EXPSTATUS(LQ)=1› EXPSTATUS(LQ+1)=1› EXPX(LQ)=CHOPPERX(LP)› EXPX(LQ+1)=CHOPPERX(LP)+1› EXPY(LQ)=CHOPPERY(LP)› EXPY(LQ+1)=CHOPPERY(LP)› CHOPPERSTATUS(LP)=0› PLOT0(EXPX(LQ),EXPY(LQ),6)› PLOT0(EXPX(LQ+1),EXPY(LQ+1),6)› EXIT› FI› OD›RETURN› ››PROC HITCHOPPER(BYTE WH)›BYTE LP› FOR LP=0 TO 29 DO› IF MISY(WH)=CHOPPERY(LP) AND (MISX(WH)=CHOPPERX(LP) OR MISX(WH)=CHOPPERX(LP)+1) THEN› EXPLODECHOPPER(LP)› EXIT› FI› OD› LOUD=12›RETURN›››PROC MISSILEHIT(BYTE WH)›BYTE DUM› DUM=LOCATE0(MISX(WH),MISY(WH))› IF DUM=0 THEN› PLOT0(MISX(WH),MISY(WH),84)› RETURN› FI› MISSTATUS(WH)=0› IF DUM=1 OR DUM=2 THEN› HITCHOPPER(WH)› SCORE==+1› ELSEIF (DUM=7 AND INDX<6 OR DUM=8 AND INDX>3) THEN› HITCHUTE(WH)› SCORE==+2› ELSEIF (DUM=8 AND INDX<4 OR DUM=9 AND INDX>1) THEN› HITMAN(WH)› SCORE==+1› FI›RETURN›››PROC MODIFY()›CARD XX› FOR XX=0 TO 103 DO› CHARSET(XX+8)=SHAPETABLE(XX)› OD›RETURN›››PROC LAUNCHTROOPER(BYTE WH)›BYTE LP› IF FATE>240-(LEVEL LSH 1) THEN› FOR LP=0 TO 29 DO› IF TRSTATUS(LP)=0 THEN TRSTATUS(LP)=1› TRX(LP)=CHOPPERX(WH)› IF TRX(LP)=0 THEN› TRX(LP)=1› FI› TRY(LP)=CHOPPERY(WH)+1› PLOT0(TRX(LP),TRY(LP),7)› PLOT0(TRX(LP),TRY(LP)+1,8)› PLOT0(TRX(LP),TRY(LP)+2,9)› EXIT› FI› OD› FI›RETURN›››PROC ERASECHOPPER(BYTE WH)› PLOT0(CHOPPERX(WH),CHOPPERY(WH),0)› PLOT0(CHOPPERX(WH)+1,CHOPPERY(WH),0)› CHOPPERSTATUS(WH)=0› CHOPPERX(WH)=0› CHOPPERY(WH)=0›RETURN›››PROC DRAWCHOPPER(BYTE WH)› PLOT0(CHOPPERX(WH),CHOPPERY(WH),1)› PLOT0(CHOPPERX(WH)+1,CHOPPERY(WH),2)›RETURN›››PROC CLEARSCREEN()›BYTE LP› FOR LP=0 TO 29› DO› IF CHOPPERSTATUS(LP) THEN› ERASECHOPPER(LP)› FI› IF TRSTATUS(LP) THEN TRSTATUS(LP)=0› PLOT0(TRX(LP),TRY(LP),0)› PLOT0(TRX(LP),TRY(LP)+1,0)› PLOT0(TRX(LP),TRY(LP)+2,0)› FI› IF MISSTATUS(LP)=1 THEN MISSTATUS(LP)=0› PLOT0(MISX(LP),MISY(LP),0)› FI› OD› FOR LP=0 TO 59 STEP 2 DO› IF EXPSTATUS(LP)=1 THEN EXPSTATUS(LP)=0› EXPSTATUS(LP+1)=0› PLOT0(EXPX(LP),EXPY(LP),0)› PLOT0(EXPX(LP+1),EXPY(LP+1),0)› FI› OD›RETURN›››PROC MOVECHOPPER()›BYTE LP,PS=[0]› FOR LP=0 TO 29 DO› IF CHOPPERSTATUS(LP)=1 THEN IF CHOPPERX(LP)=38 THEN ERASECHOPPER(LP)› ELSE› PLOT0(CHOPPERX(LP),CHOPPERY(LP),0)› CHOPPERX(LP)==+1› DRAWCHOPPER(LP)› LAUNCHTROOPER(LP)› FI› FI› IF CHOPPERSTATUS(LP)=2 THEN IF CHOPPERX(LP)=0 THEN ERASECHOPPER(LP)› ELSE› PLOT0(CHOPPERX(LP)+1,CHOPPERY(LP),0)› CHOPPERX(LP)==-1› DRAWCHOPPER(LP)› LAUNCHTROOPER(LP)› FI› FI› OD› IF PS=0 THEN CHARSET(8)=56› CHARSET(16)=28› PS=1› ELSE› PS=0› CHARSET(8)=254› CHARSET(16)=127› FI›RETURN›››PROC LAUNCHCHOPPER()›BYTE LP› IF FATE>230-(LEVEL LSH 1) THEN FOR LP=0 TO 29 DO› IF CHOPPERSTATUS(LP)=0 THEN CHOPPERY(LP)=RAND(HARD)› IF FATE>128 THEN CHOPPERX(LP)=38› CHOPPERSTATUS(LP)=2› ELSE› CHOPPERX(LP)=0› CHOPPERSTATUS(LP)=1› FI› DRAWCHOPPER(LP)› EXIT› FI› OD› FI›RETURN›››PROC DRAWBASE()›BYTE LP› FOR LP=19 TO 21 DO› PLOT0(LP,22,128)› OD› PLOT0(20,21,4)›RETURN›››PROC AIMGUN()› IF STICK=11 THEN PS=3› ELSEIF STICK=7 THEN PS=5› ELSE› PS=4› FI› PLOT0(20,21,PS)›RETURN›››PROC SHOOT()›BYTE TRIG=644,LP,FLG=[0]› IF TRIG=1 OR FLG=0 THEN FLG=1› RETURN› FI› FOR LP=0 TO 29 DO› IF MISSTATUS(LP)=0 THEN MISSTATUS(LP)=1› MISY(LP)=20› IF PS=3 THEN MISX(LP)=19› ELSEIF PS=5 THEN MISX(LP)=21› ELSE› MISX(LP)=20› FI› MISSILEHIT(LP)› EXIT› FI› OD› FLG=0›RETURN›››PROC MOVESHOTS()›BYTE LP› FOR LP=0 TO 29 DO› IF MISSTATUS(LP)=1 THEN PLOT0(MISX(LP),MISY(LP),0)› IF STICK=11 THEN MISX(LP)==-1› ELSEIF STICK=7 THEN MISX(LP)==+1› ELSE MISY(LP)==-1› FI› IF (MISX(LP)<>39 AND MISY(LP)<>255 AND MISX(LP)<>0) THEN MISSILEHIT(LP)› ELSE MISSTATUS(LP)=0› FI› FI› OD›RETURN›››PROC MOVEEXPLOSIONS()›BYTE LP› FOR LP=0 TO 59 STEP 2 DO› IF EXPSTATUS(LP)=1 THEN PLOT0(EXPX(LP),EXPY(LP),0)› PLOT0(EXPX(LP+1),EXPY(LP+1),0)› EXPY(LP)==+1› EXPY(LP+1)==+1› EXPX(LP)==-1› EXPX(LP+1)==+1› IF EXPY(LP)<>22 AND EXPX(LP)<>0 AND EXPX(LP+1)<>39 THEN › PLOT0(EXPX(LP),EXPY(LP),6)› PLOT0(EXPX(LP+1),EXPY(LP+1),6)› ELSE› EXPSTATUS(LP)=0› EXPSTATUS(LP+1)=0› FI› FI› OD›RETURN›››PROC BASEEXPLODE()›BYTE ARRAY ENDX(0)=[16 24 17 23 20],ENDY(0)=[22 22 19 19 17]›BYTE LP,TIME=20› COLOR=38› FOR LP=0 TO 4 DO› PLOT(20,22)› DRAWTO(ENDX(LP),ENDY(LP))› OD› FOR LP=0 TO 16 DO› SOUND(0,FATE,8,16-LP)› SOUND(1,FATE,8,16-LP)› TIME=0› DO› UNTIL TIME=15› OD› OD› SNDRST()› COLOR=32› FOR LP=0 TO 4 DO› PLOT(20,22)› DRAWTO(ENDX(LP),ENDY(LP))› OD›RETURN›››PROC ENDRIGHT()›BYTE LP,LQ,NN,TIME=20› FOR LP=0 TO 19 DO› IF RR(LP)=1 THEN LQ=21+LP› WHILE LQ>20 DO› IF NN=12 THEN NN=13› ELSE NN=12› FI› PLOT0(LQ,22,NN)› TIME=0› DO› UNTIL TIME=10› OD› PLOT0(LQ,22,0)› LQ==-1› OD› PLOT0(21,22,11)› FI› OD› FOR LP=0 TO 3 DO› PLOT0(21,22-LP,11)› TIME=0› DO› UNTIL TIME=10› OD› OD› BASEEXPLODE()›RETURN››››PROC ENDLEFT()›BYTE LP,LQ,LC,NN,TIME=20› FOR LP=0 TO 19 DO› LQ=19-LP› IF LL(LQ)=1 THEN FOR LC=LQ TO 19 DO› IF NN=12 THEN NN=13› ELSE NN=12› FI› PLOT0(LC,22,NN)› TIME=0› DO› UNTIL TIME=10› OD› PLOT0(LC,22,0)› OD› PLOT0(19,22,11)› FI› OD› FOR LP=0 TO 3 DO› PLOT0(19,22-LP,11)› TIME=0› DO› UNTIL TIME=10› OD› OD› BASEEXPLODE()›RETURN›››PROC ENDPRINT()›BYTE TRIG=644,LP› POSITION(10,7)› PRINT("GAME OVER...FINAL SCORE:")› POSITION(15,8)› PRINTC(SCORE)› POSITION(15,9)› PRINT("FINAL LEVEL :")› PRINTB(LEVEL)› POSITION(10,20)› PRINT("PRESS ÆÉÒÅ TO PLAY AGAIN")› DO› UNTIL TRIG=0› OD› DOWNL=0› DOWNR=0› PUT(125)› FOR LP=0 TO 19 DO› LL(LP)=0› RR(LP)=0› OD› SCORE=0› LEVEL=1› DRAWBASE()› UPDATE()› HARD=15›RETURN›››PROC GAMEOVERTWO()›BYTE LP› SNDRST()› CLEARSCREEN()› LOUD=0› LOUD1=0› FREQ=169› FOR LP=0 TO 19 DO› IF LL(LP)=1 THEN PLOT0(LP,22,11)› FI› IF RR(LP)=1 THEN PLOT0(LP+21,22,11)› FI› OD› IF DOWNL=4 THEN ENDLEFT()› ELSE› ENDRIGHT()› FI› ENDPRINT()›RETURN›››PROC GAMEOVERONE()›BYTE LP› SNDRST()› CLEARSCREEN()› LOUD=0› LOUD1=0› FREQ=169› FOR LP=0 TO 19 DO› IF LL(LP)=1 THEN PLOT0(LP,22,11)› FI› IF RR(LP)=1 THEN PLOT0(LP+21,22,11)› FI› OD› BASEEXPLODE()› ENDPRINT()›RETURN›››PROC TROOPERDOWN(BYTE WH)›BYTE CC› TRSTATUS(WH)=0› CC=TRX(WH)› PLOT0(TRX(WH),TRY(WH),0)› PLOT0(TRX(WH),TRY(WH)+1,11)› IF TRX(WH)<20 AND LL(CC)=0 THEN LL(CC)=1› DOWNL==+1› ELSEIF TRX(WH)>20 AND RR(CC-21)=0 THEN RR(CC-21)=1› DOWNR==+1› ELSEIF TRX(WH)=20 THEN GAMEOVERONE()› FI› IF DOWNL=4 OR DOWNR=4 THEN GAMEOVERTWO()› FI›RETURN›››PROC TROOPERFALL()›BYTE LP,QQ,CC› FOR LP=0 TO 29 DO› IF TRSTATUS(LP)=2 THEN PLOT0(TRX(LP),TRY(LP)+1,0)› TRY(LP)==+1› IF TRY(LP)=21 THEN CC=TRX(LP)› IF TRX(LP)<20 AND LL(CC)=1 THEN DOWNL==-1› LL(CC)=0› ELSEIF TRX(LP)>20 AND RR(CC-21)=1 THEN RR(CC-21)=0› DOWNR==-1› FI› FI› IF (TRY(LP)<22 AND TRX(LP)<>20) OR (TRY(LP)<20 AND TRX(LP)=20) THEN PLOT0(TRX(LP),TRY(LP)+1,10)› ELSE› TRSTATUS(LP)=0› FI› FI› OD ›RETURN›››PROC MOVETROOPERS()›BYTE LP,QQ›BYTE ARRAY TROOPER(0)=[60 126 255 255 195 66 36 24 › 60 36 24 255 60 24 36 102› 0 0 0 0 0 0 0 0]› FOR LP=0 TO INDX DO› CHARSET(56+LP)=0› OD› MOVEBLOCK(CHARSET+56+INDX+1,TROOPER,16)› INDX==+1› IF INDX<8 THEN RETURN› FI› INDX=0› FOR LP=0 TO 29 DO› IF TRSTATUS(LP)=1 THEN PLOT0(TRX(LP),TRY(LP),0)› TRY(LP)==+1› IF TRY(LP)=21 THEN TROOPERDOWN(LP)› FI› FI› IF TRSTATUS(LP)=3 THEN TRSTATUS(LP)=0› PLOT0(TRX(LP),TRY(LP)+1,0)› FI› OD› MOVEBLOCK(CHARSET+56,TROOPER,24)› FOR LP=0 TO 29 DO› IF TRSTATUS(LP)=1 THEN › PLOT0(TRX(LP),TRY(LP),7)› PLOT0(TRX(LP),TRY(LP)+1,8)› PLOT0(TRX(LP),TRY(LP)+2,9)› FI› OD›RETURN›››PROC NEWLEVEL()›BYTE LP,TIME=20› LEVEL==+1› IF LEVEL>100 THEN LEVEL=100› FI› SNDRST()› LOUD=0› LOUD1=0› FREQ=169› COMP==+300› FOR LP=10 TO 150 STEP 10 DO› SOUND(0,LP,10,4)› SOUND(1,LP+10,10,4)› TIME=0› DO› UNTIL TIME=2› OD› OD› POSITION(25,23)› PRINTB(LEVEL)› IF LEVEL>8 THEN HARD=19› FI› SNDRST()›RETURN›››PROC MAIN()›BYTE TIME=20,LP,CH=764› TITLE()› GR0INIT()› SND1=0› SND2=3› DOWNLOAD()› MODIFY()› DRAWBASE()› SCORELINE()› DO› LAUNCHCHOPPER()› MOVECHOPPER()› MOVEEXPLOSIONS()› NOISE()› TROOPERFALL()› MOVETROOPERS()› POSITION(8,23)› PRINTC(SCORE)› IF SCORE>COMP THEN NEWLEVEL()› FI› TIME=0› FOR LP=2 TO 6 STEP 2 DO› AIMGUN()› SHOOT()› MOVESHOTS()› DO› UNTIL TIME=LP› OD› OD› OD›RETURN››