! ************************** ! * Space Shoot Em Up Demo * ! * * ! * Requires XB256 and * ! * the Compiler * ! * * ! ************************** ! ********************************************************* ! * Initialize Screen and Sprite Magnification, Randomize * ! ********************************************************* ! NOTE; PLAYER SCORE DECLARED AS NILL TO AVOID COMPILER ERROR 100 CALL LINK("SCRN2") :: CALL SCREEN(2) :: CALL CLEAR :: CALL MAGNIFY(3) :: RANDOMIZE :: SC=0 ! ******************************************** ! * Graphical definitions in data statements * ! ******************************************** ! ! ------------------- ! Characters defined; ! ------------------- ! 60 Player ship ! 64 Player missile ! 68 Exhaust #1 ! 72 Exhaust #2 ! 76 Exhaust #3 ! 80 Exhaust #4 ! 84 Explosion #1 ! 88 Explosion #2 ! 92 Explosion #3 ! 96 Explosion #4 ! 100 Enemy ship ! 104 Enemy missile ! 110 FOR L=1 TO 12 :: READ A,A$ :: CALL CHAR(A,A$) :: NEXT L 120 DATA 60,705C81FE9E807F7B3E3DBBF80000000000000070FAFB7307FEF0C00000000000,64,0000000000002B000000000000000000000000001C7EFF7E1C00000000000000 130 DATA 68,0000000000000001000000000000000000000000000044104200000000000000,72,0000000000000200090000000000000000000000000010421044000000000000 140 DATA 76,0000000000000021880200000000000000000000000044104210000000000000,80,0000000000000001080200000000000000000000000044104210000000000000 150 DATA 84,0000000000000002000000000000000000000000000020000040000000000000,88,0000001000000002000010000000000000000008800020000040000020000000 160 DATA 92,0000011000000802000010040000000000000008800028000044000020000000,96,0000011400022802200811040100000000002008A00428841044100820000000 170 DATA 100,1C27AE9CC07F0F76760F7FC09CAE271C7EFB01FFC665B7DEDEB765C6FF01FB7E,104,000000000003070000070300000000000000000000FCFE0000FEFC0000000000 ! ******************************************** ! * Enemy movement pixels stored in an array * ! ******************************************** 172 DIM EMV(256) :: N=16 :: FOR L=1 TO 128 :: EMV(L)=N :: N=N+1 :: NEXT L :: FOR L=129 TO 256 :: N=N-1 :: EMV(L)=N :: NEXT L ! **************************** ! * NEW UFO GRAPHICS PATTERN * ! **************************** 175 CALL CHAR(36,"000301030F127FFF1F0800000000000000C080C0F048FEFFF810000000000000") ! *************************************** ! * Background characters for scrolling * ! *************************************** ! ! ------------------------------------------------------------- ! 112,113,114,115 are top layer, displayed at row 20 (scrolled) ! 120,121,122,123 are mid layer, displayed at row 21 (scrolled) ! 124 is bottom layer, not scrolled ! ------------------------------------------------------------- 180 CALL LINK("CHAR2",112,"00101435377FFFFF000001119195DFFF000000000090F5FF0414143436367FFF") ! TOP 190 CALL LINK("CHAR2",120,"0000103031317BFF0000808282CAFBFF00080C0C8C9E9FFF0002123232737BFF") ! MID 195 CALL LINK("CHAR2",124,"FFFFFFFFFFFFFFFF") ! BOT ! ********************** ! * Set up the colours * ! ********************** 200 CALL LINK("COLOR2",11,7,2,12,10,7) ! COLOUR FOR THE GROUND ! ********************* ! * Game screen setup * ! ********************* ! ! First we must clear the screen and sprites, as we will restart from here; 210 CALL CLEAR :: CALL DELSPRITE(ALL) ! Then we place the layers of ground; 220 CALL LINK("DISPLY",20,1,RPT$("pqrs",8)) :: CALL LINK("DISPLY",21,1,RPT$("xyz{",8)) :: CALL LINK("DISPLY",22,1,RPT$("|",96)) ! Display the player's score 230 GOSUB 10000 ! *********************** ! * Timers for the game * ! *********************** 240 T1=0 ! Timer for next enemy to appear, counts to 100. 250 T2=0 ! Timer for player's exhaust, counts to 16. 260 T3=0 ! Timer for player's movement, counts to 2. ! ************************* ! * Declare enemy as dead * ! ************************* 300 E=0 ! It's 1 if alive. If dead, the timer T1 counts to 100. ! ***************************** ! * Declare "appear" variable * ! ***************************** 305 APPEAR=0 ! This is set to increment when a new enemy appears ! and increments to 32 whilst pushing the enemy onto the screen from 255 to 223 ! then it sets to 0 again and is ignored until a new enemy arrives ! Variable "EY" is used for enemy Y position 255-223 during this period ! Variable "EF" is set to nill when new enemy appears, this is carrier for Enemy Fire ! ************************ ! * Player Exhaust value * ! ************************ 310 X=68 ! Counts up to 80 then back to 68, uses T2 timer. ! ******************************* ! * Player's X coordinate value * ! ******************************* 320 PX=80 :: PY=18 ! We put the player and exhaust at this value to start. ! ************************* ! * Player's firing value * ! ************************* 321 PF=0 ! When player fires, it's set to 1. If at 1 player cannot fire during that time. ! Unlike some Atari VCS games where it just start player fire off again. ! ************************************** ! * Declare Explosion variable as nill * ! ************************************** 322 EXPL=0 ! Set to 1 when enemy dies 323 EXPT=0 ! Counts up to 4 then next explosion pattern ! **************************************************** ! * Ufo is off, give it a random max time to come on * ! **************************************************** 324 UFO=0 :: UFT=0 :: UFM=INT(200*RND)+50 ! ****************************************** ! * Display the player and exhaust sprites * ! ****************************************** 330 CALL SPRITE(#1,60,16,px,py,#2,X,7,PX,PY-16) ! ------------------------------- ! Variables used; ! ------------------------------- ! ! PEW ! This is set to 1600 when player fires and decrements by 2 each update ! XPAT ! Explosion pattern carrier, goes from 84 to 96 on a timer called EXPT (Expt incs. to 4 then XPAT=XPAT+4) ! SPD ! Speed of enemy, will travel at either 1,3 or 3 pixels per update ! PX ! Player's X coord ! PY ! Player's Y coord ! UFO ! Carrier for if UFO is active or not ! UFT ! Timer for UFO to arrive if not active ! UFM ! Random maximum time for UFT timer to get to ! UFALL ! When UFO is hit by player missile it will fall to the ground ! ########################################### ! **************** ! * Program flow * ! **************** 1100 GOSUB 4100 ! IS AN ENEMY DEAD? IF SO INCREMENT T1 UNTIL 100 1105 GOSUB 4120 ! SCROLL THE GROUND 1110 GOSUB 4130 ! UPDATE PLAYER EXHAUST 1115 GOSUB 4140 ! IS "APPEAR" ACTIVE? 1120 GOSUB 4150 ! READ JOYSTICK ON TIMER T1 1125 GOSUB 4160 ! JOYSTICK UP? 1130 GOSUB 4170 ! JOYSTICK DOWN? 1135 GOSUB 4180 ! JOYSTICK FIRE? 1140 GOSUB 4190 ! INC.PLAYER MISSILE? 1145 GOSUB 4200 ! CAN ENEMY MOVE? 1150 GOSUB 4210 ! CAN ENEMY FIRE? 1155 GOSUB 4220 ! IF SO INCREMENT MISSILE 1160 GOSUB 4230 ! IS ENEMY EXPLODING? 1165 GOSUB 4240 ! JOYSTICK LEFT? 1170 GOSUB 4250 ! JOYSTICK RIGHT? 1175 GOSUB 4260 ! IS UFO ACTIVE YET? 1180 GOSUB 4270 ! IF YES THEN INCREMENT IT 1185 GOSUB 4280 ! CHECK "UFALL" IF ON 1190 GOTO 1100 ! ########################## ! # PROGRAM FLOW FUNCTIONS # ! ########################## ! ---------------------------------------------- ! IS AN ENEMY DEAD? IF SO INCREMENT T1 UNTIL 100 ! ---------------------------------------------- 4100 IF E=0 THEN 4101 ELSE 4110 4101 T1=T1+1 :: IF T1>99 THEN 4102 ELSE 4110 4102 T1=0 :: E=1 :: EX=1::EY=255::CALL SPRITE(#3,100,16,EMV(EX),EY)::APPEAR=1::EF=0::SPD=INT(3*RND)+1 4110 RETURN ! ----------------- ! SCROLL THE GROUND ! ----------------- 4120 CALL LINK("WINDOW",20,1,21,32) :: CALL LINK("SCPXLF",112,4,1,120,4,2) :: RETURN ! --------------------- ! UPDATE PLAYER EXHAUST ! --------------------- 4130 T2=T2+1 :: IF T2>16 THEN 4131 ELSE 4139 4131 T2=0 :: X=X+4 :: IF X>80 THEN X=68 4132 CALL PATTERN(#2,X) 4139 RETURN ! ------------------ ! IS APPEAR ACTIVE? ! ------------------ 4140 IF APPEAR>0 THEN 4141 ELSE 4149 4141 APPEAR=APPEAR+1::IF APPEAR>31 THEN 4142 ELSE 4143 4142 APPEAR=0::GOTO 4149 4143 EY=EY-1::EX=EX+1::CALL LOCATE(#3,EMV(EX),EY) 4149 RETURN ! ------------- ! READ JOYSTICK ! ------------- 4150 T3=T3+1 :: IF T3>3 THEN 4151 ELSE 4159 4151 T3=0 :: CALL JOYST(1,JY,JX) :: CALL KEY(1,K,ST) 4159 RETURN ! ------------ ! JOYSTICK UP? ! ------------ 4160 IF JX=4 THEN 4161 ELSE 4169 4161 PX=PX-2 :: IF PX<8 THEN PX=8 4162 CALL LOCATE(#1,PX,PY,#2,PX,PY-16) 4169 RETURN ! -------------- ! JOYSTICK DOWN? ! -------------- 4170 IF JX=-4 THEN 4171 ELSE 4179 4171 PX=PX+2 :: IF PX>152 THEN 10100 4172 CALL LOCATE(#1,PX,PY,#2,PX,PY-18) 4179 RETURN ! -------------- ! JOYSTICK FIRE? ! -------------- 4180 IF PF=1 THEN 4189 4181 IF K=18 THEN 4182 ELSE 4189 4182 PF=1 :: PFX=PX::PFY=py::CALL SPRITE(#4,64,12,PFX,PFY)::PEW=1600 4189 RETURN ! ---------------------- ! INCREMENT PLAYER FIRE? ! ---------------------- ! Checks for coincidence each time player missile increments. 4190 IF PF=1 THEN 4191 ELSE 4199 4191 PFY=PFY+8 :: IF PFY>252 THEN 4192 ELSE 4193 4192 CALL DELSPRITE(#4)::PF=0::GOTO 4199 4193 CALL LOCATE(#4,PFX,PFY) :: CALL COINC(#4,#3,8,C)::IF C=-1 THEN 10200 4194 CALL COINC(#4,#6,8,C)::IF C=-1 THEN 4195 ELSE 4196 4195 GOSUB 10400::GOTO 4199 4196 PEW=PEW-24::CALL SOUND(-100,PEW,0,PEW+1,0) 4199 RETURN ! ------------------------------------- ! CAN ENEMY MOVE? IF SO INCREMENT ENEMY ! ------------------------------------- 4200 IF EXPL=1 THEN 4209 4201 IF E=1 THEN 4202 ELSE 4209 4202 IF APPEAR=0 THEN 4203 ELSE 4209 4203 EX=EX+SPD :: IF EX>256 THEN EX=1 4204 CALL LOCATE(#3,EMV(EX),EY) 4209 RETURN ! --------------- ! CAN ENEMY FIRE? ! --------------- 4210 IF EXPL=1 THEN 4219 4211 IF E=0 THEN 4219 4212 IF EF=1 THEN 4219 4213 EF=1::EFY=224::EFX=EMV(EX)::CALL SPRITE(#5,104,7,EFX,EFY) 4219 RETURN ! --------------------- ! INCREMENT ENEMY FIRE? ! --------------------- 4220 IF EF=1 THEN 4221 ELSE 4229 4221 EFY=EFY-8 :: IF EFY<8 THEN 4222 ELSE 4223 4222 EF=0::CALL DELSPRITE(#5)::GOTO 4229 4223 CALL LOCATE(#5,EFX,EFY)::CALL COINC(#5,#1,8,C)::IF C=-1 THEN 10300 4229 RETURN ! ------------------- ! IS ENEMY EXPLODING? ! ------------------- 4230 IF EXPL=1 THEN 4231 ELSE 4239 4231 EXPT=EXPT+1::IF EXPT>3 then 4232 else 4239 4232 EXPT=0::XPAT=XPAT+4::IF XPAT>96 THEN 4233 ELSE 4234 4233 CALL DELSPRITE(#3)::EXPL=0::E=0::GOTO 4239 4234 CALL PATTERN(#3,XPAT)::CALL SOUND(-200,110,30,110,30,900,30,-8,0) 4239 RETURN ! -------------- ! JOYSTICK LEFT? ! -------------- 4240 IF JY=-4 THEN 4241 ELSE 4249 4241 PY=PY-1::IF PY<18 THEN PY=18 4242 CALL LOCATE(#1,PX,PY,#2,PX,PY-18) 4249 RETURN ! --------------- ! JOYSTICK RIGHT? ! --------------- 4250 IF JY=4 THEN 4251 ELSE 4259 4251 PY=PY+1::IF PY>200 THEN PY=200 4253 CALL LOCATE(#1,PX,PY,#2,PX,PY-18) 4259 RETURN ! -------------------------------------------------------------------- ! IS UFO ACTIVE YET? IF NOT INCREMENT THE TIMER TO THE RANDOM MAX TIME ! -------------------------------------------------------------------- 4260 IF UFO=0 THEN 4261 ELSE 4269 4261 IF UFALL=1 THEN 4269 4262 UFT=UFT+1 :: IF UFT=UFM THEN 4263 ELSE 4269 4263 UFO=1::UFM=INT(200*RND)+50::UFX=INT(140*RND)+10::UFY=1 4264 CALL SPRITE(#6,36,INT(13*RND)+3,UFX,UFY) 4269 RETURN ! -------------------------------------------------- ! IF UFO IS ACTIVE, INCREMENT IT USING THE EMV ARRAY ! -------------------------------------------------- 4270 IF UFO=1 THEN 4271 ELSE 4279 4271 UFY=UFY+1 :: IF UFY>255 THEN 4272 ELSE 4273 4272 UFO=0::CALL DELSPRITE(#6)::UFT=0::GOTO 4279 4273 CALL LOCATE(#6,UFX,UFY)::CALL COINC(#6,#1,8,C)::IF C=-1 THEN 10300 4279 RETURN ! ------------------- ! CHECK "UFALL" IF ON ! ------------------- 4280 IF UFALL=1 THEN 4281 ELSE 4289 4281 CALL POSITION(#6,P1,P2)::IF P1>166 THEN 4282 ELSE 4289 4282 CALL DELSPRITE(#6)::CALL SOUND(-1000,110,30,110,30,1000,30,-8,0)::SC=SC+100::GOSUB 10000 4283 UFALL=0 4289 RETURN ! ************************ ! * DISPLAY PLAYER SCORE * ! ************************ 10000 CALL LINK("DISPLY",1,1,STR$(SC)) :: RETURN ! **************************** ! * PLAYER CRASH WITH GROUND * ! **************************** 10100 GOTO 10300 ! WE COULD MAKE THIS DIFFERENT AT ANOTHER TIME. ! ***************************** ! * PLAYER MISSILE HITS ENEMY * ! ***************************** ! XPAT SET TO 80 SO FIRST INCREMENT WILL BY 84, FIRST EXPLOSION PATTERN 10200 SC=SC+100::GOSUB 10000::EXPL=1::EXPT=0::E1=0::PF=0::CALL DELSPRITE(#4)::XPAT=80::RETURN ! ******************************* ! * PLAYER HIT BY ENEMY MISSILE * ! ******************************* 10300 CALL DELSPRITE(#5,#2)::EF=0::CALL DELSPRITE(#4)::PF=0::EXPT=0::XPAT=80 10301 EXPT=EXPT+1 :: IF EXPT>8 THEN 10302 ELSE 10301 10302 EXPT=0::XPAT=XPAT+4::IF XPAT>96 THEN 10303 ELSE 10307 10303 CALL DELSPRITE(#1)::CALL LINK("DELAY",2000)::GOTO 210 10307 CALL PATTERN(#1,XPAT)::CALL SOUND(-200,110,30,110,30,900,30,-8,0) 10308 GOTO 10301 ! ***************************** ! * UFO HIT BY PLAYER MISSILE * ! ***************************** 10400 CALL DELSPRITE(#4)::PF=0::UFALL=1::UFO=0::CALL SOUND(-200,110,30,110,30,900,30,-8,0) 10405 CALL MOTION(#6,16,0) 10410 RETURN