REM - REM - ROY-ON AIR DEFENSE REM - BY ROY__ REM - REM - LAYER 0: REM - BG, BOSS SHADOW, CLOUDS REM - REM - PLAYER INVUNERABILITY REM - DISPLAY 3 LAYER OPEN 0,128, 128,0 LAYER OPEN 1,128,128,1 LAYER OPEN 2,128,128,1 LAYER OPEN 3,128,128,1 REM LAYER OFFSET 0, 64,0 RANDOMIZE TIMER REM ----------------- REM -- SCREEN VARS -- REM ----------------- SCR_W =128 SCR_H =128 SCR_OX = 0 DIM GAME(2) REM ---------------- REM -- GAMESTATES -- REM ---------------- STATE_INTRO = 0 STATE_TITLE = 1 STATE_GAME = 2 STATE_PAUSE = 3 STATE_BOSS = 5 STATE_LEVELCOMP = 6 STATE_DEAD = 20 STATE_SUBSTATE = 0 STATE_CURRENT = STATE_TITLE E_A_ON_Y = 2 GAMEPAD 1 CLS TEXT 32,28, "ROY 2018",1 REM -- CREATE STUFF GOSUB CLOUDS_CREATE GOSUB PLAYER_CREATE GOSUB ALIENS_CREATE GOSUB BOSS_CREATE GOSUB EXPLOSION_CREATE GOSUB RAIN_CREATE GOSUB EVENTS_CREATE GOSUB MESSAGES_CREATE GOSUB LETTERBOX_CREATE GOSUB SINETAB_CREATE REM -- INIT STUFF GOSUB CLOUDS_INIT GOSUB RAIN_INIT GOSUB EXPLOSION_INIT GOSUB EVENTS_INIT GOSUB BOSS_INIT GOSUB ALIENS_INIT GOSUB PLAYER_INIT GOSUB MESSAGES_INIT GOSUB LETTERBOX_INIT REM - LOAD OUR GFX GOSUB CLOUDS_LOAD GOSUB PLAYER_LOAD GOSUB ALIENS_LOAD GOSUB BOSS_LOAD GOSUB EXPLOSION_LOAD REM PLAUER EXP HACK EXPLOSIONFRAME =0 INITEXPDELAY = 4 E_BLOCK = 20 E_FRAMES = 4 EXPLOSIONDELAY = INITEXPDELAY STATE_CURRENT = STATE_TITLE PLAYER(P_ACT) =TRUE REM - MAINLOOP MAINLOOP: DO IF STATE_CURRENT=STATE_INTRO THEN GOSUB INTRO END IF IF STATE_CURRENT=STATE_TITLE THEN GOSUB TITLE END IF IF STATE_CURRENT=STATE_GAME THEN GOSUB INGAME END IF IF STATE_CURRENT = STATE_BOSS THEN GOSUB BOSS_FIGHT END IF IF STATE_CURRENT=STATE_LEVELCOMP THEN GOSUB LEVEL_COMP END IF IF STATE_CURRENT = STATE_DEAD THEN GOSUB DEAD END IF WAIT 0 LOOP INTRO: RETURN TITLE: LAYER 0 CLS LAYER 1 CLS LAYER 2 CLS LAYER 3 CLS LAYER OFFSET 0,64,0 COLOR 8 FONT 3 TEXT 32,20, "ROY-ON!", 1,3 FONT 0 TEXT 32,34, "TACTICAL",1 TEXT 32,40, "AIR DEFENCE",1 TEXT 32,50, "PUSH BUTTON",1,3 WAIT BUTTON STATE_CURRENT = STATE_GAME LB_STATE = LB_ON RETURN REM --------------------------- REM -- LOOP FOR INGAME STATE -- REM --------------------------- INGAME: STARTFRAMETIME = TIMER REM IF PLAYER(P_ACT) = TRUE THEN GOSUB PLAYER_UPDATE REM END IF GOSUB PLAYER_BULLETUPDATE GOSUB ALIENUPDATE GOSUB PLAYER_BULLETSCHECK LAYER 0 CLS REM - WHITE OUT BG? IF (RND*100) < 10 THEN REM GOSUB THUNDERFLASH CLS 2 REM - DRAW BOSS SHADOW? IF BOSS(B_STATE) = SHADOW THEN GOSUB BOSS_DRAW_SHADOW END IF END IF GOSUB CLOUDS_DRAW LAYER 1 CLS IF PLAYER(P_EXP) = FALSE THEN GOSUB PLAYER_DRAW ELSE SPRITE OFF 0 END IF GOSUB PLAYER_BULLETDRAW LAYER 2 CLS GOSUB ALIENDRAW REM --------------------------- REM -- IF WE ARENT EXPLODING -- REM --------------------------- IF PLAYER(P_EXP)= FALSE THEN IF LAYER HIT (2,0) THEN CLS REM TEXT 0,0,"HIT" PLAYER(P_EXP) = TRUE PLAYER(P_ACT) = FALSE END IF ELSE REM -- PLAYER EXPLODING PUT BLOCK EXP_BLOCK+EXPLOSIONFRAME, PLAYER(P_X), PLAYER(P_Y), 1 EXPLOSIONDELAY = EXPLOSIONDELAY-1 IF EXPLOSIONDELAY = 0 THEN EXPLOSIONDELAY = INITEXPDELAY EXPLOSIONFRAME = EXPLOSIONFRAME+1 CLS 1 WAIT 0.05 END IF END IF IF EXPLOSIONFRAME > 3 THEN PLAYER(P_LIVES)=PLAYER(P_LIVES)-1 IF PLAYER(P_LIVES) = 0 THEN STATE_CURRENT = STATE_DEAD END IF PLAYER(P_EXP) = FALSE PLAYER(P_ACT) = TRUE EXPLOSIONDELAY = INITEXPDELAY EXPLOSIONFRAME = 0 END IF GOSUB EXPLOSION_UPDATE LAYER 3 CLS REM GOSUB GETDISTANCE REM --------------- REM -- DRAW RAIN -- REM --------------- GOSUB RAIN_DRAW REM -------------------------- REM -- DISPLAY ANY MESSAGES -- REM -------------------------- GOSUB MESSAGE_DRAW REM ---------------------------- REM -- CHECK EVENTS AT END -- REM -- SO DEBUG INFO VISIBLE! -- REM ---------------------------- GOSUB EVENTS_UPDATE REM ---------------------- REM -- TOTAL WHITE OUT? -- REM ---------------------- IF (RND*100) < 3 THEN CLS 1 END IF GOSUB DRAWSTATUS REM ---------------------------- REM -- GRAB END FRAME TIMER -- REM -- AND UPDATE FRAME COUNT -- REM ---------------------------- ENDFRAMETIME = TIMER FRAMES = FRAMES+1 REM --------------------- REM -- DRAW DEBUG INFO -- REM --------------------- REM REM IF LB_STATE = LB_ON THEN GOSUB LETTERBOX_DRAW REM ELSE REM END IF REM GOSUB DRAWDEBUG RETURN BOSS_FIGHT: LAYER 0 CLS LAYER 1 CLS LAYER 2 CLS LAYER 3 CLS IF PLAYER(P_ACT) = TRUE THEN REM WAIT 10 REM TEXT 32,32, "ACT" GOSUB PLAYER_UPDATE END IF GOSUB PLAYER_BULLETUPDATE REM GOSUB BOSS_UPDATE LAYER 0 GOSUB CLOUDS_DRAW LAYER 1 IF PLAYER(P_EXP) = FALSE THEN GOSUB PLAYER_DRAW ELSE SPRITE OFF 0 END IF GOSUB PLAYER_BULLETDRAW GOSUB BOSS_CHECKBULLETS LAYER 2 GOSUB BOSS_UPDATE IF PLAYER(P_EXP)= FALSE THEN IF LAYER HIT (2,0) THEN CLS REM TEXT 0,0,"HIT" PLAYER(P_EXP) = TRUE PLAYER(P_ACT) = FALSE END IF ELSE REM -- PLAYER EXPLODING PUT BLOCK EXP_BLOCK+EXPLOSIONFRAME, PLAYER(P_X), PLAYER(P_Y), 1 EXPLOSIONDELAY = EXPLOSIONDELAY-1 IF EXPLOSIONDELAY = 0 THEN EXPLOSIONDELAY = INITEXPDELAY EXPLOSIONFRAME = EXPLOSIONFRAME+1 CLS 1 WAIT 0.05 END IF END IF IF EXPLOSIONFRAME > 3 THEN PLAYER( P_LIVES) = PLAYER(P_LIVES)-1 IF PLAYER(P_LIVES) = 0 THEN STATE_CURRENT = STATE_DEAD END IF PLAYER(P_EXP) = FALSE PLAYER(P_ACT) = TRUE EXPLOSIONDELAY = INITEXPDELAY EXPLOSIONFRAME = 0 END IF LAYER 3 GOSUB RAIN_DRAW GOSUB DRAWSTATUS REM GOSUB DRAWDEBUG RETURN LEVEL_COMP: LAYER OFF 1 LAYER OFF 2 LAYER 3 LAYER OFF 0 CLS COLOR 7 SPRITE OFF 0 TEXT 32,32, "VICTORY",1,2 WAIT BUTTON STATE_CURRENT = STATE_TITLE GOSUB CLOUDS_INIT GOSUB RAIN_INIT GOSUB EXPLOSION_INIT GOSUB EVENTS_INIT GOSUB BOSS_INIT GOSUB ALIENS_INIT GOSUB PLAYER_INIT GOSUB MESSAGES_INIT GOSUB LETTERBOX_INIT FRAMES = 0 RETURN DEAD: LAYER OFF 1 LAYER OFF 2 LAYER 3 LAYER OFF 0 CLS COLOR 7 SPRITE OFF 0 TEXT 32,32, "FIN",1,2 WAIT BUTTON STATE_CURRENT = STATE_TITLE GOSUB CLOUDS_INIT GOSUB RAIN_INIT GOSUB EXPLOSION_INIT GOSUB EVENTS_INIT GOSUB BOSS_INIT GOSUB ALIENS_INIT GOSUB PLAYER_INIT REM GOSUB MESSAGES_INIT GOSUB LETTERBOX_INIT FRAMES = 0 RETURN ENDLEVEL: LAYER OFF 1 LAYER OFF 2 LAYER 3 LAYER OFF 0 CLS COLOR 7 SPRITE OFF 0 TEXT 32,32,"FIN", 1,3 WAIT BUTTON GOSUB CLOUDS_INIT GOSUB RAIN_INIT GOSUB EXPLOSION_INIT GOSUB EVENTS_INIT GOSUB BOSS_INIT GOSUB ALIENS_INIT GOSUB PLAYER_INIT REM GOSUB MESSAGES_INIT GOSUB LETTERBOX_INIT FRAMES = 0 RETURN PLAYER_CREATE: DIM PLAYER(10) REM -- ALIASES P_X = 0 P_Y = 1 P_STATE =2 P_LIVES =3 P_OFF = 4 P_ACT = 5 P_EXP = 6 P_DEAD =7 P_TRGTX = 8 P_TRGTY = 9 REM -- PLAYER STATES PLY_NACT = 0 PLY_ALV = 1 PLY_DEAD =2 PLY_EXPL = 3 PLY_MOVETOPOINT = 4 REM -- BULLETS PB_MAX = 8 DIM P_BULLETS(PB_MAX,3) REM -- BULLET ALIASES PB_BACT =0 PB_X = 1 PB_Y = 2 PB_IDX = 0 PB_BLK =4 PB_BASIC = 0 PB_WIDE = 2 PB_DOUBLE = 1 PB_STATE = PB_BASIC RETURN PLAYER_INIT: PLAYER(P_X) = 16 PLAYER(P_Y) = 38 PLAYER(P_STATE) = PLY_ACT PLAYER(P_LIVES) = 3 PLAYER(P_EXP) = FALSE PLY_BLK = 1 REM PB_BLK = 2 PLAYER(P_ACT) = FALSE FOR I = 0 TO PB_MAX-1 FOR J = 0 TO 2 P_BULLETS(I,J)= 0 NEXT J P_BULLETS(I,PB_ACT) = FALSE NEXT I RETURN PLAYER_UPDATE: IF PLAYER(P_STATE) = PLY_MOVETOPOINT THEN END IF IF PLAYER(P_ACT) = TRUE THEN IF BUTTON TAP(0,1) THEN GOSUB PLAYER_BULLETADD END IF IF UP(0) THEN IF LB_STATE = LB_ON THEN IF PLAYER(P_Y) > LB_DEPTH-2 THEN PLAYER(P_Y)= PLAYER(P_Y)-2 END IF ELSE IF PLAYER(P_Y) > 0 THEN PLAYER(P_Y)= PLAYER(P_Y)-2 END IF END IF IF DOWN(0) THEN IF LB_STATE = LB_ON THEN IF PLAYER(P_Y)<64-(LB_DEPTH+6) THEN PLAYER(P_Y)= PLAYER(P_Y)+2 END IF ELSE IF PLAYER(P_Y) < 64 THEN PLAYER(P_Y) = PLAYER(P_Y)+2 END IF END IF IF RIGHT(0) THEN PLAYER(P_X) = PLAYER(P_X)+2 END IF IF LEFT(0) THEN IF PLAYER(PLY_X) > -2 THEN PLAYER(P_X) = PLAYER(P_X)-2 END IF END IF END IF RETURN PLAYER_DRAW: REM IF PLAYER(P_ACT) = TRUE THEN LAYER 0 SPRITE 0,(PLAYER(P_X)),PLAYER(P_Y),0 LAYER 1 PUT BLOCK PLY_BLK,PLAYER(P_X), PLAYER(P_Y) REM END IF RETURN PLAYER_LOAD: LAYER 0 CLS 0 REM LAYER OFFSET 0,0,0 PALETTE 15, 22 PALETTE 14, 23 PALETTE 13, 43 RESTORE SPRITESHEET GOSUB SHOWIMAGE GET BLOCK PLY_BLK, 0,56 TO 7,63 GET BLOCK PB_BLK, 0,48 TO 7,55 RESTORE PLAYERHITBOX DIM ARR(15) FOR I=0 TO 15 READ ARR(I) NEXT I READ C0,C1,C2,C3 DEF SPRITE 0,ARR,C1,C2,C3 RESTORE BULLET_MASK DIM BRR(15) FOR I=0 TO 15 READ BRR(I) NEXT I READ C0,C1,C2,C3 DEF SPRITE 1,BRR,C1,C2,C3 SPRITE LAYER 0 RETURN PLAYER_BULLETADD: P_BULLETS(PB_IDX,PB_ACT) = TRUE P_BULLETS(PB_IDX, PB_X)=PLAYER(P_X)+8 P_BULLETS(PB_IDX, PB_Y)=PLAYER(P_Y) PB_IDX = PB_IDX+1 IF PB_IDX > 7 THEN PB_IDX = 0 END IF RETURN PLAYER_BULLETUPDATE: FOR I = 0 TO PB_MAX-1 IF P_BULLETS(I,PB_ACT) = TRUE THEN P_BULLETS(I,PB_X)=P_BULLETS(I, PB_X)+3 END IF IF P_BULLETS(I,PB_X) > SCR_W THEN P_BULLETS(I,PB_ACT) = 0 P_BULLETS(I,PB_X) =0 P_BULLETS(I,PB_Y) = 0 END IF NEXT I RETURN PLAYER_BULLETSCHECK: FOR I = 0 TO PB_MAX-1 IF P_BULLETS(I,PB_ACT) = TRUE THEN REM WAIT BUTTON FOR A = 0 TO ALIENS_MAX-1 IF ALN_POOL(A, ALN_ACTV) = TRUE THEN REM WAIT BUTTON IF ALN_POOL(A,ALN_TYP) = 2 THEN IF (P_BULLETS(I,PB_Y) > ALN_POOL(A,ALN_Y)-4) AND (P_BULLETS(I,PB_Y)+4 < ALN_POOL(A,ALN_Y)+5) THEN IF (P_BULLETS(I,PB_X)+4 > ALN_POOL(A,ALN_X)) AND (P_BULLETS(I,PB_X)+4 < ALN_POOL(A,ALN_X)+8) THEN GOSUB ALIEN_DESTROY END IF END IF END IF IF ALN_POOL(A,ALN_TYP) = 3 THEN AY = ALN_POOL(A,ALN_Y) AMTO = ALN_POOL(A,ALN_MTO) YO = SINES(YO) IF (P_BULLETS(I,PB_Y)+4 > (AY+YO)-4) AND (P_BULLETS(I,PB_Y)+4 <(AY+YO)+5) THEN IF (P_BULLETS(I,PB_X)+4 > ALN_POOL(A,ALN_X)) AND (P_BULLETS(I,PB_X)+4 < ALN_POOL(A,ALN_X)+8) THEN GOSUB ALIEN_DESTROY END IF END IF END IF END IF NEXT A END IF NEXT I RETURN ALIEN_DESTROY: REM CLS REM TEXT 32,32,"X HIT" REM WAIT BUTTON ALN_POOL(A,ALN_ACTV) = FALSE P_BULLETS(I,PB_ACTV) = FALSE EXP_TEMPX = ALN_POOL(A,ALN_X) EXP_TEMPY = ALN_POOL(A,ALN_Y) GOSUB EXPLOSION_ADD RETURN PLAYER_BULLETDRAW: REM COLOR 2 FOR I = 0 TO PB_MAX-1 IF P_BULLETS(I,PB_ACT)=TRUE THEN IF PB_STATE = PB_BASIC THEN REM LAYER 1 PUT BLOCK PB_BLK, P_BULLETS(I,PB_X),P_BULLETS(I,PB_Y) END IF END IF NEXT I RETURN ALIENS_CREATE: ALIENS_MAX = 16 DIM ALN_POOL(ALIENS_MAX,10) RETURN ALIENS_INIT: REM ---------------- REM -- ALIEN VARS -- REM ---------------- ALIEN_BLOCK =5 ALIEN_FRAMES =3 ALIEN_ANIMSPEED=0 ALIENS_ALIVE = 0 ALN_X = 0 ALN_Y = 1 ALN_SPD = 2 ALN_TYP = 3 ALN_MTO =4 ALN_SPR =5 ALN_ACTV = 6 ALN_CURFRM = 7 ALN_TOTFRM =8 ALN_ANIMDIR = 9 REM DIM ALIENBB(ALIENS_MAX, 2) REM -- ALIENS ALN_FRAME =0 ALIEN_ANIMDIR=1 FREESPACEINDEX = -1 FOR I = 0 TO ALIENS_MAX ALN_POOL(I, ALN_ACTV) = FALSE NEXT I RETURN ALIENUPDATE: FOR I = 0 TO ALIENS_MAX REM IF ALN_POOL(I, ALN_TYP) = 2 THEN IF ALN_POOL(I,ALN_ACTV) =TRUE THEN ALN_POOL(I,ALN_X)=ALN_POOL(I,ALN_X)-1 IF ALN_POOL(I,ALN_X) < -8 THEN ALN_POOL(I,ALN_ACTV) = FALSE END IF END IF REM END IF NEXT I RETURN ALIENDRAW: FOR I = 0 TO ALIENS_MAX-1 IF ALN_POOL(I,ALN_ACTV)=TRUE THEN IF ALN_POOL(I,ALN_TYP) = 2 THEN PUT BLOCK ALN_POOL(I,ALN_SPR)+ALN_POOL(I,ALN_CURFRM), ALN_POOL(I, ALN_X)+SCR_OX, ALN_POOL(I,ALN_Y), 1 REM WAIT 2 END IF IF ALN_POOL(I,ALN_TYP) = 3 THEN PUT BLOCK ALN_POOL(I,ALN_SPR)+ALN_POOL(I,ALN_CURFRM), ALN_POOL(I, ALN_X)+SCR_OX, ALN_POOL(I,ALN_Y)+SINES(ALN_POOL(I,ALN_MTO)), 1 ALN_POOL(I,ALN_MTO)=ALN_POOL(I,ALN_MTO)+1 IF ALN_POOL(I,ALN_MTO) = 32 THEN ALN_POOL(I,ALN_MTO) = 0 END IF END IF END IF IF ALN_POOL(I,ALN_ANIMDIR) = 0 THEN ALN_POOL(I,ALN_CURFRM) = ALN_POOL(I,ALN_CURFRM) -1 IF ALN_POOL(I,ALN_CURFRM) < 0 THEN ALN_POOL(I,ALN_ANIMDIR) = 1 ALN_POOL(I,ALN_CURFRM) = 0 END IF ELSE ALN_POOL(I,ALN_CURFRM) = ALN_POOL(I,ALN_CURFRM) +1 IF ALN_POOL(I,ALN_CURFRM) > ALN_POOL(I,ALN_TOTFRM) THEN ALN_POOL(I,ALN_ANIMDIR) = 0 ALN_POOL(I,ALN_CURFRM) = ALN_POOL(I,ALN_TOTFRM) END IF END IF NEXT I RETURN ALIENGETSLOT: SPACE = FALSE LI = 0 FREESPACEINDEX = -1 WHILE LI <> -1 IF ALN_POOL(LI, ALN_ACTV) = FALSE THEN SPACE = TRUE REM TEXT 0,24, "ALIEN: " +LI +" FREE" REM WAIT 1 FREESPACEINDEX = LI LI = -1 ELSE LI = LI+1 IF LI > ALIENS_MAX THEN CLS TEXT 32,32, "NO ALIEN SPACE!" WAIT 10 END IF END IF WEND RETURN ALIENS_LOAD: LAYER 0 CLS 0 REM LAYER OFFSET 0,0,0 PALETTE 15, 22 PALETTE 14, 23 PALETTE 13, 43 RESTORE SPRITESHEET GOSUB SHOWIMAGE REM ENEMY FRAMES FOR I = 0 TO ALIEN_FRAMES-1 GET BLOCK ALIEN_BLOCK+I, 16+(8*I),56 TO 23+(8*I),64 NEXT I RETURN EXPLOSION_CREATE: DIM EXPLOSIONS(16,5) EXP_X = 0 EXP_Y = 1 EXP_FR =2 EXP_DELAY = 4 EXP_ACT = 5 RETURN EXPLOSION_INIT: REM -------------------- REM -- EXPLOSION VARS -- REM -------------------- FOR I = 0 TO 15 EXPLOSIONS(I, EXP_ACT) = FALSE EXPLOSIONS(I, EXP_X) =0 EXPLOSIONS(I, EXP_Y) =0 EXPLOSIONS(I, EXP_FR) =0 EXPLOSIONS(I, EXP_DELAY) =0 NEXT I EXP_TEMPX = 0 EXP_TEMPY = 0 EXP_FRAME =0 EXP_INITIALDELAY = 4 EXP_BLOCK = 20 EXP_FRAMES = 4 EXP_DELAY = EXP_INITIALDELAY RETURN EXPLOSION_UPDATE: FOR I = 0 TO 15 IF EXPLOSIONS(I,EXP_ACT)=TRUE THEN PUT BLOCK EXP_BLOCK+EXPLOSIONS(I,EXP_FR), EXPLOSIONS(I,EXP_X), EXPLOSIONS(I,EXP_Y), 1 EXPLOSIONS(I,EXP_DELAY) = EXPLOSIONS(I,EXP_DELAY)-1 IF EXPLOSIONS(I,EXP_DELAY)= 0 THEN EXPLOSIONS(I, EXP_DELAY) = EXP_INITIALDELAY EXPLOSIONS(I,EXP_FR) = EXPLOSIONS(I,EXP_FR)+1 END IF IF EXPLOSIONS(I,EXP_FR) > 3 THEN EXPLOSIONS(I,EXP_ACT) = FALSE EXPLOSIONS(I,EXP_FR) = 0 EXPLOSIONS(I,EXP_X) =0 EXPLOSIONS(I,EXP_Y)= 0 EXPLOSIONS(I,EXP_DELAY) = 0 END IF END IF NEXT I RETURN REM ------------------- REM -- ADD EXPLOSION -- REM ------------------- EXPLOSION_ADD: REM TEXT 32,32,"EXP ADD" SPACE = FALSE KI = 0 FREESPACEINDEX = -1 I = 0 WHILE KI <> -1 REM CLS REM TEXT 32, 32, "FINDING SPACE" IF EXPLOSIONS(I,EXP_ACT)=FALSE THEN SPACE = TRUE FREESPACEINDEX = KI KI = -1 ELSE KI = I+1 I = I+1 IF KI > 15 THEN TEXT 32,32, "NO SPACE!" WAIT 10 END IF END IF WEND IF SPACE = TRUE THEN FS = FREESPACEINDEX EXPLOSIONS(FS,EXP_ACT) = TRUE EXPLOSIONS(FS,EXP_X) = EXP_TEMPX EXPLOSIONS(FS,EXP_Y) = EXP_TEMPY EXPLOSIONS(FS,EXP_FR) = 0 EXPLOSIONS(FS,EXP_DELAY) = 4 END IF RETURN EXPLOSION_LOAD: LAYER 0 CLS REM LAYER OFFSET 0,0,0 PALETTE 15, 22 PALETTE 14, 23 PALETTE 13, 43 RESTORE SPRITESHEET GOSUB SHOWIMAGE REM ------------------------- REM -- EXPLOSION FRAMES 20 -- REM ------------------------- FOR I = 0 TO 4 GET BLOCK EXP_BLOCK+I, 16+(8*I),40 TO 23+(8*I),47 NEXT I CLS RETURN BOSS_CREATE: REM -- BOSS VARIABLES DIM BOSS(20) REM -- VAR ALIASES B_X = 0 B_Y =1 B_DIR =2 B_ENERGY =3 B_LAX =4 LAY =5 LAD =6 RAX =7 RAY =8 RAD =9 LFX =10 LFY = 11 RFX =12 RFY = 13 SKEW = 14 SKEWD =15 B_STATE = 16 B_LFE = 17 B_RFE = 18 B_RFA = 19 B_LFA = 20 REM -- BOSS STATES BOSS_OFF = -1 BOSS_FORE = 0 BOSS_RISE = 1 BOSS_LR = 2 BOSS_WOBBLEHEAD =3 BOSS_DIE = 4 BOSS_FISTSDEAD = 5 HEAD = 0 ARM = 1 FIST =2 DIM BOSS_BLOCKS(3) RETURN BOSS_INIT: BOSSSTATE = BOSS_OFF REM SET ARM DATA BOSS(B_X) = 16 BOSS(B_Y) = 80 BOSS(LAX) = 0 BOSS(LAY) = 0 BOSS(LAD) = 0 BOSS(RAX) = 56 BOSS(RAY) = 64 BOSS(RAD) = 0 BOSS(LFX) = 0 BOSS(LFY) = 0 BOSS(RFX) = 16 BOSS(RFY) = 32 BOSS(SKEW) = 0 BOSS(SKEWD) = 0 BOSS(B_RFE) = 50 BOSS(B_LFE) = 50 BOSS(B_LFA) = TRUE BOSS(B_RFA) = TRUE BOSS_BLOCKS(HEAD) = 29 BOSS_BLOCKS(ARM) = 28 BOSS_BLOCKS(FIST) = 27 BOSS(ENERGY) = 100 BOSS(B_STATE) = BOSS_RISE BOSS(B_DIR) =0 RETURN BOSS_UPDATE: IF BOSS(B_STATE) = BOSS_RISE THEN BOSS(B_X) = 16 IF BOSS(SKEWD) = 0 THEN BOSS(SKEW)= BOSS(SKEW)-0.05 ELSE BOSS(SKEW) = BOSS(SKEW)+0.05 END IF IF BOSS(SKEW)>0.4 THEN BOSS(SKEWD) = 0 END IF IF BOSS(SKEW) <-0.4 THEN BOSS(SKEWD) = 1 END IF IF BOSS(B_Y) > 28 THEN BOSS(B_Y) = BOSS(B_Y) -1 BOSS(RAY) = BOSS(RAY) -1 ELSE BOSS(B_STATE) = BOSS_LR END IF GOSUB BOSS_DRAW_SKEW END IF IF BOSS(B_STATE) = BOSS_LR THEN IF BOSS(B_DIR) = 0 THEN BOSS(B_X) = BOSS(B_X)-1 BOSS(RAX)= BOSS(RAX)-1 IF BOSS(B_X) <-20 THEN BOSS(B_DIR) = 1 END IF END IF IF BOSS(B_DIR) = 1 THEN BOSS(B_X) = BOSS(B_X)+1 BOSS(RAX) = BOSS(RAX)+1 IF BOSS(B_X) >48 THEN BOSS(B_DIR) = 0 END IF END IF IF BOSS(RAD) =0 THEN BOSS(RAY)=BOSS(RAY)+1 ELSE BOSS(RAY) = BOSS(RAY)-1 END IF IF BOSS(RAY) >32 THEN BOSS(RAD) = 1 END IF IF BOSS(RAY) <16 THEN BOSS(RAD) = 0 END IF GOSUB BOSS_DRAW IF BOSS(B_LFA) = FALSE AND BOSS(B_RFA) = FALSE THEN BOSS(B_STATE) = B_FISTSDEAD END IF END IF IF BOSS(B_STATE) = BOSS_FISTS_DEAD THEN BOSS(RAY) = BOSS(RAY)+ RND*2 BOSS(B_Y) = BOSS(B_Y) + RND*2 IF BOSS(RAY) > 70 THEN STATE_CURRENT = STATE_LEVELCOMP END IF GOSUB BOSS_DRAW END IF RETURN BOSS_DRAW_SKEW: REM PUT BLOCK BOSS_BLOCKS(HEAD), BOSS(B_X), BOSS(B_Y), 0 Y=-17 FOR I =0 TO 33 PUT BLOCK 30+I,BOSS(B_X)+I,BOSS(B_Y)+Y*BOSS(SKEW) Y =Y+1 NEXT I PUT BLOCK BOSS_BLOCKS(ARM), BOSS(RAX), BOSS(RAY) PUT BLOCK BOSS_BLOCKS(ARM), BOSS(RAX)-54, BOSS(RAY) PUT BLOCK BOSS_BLOCKS(FIST), BOSS(RAX)-4, BOSS(RAY) PUT BLOCK BOSS_BLOCKS(FIST), BOSS(RAX)-58, BOSS(RAY) RETURN BOSS_DRAW: PUT BLOCK BOSS_BLOCKS(HEAD), BOSS(B_X), BOSS(B_Y), 0 PUT BLOCK BOSS_BLOCKS(ARM), BOSS(RAX), BOSS(RAY) PUT BLOCK BOSS_BLOCKS(ARM), BOSS(RAX)-54, BOSS(RAY) IF BOSS(B_RFA) = TRUE THEN PUT BLOCK BOSS_BLOCKS(FIST), BOSS(RAX)-4, BOSS(RAY) END IF IF BOSS(B_LFA) = TRUE THEN PUT BLOCK BOSS_BLOCKS(FIST), BOSS(RAX)-58, BOSS(RAY) END IF RETURN BOSS_DRAW_SHADOW: COLOR 0 BAR 64+24,22 TO 64+40, 40 COLOR 1 BAR 64+28,26 TO 64+30, 28 BAR 64+34,26 TO 64+36, 28 RETURN BOSS_LOAD: LAYER 2 CLS RESTORE ROBOTBOSSDATA GOSUB SHOWIMAGE GET BLOCK BOSS_BLOCKS(FIST), 48,0 TO 63, 15 GET BLOCK BOSS_BLOCKS(ARM),56,24 TO 63, 63 GET BLOCK BOSS_BLOCKS(HEAD), 15,23 TO 48, 48 CLS PUT BLOCK BOSS_BLOCKS(HEAD), 0, 0 FOR I =0 TO 33 GET BLOCK 30+I,I,0 TO I,33 NEXT I CLS RETURN BOSS_CHECKBULLETS: FOR I = 0 TO PB_MAX-1 IF BOSS(B_RFA) = TRUE THEN REM CLS REM TEXT 32,32,BOSS(RAY) REM TEXT 32,40,P_BULLETS(I,PB_Y) IF (P_BULLETS(I,PB_Y) > BOSS(RAY)-8) AND (P_BULLETS(I,PB_Y) < BOSS(RAY))THEN REM WAIT 1 IF (P_BULLETS(I,PB_X)+4 > BOSS(RAX)) AND (P_BULLETS(I,PB_X)+4 < BOSS(RAX)+8) THEN REM WAIT 0.5 REM TEXT 32,32, "RIGHY FIST HIT" LAYER 3 COLOR 1 BAR BOSS(RAX)-4,BOSS(RAY) TO BOSS(RAX)+12, BOSS(RAY)+16 P_BULLETS(I,PB_ACT) = FALSE BOSS(B_RFE) = BOSS(B_RFE) -1 IF BOSS(B_RFE) = 0 THEN BOSS(B_RFA) = FALSE GOSUB DUST_CREATE GOSUB DUST_INIT END IF END IF END IF ELSE GOSUB DUST_UPDATE END IF IF BOSS(B_LFA) = TRUE THEN IF (P_BULLETS(I,PB_Y) > BOSS(RAY)) AND (P_BULLETS(I,PB_Y) < BOSS(RAY)+8) THEN IF (P_BULLETS(I,PB_X)+4 > BOSS(RAX)-58) AND (P_BULLETS(I,PB_X)+4 < BOSS(RAX)-54+8) THEN REM TEXT 32,32, "RIGHY FIST HIT" LAYER 3 COLOR 1 BAR BOSS(RAX)-56-4,BOSS(RAY) TO BOSS(RAX)-56+12, BOSS(RAY)+16 P_BULLETS(I,PB_ACT) = FALSE BOSS(B_LFE) = BOSS(B_LFE)-1 IF BOSS(B_LFE) = 0 THEN BOSS(B_LFA) = FALSE END IF END IF END IF END IF NEXT I RETURN EVENTS_CREATE: EVENT_DEBUG = FALSE DATALENGTH =0 I =0 RESTORE EVENT_DATA_LVL1 READ I WHILE I > -1 DATALENGTH = DATALENGTH+1 READ I WEND RESTORE EVENT_DATA_LVL1 DIM EV_DATA(DATALENGTH) FOR I = 0 TO DATALENGTH READ EV_DATA(I) NEXT I RETURN EVENTS_INIT: REM ------------------------- REM -- EVENT REM -- GET EVENT DATA LENGTH REM -- '-1' TERMINATES REM ------------------------- EV_IDX = 0 NEXTEVENT = EV_DATA(EV_IDX) RETURN EVENTS_UPDATE: IF EVENT_DEBUG = TRUE THEN COLOR 8 TEXT 0,0, FRAMES TEXT 16,0,NEXTEVENT END IF IF FRAMES = NEXTEVENT THEN EV_TYP= EV_DATA(EV_IDX+1) REM TEXT 0,8, EV_TYP IF EV_TYP = 1 THEN GOSUB SPAWNRANDOM EV_IDX = EV_IDX+2 NEXTEVENT = EV_DATA(EV_IDX) END IF IF EV_TYP = 2 THEN GOSUB SPAWNONY EV_IDX = EV_IDX+3 NEXTEVENT = EV_DATA(EV_IDX) END IF IF EV_TYP = 3 THEN GOSUB SPAWNONYWITHMOVEMENT EV_IDX = EV_IDX+3 NEXTEVENT = EV_DATA(EV_IDX) END IF IF EV_TYP = 30 THEN PLAYER(P_ACT) = TRUE EV_IDX = EV_IDX+2 NEXTEVENT = EV_DATA(EV_IDX) END IF IF EV_TYP = 31 THEN PLAYER(P_ACT) = FALSE EV_IDX = EV_IDX+2 NEXTEVENT = EV_DATA(EV_IDX) END IF REM - MOVE PLAYER TO IF EV_TYP =35 THEN EV_IDX = EV_IDX+4 NEXTEVENT = EV_DATA(EV_IDX) END IF IF EV_TYP = 40 THEN MESS_VIS = 1 MESS_DUR =EV_DATA(EV_IDX+2) MESS_IDX =EV_DATA(EV_IDX+3) EV_IDX = EV_IDX+4 NEXTEVENT = EV_DATA(EV_IDX) END IF REM -- 50 CLOUD EVENTS IF EV_TYP = 50 THEN END IF REM SET CLOUDY IF EV_TYP = 51 THEN CL_Y_OFF = EV_DATA(EV_IDX+2) EV_IDX = EV_IDX+3 NEXTEVENT = EV_DATA(EV_IDX) END IF IF EV_TYP = 52 THEN CL_STATE = CLOUD_DOWN CL_Y_SPD = EV_DATA(EV_IDX+2) EV_IDX = EV_IDX+3 NEXTEVENT = EV_DATA(EV_IDX) END IF IF EV_TYP = 53 THEN CL_STATE = CLOUD_UP CL_Y_SPD = EV_DATA(EV_IDX+2) CL_Y_TARGET = EV_DATA(EV_IDX+3) EV_IDX = EV_IDX+4 NEXTEVENT = EV_DATA(EV_IDX) END IF IF EV_TYP = 54 THEN CL_STATE = CLOUD_STOPPING EV_IDX = EV_IDX+2 NEXTEVENT = EV_DATA(EV_IDX) END IF REM SPEED PER VALUE CLAMPED IF EV_TYP = 55 THEN END IF REM -- 60 RAIN EVENTS IF EV_TYP = 61 THEN RAIN_STATE = RAIN_RAINING EV_IDX = EV_IDX+2 NEXTEVENT = EV_DATA(EV_IDX) END IF REM -- 70 BOSS EVENTS IF EV_TYP = 70 THEN BOSS(B_STATE) = BOSS_SHADOW EV_IDX = EV_IDX+2 NEXTEVENT = EV_DATA(EV_IDX) END IF IF EV_TYP = 71 THEN BOSS(B_STATE) = BOSS_OFF EV_IDX = EV_IDX+2 NEXTEVENT = EV_DATA(EV_IDX) END IF IF EV_TYP = 72 THEN BOSS(B_STATE) = BOSS_RISE STATE_CURRENT = STATE_BOSS EV_IDX = EV_IDX+2 NEXTEVENT = EV_DATA(EV_IDX) END IF REM -- 90 GAME EVENTS IF EV_TYP = 90 THEN REM TURN OFF EVENT SYSTEM END IF IF EV_TYP = 91 THEN LB_STATE = LB_EASEOUT REM WAIT 10 EV_IDX = EV_IDX+2 NEXTEVENT = EV_DATA(EV_IDX) END IF IF EV_TYP = 92 THEN LB_STATE = LB_EASEIN REM WAIT 10 EV_IDX = EV_IDX+2 NEXTEVENT = EV_DATA(EV_IDX) END IF IF EV_TYP = 99 THEN GOSUB ENDLEVEL END IF END IF REM -- MORE EVENTS ON THIS FRAME REM -- IF NEXTEVENT = FRAMES THEN GOTO EVENTS_UPDATE END IF RETURN SPAWNONY: LAYER 2 COLOR 7 REM TEXT SCR_OX,16, "SPAWN ON Y: " +EV_DATA(EV_IDX+2) GOSUB ALIENGETSLOT IF FREESPACEINDEX >-1 THEN ALN_POOL(FREESPACEINDEX, ALN_ACTV) = TRUE ALN_POOL(FREESPACEINDEX, ALN_TYP) = 2 ALN_POOL(FREESPACEINDEX, ALN_X) = 70 ALN_POOL(FREESPACEINDEX, ALN_Y) = EV_DATA(EV_IDX+2) ALN_POOL(FREESPACEINDEX, ALN_SPR)= 5 ALN_POOL(FREESPACEINDEX, ALN_CURFRM) = 0 ALN_POOL(FREESPACEINDEX, ALN_TOTFRM) = 2 END IF RETURN SPAWNONYWITHMOVEMENT: LAYER 2 COLOR 7 REM TEXT SCR_OX,16, "SPAWN ON Y: " +EV_DATA(EV_IDX+2) GOSUB ALIENGETSLOT IF FREESPACEINDEX >-1 THEN ALN_POOL(FREESPACEINDEX, ALN_ACTV) = TRUE ALN_POOL(FREESPACEINDEX, ALN_TYP) = 3 ALN_POOL(FREESPACEINDEX, ALN_X) = 70 ALN_POOL(FREESPACEINDEX, ALN_Y) = EV_DATA(EV_IDX+2) ALN_POOL(FREESPACEINDEX, ALN_MTO) = 0 ALN_POOL(FREESPACEINDEX,ALN_SPR) = 5 ALN_POOL(FREESPACEINDEX,ALN_CURFRM) = 0 ALN_POOL(FREESPACEINDEX,ALN_TOTFRM) = 2 ALN_POOL(FREESPACEINDEX,ALN_ANIMDIR) = 0 END IF RETURN SPAWNRANDOM: REM TEXT 0,16,"SPAWN RANDOM" REM WAIT 10 GOSUB ALIENGETSLOT IF FREESPACEINDEX >-1 THEN ALN_POOL(FREESPACEINDEX) = 1 ALIENTYPE(FREESPACEINDEX) = 1 ALIENS_X(FREESPACEINDEX) = 70 ALIENY(FREESPACEINDEX) = (RND*56) END IF RETURN PLAYERHITBOX: DATA 0,0,0,0,0,0,1,64,5,80,1,64,0,0,0,0 DATA 0,1,2,3 BULLET_MASK: DATA 0,0,0,0,0,0,1,80,0,0,0,0,0,0,0,0 DATA 0,1,2,3 CLOUDS_CREATE: CLOUDS_MAX = 6 DIM CLOUDS(CLOUDS_MAX,4) REM -- CLOUD ALIASES CL_ACT = 0 CL_XOFF = 1 CL_YOFF = 2 CL_SPD = 3 REM -- DRAWING VAR CLOUD_BLK_START = 10 REM -- CLOUD STATES CLOUD_FORWARD = 0 CLOUD_REVERSE = 1 CLOUD_STOPPING = 2 CLOUD_DOWN = 3 CLOUD_UP = 4 RETURN CLOUDS_INIT: CLOUD_STATE = CLOUD_FORWARD FOR I = 0 TO CLOUDS_MAX CLOUDS(I,CL_ACT) = TRUE NEXT I CLOUDS(0,CL_XOFF) = 0 CLOUDS(1,CL_XOFF) = 8 CLOUDS(2,CL_XOFF) = 4 CLOUDS(3,CL_XOFF) = 24 CLOUDS(4,CL_XOFF) = 32 CLOUDS(5,CL_XOFF) = 48 CLOUDS(0,CL_SPD) = 0.5 CLOUDS(1,CL_SPD) = 1 CLOUDS(2,CL_SPD) = 2 CLOUDS(3,CL_SPD)= 3 CLOUDS(4,CL_SPD) = 4 CLOUDS(5,CL_SPD) = 5 CL_Y_OFF = 64 CL_Y_TARGET = 32 CL_Y_SPD = 0.2 CL_SLOW_SPD = 0.2 RETURN CLOUDS_DRAW: Y= CL_Y_OFF FOR I = CLOUD_BLK_START TO CLOUD_BLK_START+CLOUDS_MAX-1 PUT BLOCK I,64-CLOUDS(I-10,CL_XOFF),Y,1 REM WAIT BUTTON REM Y=Y+4 CLOUDS(I-10,CL_XOFF) = CLOUDS(I-10,CL_XOFF)+CLOUDS(I-10,CL_SPD) IF CLOUDS(I-10,CL_XOFF)>63 THEN CLOUDS(I-10,CL_XOFF) = 0 END IF NEXT I IF CL_STATE = CLOUD_STOPPING THEN FOR I = 0 TO CLOUDS_MAX-1 IF CLOUDS(I,CL_SPD) > 0 THEN CLOUDS(I,CL_SPD) = CLOUDS(I,CL_SPD)-CL_SLOW_SPD ELSE CLOUDS(I,CL_SPD) = 0 END IF NEXT I END IF IF CL_STATE = CLOUD_UP THEN IF CL_Y_OFF > CL_Y_TARGET THEN CL_Y_OFF = CL_Y_OFF-CL_Y_SPD ELSE CL_STATE = CLOUD_FORWARD END IF END IF IF CL_STATE = CLOUD_DOWN THEN IF CL_Y_OFF < CL_Y_TARGET THEN CL_Y_OFF = CL_Y_OFF+CL_Y_SPD ELSE CL_STATE = CLOUD_FORWARD END IF END IF RETURN CLOUDS_UPDATE: RETURN CLOUDS_LOAD: LAYER 0 CLS PALETTE 15, 22 PALETTE 14, 23 PALETTE 13, 43 RESTORE SPRITESHEET GOSUB SHOWIMAGE GET BLOCK 0, 0,0 TO 63, 16 PUT BLOCK 0, 0,16 PUT BLOCK 0, 0,32 REM -- RECOLOR LAYERS FOR Y=0 TO 15 FOR X = 0 TO 63 IF POINT(X,Y) =1 THEN COLOR 15 PLOT X,Y END IF IF POINT(X,16+Y) =1 THEN COLOR 14 PLOT X,16+Y END IF IF POINT(X,32+Y) =1 THEN COLOR 13 PLOT X,32+Y END IF NEXT X NEXT Y REM -- EXPAND STRIPS GET BLOCK 10, 0,0 TO 63,15 PUT BLOCK 10, 64,0 GET BLOCK 10, 0,16 TO 63,31 PUT BLOCK 10, 64,16 GET BLOCK 10, 0,32 TO 63,47 PUT BLOCK 10, 64,32 REM -- GRAB FINAL BLOCKS GET BLOCK 10, 0,0 TO 127,7 GET BLOCK 11, 0,8 TO 127,15 GET BLOCK 12, 0,16 TO 127,23 GET BLOCK 13, 0,24 TO 127,31 GET BLOCK 14, 0,32 TO 127,39 GET BLOCK 15, 0,40 TO 127,47 RETURN RAIN_CREATE: REM - MAX RAINDROPS AND CURRENT R_MAX = 64 R_COUNT = 32 REM -- NUMBER OF ALIASES R_ATT = 6 REM -- MAIN DATA STRUCTURE DIM RAIN(R_MAX,R_ATT) REM -- RAIN ALIASES RAIN_X = 0 RAIN_Y = 1 RAIN_LAY = 2 RAIN_COL = 3 RAIN_VX = 4 RAIN_VY = 5 REM -- RAIN ON/OFF RAIN_ACTIVE = TRUE REM -- RAIN STATES RAIN_RAINING = 0 RAIN_STOPPING = 3 RAIN_STOPPED = 4 RAIN_DECREASING = 5 RAIN_INCREASING = 6 RETURN RAIN_INIT: REM -- INITIAL STATE RAIN_STATE = RAIN_STOPPED WAIT RND*2 RANDOMIZE TIMER RANDOMIZE TIMER FOR I = 0 TO R_MAX RAIN(I,RAIN_X) = (RND*96) RAIN(I,RAIN_Y)= (RND*60)-70 RAIN(I,RAIN_LAY) = 3 RAIN(I,RAIN_COL) = 2 RAIN(I,RAIN_VX) = 2 RAIN(I,RAIN_VY) = 3 NEXT I RETURN REM -- DRAW RAIN REM -- REM -- DRAW RAIN FROM X, Y REM -- TO VECTOR X,Y RAIN_DRAW: IF RAIN_STATE=RAIN_RAINING THEN FOR I =0 TO R_COUNT COLOR RAIN(I,RAIN_COL) LINE RAIN(I,RAIN_X), RAIN(I, RAIN_Y) TO RAIN(I, RAIN_X)-RAIN(I,RAIN_VX), RAIN(I,RAIN_Y)+RAIN(I,RAIN_VY) RAIN(I,RAIN_X) = RAIN(I,RAIN_X)-RAIN(I,RAIN_VX) RAIN(I,RAIN_Y) = RAIN(I,RAIN_Y)+RAIN(I,RAIN_VY) IF RAIN(I,RAIN_Y)> 64 THEN RAIN(I,RAIN_X) = (RND*128) RAIN(I,RAIN_Y) = (RND *30)-20 END IF NEXT I END IF IF RAIN_STATE= RAIN_INCREASING THEN IF R_COUNT < R_MAX THEN R_COUNT = R_COUNT+1 END IF END IF IF RAIN_STATE= RAIN_DECREASING THEN IF R_COUNT >0 THEN R_COUNT = R_COUNT-1 END IF END IF RETURN RAIN_DEBUG: TEXT 0,0,R_COUNT RETURN DUST_CREATE: MAX_DUST = 8 DUST_ACT = 7 DIM DUST(MAX_DUST,8) DUST_X = 0 DUST_Y = 1 DUST_RADIUS=2 DUST_COLOR=3 DUST_YSPD=4 DUST_LIFE=5 DUST_DIESPD=6 DUST_RISE=7 BLOOM = 0.1 RETURN DUST_INIT: FOR I = 0 TO MAX_DUST-1 DUST(I,DUST_X)= BOSS(RAX) DUST(I,DUST_Y)= BOSS(RAY) DUST(I,DUST_YSPD) = RND*2 DUST(I,DUST_COLOR) = 1+RND*2 DUST(I,DUST_RADIUS) =RND*2 DUST(I,DUST_LIFE) = 4*RND*3 DUST(I,DUST_DIESPD) = 0.5+RND DUST(I,DUST_RISE) = 1.5+RND NEXT I RETURN DUST_UPDATE: FOR D = 0 TO MAX_DUST-1 COLOR 3-DUST(D,DUST_Y)/32 IF DUST(D,DUST_LIFE) >0 THEN DUST(D,DUST_X) = BOSS(RAX)+3 CIRCLE DUST(D,DUST_X), DUST(D,DUST_Y), DUST(D,DUST_RADIUS) PAINT IF BOSS(B_LFA) = FALSE THEN COLOR 3-DUST(D,DUST_Y)/32 CIRCLE DUST(D,DUST_X)-54, DUST(D,DUST_Y), DUST(D,DUST_RADIUS) PAINT END IF DUST(D,DUST_Y)= DUST(D,DUST_Y)-DUST(D, DUST_RISE) DUST(D,DUST_RADIUS) = DUST(D,DUST_RADIUS)+BLOOM DUST(D, DUST_LIFE) = DUST(D,DUST_LIFE)-DUST(D,DUST_DIESPD) REM END IF ELSE DUST_ACT = DUST_ACT-1 IF DUST_ACT = 0 THEN GOSUB DUST_INIT DUST_ACT = 7 END IF END IF NEXT D RETURN THUNDERFLASH: CLS 2 RETURN REM -------------- REM -- MESSAGES -- REM -------------- MESSAGES_CREATE: DIM MESS$(32) MESS_VIS = 0 MESS_TXT$ = "" MESS_DUR = 0 MESSAGESTARTFRAME = 0 RETURN MESSAGES_INIT: MESS$(0) = "WARNING" MESS$(1) = "BIG OBJECT" MESS$(2) = "APPROACHING!" MESS$(3) = "TAKE" MESS$(4) = "REFUGE!" MESS$(5) = "READY....." MESS$(6) = "GO!!!" MESS$(7) = "OKAY" MESS$(8) = "LISTEN UP" MESS$(9) = "WE'RE ENTERING" MESS$(10) ="PLANETARY" MESS$(11) ="ATMOSPHERE..." MESS$(12) ="A SMALL NUMBER" MESS$(13) ="OF HOSTILES" MESS$(14) ="DETECTED" MESS$(15) ="" MESS$(16) ="" MESS$(17) ="GO GET 'EM!! " RETURN MESSAGE_DRAW: IF MESS_VIS = 1 THEN COLOR 7 IF LB_STATE = LB_ON THEN TEXT 32,30,MESS$(MESS_IDX),1,3 ELSE TEXT 32,24,MESS$(MESS_IDX),1,3 END IF MESS_DUR = MESS_DUR-1 IF MESS_DUR = 0 THEN MESS_VIS = 0 END IF END IF RETURN SINETAB_CREATE: DIM SINES(32) RESTORE SINETABLE1 FOR I = 0 TO 31 READ SINES(I) NEXT I RETURN DRAWSTATUS: COLOR 12 BAR 0+SCR_OX, 52 TO 64+SCR_OX, 64 COLOR 7 BOX 1+SCR_OX, 53 TO SCR_OX+63, 62 TEXT SCR_OX+3,55,"SCORE: " RETURN DRAWDEBUG: FRAMETIME=ENDFRAMETIME-STARTFRAMETIME REM LAYER 1 REM -- PRINT FRAME TIME TEXT 32, 0, FRAMETIME REM -- PRINY FRAME NO TEXT 0,0, FRAMES REM FOR I =0 TO 5 REM TEXT 8, (I*8), "LAYER SPEED: " +CL_SPD(I) REM NEXT I TEXT 16,0,NEXTEVENT RETURN LETTERBOX_CREATE: REM -- STATES LB_OFF = 0 LB_ON = 1 LB_EASEIN = 2 LB_EASEOUT = 3 RETURN LETTERBOX_INIT: LB_SCRH = 63 LB_SCRW = 63 LB_X = 0 LB_Y = 0 LB_WIDTH = 63 LB_DEPTH = 12 LB_CURRDEPTH = LB_DEPTH LB_COLOUR = 13 LB_EASEVAL = 0 LB_EASESPD = 0 LB_EASESPDTMP = LB_EASESPD LB_STATE = LB_OFF RETURN LETTERBOX_DRAW: IF LB_STATE = LB_ON THEN GOSUB LB_DRAWBARS END IF IF LB_STATE = LB_EASEOUT THEN REM WAIT 2 GOSUB LB_DRAWBARS LB_DEPTH = LB_DEPTH-1 IF LB_DEPTH < 0 THEN LB_DEPTH = 0 LB_STATE = LB_OFF END IF END IF IF LB_STATE = LB_EASEIN THEN REM WAIT 2 GOSUB LB_DRAWBARS LB_DEPTH = LB_DEPTH+1 IF LB_DEPTH > 12 THEN LB_DEPTH = 12 LB_STATE = LB_ON END IF END IF RETURN LB_DRAWBARS: PALETTE 13, 0 COLOR LB_COLOUR BAR LB_X, LB_Y TO LB_WIDTH, LB_Y+LB_DEPTH BAR LB_X, LB_SCRH-LB_Y TO LB_WIDTH, LB_SCRH-(LB_Y+LB_DEPTH) COLOR 4 LINE LB_X, LB_DEPTH TO LB_WIDTH, LB_DEPTH LINE LB_X, (LB_SCRH-LB_DEPTH) TO LB_WIDTH, (LB_SCRH-LB_DEPTH) RETURN RASTERBARS_CREATE: LAYER 3 REM COLOR 0 REM BAR 0, 0 TO 64, 0 COLOR 1 BAR 0, 1 TO 64, 1 COLOR 2 BAR 0, 2 TO 64, 2 COLOR 3 BAR 0, 3 TO 64, 3 COLOR 3 BAR 0, 4 TO 64, 4 COLOR 2 BAR 0, 5 TO 64, 5 COLOR 1 BAR 0, 6 TO 64, 6 REM COLOR 0 REM BAR 0, 7 TO 64, 7 GET BLOCK 61,0,1 TO 64,5 RETURN RASTERBAR_UPDATE: OFFS = OFFS +1 OFFS2 = OFFS2 -1 IF OFFS >32 THEN OFFS =0 END IF IF OFFS2 <0 THEN OFFS2 = 32 END IF RETURN RASTERBAR_DRAW: PUT BLOCK 0, 0, 11+SINE(OFFS) PUT BLOCK 0, 0, 47-SINE(OFFS2) TEXT 32, 7+SINE(OFFS), "RIVAL", 1,3 TEXT 32, 51-SINE(OFFS2), "TURF", 1,3 COLOR 1 PAINT 0,0 PAINT 0,63 COLOR 7 REM LINE 0,32 TO 64,32 RETURN REM -- UTILITIES AND DATA SHOWIMAGE: READ IMGFMT,IMGSIZE REM ** DATA IS RUN-LENGTH ENCODED (RLE) ** FOR IMGY=0 TO IMGSIZE-1 IMGX=0 REPEAT READ IMGV IF IMGV>=16 THEN IMGCOUNT=INT(IMGV/16)-1 IMGCOLOR=IMGV MOD 16 ELSE IMGCOLOR=IMGV READ IMGCOUNT END IF COLOR IMGCOLOR BAR IMGX,IMGY TO IMGX+IMGCOUNT,IMGY IMGX=IMGX+IMGCOUNT+1 UNTIL IMGX=IMGSIZE NEXT IMGY RETURN REM --------------------------- REM - LEVEL DATA REM - REM - TRIGGER POINT (FRAMES) REM - FOLLOWED REM - BY EVENT TYPE AND ARGS REM - REM --------------------------- EVENT_DATA_LVL1: REM - INTRO TEXT EVENTS (40) DATA 0, 40, 20, 7 DATA 25, 40, 20, 8 DATA 46, 53, 1, 32 DATA 50, 40, 20, 9 DATA 75, 40, 20, 10 DATA 100, 40, 20, 11 DATA 125, 40, 20, 12 DATA 150, 40, 20, 13 DATA 175, 40, 20, 14 DATA 200, 40, 20, 15 DATA 225, 40, 10, 16 DATA 230, 40, 10, 17 DATA 230, 30 DATA 250, 91 REM - SOME ENEMIES AT POS Y DATA 250,3, 32 REM DATA 260,2, 32 DATA 270,3, 16 REM DATA 280,2, 32 DATA 290,3, 32 REM DATA 300,2, 16 REM DATA 300, 31 DATA 380,2,8 DATA 380,2,16 DATA 380,2,24 DATA 380,2,32 DATA 380,2,40 DATA 380,2,48 DATA 410,3,24 DATA 418,3,32 DATA 426,3,40 DATA 434,3,48 DATA 442,3,40 DATA 450,3,32 DATA 458,3,24 DATA 500, 61 REM - BOSS FORESHADOW ON/OFF DATA 550, 70 DATA 560, 54 DATA 580, 92 DATA 595, 71 REM - BOSS TEXT DATA 600, 40, 20, 0 DATA 630, 40, 20, 1 DATA 650, 40, 20, 2 DATA 670, 40, 10, 3 DATA 680, 40, 10, 4 DATA 690, 91 REM - TRIGGER BOSS BATTLE DATA 700, 72 REM - END LEVEL REM DATA 850, 99 REM - END OF DATA DATA -1 SPRITESHEET: DATA -3,64 DATA 19,80,19,16,19,112,35,80,51,96,51,128,67,64,67,128 DATA 19,19,64,19,17,19,33,19,64,19,33,35,32,19,49,80 DATA 19,49,19,112,65,19,48,19,49,19,96,35,17,35,16,19 DATA 65,99,49,19,33,19,65,51,16,51,17,83,32,19,97,51 DATA 81,19,64,35,17,33,35,65,19,81,19,49,19,33,19,49 DATA 19,49,19,33,19,33,35,33,35,129,19,113,83,33,65,35 DATA 17,19,113,19,81,67,113,51,81,19,145,35,113,19,65,49 DATA 67,145,19,97,35,113,35,17,19,81,19,161,19,81,19,81 DATA 17,35,49,35,129,19,113,19,177,19,1,15,19,49,19,97 DATA 35,97,19,113,19,17,19,97,19,161,19,1,16,19,33,19 DATA 97,192,35,80,19,96,67,160,99,0,17,19,144,35,33,19 DATA 48,19,17,19,64,19,65,19,16,51,80,19,81,19,144,19 DATA 64,51,17,83,32,35,81,51,49,19,32,19,97,35,33,19 DATA 32,51,97,19,32,51,32,19,17,19,32,35,33,81,19,16 DATA 19,33,19,65,19,81,19,16,19,81,35,33,19,33,35,33 DATA 19,97,19,16,19,49,35,49,35,17,19,17,19,33,51,17 DATA 19,65,19,33,19,113,67,33,19,81,19,33,19,145,51,65 DATA 19,49,19,49,19,17,17,19,33,35,97,35,193,35,161,19 DATA 145,35,113,19,97,19,65,19,113,19,209,19,177,19,145,19 DATA 97,19,113,19,209,19,209,19,177,19,241,19,113,0,63,0 DATA 63,0,63,0,63,0,63,0,63,0,63,0,63,128,131,128 DATA 131,128,131,128,131,128,131,128,131,128,131,128,131,128,131,128 DATA 131,128,131,128,131,128,131,128,131,128,131,128,131,128,131,128 DATA 131,128,131,128,131,128,131,128,131,128,131,128,131,128,131,128 DATA 131,128,131,128,131,128,131,128,131,128,131,128,131,131,128,131 DATA 128,131,128,131,128,131,128,131,128,131,128,131,128,131,128,131 DATA 128,131,128,131,128,131,128,131,128,131,128,131,128,131,128,131 DATA 128,131,128,131,128,131,128,131,128,131,128,131,128,131,128,131 DATA 128,131,128,131,128,131,128,131,128,131,128,131,128,128,131,128 DATA 24,96,24,80,23,32,21,96,21,128,131,128,131,144,120,16 DATA 23,24,32,24,23,16,23,24,64,23,144,131,32,20,56,32 DATA 131,32,49,64,104,32,24,48,40,32,24,48,24,160,131,16 DATA 20,40,33,32,131,16,81,64,88,64,33,39,0,16,131,32 DATA 20,56,32,131,16,81,64,72,80,33,16,23,16,23,24,48 DATA 24,23,144,131,128,131,16,81,64,88,32,56,16,40,16,22 DATA 23,24,32,23,22,144,131,128,131,32,49,64,120,16,23,40 DATA 16,39,32,22,23,32,23,160,131,128,131,128,24,48,40,0 DATA 33,0,15,131,128,131,0,20,42,16,0,15,131,48,61,32 DATA 131,0,19,26,41,26,0,15,131,32,29,59,29,16,131,80 DATA 117,42,96,26,41,26,48,20,24,176,51,41,26,35,16,29 DATA 27,33,43,29,131,32,53,125,42,32,26,48,26,25,42,0 DATA 15,131,16,29,27,33,43,29,131,32,21,61,28,29,28,29 DATA 28,29,122,16,26,41,26,0,15,131,16,29,91,29,131,32 DATA 29,28,29,28,29,28,29,28,45,25,26,41,26,25,58,25 DATA 42,0,15,131,32,29,59,29,16,131,32,29,27,28,29,28 DATA 29,28,29,28,29,26,137,26,25,26,0,15,131,48,61,32 DATA 131,32,29,75,28,27,28,27,29,25,26,105,26,25,26,16 DATA 128,131,32,79,0,19,29,91,28,27,28,29,26,105,58,32 DATA 128,131,16,31,78,31,48,79,192,29,107,28,27,29,25,26 DATA 73,26,25,26,48,16,50,29,28,27,16,131,63,46,63,16 DATA 31,78,31,16,127,48,29,91,28,27,29,25,26,73,74,48 DATA 16,19,34,29,28,43,131,48,47,48,159,94,47,32,21,125 DATA 25,26,73,26,25,26,80,19,50,29,60,131,48,47,48,127 DATA 16,127,64,37,41,42,25,26,73,26,25,26,96,35,50,48 DATA 131,63,46,63,16,31,78,31,0,15,170,112,16,19,34,64 DATA 131,16,31,78,31,48,79,0,33,16,35,80,131,32,79,0 DATA 41 ROBOTBOSSDATA: DATA -3,64 DATA 131,128,131,128,131,128,13,15,131,128,131,128,131,128,29,239 DATA 29,131,128,131,128,131,128,29,31,194,31,29,131,128,131,128 DATA 131,128,29,31,18,175,18,31,29,131,128,131,128,131,128,29 DATA 31,18,175,18,31,29,131,128,131,128,131,128,29,31,18,175 DATA 18,31,29,131,128,131,128,131,128,29,31,18,175,18,31,29 DATA 131,128,131,128,131,128,29,31,194,31,29,128,131,128,51,55 DATA 35,128,131,29,239,29,128,131,128,35,23,56,23,19,128,131 DATA 13,15,128,131,128,19,23,88,23,128,131,29,47,29,47,29 DATA 47,29,47,29,47,29,128,131,128,19,23,40,20,40,23,128 DATA 131,29,47,29,47,29,47,29,47,29,47,29,128,131,128,19 DATA 23,88,23,128,131,29,47,29,47,29,47,29,47,29,47,29 DATA 128,131,128,35,23,56,23,19,128,131,29,47,29,47,29,47 DATA 29,47,29,47,29,128,131,128,51,55,35,128,131,29,47,29 DATA 47,29,47,29,47,29,47,29,128,131,128,131,128,131,13,15 DATA 131,128,131,128,131,128,131,128,131,128,131,128,131,128,131,128 DATA 131,128,131,128,131,128,131,128,131,128,131,128,131,128,131,128 DATA 131,128,131,128,131,128,131,128,131,128,131,128,131,128,131,128 DATA 131,128,131,128,131,128,131,128,131,112,13,33,115,128,128,115 DATA 29,15,31,29,112,141,128,115,29,31,2,29,31,29,112,29 DATA 111,29,128,115,29,31,18,15,27,18,31,29,112,29,31,66 DATA 31,29,128,115,29,31,18,15,27,18,31,29,112,29,31,18 DATA 47,18,31,29,128,115,29,31,18,15,27,18,31,29,112,29 DATA 31,18,47,18,31,29,128,115,29,31,18,15,27,18,31,29 DATA 112,29,31,18,47,18,31,29,128,115,29,31,18,47,141,143 DATA 141,47,18,31,29,112,29,31,18,47,18,31,29,128,115,29 DATA 31,18,47,141,143,141,47,18,31,29,112,29,31,18,47,18 DATA 31,29,131,112,29,31,18,47,141,143,141,47,18,31,29,115 DATA 29,31,18,47,18,31,29,131,112,29,31,18,47,141,143,141 DATA 47,18,31,29,115,29,31,18,47,18,31,29,131,112,29,31 DATA 18,47,141,143,141,47,18,31,29,115,29,31,18,47,18,31 DATA 29,131,112,29,31,18,15,27,18,31,29,115,29,31,18,47 DATA 18,31,29,131,112,29,31,18,15,27,18,31,29,115,29,31 DATA 18,47,18,31,29,131,112,29,31,18,15,27,18,31,29,115 DATA 29,31,18,47,18,31,29,131,112,29,31,18,111,13,16,95 DATA 18,31,29,115,29,31,18,47,18,31,29,131,112,29,31,18 DATA 111,29,17,29,17,29,17,29,17,29,17,29,17,29,17,29 DATA 17,29,95,18,31,29,115,29,31,18,47,18,31,29,128,115 DATA 29,31,18,111,29,17,29,17,29,17,29,17,29,17,29,17 DATA 29,17,29,17,29,95,18,31,29,112,29,31,18,47,18,31 DATA 29,128,115,29,31,18,111,29,17,29,17,29,17,29,17,29 DATA 17,29,17,29,17,29,17,29,95,18,31,29,112,29,31,18 DATA 47,18,31,29,128,115,29,31,18,111,29,17,29,17,29,17 DATA 29,17,29,17,29,17,29,17,29,17,29,95,18,31,29,112 DATA 29,31,18,47,18,31,29,128,115,29,31,18,111,13,16,95 DATA 18,31,29,112,29,31,18,47,18,31,29,128,115,29,31,18 DATA 15,27,18,31,29,112,29,31,18,47,18,31,29,128,115,29 DATA 31,18,15,27,18,31,29,112,29,31,18,47,18,31,29,128 DATA 115,29,31,2,29,31,29,112,29,31,18,47,18,31,29,128 DATA 115,29,15,31,29,112,29,31,18,47,18,31,29,131,112,13 DATA 33,115,29,31,18,47,18,31,29,131,128,131,128,131,128,131 DATA 29,31,18,47,18,31,29,131,128,131,128,131,128,131,29,31 DATA 18,47,18,31,29,131,128,131,128,131,128,131,29,31,18,47 DATA 18,31,29,131,128,131,128,131,128,131,29,31,18,47,18,31 DATA 29,131,128,131,128,131,128,131,29,31,18,47,18,31,29,131 DATA 128,131,128,131,128,131,29,31,18,47,18,31,29,131,128,131 DATA 128,131,128,131,29,31,18,47,18,31,29,128,131,128,131,128 DATA 131,128,29,31,18,47,18,31,29,128,131,128,131,128,131,128 DATA 29,31,18,47,18,31,29,128,131,128,131,128,131,128,29,31 DATA 18,47,18,31,29,128,131,128,131,128,131,128,29,31,18,47 DATA 18,31,29,128,131,128,131,128,131,128,29,31,18,47,18,31 DATA 29,128,131,128,131,128,131,128,29,31,66,31,29,128,131,128 DATA 131,128,131,128,29,111,29,128,131,128,131,128,131,128,141 SINETABLE1: DATA 0,1,3,4,5,6,7,7 DATA 8,7,7,6,5,4,3,1 DATA -1,-2,-4,-5,-6,-7,-8,-8 DATA -8,-8,-8,-7,-6,-5,-4,-2 DATA 0