home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
A.N.A.L.O.G. Magazine 1985 November
/
85_nov.atr
/
sneak.act
< prev
next >
Wrap
Text File
|
2023-02-26
|
15KB
|
1 lines
; Sneak Attack by David Plotkin¢¢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()¢;Step back HiMem and move the¢;character set into RAM¢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()¢;the display list interrupt routine¢ [$48 $8A $48 $98 $48]¢ Wsync=1¢ Colbk=50¢ [$68 $A8 $68 $AA $68 $40]¢¢¢PROC ScoreLine()¢;set up the dli¢ Dlist=Sdlst¢ Vdslst=Dlint¢ Dlist(27)=130¢ Nmien=$C0¢RETURN¢¢¢PROC Update()¢;print score and level¢ 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()¢;Set up the address of each screen¢;line and initialize¢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)¢;Plot a char at location x,y¢BYTE ARRAY line¢ line=Linept(y)¢ line(x)=ch¢RETURN¢¢¢BYTE FUNC Locate0(BYTE x,y)¢;Returns the value of the char at x,y¢BYTE ARRAY line¢ line=Linept(y)¢RETURN(line(x))¢¢¢PROC Noise()¢;the explosion noises¢ 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)¢;see which chute was hit by missile 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)¢;see which man was hit by missile 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)¢;explosions in place of Chopper lp¢BYTE lq¢ FOR lq=0 TO 59 STEP 2 DO ;find empty¢ 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)¢;which chopper was hit by missile 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)¢;see if missile wh hit anything¢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()¢;Modify the RAM character set¢CARD xx¢ FOR xx=0 TO 103 DO¢ Charset(xx+8)=ShapeTable(xx)¢ OD¢RETURN¢¢¢PROC LaunchTrooper(BYTE wh)¢;drop a paratrooper from chopper wh¢BYTE lp¢ IF Fate>240-(Level LSH 1) THEN¢ FOR lp=0 TO 29 DO ;find MT trooper¢ IF TrStatus(lp)=0 THEN ;got one¢ 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)¢;erase chopper number 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)¢;draw chopper number wh¢ Plot0(Chopperx(wh),Choppery(wh),1)¢ Plot0(Chopperx(wh)+1,Choppery(wh),2)¢RETURN¢¢¢PROC ClearScreen()¢;clear the screen¢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()¢;move the choppers¢BYTE lp,ps=[0]¢ FOR lp=0 TO 29 DO¢ IF Chopperstatus(lp)=1 THEN ;right¢ 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 ;left¢ 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()¢;Decide whether to send off a new¢;chopper, which side, how high up¢BYTE lp¢ IF Fate>230-(Level LSH 1) THEN¢ FOR lp=0 TO 29 DO ;find MT chopper¢ IF Chopperstatus(lp)=0 THEN¢ Choppery(lp)=Rand(Hard)¢ IF Fate>128 THEN¢ Chopperx(lp)=38 ;right side¢ Chopperstatus(lp)=2¢ ELSE¢ Chopperx(lp)=0 ;left side¢ Chopperstatus(lp)=1¢ FI¢ DrawChopper(lp)¢ EXIT¢ FI¢ OD¢ FI¢RETURN¢¢¢PROC DrawBase()¢;draw the base¢BYTE lp¢ FOR lp=19 TO 21 DO¢ Plot0(lp,22,128)¢ OD¢ Plot0(20,21,4)¢RETURN¢¢¢PROC AimGun()¢;read the joystick and move the base¢ IF Stick=11 THEN¢ Ps=3¢ ELSEIF Stick=7 THEN¢ Ps=5¢ ELSE¢ Ps=4¢ FI¢ Plot0(20,21,Ps)¢RETURN¢¢¢PROC Shoot()¢;send off a bullet¢BYTE trig=644,lp,flg=[0]¢ IF trig=1 OR flg=0 THEN¢ flg=1¢ RETURN¢ FI¢ FOR lp=0 TO 29 DO ;find empty shot¢ IF MisStatus(lp)=0 THEN ;got one¢ 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()¢;move the fired bullets¢BYTE lp¢ FOR lp=0 TO 29 DO ;for each shot¢ 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()¢;move the explosions¢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()¢;explode the base¢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()¢;move the troopers from the right¢;to the base¢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()¢;Move the troopers from the left to¢;the base¢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()¢;print the end of game message and¢;test for new game¢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()¢;game over when four troopers down¢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()¢;game over when trooper lands on base¢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)¢;redraw trooper wh at bottom of screen¢BYTE cc¢ TrStatus(wh)=0¢ cc=Trx(wh)¢ Plot0(Trx(wh),Try(wh),0) ;erase chute¢ Plot0(Trx(wh),Try(wh)+1,11) ;replace¢ 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()¢;make trooper fall when chute hit¢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()¢;move paratroopers down screen¢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()¢;go to higher level¢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¢¢