' ARCHER GAME GAMEPAD 1 FONT 192 ' CHARACTERS GLOBAL KC_PLR,KC_ARR,KC_WALL,KC_PFX,KC_EBAR,KC_CURSOR GLOBAL KC_SCROLL_L,KC_SCROLL_R,KC_SCROLL_C,KC_SCROLL_PL,KC_SCROLL_PR GLOBAL KC_BEAD_ON,KC_BEAD_OFF,KC_ORNAMENT,KC_STRIKE,KC_BLAST GLOBAL KC_PWDUPLEX,KC_PWFLAME,KC_PWBASE,KC_AIM,KC_SHIELD KC_PLR=1 KC_ARR=12 KC_WALL=80 KC_PFX=28 KC_EBAR=57 KC_CURSOR=48 KC_SCROLL_L=171 KC_SCROLL_C=172 KC_SCROLL_R=173 KC_SCROLL_PL=187 KC_SCROLL_PR=189 KC_BEAD_OFF=174 KC_BEAD_ON=175 KC_ORNAMENT=170 KC_STRIKE=190 KC_BLAST=49 'BASE CHAR FOR POWERUPS KC_PWBASE=50 KC_PWDUPLEX=50 KC_PWFLAME=51 KC_AIM=75 KC_SHIELD=73 ' SPRITE NUMBERS GLOBAL KS_PLR,KS_ARRL,KS_ARRU,KS_ENEMYU,KS_PFXL,KS_PFXU,KS_EBARL GLOBAL KS_EBARU,KS_BLASTL,KS_BLASTU,KS_PW,KS_AIM1,KS_AIM2,KS_ESHIELD ' ENEMIES (SPRITES 0 TO KS_ENEMYU). KS_ENEMYU=15 ' ENEMY HEALTH BARS KS_EBARL=16 KS_EBARU=31 ' PLAYER KS_PLR=32 ' ARROWS KS_ARRL=33 KS_ARRU=37 ' ENEMY SHIELD KS_ESHIELD=38 ' AIM DOTTED LINES KS_AIM1=39 KS_AIM2=40 ' POWERUP KS_PW=41 ' PARTICLE FX KS_PFXL=42 KS_PFXU=58 ' BLAST SPELL KS_BLASTL=59 KS_BLASTU=63 ' MAXIMUM Y COORD (BOTTOM OF PLAY AREA) ' THIS LEAVES 16 PX FOR STATUS BAR GLOBAL K_MAXY K_MAXY=112 ' NEXT AUDIO CHANNEL TO USE ' (ROUND ROBIN) GLOBAL G_NEXTAC G_NEXTAC=0 ' WALL COLUMN GLOBAL K_WALL_C K_WALL_C=3 ' ENEMY START X GLOBAL K_ESTARTX K_ESTARTX=152 ' FRAME COUNTER GLOBAL G_CLK G_CLK=0 ' PLAYER POS AND MOMENTUM GLOBAL G_PX,G_PY,G_PM G_PX=4 G_PY=20 G_PM=0 ' PLAYER GOLD GLOBAL G_GOLD G_GOLD=0 ' ARROW FIRE FRAME COUNTER ' 0 MEANS NOT FIRING ' 1-11 = DOING ANIMATION ' ARROW FIRES WHEN G_FIRE=11 ' THEN CONTINUES TO COUNT UP DURING RECOVERY GLOBAL G_FIRE G_FIRE=0 GLOBAL G_LNO,G_ECOUNT,G_ENDED,G_WHP,G_LICD,G_CURWAV,G_NUMWAVS ' CUR LEVEL NUMBER G_LNO=0 ' CUR NUM OF ENEMIES G_ECOUNT=0 ' CURRENT WAVE NUMBER G_CURWAV=0 ' TOTAL # OF WAVES IN THIS LEVEL G_NUMWAVS=0 ' COUNTDOWN TO NEXT LEVEL INSTRUCTION ' SPECIAL VALUE: 999 MEANS WAITING FOR ' PLAYER TO CLEAR ALL ENEMIES G_LICD=0 ' LEVEL ENDED? ' 0: NOT ENDED ' 1: ENDED (GAME OVER), ' 2: ENDED (WON) ' 3: ENDED (END OF GAME) G_ENDED=0 ' WALL HITPOINTS G_WHP=0 ' SPELL EFFECT COUNTDOWNS GLOBAL G_FREEZECD,G_TEMPESTCD G_FREEZECD=0 G_TEMPESTCD=0 ' HOW MANY TIMES EACH SPELL CAN STILL BE CAST DIM GLOBAL G_SPLEFT(4) GLOBAL G_PW,G_PWAMMO,G_PWDROPCD,G_LASTEY ' CURRENT POWERUP (KC_PWDUPLEX, KC_PWFLAME, ETC) G_PW=0 ' POWERUP AMMO LEFT G_PWAMMO=0 ' # OF ENEMIES BEFORE NEXT POWERUP G_PWDROPCD=0 ' Y POSITION OF LAST ENEMY CREATED G_LASTEY=0 ' THEME-BASED CHARACTERS TO USE FOR GRASS/TREES GLOBAL G_CTREE,G_CGRASS G_CTREE=0 G_CGRASS=0 ' ENEMY POS AND VELOCITY DIM GLOBAL G_EX(KS_ENEMYU) DIM GLOBAL G_EY(KS_ENEMYU) DIM GLOBAL G_EVX(KS_ENEMYU) DIM GLOBAL G_EVY(KS_ENEMYU) ' ENEMY CUR HIT POINTS DIM GLOBAL G_EHP(KS_ENEMYU) ' ENEMY INITIAL HP DIM GLOBAL G_EIHP(KS_ENEMYU) ' TICKS SINCE ENEMY CREATED DIM GLOBAL G_EAGE(KS_ENEMYU) ' TIME WHEN ENEMY LAST TOOK DAMAGE ' AS GIVEN BY G_CLK DIM GLOBAL G_EDMGT(KS_ENEMYU) ' ENEMY PALETTE DIM GLOBAL G_EPAL(KS_ENEMYU) ' ENEMY GOLD VALUE DIM GLOBAL G_EGOLD(KS_ENEMYU) ' ENEMY FLAGS - SEE KEF_* CONSTANTS DIM GLOBAL G_EF(KS_ENEMYU) ' TICKS LEFT UNTIL ENEMY ACTION. ' ACTION CAN BE SPAWNING NEW ENEMIES OR ' FIRING A PROJECTILE, ETC. DIM GLOBAL G_EACTCD(KS_ENEMYU) ' POSSIBLE FLAGS FOR ENEMIES: GLOBAL KEF_HEAVY,KEF_SPAWN,KEF_FRAGILE,KEF_SHOOT,KEF_BIG,KEF_SHIELD,KEF_FASTACT ' REDUCED PUSHBACK FROM ARROWS KEF_HEAVY=1 ' SPAWNS NEW ENEMIES AFTER A TIME. ' SPAWNED ENEMIES ARE OF THE NEXT TYPE (EID + 2). ' CURRENT ENEMY DISAPPEARS. KEF_SPAWN=2 ' CAN BE KILLED IN ONE SHOT BY ' POWERUPS OR WHEN FROZEN KEF_FRAGILE=4 ' SHOOTS PROJECTILES ' PROJECTILE IS THE NEXT EID (EID + 2) KEF_SHOOT=8 ' BIG ENEMY (DOUBLE SPRITE) KEF_BIG=16 ' ENEMY HAS A SHIELD KEF_SHIELD=32 ' ACTION TIMER IS REDUCED KEF_FASTACT=64 ' MENU OPTIONS. SEE M_SHOW(). DIM GLOBAL G_MENU$(8) GLOBAL G_MENUC G_MENUC=0 ' RAM ADDRESSES: GLOBAL KA_EDB,KA_BGBACKUP,KA_NEXTLNO,KA_GOLD,KA_UPGRADES,KA_BGCLRBK,KA_LTHEME ' BACKGROUND BACKUP ($800 BYTES) KA_BGBACKUP=$A000 ' BG COLOR BACKUP KA_BGCLRBK=$A800 ' LEVEL THEME DATA KA_LTHEME=$A801 ' ENEMY DB KA_EDB=$B000 ' SAVE: NEXT LEVEL TO PLAY KA_NEXTLNO=$E001 ' SAVE: GOLD (2 BYTES) KA_GOLD=$E002 ' SAVE: UPGRADES (5 BYTES) KA_UPGRADES=$E004 ' NEXT LEVEL TO PLAY GLOBAL G_NEXTLNO G_NEXTLNO=1 ' UPGRADES PURCHASED. EACH INDICATES ' THE CURRENT UPGRADE LEVEL (0-5). DIM GLOBAL G_UPGRADE(4) ' UPGRADE INDICES GLOBAL KU_DAMAGE,KU_MOVESPD,KU_ARRSPD,KU_PWRATE,KU_MAGIC KU_DAMAGE=0 KU_MOVESPD=1 KU_ARRSPD=2 KU_PWRATE=3 KU_MAGIC=4 ' UPGRADE NAMES DIM GLOBAL K_UPGRADE_NAMES$(4) K_UPGRADE_NAMES$(0)="DAMAGE" K_UPGRADE_NAMES$(1)="MOVE SPEED" K_UPGRADE_NAMES$(2)="ARROW SPEED" K_UPGRADE_NAMES$(3)="POWERUP RATE" K_UPGRADE_NAMES$(4)="MAGIC SPELLS" ' UPGRADE COSTS (FOR EACH LEVEL) DIM GLOBAL K_UPGRADE_COSTS(5) K_UPGRADE_COSTS(0)=0 K_UPGRADE_COSTS(1)=200 K_UPGRADE_COSTS(2)=400 K_UPGRADE_COSTS(3)=700 K_UPGRADE_COSTS(4)=1200 K_UPGRADE_COSTS(5)=1800 ' CHEAT OPTIONS GLOBAL G_CH_EKILL G_CH_EKILL=0 ' LOAD GAME FROM PERSISTENT MEMORY SUB GAME_LOAD G_NEXTLNO=MIN(MAX(PEEK(KA_NEXTLNO),1),21) G_GOLD=PEEKW(KA_GOLD) FOR I=0 TO UBOUND(G_UPGRADE) G_UPGRADE(I)=PEEK(KA_UPGRADES+I) NEXT I END SUB ' PLAYS THE GIVEN LEVEL SUB GAME_PLAY(LNO) CLS ' SHOW STORY? FOUND=0 CAP=0 CALL L_STORYSEEK(LNO,FOUND,CAP) IF FOUND>0 THEN CALL SHOWSCROLL(CAP) CLS CALL SFXTRACK(6) LOCATE 6,4 PRINT "LEVEL "+STR$(LNO) POKE $FF00,0 WAIT 120 CLS ' SET UP PLAYER SPRITE KS_PLR,4,50,KC_PLR SPRITE KS_PLR PAL 0 CALL L_START(LNO) ' STORE BACKUP OF BG COLOR IN CASE WE CHANGE IT POKE KA_BGCLRBK,PEEK($FF00) ' KEEP PLAYING UNTIL GAME ENDS WHILE G_ENDED=0 INC G_CLK CALL PLR_UPD CALL ARR_UPD CALL PLR_DRAW CALL L_UPD ' NOTE: G_ENDED MIGHT HAVE CHANGED ABOVE. CALL PFX_UPD CALL SB_UPD CALL PW_UPD IF G_ENDED=0 THEN CALL SP_UPD FOR I=0 TO KS_ENEMYU IF G_ENDED=0 AND SPRITE.C(I)>0 THEN CALL E_UPD(I) NEXT I WAIT VBL WEND ' CLEAR ALL SPRITES FOR I=0 TO 63 SPRITE I,-16,-16,0 NEXT I ' WAIT A BIT SO THE USER CAN SEE THE ' END STATE. WAIT 200 ' RESTORE DEFAULT THEME CALL L_SETTHEME(0) ' RESTORE BG COLOR POKE $FF00,PEEK(KA_BGCLRBK) IF G_ENDED=3 THEN CALL WINSCREEN END IF END SUB ' UPDATE PLAYER SUB PLR_UPD IF G_ENDED>0 THEN EXIT SUB ' UP/DOWN ARROWS CONTROL MOMENTUM MAXM=1+G_UPGRADE(KU_MOVESPD)*0.25 ACC=0.3 LOCATE 0,0 IF UP(0) THEN G_PM=MAX(G_PM-ACC,-MAXM) IF DOWN(0) THEN G_PM=MIN(G_PM+ACC,MAXM) ' MOVE BASED ON MOMENTUM ADD G_PY,G_PM G_PY=MIN(MAX(G_PY,0),K_MAXY-8) ' MOMENTUM FALLOFF IF NOT UP(0) AND NOT DOWN(0) THEN G_PM=SGN(G_PM)*MAX(0,ABS(G_PM)-0.5) IF G_FIRE>0 THEN CALL PLR_UPD_FIRE ' START FIRING? AVAIL=0 CALL ARR_AVAIL(AVAIL) IF AVAIL>0 AND G_FIRE=0 AND BUTTON(0,0) THEN ' START FIRING SEQUENCE G_FIRE=1 IF G_PW=KC_PWDUPLEX THEN CALL SFX(3,30,1) ELSE IF G_PW=KC_PWFLAME THEN CALL SFX(6,30,15) ELSE CALL SFX(3,20,1) END IF END IF ' CAST SPELL? IF G_FIRE=0 AND BUTTON(0,1) AND G_UPGRADE(KU_MAGIC)>0 THEN CALL SP_MENU END IF ' UPDATE AIM SPRITE KS_AIM1,G_PX+28,G_PY,KC_AIM SPRITE KS_AIM2,144,G_PY,KC_AIM ' CHEAT IF G_CH_EKILL>0 AND LEFT TAP(0) THEN FOR I=0 TO KS_ENEMYU CALL E_KILL(I,1) NEXT I END IF END SUB SUB PLR_UPD_FIRE INC G_FIRE ' TIME TO CREATE ARROW? IF G_FIRE=11 THEN CALL ARR_CREATE ELSE IF G_FIRE>11 THEN ' AFTER G_FIRE=11 WE CONTINUE COUNTING UP (RECOVERY TIME) SPD=0 CALL ARR_GETSPD(SPD) ' ARROW TAKES T=11+(160-4)/SPD TO GO ACROSS SCREEN ' WE WANT RECOVERY TO BE SUCH THAT 3 ARROWS ARE ' ON THE SCREEN AT ANY TIME, SO THE USER NEEDS ' TO BE ABLE TO FIRE AN ARROW EVERY T/3 TICKS. RT=(11+156/SPD)/3 ' RECOVERY DONE? IF G_FIRE>RT THEN G_FIRE=0 END IF END SUB ' CREATES ARROW SUB ARR_CREATE I=0 CALL ARR_AVAIL(I) IF I=0 THEN EXIT SUB S=KC_ARR P=0 ' USE SAME PALETTE AS PLAYER. THAT WAY WE ' HAVE THE RIGHT ARROW COLOR DEPENDING ON ' POWERUPS. SPRITE I PAL (SPRITE.A(KS_PLR) AND 7) ' HAS POWERUP? IF G_PW>0 THEN DEC G_PWAMMO ' SET ARROW CHAR BASED ON POWERUP S=G_PW-KC_PWBASE+1+KC_ARR IF G_PWAMMO<1 THEN ' END OF POWERUP G_PW=0 SPRITE KS_PLR PAL 0 CALL PW_SETDROPCD END IF END IF ' CREATE ARROW SPRITE I,G_PX+3,G_PY,S END SUB ' CHECKS IF WE CAN CREATE AN ARROW ' RETURNS SPRITE#, OR 0 TO INDICATE THAT ' NO SPRITE IS AVAILABLE. SUB ARR_AVAIL(RET) RET=0 FOR I=KS_ARRL TO KS_ARRU IF SPRITE.C(I)=0 THEN RET=I NEXT I END SUB ' UPDATE ARROWS SUB ARR_UPD FOR I=KS_ARRL TO KS_ARRU IF SPRITE.C(I)>0 THEN SPD=0 CALL ARR_GETSPD(SPD) X=SPRITE.X(I)+SPD SPRITE I,X,SPRITE.Y(I),SPRITE.C(I) ' WENT OFF SCREEN? IF X>160 THEN SPRITE I,0,0,0 IF SPRITE HIT(I,KS_ESHIELD) THEN ' HIT ENEMY SHIELD. CALL SFX(2,40,5) SPRITE I,0,0,0 END IF END IF NEXT I END SUB ' GET ARROW SPEED BASED ON UPGRADES SUB ARR_GETSPD(RET) RET=2+0.3*G_UPGRADE(KU_ARRSPD) END SUB SUB PLR_DRAW IF G_ENDED>0 THEN EXIT SUB C=KC_PLR IF G_FIRE>0 THEN ' FIRE ANIMATION, 3 TICKS PER ANIM FRAME. C=MIN(5,KC_PLR+G_FIRE\3) ELSE IF (UP(0) OR DOWN(0)) AND (G_CLK AND 4) THEN ' WALK ANIM, CHANGE SPRITE EVERY 4 FRAMES. INC C END IF SPRITE KS_PLR,G_PX,G_PY,C END SUB ' CREATE ENEMY ' EID=ENEMY ID ' X,Y=POSITION ' RET=(OUT) ENEMY SPRITE#, -1 IF FAIL SUB E_CREATE(EID,X,Y,RET) X=MIN(MAX(X,0),K_ESTARTX) Y=MIN(MAX(Y,0),K_MAXY-8) VX=0 VY=0 F=0 P=0 HP=0 GOLD=0 ' LOOKUP ENEMY DB CALL E_LOOKUP(EID,VX,VY,P,HP,GOLD,F) ' SHIELDED ENEMIES ARE CREATED IN THE MIDDLE ' OF THE SCREEN. IF F AND KEF_SHIELD THEN Y=50 ' IN DATA VX,VY ARE REPRESENTED AS SIXTEENTHS. VX=-VX/16 VY=VY/16 ' IF ENEMY TOO FAR DOWN, MOVE UP NOT DOWN IF Y>56 THEN VY=-VY I=0 CALL E_FINDFREE(I) RET=I IF I<0 THEN EXIT SUB ' FOUND FREE SPRITE I. ' INIT ENEMY. SPRITE I,X,Y,EID SPRITE I PAL P ' IS IT A 16X16 ENEMY? ISBIG=SGN(F AND KEF_BIG) SPRITE I SIZE ISBIG G_EPAL(I)=P G_EX(I)=X G_EY(I)=Y G_EVX(I)=VX G_EVY(I)=VY G_EHP(I)=HP G_EIHP(I)=HP G_EAGE(I)=0 G_EF(I)=F G_EDMGT(I)=-999999 G_EACTCD(I)=0 IF F AND KEF_SPAWN THEN ' SPAWN COUNTDOWN IF F AND KEF_FASTACT THEN G_EACTCD(I)=200+RND(100) ELSE G_EACTCD(I)=700+RND(100) END IF ELSE IF F AND KEF_SHOOT THEN ' COUNTDOWN TO SHOOT G_EACTCD(I)=20+RND(20) END IF G_EGOLD(I)=GOLD INC G_ECOUNT RET=I END SUB ' FINDS A FREE ENEMY SPRITE. ' RET=(OUT) THE SPRITE# OR -1 IF NOT FOUND. SUB E_FINDFREE(RET) RET=-1 FOR I=0 TO KS_ENEMYU IF SPRITE.C(I)=0 THEN RET=I EXIT SUB END IF NEXT I END SUB ' INITIALIZE ENEMY DATABASE. SUB E_INITDB ' COPY TO RAM RESTORE DATA_EDB PTR=KA_EDB DO B=0 READ B ' END SENTINEL? IF B>255 THEN POKE PTR,0 EXIT SUB END IF POKE PTR,B INC PTR LOOP END SUB ' LOAD ENEMY DEFINITION FROM DATABASE SUB E_LOOKUP(EID,OUT_VX,OUT_VY,OUT_PAL,OUT_HP,OUT_GOLD,OUT_F) PTR=KA_EDB DO E=PEEK(PTR) ' GOT TO END OF DB? IF E=0 THEN CALL CRASH("BAD EID:"+STR$(EID)) IF E=EID THEN ' FOUND OUT_VX=PEEK(PTR+1) OUT_VY=PEEK(PTR+2) OUT_PAL=PEEK(PTR+3) OUT_HP=PEEK(PTR+4) OUT_GOLD=PEEK(PTR+5) OUT_F=PEEK(PTR+6) EXIT SUB END IF ' ADVANCE TO NEXT RECORD (8 BYTES) ADD PTR,8 LOOP END SUB ' UPDATE ENEMY, I=SPRITE NUMBER SUB E_UPD(I) ' UNLESS FROZEN, INCREMENT COUNTERS. IF G_FREEZECD=0 THEN INC G_EAGE(I) G_EACTCD(I)=MAX(0,G_EACTCD(I)-1) END IF C=SPRITE.C(I) VX=G_EVX(I) VY=G_EVY(I) SPAWNCD=9999 SHOOTCD=9999 REELT=10 IF G_EF(I) AND KEF_HEAVY THEN REELT=3 REEL=0 IF G_CLK-G_EDMGT(I)0 THEN VX=1 VY=0 END IF ' IF TIME IS FROZEN, DON'T MOVE IF G_FREEZECD>0 THEN VX=0 VY=0 END IF ' UPDATE SHIELD IF G_EF(I) AND KEF_SHIELD THEN ' IS SHIELD UP? ISUP=1-(G_EAGE(I)\250 MOD 2) ISUP=MSHIELD*ISUP ' IF SHIELD UP, SHOW IT, AND STAY IN PLACE. IF ISUP>0 THEN SPRITE KS_ESHIELD,G_EX(I)-7,G_EY(I),KC_SHIELD VX=0 ELSE SPRITE KS_ESHIELD,-16,-16,0 END IF END IF ' MOVE, UNLESS ABOUT TO SPAWN OR SHOOT IF SPAWNCD>200 AND SHOOTCD>60 THEN ADD G_EX(I),VX ADD G_EY(I),VY G_EX(I)=MIN(G_EX(I),K_ESTARTX) ' ANIMATION (2 FRAMES) IF G_FREEZECD=0 THEN ' MASK IS 254 FOR SMALL ENEMIES (ALL BUT LAST BIT) ' MASK IS 252 FOR BIG ENEMIES (ALL BUT LAST 2 BITS) B=SGN(G_EF(I) AND KEF_BIG) M=254-2*B C=(C AND M) OR (G_CLK\16 AND 1)*(B+1) END IF END IF SPRITE I,G_EX(I),G_EY(I),C IF REEL>0 THEN ' IF REELING USE PALETTE 7 (WHITE) SPRITE I PAL 7 ELSE ' IF ABOUT TO SPAWN OR SHOOT FLASH PALETTE 7 P=G_EPAL(I) IF (SPAWNCD<200 OR SHOOTCD<60) AND (G_CLK\16 AND 1) THEN P=7 ELSE ' IF FROZEN USE PAL 3 IF G_FREEZECD>0 THEN P=3 END IF SPRITE I PAL P END IF ' TIME TO SHOOT? IF SHOOTCD<1 THEN CALL E_SHOOT(I) ' UPDATE LIFE BAR IF G_EHP(I)0 THEN CALL E_KILL(I,0) END IF ' HIT BY ARROW? IF G_EAGE(I)>5 THEN FOR J=KS_ARRL TO KS_ARRU AC=SPRITE.C(J) IF SPRITE HIT(I,J) AND G_EDMGT(I)KC_ARR THEN ' THIS IS A POWERUP ARROW. DAMAGE BONUS. DMG=3*DMG ' IF FRAGILE AND HIT WITH POWERUP, ' DESTROY INSTANTLY. IF G_EF(I) AND KEF_FRAGILE THEN DMG=999 END IF ' IF FROZEN AND FRAGILE, DESTROY IMMEDIATELY. IF G_FREEZECD>0 THEN IF G_EF(I) AND KEF_FRAGILE THEN DMG=999 END IF CALL E_DAMAGE(I,DMG) END IF NEXT J END IF ' HIT TOP OR BOTTOM OF SCREEN? IF G_EY(I)<0 THEN ' START MOVING DOWN G_EY(I)=0 G_EVY(I)=ABS(G_EVY(I)) ELSE IF G_EY(I)>K_MAXY-8 THEN ' START MOVING UP G_EY(I)=K_MAXY-8 G_EVY(I)=-ABS(G_EVY(I)) END IF ' TIME TO SPAWN? IF SPAWNCD<1 THEN CALL E_SPAWN(I) END SUB ' NOTE: THIS IS SPAWN IN THE SENSE OF AN ENEMY ' DISAPPEARING AND GETTING REPLACED WITH ' "OFFSPRING", NOT AN ENEMY INITIALLY APPEARING ' (FOR THAT SEE E_CREATE). SUB E_SPAWN(I) C=SPRITE.C(I) AND 254 RET=0 CALL E_CREATE(C+2,G_EX(I),G_EY(I),RET) CALL E_CREATE(C+2,G_EX(I)+RND(4),G_EY(I)-8,RET) CALL E_CREATE(C+2,G_EX(I)-RND(4),G_EY(I)+8,RET) CALL E_KILL(I,0) END SUB ' MAKES THE ENEMY SHOOT. SUB E_SHOOT(I) IF G_EF(I) AND KEF_BIG THEN ' BIG ENEMY C=SPRITE.C(I) AND 252 BC=C+4 ELSE ' SMALL ENEMY C=SPRITE.C(I) AND 254 BC=C+2 END IF RET=0 ' CREATE BULLET. CALL E_CREATE(BC,G_EX(I)-4,G_EY(I),RET) ' COUNTDOWN TO NEXT BULLET. IF G_EF(I) AND KEF_FASTACT THEN G_EACTCD(I)=120+RND(40) ELSE G_EACTCD(I)=230+RND(40) END IF END SUB ' APPLY DAMAGE TO ENEMY SUB E_DAMAGE(I,DMG) ' IF ENEMY IS SHIELDED, DON'T DAMAGE. IF G_EF(I) AND KEF_SHIELD THEN IF SPRITE.C(KS_ESHIELD)>0 THEN EXIT SUB END IF G_EDMGT(I)=G_CLK ADD G_EHP(I),-DMG IF G_EHP(I)<1 THEN ' DIED. CALL E_KILL(I,1) EXIT SUB END IF CALL SFX(5,30,1) ' TAKING DAMAGE RESETS ACTION COUNTER. G_EACTCD(I)=MAX(G_EACTCD(I),300) SPRITE I PAL 7 END SUB ' KILL ENEMY. ' BYPLR=IF 1 ENEMY WAS KILLED BY PLAYER SUB E_KILL(I,BYPLR) IF SPRITE.C(I)<1 THEN EXIT SUB DEC G_ECOUNT P=SPRITE.A(I) AND 7 IF G_EF(I) AND KEF_BIG THEN CALL PFX_CREATE(G_EX(I)+1,G_EY(I)+1,P) CALL PFX_CREATE(G_EX(I)+7,G_EY(I)+1,P) CALL PFX_CREATE(G_EX(I)+1,G_EY(I)+7,P) CALL PFX_CREATE(G_EX(I)+7,G_EY(I)+7,P) ELSE CALL PFX_CREATE(G_EX(I),G_EY(I),P) END IF SPRITE I,-16,-16,0 SPRITE KS_EBARL+I,0,0,0 IF BYPLR THEN ADD G_GOLD,G_EGOLD(I) G_GOLD=MIN(G_GOLD,9999) CALL GAME_SAVE IF G_FREEZECD>0 THEN ' SOUND OF ICE BREAKING CALL SFXTRACK(13) ELSE IF G_EF(I) AND KEF_BIG THEN CALL SFX(6,50,30) ELSE ' REGULAR SOUND CALL SFX(5,40,1) END IF IF G_EF(I) AND KEF_SHIELD THEN SPRITE KS_ESHIELD,-16,-16,0 END IF IF BYPLR=1 THEN CALL PW_MAYBEDROP(G_EX(I),G_EY(I)) END SUB SUB E_DELALL FOR I=0 TO KS_ENEMYU SPRITE I,-16,-16,0 SPRITE KS_EBARL+I,0,0,0 NEXT I SPRITE KS_ESHIELD,-16,-16,0 END SUB ' HANDLES POSSIBLE WALL HIT BY A GIVEN ENEMY ' I: THE ENEMY# ' RET=1 IF COLLIDED, 0 IF PASSED THRU SUB W_HIT(I,RET) X=G_EX(I) RET=0 ' WALL EFFECTIVE X (RETRACTS 2 PX PER ' HITPOINT LOST) WEX=(K_WALL_C+1)*8-(3-G_WHP)*2 IF X>WEX THEN EXIT SUB ' COLLIDED RET=1 DEC G_WHP ' DOUBLE DAMAGE FOR BIG ENEMIES IF G_EF(I) AND KEF_BIG THEN DEC G_WHP CALL SFX(6,40,30) IF G_WHP<0 THEN G_ENDED=1 CALL E_DELALL LOCATE 5,4 PRINT "GAME OVER" CALL SFXTRACK(0) END IF CALL W_REDRAW END SUB SUB W_REDRAW FOR R=0 TO 13 C=KC_WALL+(3-G_WHP) IF G_WHP<0 THEN C=0 CELL K_WALL_C,R,C NEXT R END SUB ' INITIALIZE THEMES (COPY TO RAM) SUB L_INITTHEME RESTORE DATA_LTHEME D=0 PTR=KA_LTHEME WHILE D<>999999 READ D POKE PTR,D INC PTR WEND END SUB SUB L_SETTHEME(THNO) PTR=KA_LTHEME+THNO*6 ' COPY COLORS TO PALETTE 4 ($FF10) COPY PTR,4 TO $FF10 ' ALSO SET PALETTE 0'S FIRST COLOR POKE $FF00,PEEK(PTR) ' GRASS/TREE CHARACTERS G_CGRASS=PEEK(PTR+4) G_CTREE=PEEK(PTR+5) END SUB ' SEEK DATA POINTER TO LEVEL START SUB L_SEEK(LNO) RESTORE DATA_LEVEL DO D=0 READ D IF D=900000+LNO THEN EXIT SUB IF D=999999 THEN CALL CRASH("BAD LVL") LOOP END SUB ' SEEK DATA POINTER TO LEVEL STORY SUB L_STORYSEEK(LNO,FOUND,CAP) RESTORE DATA_STORY FOUND=0 DO L=0 CAP=0 READ L,CAP IF L=0 THEN FOUND=0 EXIT SUB ELSE IF L=LNO THEN FOUND=1 EXIT SUB END IF ' SKIP STORY X$="" WHILE X$ <> "/" READ X$ WEND LOOP END SUB ' START LEVEL SUB L_START(LNO) G_LNO=LNO TRACE G_LNO ' HOW MANY WAVES IN THIS LEVEL? ' READ THE LEVEL DATA TO SEE HOW MANY 255'S WE FIND, ' AS 255 MEANS END OF WAVE. CALL L_SEEK(LNO) READ LTHEME G_NUMWAVS=0 D=-1 WHILE D<>0 READ D IF D=255 THEN INC G_NUMWAVS WEND ' REWIND DATA PTR TO START OF LEVEL DATA. CALL L_SEEK(LNO) READ LTHEME CALL L_SETTHEME(LTHEME) G_CURWAV=0 G_ECOUNT=0 G_ENDED=0 G_FREEZECD=0 G_TEMPESTCD=0 G_WHP=3 G_PW=0 G_LASTEY=50 G_PWAMMO=0 CALL PW_SETDROPCD FOR I=0 TO UBOUND(G_SPLEFT) G_SPLEFT(I)=3 NEXT I ' THE TOP SPELL UNLOCKED ONLY HAS 2 INSTEAD OF 3 IF G_UPGRADE(KU_MAGIC)>0 THEN G_SPLEFT(G_UPGRADE(KU_MAGIC)-1)=2 ' THE FIX WALL SPELL CAN ONLY BE USED ONCE G_SPLEFT(3)=1 ' REPEL CAN BE USED MORE TIMES INC G_SPLEFT(2) INC G_SPLEFT(2) CLS ' SET UP WALL FOR R=0 TO 13 CELL K_WALL_C,R,KC_WALL NEXT R ' SCENERY PAL 4 RANDOMIZE LNO+12345 FOR R=0 TO 13 FOR C=K_WALL_C+1 TO 19 IF RND(3)<1 THEN CELL C,R,G_CGRASS IF RND(20)<1 THEN CELL C,R,G_CTREE NEXT C NEXT R PAL 0 SPRITE KS_AIM1 PAL 5 SPRITE KS_AIM1 SIZE 1 SPRITE KS_AIM2 PAL 5 SPRITE KS_AIM2 SIZE 1 SPRITE KS_ESHIELD SIZE 1 SPRITE KS_ESHIELD,-16,-16,0 END SUB ' UPDATES THE LEVEL SUB L_UPD IF G_ENDED>0 THEN EXIT SUB IF G_FREEZECD>0 THEN EXIT SUB ' 999 MEANS WAITING UNTIL ENEMIES CLEARED IF G_LICD=999 THEN IF G_ECOUNT>0 THEN EXIT SUB G_LICD=0 ' START OF NEXT WAVE INC G_CURWAV END IF IF G_LICD>0 THEN DEC G_LICD EXIT SUB END IF INS=0 ' READ NEXT LEVEL INSTRUCTION READ INS IF INS=0 THEN ' END OF LEVEL CALL L_WIN ELSE IF INS>=251 AND INS<=254 THEN ' DELAY G_LICD=(INS-250)*60 IF G_CH_EKILL>0 THEN G_LICD=0 ELSE IF INS=255 THEN ' END OF WAVE (WAIT UNTIL ENEMIES CLEARED) G_LICD=999 ELSE ' CREATE ENEMY ' RANDOM Y BUT TRY TO BE DIFFERENT FROM LAST YS=1 IF RND(100)<50 THEN YS=-1 ADD G_LASTEY,YS*(30+RND(30)),8 TO K_MAXY-8 RET=0 CALL E_CREATE(INS,K_ESTARTX,G_LASTEY,RET) G_LICD=20 IF G_CH_EKILL>0 THEN G_LICD=0 END IF END SUB SUB L_WIN LOCATE 5,4 PRINT "LEVEL CLEAR" G_ENDED=2 G_NEXTLNO=MIN(G_LNO+1,21) CALL GAME_SAVE CALL SFXTRACK(7) IF G_LNO=21 THEN G_ENDED=3 END SUB ' CREATE PARTICLE FX SUB PFX_CREATE(X,Y,P) ' FIND FREE INDEX FOR I=KS_PFXL TO KS_PFXU IF SPRITE.C(I)=0 THEN SPRITE I,X,Y,KC_PFX SPRITE I PAL P EXIT SUB END IF NEXT I ' NO FREE INDEX, FORCE ONE SPRITE KS_PFXL,X,Y,KC_PFX SPRITE KS_PFXL PAL P END SUB SUB PFX_UPD IF G_CLK AND 7 THEN EXIT SUB FOR I=KS_PFXL TO KS_PFXU C=SPRITE.C(I) IF C>0 THEN INC C IF C>3+KC_PFX THEN ' END OF EFFECT SPRITE I,0,0,0 ELSE SPRITE I,SPRITE.X(I),SPRITE.Y(I),C END IF END IF NEXT I END SUB SUB CRASH(MSG$) ' WHITE OVER RED BG POKEW $FF00,$3F20 PAL 0 LOCATE 0,0 PRINT "*ERROR: "+MSG$ DO WAIT VBL LOOP END SUB ' UPDATE STATUS BAR SUB SB_UPD BG FILL 0,14 TO 19,15 CHAR 0 LOCATE 0,15 IF G_LNO>0 THEN PAL 0 PRINT "LEVEL "; PAL 1 PRINT STR$(G_LNO) LOCATE 10,14 PAL 0 PRINT "WAVE "; PAL 1 PRINT MIN(G_CURWAV+1,G_NUMWAVS);"/";G_NUMWAVS END IF PAL 0 G$=STR$(MIN(G_GOLD,9999)) WHILE LEN(G$)<4 G$="0"+G$ WEND LOCATE 10,15 PRINT "GOLD:"; PAL 1 PRINT G$ PAL 0 ' SHOW POWERUP AMMO IF G_LNO>0 AND G_PW>0 THEN LOCATE 1,14 PAL 1 PRINT "="+STR$(G_PWAMMO) PAL (SPRITE.A(KS_PLR) AND 7) CELL 0,14,G_PW PAL 0 END IF END SUB ' DISPLAYS MENU (WHICH MUST HAVE BEEN PREVIOUSLY ' CONFIGURED IN G_MENU$ AND G_MENUC. ' ITEMS STARTING WITH "-" ARE DISABLED. SUB M_SHOW(Y0,RET) DIM GRAY(G_MENUC-1) WID=0 FOR I=0 TO G_MENUC-1 IF LEFT$(G_MENU$(I),1)="-" THEN ' ITEM DISABLED G_MENU$(I)=RIGHT$(G_MENU$(I),LEN(G_MENU$(I))-1) GRAY(I)=1 END IF WID=MAX(WID,LEN(G_MENU$(I))) NEXT I ADD WID,2 X0=10-WID\2 CUR=0 FNO=0 DO FOR I=0 TO G_MENUC-1 CURC=0 IF (FNO AND 31) > 8 THEN CURC=KC_CURSOR IF I=CUR THEN PAL 1 CELL X0,Y0+I,CURC ELSE PAL 0 CELL X0,Y0+I,0 END IF LOCATE X0+1,Y0+I IF GRAY(I) THEN PAL 5 PRINT G_MENU$(I) IF GRAY(I) THEN ' CROSS IT OUT BG 1 BG FILL X0+1,Y0+I TO X0+LEN(G_MENU$(I)),Y0+I CHAR KC_STRIKE BG 0 END IF NEXT I IF DOWN TAP(0) THEN ADD CUR,1,0 TO G_MENUC-1 CALL SFX(3,15,1) ELSE IF UP TAP(0) THEN ADD CUR,-1,0 TO G_MENUC-1 CALL SFX(3,20,1) END IF ' DON'T ACCEPT SELECTION FOR THE FIRST FEW FRAMES TO ' AVOID USER SELECTING ACCIDENTALLY. IF FNO>30 AND BUTTON TAP(0,0) THEN IF GRAY(CUR)=0 THEN CALL SFX(3,50,1) FOR I=1 TO 6 LOCATE X0+1,Y0+CUR IF I AND 1 THEN PAL 0 ELSE PAL 1 PRINT G_MENU$(CUR) WAIT 5 NEXT I RET=CUR CLS 1 PAL 0 EXIT SUB ELSE ' TRIED TO SELECT DISABLED ITEM CALL SFX(2,30,5) END IF END IF WAIT VBL INC FNO LOOP END SUB SUB SFX(SNO,PITCH,DUR) ' IF PLAYING MUSIC ONLY USE CHANNEL 3 FOR SFX IF MUSIC(3)>0 THEN G_NEXTAC=3 PLAY G_NEXTAC,PITCH,DUR SOUND SNO ADD G_NEXTAC,1,0 TO 3 END SUB SUB SFXTRACK(TNO) TRACK TNO,G_NEXTAC ADD G_NEXTAC,1,0 TO 3 END SUB ' SHOWS THE STORY SCROLL. ' ASSUMES DATA POINTER POINTS TO START OF STRINGS. ' DATA ENDS WITH A "/" ' CAP: CAPITAL LETTER SPRITE TO USE SUB SHOWSCROLL(CAP) PAL 0 CLS ' TOP PART OF SCROLL BG FILL 1,0 TO 18,0 CHAR KC_SCROLL_C CELL 0,0,KC_SCROLL_L CELL 19,0,KC_SCROLL_R ENDED=0 FOR I=1 TO 14 ' ERASE BOTTOM PART OF SCROLL ' AND REPLACE BY LINE OF TEXT. BG FILL 0,I TO 19,I CHAR 0 CELL 0,I,KC_SCROLL_PL CELL 19,I,KC_SCROLL_PR L$="" IF ENDED=0 AND I>1 THEN READ L$ IF L$="/" THEN L$="" ENDED=1 END IF LOCATE 2,I PRINT L$ ' DRAW CAPITAL LETTER IF I=1 AND CAP>0 THEN CELL 2,1,CAP CELL 3,1,CAP+1 ELSE IF I=2 AND CAP>0 THEN CELL 2,2,CAP+16 CELL 3,2,CAP+17 END IF ' DRAW NEW BOTTOM PART OF SCROLL. BG FILL 1,I+1 TO 18,I+1 CHAR KC_SCROLL_C CELL 0,I+1,KC_SCROLL_L CELL 19,I+1,KC_SCROLL_R WAIT 5 NEXT I WAIT 50 LOCATE 2,14 CALL WAITBUTTON END SUB SUB WAITBUTTON CX=CURSOR.X CY=CURSOR.Y C=0 WAIT VBL WHILE NOT BUTTON TAP(0,0) INC C LOCATE CX,CY IF C AND 16 THEN PRINT "- PRESS BUTTON -" ELSE PRINT " " END IF WAIT VBL WEND END SUB SUB UPG_MENU STOP MUSIC 2 SEL=0 UB=UBOUND(G_UPGRADE) DO CLS LOCATE 0,0 PAL 0 LOCATE 4,1 PRINT "UPGRADE WHAT?" FOR I=0 TO UB LOCATE 1,I+3 IF SEL=I THEN PAL 1 ELSE PAL 0 C=0 IF SEL=I THEN C=KC_CURSOR CELL 0,I+3,C PRINT K_UPGRADE_NAMES$(I) PAL 0 FOR J=0 TO 4 C=KC_BEAD_OFF IF G_UPGRADE(I)>J THEN C=KC_BEAD_ON CELL 14+J,I+3,C NEXT J NEXT I IF SEL=UB+1 THEN PAL 1 ELSE PAL 0 C=0 IF SEL=UB+1 THEN C=KC_CURSOR CELL 1,UB+5,C LOCATE 2,UB+5 PRINT "RETURN TO MENU" ' SEPARATOR PAL 0 BG FILL 0,10 TO 19,10 CHAR KC_ORNAMENT BG FILL 0,0 TO 19,0 CHAR KC_ORNAMENT UPCOST=0 IF SEL<=UB THEN LOCATE 2,12 IF G_UPGRADE(SEL)UB THEN EXIT SUB IF UPCOST>0 THEN CALL UPG_OFFER(SEL,UPCOST) END IF LOOP WAIT 500 END SUB SUB UPG_OFFER(SLOT,UPCOST) CLS UNAME$=K_UPGRADE_NAMES$(SLOT) IF G_GOLD1 THEN EXIT SUB G_GOLD=MAX(0,G_GOLD-UPCOST) INC G_UPGRADE(SLOT) STOP CLS LOCATE 2,2 PRINT "UPGRADE APPLIED" CALL GAME_SAVE CALL SFXTRACK(8) WAIT 100 STOP MUSIC 2 ' IF FIRST MAGIC UPGRADE, EXPLAIN. IF G_UPGRADE(SLOT)=1 AND SLOT=KU_MAGIC THEN CLS PAL 1 ' 01234567890123456789 LOCATE 0,0 PRINT "HOW TO USE MAGIC" PRINT PAL 0 PRINT "DURING GAMEPLAY," PRINT "PRESS SECONDARY" PRINT "BUTTON TO CAST" PRINT "SPELL. THAT'S" PRINT "B ON CONSOLE, OR" PRINT "X ON PC." PRINT PRINT "EACH SPELL CAN BE" PRINT "USED A LIMITED #" PRINT "OF TIMES." PRINT "" CALL WAITBUTTON END IF END SUB SUB GAME_SAVE POKE KA_NEXTLNO,G_NEXTLNO POKEW KA_GOLD,MIN(MAX(G_GOLD,0),9999) FOR I=0 TO UBOUND(G_UPGRADE) POKEW KA_UPGRADES+I,G_UPGRADE(I) NEXT I END SUB SUB ABOUT_SCREEN STOP MUSIC 2 CLS BG SOURCE ROM(3) BG COPY 0,0,20,16 TO 0,0 BG FILL 0,4 TO 19,6 CHAR 0 LOCATE 1,5 PAL 1 PRINT "GAME CREATED BY:" PAL 0 PRINT " BRUNO OLIVEIRA" PAL 1 PRINT " TWITTER:" PAL 0 PRINT " @BTCO_CODE" PAL 1 PRINT " EMAIL:" PAL 0 PRINT " BRUNOTC@GMAIL.COM" LOCATE 2,14 CALL WAITBUTTON IF UP(0) AND BUTTON(0,1) THEN CALL CHEAT_SCREEN END SUB SUB WIPE_MEMORY ' WIPE MEMORY FILL $E000,4096 CALL GAME_LOAD CLS PRINT "PMEM WIPED." PRINT CALL WAITBUTTON END SUB SUB CHEAT_SCREEN DIM DIGIT(3) D=0 WHILE BUTTON(0,0) WEND DO CLS PRINT "DEBUG COMMAND:" FOR I=0 TO 3 LOCATE 3+I,5 IF D=I THEN PAL 1 ELSE PAL 0 PRINT DIGIT(I) NEXT I PAL 1 LOCATE 3+D,6 PRINT "^" IF UP TAP(0) THEN ADD DIGIT(D),1,0 TO 9 IF DOWN TAP(0) THEN ADD DIGIT(D),-1,0 TO 9 IF RIGHT TAP(0) THEN ADD D,1,0 TO 3 IF LEFT TAP(0) THEN ADD D,-1,0 TO 3 IF BUTTON TAP(0,0) THEN ' EXECUTE COMMAND CALL EXEC_CHEAT(DIGIT(0)*1000 + DIGIT(1)*100 + DIGIT(2)*10 + DIGIT(3)) DIGIT(0)=0 DIGIT(1)=0 DIGIT(2)=0 DIGIT(3)=0 WAIT VBL EXIT SUB ELSE IF BUTTON TAP(0,1) THEN CLS EXIT SUB END IF WAIT VBL LOOP END SUB SUB EXEC_CHEAT(C) LOCATE 0,10 IF C=7331 THEN CALL WIPE_MEMORY ELSE IF C>=6000 AND C<=6999 THEN A=(C-6000)*10 G_GOLD=MIN(G_GOLD+A,9999) CALL GAME_SAVE PRINT STR$(A)+" GOLD GIVEN" CALL WAITBUTTON ELSE IF C\100=13 THEN G_NEXTLNO=MAX(1,C MOD 100) CALL GAME_SAVE PRINT "LEVEL SET: "+STR$(G_NEXTLNO) CALL WAITBUTTON ELSE IF C=5333 THEN FOR I=1 TO 21 CLS PRINT "STORY FOR LEVEL ";I CALL WAITBUTTON CLS FOUND=0 CAP=0 CALL L_STORYSEEK(I,FOUND,CAP) IF FOUND>0 THEN CALL SHOWSCROLL(CAP) NEXT I ELSE IF C=9991 THEN CALL WINSCREEN ELSE IF C=9941 THEN G_CH_EKILL=1 PRINT "EKILL ACTIVE" CALL WAITBUTTON ELSE PRINT "INVALID CODE." CALL WAITBUTTON END IF END SUB SUB SP_MENU G_MENU$(0)="(CANCEL) " G_MENU$(1)="BLAST ["+STR$(G_SPLEFT(0))+"]" G_MENU$(2)="FREEZE ["+STR$(G_SPLEFT(1))+"]" G_MENU$(3)="REPEL ["+STR$(G_SPLEFT(2))+"]" G_MENU$(4)="FIX WALL ["+STR$(G_SPLEFT(3))+"]" G_MENU$(5)="TEMPEST ["+STR$(G_SPLEFT(4))+"]" G_MENUC=G_UPGRADE(KU_MAGIC)+1 ' USED SPELLS ARE DISABLED FOR I=0 TO UBOUND(G_SPLEFT) IF G_SPLEFT(I)=0 THEN G_MENU$(I+1)="-"+G_MENU$(I+1) NEXT I MY=4 MYF=MY+G_MENUC+3 ' MAKE A BACKUP OF BG COPY $9000,$800 TO KA_BGBACKUP BG FILL 2,MY TO 13,MYF CHAR 0 CELL 2,MY,KC_SCROLL_L CELL 17,MY,KC_SCROLL_R BG FILL 3,MY TO 16,MY CHAR KC_SCROLL_C FOR I=MY+1 TO MYF CELL 2,I,KC_SCROLL_PL CELL 17,I,KC_SCROLL_PR NEXT I CELL 2,MYF,KC_SCROLL_L CELL 17,MYF,KC_SCROLL_R BG FILL 3,MYF TO 16,MYF CHAR KC_SCROLL_C RET=0 SPRITE VIEW OFF LOCATE 3,MY+1 PRINT "SPELL:" CALL M_SHOW(MY+3,RET) SPRITE VIEW ON ' RESTORE BG BACKUP COPY KA_BGBACKUP,$800 TO $9000 IF RET>0 THEN CALL SP_CAST(RET-1) END SUB ' CAST SPELL. SP: SPELL NUMBER. SUB SP_CAST(SP) DEC G_SPLEFT(SP) IF SP=0 THEN CALL SP_CAST_BLAST IF SP=1 THEN CALL SP_CAST_FREEZE IF SP=2 THEN CALL SP_CAST_REPEL IF SP=3 THEN CALL SP_CAST_WALL IF SP=4 THEN CALL SP_CAST_TEMPEST END SUB SUB SP_CAST_BLAST X=12 Y0=G_PY-16 CALL SFX(6,60,40) ' ENEMIES THAT ALREADY TOOK DAMAGE DIM DAMAGED(KS_ENEMYU) ' BLAST SWEEPS TO THE RIGHT WHILE X<160 FOR I=KS_BLASTL TO KS_BLASTU SPRITE I,X,Y0+(I-KS_BLASTL)*8,KC_BLAST SPRITE I PAL 1 ' CHECK IF ENEMIES WERE HIT FOR J=0 TO KS_ENEMYU IF SPRITE.C(J)>0 AND SPRITE HIT(I,J) AND DAMAGED(J)=0 THEN CALL E_DAMAGE(J,20) DAMAGED(J)=1 END IF NEXT J NEXT I WAIT VBL ADD X,2 WEND FOR I=KS_BLASTL TO KS_BLASTU SPRITE I,0,0,0 NEXT I END SUB SUB SP_CAST_FREEZE G_FREEZECD=500 CALL SFXTRACK(9) ' SET BG COLOR TO BLUE POKE $FF00,2 END SUB SUB SP_CAST_REPEL MAXX=152 CALL SFXTRACK(10) FOR I=1 TO 64 ' PUSH ENEMIES TO THE RIGHT FOR J=0 TO KS_ENEMYU IF SPRITE.C(J)>0 THEN SPRITE J PAL 7 G_EX(J)=MIN(G_EX(J)+1,K_ESTARTX) SPRITE J,G_EX(J),G_EY(J),SPRITE.C(J) END IF NEXT J WAIT VBL NEXT I END SUB SUB SP_CAST_WALL CALL SFXTRACK(11) G_WHP=3 CALL W_REDRAW FOR I=0 TO 8 FOR R=0 TO 13 TINT K_WALL_C,R PAL (I MOD 2)*7 NEXT R WAIT 5 NEXT I END SUB SUB SP_CAST_TEMPEST ' SET BG COLOR TO RED CALL SFXTRACK(12) FOR I=1 TO 3 POKE $FF00,$2A WAIT 10 POKE $FF00,PEEK(KA_BGCLRBK) WAIT 10 NEXT I FOR I=0 TO KS_ENEMYU CALL E_KILL(I,1) NEXT I G_TEMPESTCD=500 END SUB ' UPDATE SPELL EFFECTS SUB SP_UPD IF G_FREEZECD>0 THEN DEC G_FREEZECD IF G_FREEZECD=0 THEN ' RESTORE BACKGROUND COLOR POKE $FF00,PEEK(KA_BGCLRBK) END IF END IF END SUB ' SET POWERUP DROP COUNTDOWN SUB PW_SETDROPCD G_PWDROPCD=10-G_UPGRADE(KU_PWRATE)+RND(3) END SUB SUB PW_UPD ' MOVE POWERUP TO THE LEFT IF SPRITE.C(KS_PW)=0 THEN EXIT SUB X=SPRITE.X(KS_PW) X=MAX(X-0.2,G_PX) SPRITE KS_PW,X,SPRITE.Y(KS_PW),SPRITE.C(KS_PW) ' PLAYER PICKED UP POWERUP? IF SPRITE HIT(KS_PLR,KS_PW) THEN 'TODO: SFX P=SPRITE.A(KS_PW) AND 7 G_PW=SPRITE.C(KS_PW) SPRITE KS_PW,0,0,0 G_PWAMMO=20 ' TRANSFER POWERUP PAL TO PLAYER SPRITE KS_PLR PAL P END IF END SUB SUB PW_MAYBEDROP(X,Y) ' POWERUP ALREADY EXISTS? IF SPRITE.C(KS_PW)<>0 THEN EXIT SUB DEC G_PWDROPCD IF G_PWDROPCD>0 THEN EXIT SUB CALL PW_SETDROPCD C=KC_PWDUPLEX P=2 IF RND(100)<25 THEN C=KC_PWFLAME P=1 END IF SPRITE KS_PW,X,Y,C SPRITE KS_PW PAL P END SUB SUB WINSCREEN CLS POKE $FF00,1 MUSIC 4 PAL 0 L1$="" L2$="" RESTORE DATA_WIN DO READ L1$,L2$ FOR I=13 TO 5 STEP -1 CLS LOCATE 0,I PRINT L1$ PRINT L2$; WAIT 10 NEXT I CALL FIREWORKS(8) IF L2$="" THEN LOCATE 2,14 CALL WAITBUTTON EXIT SUB END IF LOOP END SUB SUB FIREWORKS(C) FOR I=1 TO C X=8+RND(144) Y=8+RND(20) CALL SFX(6,10,10) SPRITE KS_PFXL PAL RND(3) FOR J=0 TO 6 SPRITE KS_PFXL,X,Y,KC_PFX+(J\2) INC Y IF G_CH_EKILL=0 OR NOT LEFT(0) THEN WAIT 10 NEXT J NEXT I SPRITE KS_PFXL,0,0,0 END SUB MAIN_MENU: CLS MUSIC BG SOURCE ROM(3) BG COPY 0,0,20,16 TO 0,0 CALL L_INITTHEME CALL E_INITDB CALL GAME_LOAD G_MENUC=3 G_MENU$(0)="PLAY" G_MENU$(1)="UPGRADES" G_MENU$(2)="ABOUT" RET=0 IF G_NEXTLNO>1 THEN G_MENU$(0)="CONTINUE" CALL SB_UPD CALL L_SETTHEME(0) CALL M_SHOW(8,RET) IF RET=0 THEN STOP CALL GAME_PLAY(G_NEXTLNO) G_LNO=0 GOTO MAIN_MENU ELSE IF RET=1 THEN CALL UPG_MENU GOTO MAIN_MENU ELSE CALL ABOUT_SCREEN GOTO MAIN_MENU END IF ' LEVEL THEME DATA ' EACH THEME IS: ' PALETTE (4 BYTES), GRASS SPRITE, TREE SPRITE DATA_LTHEME: ' THEME 0: STANDARD DATA %000100,%010100,%011000,%101000,64,65 ' THEME 1: NIGHT DATA %000000,%000001,%001000,%010101,64,65 ' THEME 2: BROWN DATA %100100,%010000,%010100,%101000,64,65 ' THEME 3: DESERT DATA %010100,%100100,%011000,%001000,67,68 ' THEME 4: NIGHT 2 DATA %000000,%010101,%101010,%000101,69,70 ' THEME 5: RED DATA %010000,%000000,%100100,%010101,71,72 ' THEME 6: GRAY DATA %010101,%000000,%100101,%010110,71,72 ' END SENTINEL DATA 999999 ' LEVEL DATA ' 900000+N IS START OF LEVEL N ' 999999 IS THE END SENTINEL ' LEVEL DATA: ' THEME# ' EACH BYTE IS AN ENEMY ID, OR THESE SPECIAL VALUES: ' 251-254 DELAY (DURATION 1,2,3 OR 4) ' 255 END OF WAVE ' 0 END LEVEL DATA_LEVEL: DATA 900001,0 DATA 16,254,16,254,255 DATA 18,16,255 DATA 18,16,16,255 DATA 18,16,252,16,252,16,252,16,255 DATA 0 DATA 900002,0 DATA 16,16,18,18,255 DATA 18,16,20,16,255 DATA 20,18,16,16,18,255 DATA 20,20,18,255 DATA 18,18,18,18,255 DATA 20,20,20,20,255 DATA 0 DATA 900003,0 DATA 16,16,16,18,18,16,255 DATA 16,16,22,18,16,255 DATA 16,18,18,22,16,255 DATA 22,22,20,18,16,255 DATA 16,16,16,16,16,16,16,16,255 DATA 22,22,22,18,16,255 DATA 0 DATA 900004,1 DATA 22,16,18,22,254,16,18,22,16,255 DATA 18,18,18,251,18,251,18,251,18,251,18,255 DATA 16,18,16,18,252,22,22,22,22,255 DATA 16,16,24,16,255 DATA 22,22,22,18,18,18,255 DATA 24,24,255 DATA 0 DATA 900005,1 DATA 24,252,24,252,24,252,24,255 DATA 22,22,22,20,20,20,255 DATA 24,24,254,20,20,20,20,255 DATA 20,252,20,252,20,252,20,252,20,252,255 DATA 16,18,20,22,252,16,18,20,22,255 DATA 24,24,24,255 DATA 0 DATA 900006,1 DATA 16,16,16,36,32,255 DATA 32,16,16,16,16,255 DATA 36,16,18,32,255 DATA 18,18,32,16,16,255 DATA 32,254,20,18,18,255 DATA 20,20,254,32,16,18,255 DATA 18,18,16,32,20,255 DATA 0 DATA 900007,2 DATA 32,18,18,255 DATA 16,18,16,18,16,36,16,36,20,20,20,255 DATA 22,22,18,22,22,16,22,255 DATA 24,24,32,36,18,16,255 DATA 32,18,24,36,36,18,255 DATA 20,20,24,24,32,255 DATA 0 DATA 900008,2 DATA 16,16,16,18,16,16,16,18,16,16,16,18,16,16,16,16,255 DATA 24,24,32,18,18,16,16,255 DATA 36,22,22,18,22,22,16,22,255 DATA 32,36,24,18,20,36,18,255 DATA 18,16,18,16,36,16,18,16,36,20,20,20,255 DATA 32,32,255 DATA 16,20,20,18,24,24,32,255 DATA 0 DATA 900009,2 DATA 18,18,18,18,18,20,18,36,18,18,18,20,18,18,18,18,255 DATA 22,16,22,16,22,16,22,16,22,16,22,16,254,24,255 DATA 32,36,36,18,22,254,32,18,36,18,18,16,16,255 DATA 32,32,32,255 DATA 24,254,24,254,24,254,24,36,18,255 DATA 32,32,24,24,16,16,16,16,255 DATA 0 DATA 900010,3 DATA 22,22,22,22,22,254,22,22,22,22,22,254,18,18,18,18,18,18,255 DATA 32,32,16,16,16,16,16,16,16,16,18,18,255 DATA 20,20,20,20,20,20,20,16,16,16,16,16,255 DATA 24,24,24,24,16,36,36,16,36,16,20,255 DATA 32,32,24,24,24,36,36,36,22,255 DATA 32,32,32,32,255 DATA 0 DATA 900011,3 DATA 96,16,16,16,16,16,16,255 DATA 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,255 DATA 20,20,20,32,254,32,32,20,20,36,36,36,18,18,16,24,255 DATA 24,24,22,22,22,254,16,16,16,96,36,255 DATA 20,252,20,252,24,20,252,20,252,255 DATA 22,22,22,22,22,22,22,22,22,22,254,32,32,16,16,16,255 DATA 0 DATA 900012,3 DATA 16,18,20,22,24,32,36,96,255 DATA 32,32,32,32,255 DATA 22,20,22,20,22,20,22,20,254,36,36,36,255 DATA 96,20,20,20,36,36,36,36,255 DATA 24,24,24,24,24,24,16,16,16,16,255 DATA 0 DATA 900013,4 DATA 22,20,24,20,36,20,36,20,254,36,24,36,255 DATA 36,36,20,22,24,32,36,96,255 DATA 32,32,96,255 DATA 36,36,36,22,22,24,16,16,16,16,22,20,255 DATA 96,32,20,16,16,16,251,16,16,16,16,16,251,18,18,18,18,18,255 DATA 0 DATA 900014,4 DATA 100,16,16,16,16,16,255 DATA 18,20,22,24,32,36,96,36,36,36,36,36,255 DATA 32,32,32,16,16,16,16,22,22,22,22,22,255 DATA 100,24,18,18,18,22,22,22,20,36,36,36,255 DATA 20,20,20,20,20,20,36,36,36,36,22,22,255 DATA 96,32,22,22,22,22,255 DATA 0 DATA 900015,4 DATA 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,255 DATA 100,16,16,16,16,254,24,24,24,254,32,32,36,36,255 DATA 22,22,22,22,22,22,22,22,22,22,22,22,22,22,254,20,20,255 DATA 32,32,32,16,16,16,16,254,100,36,36,36,36,36,36,255 DATA 96,20,20,20,20,20,20,20,20,22,22,22,22,255 DATA 0 DATA 900016,5 DATA 38,38,16,16,16,16,16,16,18,18,20,20,255 DATA 100,38,38,16,20,20,20,20,20,22,20,22,255 DATA 22,22,32,36,36,36,254,38,38,38,96,24,255 DATA 22,22,22,22,22,22,22,22,22,22,22,22,22,22,254,32,32,255 DATA 38,38,38,38,255 DATA 0 DATA 900017,5 DATA 24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,255 DATA 20,38,38,38,38,36,36,36,254,24,18,38,255 DATA 100,38,38,38,38,255 DATA 32,32,32,32,16,16,16,16,255 DATA 96,32,32,38,38,38,255 DATA 0 DATA 900018,5 DATA 100,38,38,38,38,38,22,22,16,255 DATA 96,32,32,32,38,38,16,16,16,16,255 DATA 38,38,38,38,38,38,38,38,22,22,22,22,255 DATA 32,32,32,24,24,24,18,18,18,255 DATA 100,20,20,20,20,20,20,20,20,20,20,38,255 DATA 0 DATA 900019,6 DATA 38,38,100,36,36,16,16,16,16,18,18,20,20,255 DATA 96,38,38,32,20,20,20,20,20,22,32,22,255 DATA 38,22,32,36,36,36,254,38,38,38,96,24,255 DATA 22,22,38,22,22,38,22,22,38,22,22,38,22,36,254,32,32,255 DATA 38,38,38,38,38,38,38,255 DATA 0 DATA 900020,6 DATA 42,42,42,36,36,36,36,38,255 DATA 100,36,36,36,36,36,38,38,38,32,255 DATA 96,38,38,38,42,42,42,22,22,22,22,22,255 DATA 38,38,38,38,38,42,42,24,24,255 DATA 100,32,32,32,42,42,20,20,38,38,255 DATA 0 DATA 900021,6 DATA 96,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,255 DATA 100,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,255 DATA 20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,255 DATA 24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,255 DATA 36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,255 DATA 32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,255 DATA 38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,255 DATA 42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,42,255 DATA 100,38,38,38,38,32,32,32,32,24,24,24,24,20,20,20,255 DATA 0 DATA 999999 ' STORY TEXT ' FORMAT: LEVEL NUMBER, CAPITAL LETTER SPRITE, TEXT LINES ' TEXT LINES END WITH A STRING "/" ' (VIM: SET CC=24) DATA_STORY: DATA 1,160 ' 01234567890123456 DATA " MONGST ALL THE" DATA "ARCHERS SUMMONED," DATA "YOU WERE CHOSEN" DATA "FOR YOUR COURAGE." DATA "" DATA "YOUR SURPRISINGLY" DATA "LOW FEES WERE IN " DATA "NO WAY A FACTOR." DATA "" DATA "DEFEND THE WALL." DATA "DON'T LET ENEMIES" DATA "THROUGH." DATA "/" ' 01234567890123456 DATA 2,164 DATA " ERTAINLY YOU" DATA "HAVE PROVED YOUR" DATA "VALUE, ARCHER." DATA "" DATA "BUT HOLD ON TO" DATA "THAT BOW, BECAUSE" DATA "THERE ARE MORE" DATA "ENEMIES. ALSO WE" DATA "DON'T HAVE ANY" DATA "GRAPHICS OF YOU" DATA "WITHOUT THE BOW." DATA "/" ' 01234567890123456 DATA 3,166 DATA " MMM WAIT, WHAT?" DATA "YOU SURVIVED?" DATA "THE KING HOPED" DATA "NOT TO HAVE TO" DATA "PAY YOU. AH, WE" DATA "MEAN, HOW GREAT" DATA "THAT YOU HAVE" DATA "DEFENDED US YET" DATA "AGAIN! THANK" DATA "YOU!" DATA "/" ' 01234567890123456 DATA 4,160 DATA " PPARENTLY THE" DATA "ENEMIES WILL COME" DATA "BACK IN LARGER" DATA "NUMBERS TODAY." DATA "IT'S FUNNY HOW" DATA "THEY KEEP DOING" DATA "THAT. AS IF THEIR" DATA "BEHAVIOR WAS ALL" DATA "PROGRAMMED IN" DATA "SOME SORT OF" DATA "SOURCE CODE." DATA "/" ' 01234567890123456 DATA 5,166 DATA " AVE YOU HAD" DATA "THE IMPRESSION" DATA "YOU MIGHT BE JUST" DATA "A CHARACTER IN A" DATA "RETRO VIDEOGAME," DATA "WHOSE MOVEMENTS" DATA "ARE CONTROLLED BY" DATA "A BEING IN SOME" DATA "SORT OF MYTHICAL" DATA "THIRD DIMENSION?" DATA "/" ' LEVEL 6 DATA 6,160 DATA " PPARENTLY THE" DATA "ENEMY FORCES HAVE" DATA "DEVELOPED A TANK" DATA "THAT SHOOTS" DATA "BIZARRELY LARGE" DATA "BULLETS." DATA "" DATA "HOW DOES PHYSICS" DATA "EVEN WORK IN OUR" DATA "2D WORLD? NOBODY" DATA "KNOWS." DATA "/" ' LEVEL 7 DATA 7,168 DATA " XCELLENT. KEEP" DATA "UP THE GOOD JOB!" DATA "" DATA "YOU DO THE" DATA "KINGDOM-SAVING." DATA "" DATA "WE WILL DO THE" DATA "COST-SAVING." DATA "/" ' LEVEL 8 DATA 8,166 DATA " AVE YOU NOTICED" DATA "THAT WHEN A PART" DATA "OF THE WALL IS" DATA "HIT, THE ENTIRE" DATA "THING COLLAPSES?" DATA "" DATA "WE GOT THIS WALL" DATA "AT MERLIN'S" DATA "FRIENDLY DISCOUNT" DATA "FORTIFICATIONS" DATA "STORE." DATA "/" ' LEVEL 9 DATA 9,166 DATA " IS MAJESTY IS" DATA "PLEASED WITH YOUR" DATA "WORK. HE WISHES" DATA "TO AWARD YOU A" DATA "PAPER TROPHY!" DATA "" DATA "IT'S WEIGHS MORE" DATA "THAN GOLD IN HIS" DATA "HEART. BUT NOT IN" DATA "HIS WALLET." DATA "/" ' LEVEL 10 DATA 10,164 DATA " OOL. VERY COOL." DATA "BTW THESE TEXTS" DATA "ALWAYS BEGIN WITH" DATA "A,R,C,H OR E" DATA "BECAUSE WE REUSE" DATA "THE FANCY LETTERS" DATA "FROM THE TITLE" DATA "SCREEN. WE ONLY" DATA "HAD BUDGET FOR" DATA "FIVE CAPITAL" DATA "LETTERS." DATA "/" ' LEVEL 11 DATA 11,160 DATA " RACHNOPHOBIA IS" DATA "A COOL WORD. WE" DATA "MENTION IT JUST" DATA "CASUALLY." DATA "" DATA "YOU ARE UNLIKELY" DATA "TO ENCOUNTER ANY" DATA "SPIDERS HERE," DATA "ESPECIALLY GIANT" DATA "ONES WITH A" DATA "SHIELD." DATA "/" ' LEVEL 12 DATA 12,164 DATA " ONGRATS! BY LAW" DATA "THE KING MUST PAY" DATA "YOU A REWARD OF" DATA "10,000 GOLD. THE" DATA "KING TOLD HIS" DATA "5-YEAR-OLD SON TO" DATA "PAY YOU WHEN HE" DATA "BECOMES KING. OUR" DATA "COMPLIANCE TEAM" DATA "ASSURES US THIS" DATA "IS TOTALLY VALID." DATA "/" ' LEVEL 13 DATA 13,166 DATA " OW DOES THE" DATA "WALL GET REPAIRED" DATA "OVERNIGHT BETWEEN" DATA "ENEMY ATTACKS?" DATA "" DATA "ANSWER: IT'S AN" DATA "INFLATABLE WALL." DATA "THE BRICKS ARE" DATA "PAINTED ON. THAT" DATA "EXPLAINS WHY IT'S" DATA "SO FRAGILE." DATA "/" ' LEVEL 14 DATA 14,166 DATA " EY, YOU HAVE" DATA "DEFENDED US 14" DATA "TIMES ALREADY." DATA "" DATA "THE KING SEES YOU" DATA "AS A FRIEND." DATA "" DATA "DO YOU OFFER A" DATA "FRIENDS AND" DATA "FAMILY DISCOUNT" DATA "ON YOUR FEES?" DATA "/" ' LEVEL 15 DATA 15,160 DATA " CTU LLY, WE" DATA "SW TCHED TO N W," DATA "CHEAPER INK." DATA "" DATA "WE H PE IT'S AS" DATA "GOO AND RE DABLE" DATA "AS T E LAST O E." DATA "/" ' LEVEL 16 DATA 16,160 DATA " PPARENTLY THE" DATA "ENEMIES ALSO" DATA "FIGURED OUT THEY" DATA "CAN HIRE ARCHERS." DATA "" DATA "THEY ARE BETTER" DATA "PAID, BUT WE" DATA "HOPE YOU MAKE UP" DATA "FOR IN MOTIVATION" DATA "WHAT YOU LACK IN" DATA "REMUNERATION." DATA "/" ' LEVEL 17 DATA 17,0 DATA "" DATA "" DATA "" DATA "THIS SCROLL" DATA "INTENTIONALLY" DATA "LEFT BLANK." DATA "/" ' LEVEL 18 DATA 18,168 DATA " NEMIES ARE VERY" DATA "WELL BEHAVED." DATA "THEY ARE ALREADY" DATA "THERE, JUST" DATA "PATIENTLY WAITING" DATA "UNTIL YOU FINISH" DATA "READING THIS" DATA "SCROLL IN ORDER" DATA "TO ATTACK." DATA "" DATA "SO POLITE, RIGHT?" DATA "/" ' LEVEL 19 DATA 19,166 DATA " OW COME THIS" DATA "BIG RED INSECT" DATA "ENEMY BREATHES" DATA "FIRE? WAS IT" DATA "SUPPOSED TO BE A" DATA "DRAGON AND WE" DATA "JUST LACKED THE" DATA "SKILLS TO DRAW AN" DATA "ACTUAL DRAGON?" DATA "NO, THAT'S FAR-" DATA "FETCHED." DATA "/" ' LEVEL 20 DATA 20,160 DATA " LMOST FINISHED." DATA "THIS IS THE NEXT" DATA "TO LAST LEVEL." DATA "" DATA "DID YOU KNOW THAT" DATA "DONATIONS TO THE" DATA "KING ARE TAX" DATA "DEDUCTIBLE?" DATA "/" ' LEVEL 21 DATA 21,160 DATA " ND FINALLY," DATA "THE LAST LEVEL!" DATA "" DATA "SUCCEED, AND THE" DATA "KINGDOM WILL" DATA "FOREVER BE" DATA "GRATEFUL. WE WILL" DATA "MAKE A STATUE OF" DATA "YOU IN A STURDY," DATA "BUDGET-FRIENDLY" DATA "MATERIAL." DATA "/" ' END SENTINEL DATA 0,0 DATA_WIN: ' 01234567890123456789 DATA "YOU HAVE SAVED THE" DATA "KINGDOM!" DATA " YOUR NAME WILL" DATA " FOREVER BE KNOWN" DATA " FOR AGES AND" DATA " GENERATIONS." DATA " LEGENDS WILL BE" DATA " TOLD ABOUT YOU." DATA " WAIT, WHAT WAS" DATA " YOUR NAME, AGAIN?" DATA "ANYWAY. NEVERMIND." DATA "THANKS FOR PLAYING!" DATA "ALSO, WE'RE ALMOST" DATA "OUT OF FIREWORKS." DATA " THE END" DATA "" ' ENEMY DATABASE. FORMAT: ' EID,-VX*16,VY*16,PAL,FLAGS ' (TOTAL 8 BYTES PER ENEMY) ' ' WILL BE COPIED TO RAM ADDRESS KA_EDB ' ' END SENTINEL IS 999999 WHICH WILL ' WRITE 0 TO RAM DATA_EDB: ' EID VX VY PAL HP GOLD FL ' SLIME DATA 16 , 2, 0, 1, 9, 1, 4,0 ' BIRD DATA 18 , 1, 3, 1, 12, 3, 4,0 ' TORPEDO DATA 20 , 7, 1, 1, 6, 4, 4,0 ' BUG DATA 22 , 2, 2, 2, 30, 8, 0,0 ' CYCLOPS DATA 24 , 1, 1, 2, 30, 10, 3,0 ' CYCLOPS SPAWN DATA 26 , 8, 0, 2, 1, 5, 0,0 ' TANK DATA 32 , 1, 0, 2, 90, 20, 9,0 ' TANK BULLET DATA 34 ,10, 0, 2, 1, 0, 4,0 ' BAT DATA 36 , 3, 6, 1, 12, 4, 4,0 ' ARCHER DATA 38 , 3, 6, 0, 60, 25, 8,0 ' ARCHER ARROW DATA 40 ,10, 2, 0, 1, 0, 4,0 ' SPIDER DATA 96 , 1, 0, 1,200, 50, 49,0 ' BIG MOSQUITO DATA 100 , 2, 3, 2,200, 60, 57,0 ' BIG MOSQUITO FIREBALL DATA 104 ,10, 2, 2, 1, 0, 4,0 ' BLOB BIG, MEDIUM, SMALL DATA 42 , 2, 2, 0, 50, 15, 67,0 DATA 44 , 5, 3, 0, 20, 10, 67,0 DATA 46 , 5, 4, 0, 1, 0, 0,0 DATA 999999 #1:MAIN PALETTES 04382C3F003F383C003F1030003F070F 24101428002A3F15000C3C30003F3F3F #2:MAIN CHARACTERS 00000000000000000000000000000000 0472728782F2040070D080FDF0807050 0472728782F2040070D080FDF0807020 047A7A868AFA040070D080FEF0807050 047A728E82FA040070D080FEF0807020 0472728282F2040070D080FCF0807050 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 000002FF020000000000C0FEC0000000 0002FF0202FF020000C0FEC0C0FEC000 1C3E67C3C3673E1C001C3E7E7E3E1C00 00000000000000000000000000000000 003C7E567E16000000307C7E7E7E5600 003C7E567E16000000307C7E7E7E2A00 00F050F07838381F0082E7FF7F3F3E1F 00F050F06020321F0080E4FC7E3F3E1F 00B0F875E83000000080FDFFFD000000 00B0F874E83000000080FCFFFC000000 0E1F3FBF3F1F0000008E7EFFFF3F3F24 0E1F3F3FBF1F0000000EBE7FFFFF3F09 3C7FBF7F3F170B0438FCE6DBE7FFFF3C 7EBF7F3F170A000078E6DBE7FFFF6666 00383C5C3C0000000070C8B4CC780000 783C7C0C0000000070C884FC48000000 994218BDBD184299993C7EE7E77E3C99 0014423411500E200008282408340400 28804800100A82002802400280002200 11000800400002001180000001000040 1F0FE3030000542A003EFE3EFFFF2A54 1F0FE30300002A54003EFE3EFFFF542A 3F4D8181413F00003F73FFFF7F3F0000 000C0000000000003F73FFFF7F3F0000 00183C243C1800000081FFFFFFDBC300 183C243C18000000007EFFFFFF660000 000A01A1010E0E0A2E444FFF4F402000 000A01A1010E0E042E444FFF4F402000 003063FF633000000030638063300000 003063FF633000000000007F00000000 7E5181815641AD7A7E7FFFFF7E7FFF7A 7C22E19581C56A7E7C3EFFFFFFFF7E7E 006C426A443A660000003C3C38040000 0C32426B84562A00000C3C3C78280000 00000028000000000000387C7C3C3C00 000000280000000000183C7C7C7C7800 00180CFE0C1800000010080008100000 0F1F0F1F0F1F0F1FBC78BC78BC78BC78 FF81BD8181BD81FF007E427E7E427E00 FF8199A5A59981FF007E7E7E7E7E7E00 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 80000000000000008000000000000000 C000000000000000C000000000000000 0000000000000000E000000000000000 0000000000000000F000000000000000 0000000000000000F800000000000000 FC000000000000000000000000000000 FE000000000000000000000000000000 00000000000000000400400000040000 38542A05532A1830387C7EFFAF560000 DD00B6005A00B3000000000000000000 020040A0000205000000000000000000 8000104870093C1000181A5E78181800 00200408000048000120040080020800 08428100000810000856D7380C102000 00029000002002000000100000000000 094A263C081818000000020000081800 0204080808080808070E1C1C1C1C1C1C 00000000000000000000000000000000 000000AA000000000000000000000000 000000AA000000000000000000000000 FF808080808080800000000000000000 FF000000000000000000000000000000 FF010101010101010000000000000000 7F087F207F027F000000000000000000 780870207000780004040C14080C000C 60006000600060001010001010201030 00000000000000000040400000004000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 08080808080804021C1C1C1C1C1C0E07 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 80808080808080800000000000000000 00000000000000000000000000000000 01010101010101010000000000000000 0062110939775A75000000003059674F 182021FAAC56AB0D00000000F8ECF6F3 0204090939775A75000000003059674F 061820F8AF56AB0D00000000F8ECF6F3 003C7EFF1F0B254000007CDEFF7F3F71 000000E0F0FC7EBE1E7BD50BE6F0FCFC 3C7EFF1F0B24C000007CDEFF7F3FF303 0000E0900C020207000000E0F0FCFCFE 000070FCFC7838007079FF9F06CE7C38 00307CFEFE380800717FCF83C6FE3C1C 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 80808080808080FF0000000000000000 00000000000000FF0000000000000000 01010101010101FF0000000000000000 70586639091162004F675F3909116200 0D091204FA212018F3F7EEFCFA212018 70586639090804024F675F3909080402 0D091207F8201806F3F7EEFFF8201806 0002000810200100E103020E18300100 5F2E0540008000007E3F2F6F40C08000 02000200040000000302020204040000 2E05400040000000FF2F6F4040808000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000181E3E3E3C18703C3E77F3E3E634 00000000000000000004000040020000 0000000F0F0000000010000000004400 00000000181818180004000040020000 0000000F1F1818180004000040020000 000000F0F00000000004000000024000 000000FFFF0000000014000000044000 000000F0F81818180020000000022000 000000FFFF1818180042000000004200 18181818000000000000420000040040 1818181F0F0000000002400000200240 18181818181818180000028000048200 1818181F1F1818180002400000004200 181818F8F00000000040020002000240 181818FFFF0000000042000000002200 181818F8F81818180041000002004000 181818FFFF1818180082000000044000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 07CC383838383F3807CA323232323738 E010180C0C0CEC1CE010180C0C0CEC1C 07CC383838383F3807CA323232323738 E010180C0C0CEC1CE010180C0C0CEC1C 0344A818383838380345A91131313131 F81C0E0400000000F81C0E0400000000 78B83838393A3C3870B0303031333539 000000E0F0180C0C000000E0F0180C0C 07CC383838383F3807CA323232323738 F81C00000000E000F81C00000000E000 66DB24181824DB6500C3E73C3CE7C300 3F3FBFFFFFB52A3F000A95C0C0800000 FFFFFFFFFF55AAFF00AA550000000000 FCFCFDFFFF55ACFC00A8510303010000 00244200004224000018004242001800 00244A040042240000183C7E7E3C1800 383838383838B870323232323232B240 0C0C0C0C0C0C0D020C0C0C0C0C0C0D02 383838383838B870323232323232B240 603018180C0C0D02603018180C0C0D02 3838383838180C073131313130180C07 00000000000204F800000000000204F8 38383838383878C03931313131307080 0C0C0C0C0C0C0D020C0C0C0C0C0C0D02 F83838383838BC77F23232323232BE47 0000000000000CF80000000000000CF8 00000000000000000000000000000000 14100A1018100A102020102020201020 00000000000000000000000000000000 08280890080850080404040804040804 00000000FF000000000000FFFF000000 00000000000000000000000000000000 00000000000000000000000000000000 00101010100010000000000000000000 00484800000000000000000000000000 00247E24247E24000000000000000000 00083E280A3E08000000000000000000 00420408102042000000000000000000 001C243846443A000000000000000000 00080810000000000000000000000000 00081020201008000000000000000000 00100804040810000000000000000000 000024187E1824000000000000000000 000010107C1010000000000000000000 00000000101020000000000000000000 000000007E0000000000000000000000 00000000001818000000000000000000 00040810204000000000000000000000 003C666666663C000004020202020400 0018385818187C000008080808080000 003C460C30647A00000C020400040200 003C660C06663C00000C020402020400 0026667E060604000022020202000000 007C607C06463C00000C000402020400 001C307C66663C00000C000C02020000 007E460C18303000001E020408000000 003C663C66663C00000C020C02020C00 003C663E06663C00000C020202020C00 00000010001000000000000000000000 00000010001020000000000000000000 00000810201008000000000000000000 0000007E007E00000000000000000000 00001008040810000000000000000000 003C4204080008000000000000000000 003C42424E403C000000000000000000 00186C063E663E000008040202020200 2060687466667C002020280402020000 0000083660603E000000081600000000 0206162E66663E000202120A02020000 00001C367C603E0000001C0600000000 3C666078606040000C22203020000000 00063C66663CC67C0002040202040200 60607C666666440020201C0202000000 0018100818183C000008000808080000 0018100818D8D8780008000808080000 60666C7E666644002022040202020000 3018181818183C001008080808000000 0000ECD6D6C6840000006C1202000000 0000FC666666440000003C0202000000 0000083666663C000000080602000000 00083666667C40400008060200000000 00106C66663E020200100C0202000000 00005C766060400000004C4200000000 00003C607C067C0000000C0004020400 2060607860667C002020201800060000 0000002666663C000000002222000000 00000266663418000000022220000000 000084C6D6D66C000000044242000000 0000462C183876000000462400000000 00002666663E867C0000222202000000 00003E4618607E0000000E0200000000 003C202020203C000000000000000000 00402010080402000000000000000000 003C040404043C000000000000000000 00182442000000000000000000000000 0000000000007E000000000000000000 #3:MAIN BG 00001410AA00AA00AA00AA00AA00AA00 AA00AA00AA00AA00AA00AA00AA00AA00 AA00AA00AA00AA00AA00AA0000000000 00004004000000004004000000000000 00004004000000000000000040040000 000000000000400400000000A000A100 A200A300A400A500A600A700A800A900 A200A300000000004004000000000000 00004004B000B100B200B300B400B500 B600B700B800B900B200B30040040000 40040000000040040000000000000000 00004004000000000000000040040000 00000000000000000000000000004004 0000050000000F000000000040040000 0F004004000100001001000040041201 00000000000000000000000040040000 00000F00000000000000000010010000 00000000000000000000000000004004 00000000400400000000400400000000 40040000000000004004000000004004 40040000000000000000000000000000 40040000000000000000400400004004 00000000000000000000000040040000 00000000000000000000000040040000 00000000000100000000000000004004 00000000000040040000400400004004 00004004000000000000000140040000 00000000400400004004000000004004 40040000000000000000000000000000 40040000000000004004400400000000 00000000400400000000400400004004 00000000000000000000400400000000 000000000000000040040000AA00AA00 AA00AA00AA00AA00AA00AA00AA00AA00 AA00AA00AA00AA00AA00AA00AA00AA00 AA00AA00000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000 #15:MAIN SOUND 2800303A000000001800846C003A0000 08006060000000002800303019FE0000 38002020000000003800505000000000 3D00900000C900000800000F00000000 18008060002000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 01020340018405408140404001C04040 8F0E40400F9040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 2A0FEF290F00250F0000000000000000 00000000F10000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 255FEF3048EF0000EF3048EF255FEF30 48EF0000EF3048EF255FEF3048EF0000 EF3048EF255FEF3048EF0000EF3048EF 255FEF3048EF0000EF3048EF255FEF30 48EF0000EF3048EF255FEF3048EF0000 EF3048EF255FEF3048EF0000EF3048EF 251FEF291F002C1F00291F00251F0029 1F002C1F00291F00201F00241F00271F 00241F00201F00241F00271F00241F00 2A1F002E1F00311F002E1F002A1F002E 1F00311F002E1F00221F00251F00291F 00251F00221F00251F00291F00251F00 382FEF000000000000352F00382F0000 0000000000352F00382F003C2F003F2F 00382F00000000000000000000000000 362F00000000000000312F00362F0000 0000000000312F00362F003A2F003D2F 00362F00000000000000000000000000 201FEF241F00271F00241F00201F0024 1F00271F00241F001D1F00201F00241F 00201F001D1F00201F00241F00201F00 221F00251F00291F00251F00221F0025 1F00291F00251F001E1F00221F00251F 00221F001E1F00221F00251F00221F00 382FEF352F00332F00352F002C2F0030 2F00332F00302F003C2F00382F00352F 00382F00292F002C2F00302F002C2F00 2E2F00312F00352F00312F002E2F0031 2F00352F00312F002A2F000000000000 00000000252F00000000000000000000 272FE5292F002A2F002C2F002E2F0030 2F00292F002A2F002C2F002E2F00302F 00312F00000000362F00000000382F00 0000003A2F0000000000000000000000 0000000000000000252F00272F000000 00000000000000000000000000000000 252FE5272F00292F002A2F00312F0033 2F00352F00362F00382F000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 252FE5272F00292F002A2F002C2F002E 2F00272F00292F002A2F002C2F002E2F 00302F00000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 3D6FEF0000000000000000003D2F0000 0000000000000000412F000000000000 000000003D2F00000000000000000000 412F000000000000000000003D2F0000 0000000000000000412F000000003D2F 00000000412F003D2F00412F003D6F00 254FE4274F00294F002A4F002C4F002E 4F00304F00314F00334F00354F00364F 00384F003A4F003C4F00000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 312FE5332F00352F00362F00382F0000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 466FE5446F00426F00416F00526F0050 6F004E6F004D6F00386F00366F00356F 00336F00000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 486FE8542AE24E2A00522A004B280050 28004926000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 388FD8000000000000358F00388F0029 8F002C8F00358F00388F003C8F003F8F 00388F002C8F00278F002C8F00278F00 368F00000000000000318F00368F0000 0000000000318F00368F003A8F003D8F 00368F002A8F00258F002A8F00258F00 255FD83048D80000D83048D8255FD830 48D80000D83048D8255FD83048D80000 D83048D8255FD83048D80000D83048D8 255FD83048D80000D83048D8255FD830 48D80000D83048D8255FD83048D80000 D83048D8255FD83048D80000D83048D8 388FD8358F00338F00358F002C8F0030 8F00338F00308F003C8F00388F00358F 00388F00298F002C8F00308F002C8F00 2E8F00318F00358F00318F002E8F0031 8F00358F00318F002A8F000000000000 00000000258F00000000000000000000