REM ********************************************************************* REM * LOWRESNX COMUNITY GAME PROJECT * REM * REM * STARTED ON 05.JUN.2021 * REM * REM * CODE BY: * REM * DAN, SP4CEBAR, G9 * REM * MUSIC BY: * REM * NINTENDO,PORTED BY G-9 REM * * REM * SOUND BY: REM * SPACEB4R,G-9 * REM * * REM * SPRITES BY: * REM * DAN, SP4CEBAR * REM * LEVELS BY: REM * LEVEL 1:DAN, LEVEL 2:G-9 * REM * * REM * REM ******************************************************************** REM SORT OF CHAT REM SP4CEBAR: I'VE ADDED 6 ITEMS, A SWORD, ARMOR, A SHIELD, A POWER-UP, A JETPACK, AND A PLAYER-CLONE THING REM SP4CEBAR: THE SWORD HAS A SWING ANIMATION CHARACTER (ITEM-USAGE CODE DOESN'T EXIST YET) REM SP4CEBAR: THERE ARE 12 ITEM SPRITES, 10-15 ARE ITEMS IN THE MAP, 16-21 ARE EQUIPPED SPRITES, I HAD TO DO THIS TO KEEP SPRITE HIT FROM DETECTING AN EQUIPPED ITEM AS AN ITEM TO PICK-UP REM SP4CEBAR: THE ITEMS ARE CURRENTLY BEHIND THE PLAYER ALTHOUGH THEY SHOULD BE IN FRONT OF IT, SO THE PLAYER SPRITE NUMBER (WHICH IS 1) SHOULD BE REPLACED WITH A HIGHER SPRITE NUMBER (22 OR MORE) REM SP4CEBAR: DO WE NEED A PROJECTILES ARRAY? (WHICH COULD HAVE: ID,X,Y,DX, AND DY) REM SP4CEBAR: I'VE ADDED LASERS THAT COULD BE PLACED INSIDE THE MAP REM CODE WILL DETECT THEM AND TURN THEM ON OR OFF DEPENDING ON A TIMER OR BUTTON REM THE LASERS CAN BE ANIMATED BY REPEATEDLY FLIPPING THEM VERTICALLY REM I RAN OUT OF TIME TO WRITE THE CODE FOR THE LASERS REM DAN: I SHOULD HAVE ADDED THE JUMPING WHILE THE PLAYER WAS DRIVEN WITH ARRAYS, NOW I HAVE REWRITTEN THE CODE 2 TIMES BEFORE I DECIDED TO USE SOMEONE ELSES CODE FOR THE PLATFORMER, AND IT IS FROM HERE: HTTPS://WWW.INFINITELIMIT.NET/ARTICLE/SIMPLE-PLATFORMER-TIC-80 REM G-9: CHANGED GRAVITY TO MATCH IRL GRAVITY, NOW PLAYER CAN JUMP 3 CELLS UP. ALSO MADE THE JETPACK WORK. MADE LEVEL 2. ADDED SMB MUSIC THEME REM DAN: ITEMS NOW SPAWN WITHIN THE MAP AND NOT ON THE TILES!, GRAVITY (FALLING SPEED IS NOW LIMITED), PLAYER CAN'T GO OFFSCREEN. REM G-9: I DID SOME UPDATES, ADDING TWO LABELS. PLACED ARRAYS INITIALISATION ATOP. ADDED SPIKES.ADDED A LITTLE ANIMATION FOR THE SWORD.ADDED SCORE AND LIVES REM DAN: ADDED PAUSE MENUE: TURN SOUND/MUSIC ON/OFF (USE SND AND MUS VARIABLES FOR IT). INCREASED LASER VARIABLE TO 4,2. ADDED LEVELPAL VARIABLE TO LEVELS, TO CHANGE THE COLOR OF THE TILES ! ADDED LEVEL RANGE CHECK. CHANGED THE PLAYER SIZE TO 6.5 NOW IT SEEM THAT THE PLAYER DOES NOT GET STUCK. REM DAN: ADDED @ CHAR FOR PLAYER SPAWN POSITION, ADDED A FALLBACK COORDINATE IF NO @ IS FOUND ON THE MAP. ADDED $ AS DIAMONDS, DRAWN A SLIMY MONSTER FOR TESTING, ADDED A DESTRUCTIBLE TILE (+) AND DRAWN A DOOR REM DAN: ADDED A SOUNDS SUB, TO EASIER TURN ON/OFF SOUNDS. DEFINE ALL SOUNDS IN THERE, USE A FREE NUMBER, THEN CALL SOUNDS(3) TO PLAY IT. ADDED SWORD FUNCTIONS FOR THE DESTRUCTIBLE TILE, HOLD UP/DOWN AND PRESS THE BUTTON TO REMOVE THE TILES FROM TOP/BOTTOM, OR FIREBUTTON FACING THE TILE. REM DAN: SHORTENED THE CODE FOR SWORD HANDLING. DESTRUCTIBLE BLOCKS NOW OCCASIONALLY LEAVE A GEM. THE SHIELD NOW BLOCKS THE LASERS, THE ARMOR BLOCKS SPIKES. THE MAP SHOULD REDRAW NOW PROPERLY AFTER PAUSE MENUE. GAMEPAD 1 MUS=1 IF MUS=1 THEN MUSIC GLOBAL SND,FIREBUTTON, PLAYTESTING SND=1 MUSTXT$="OFFON " PAUSE OFF PLAYTESTING=0 DIM GLOBAL LVL(20,15,2) REM LVL(X,Y,INFO(CHAR,PAL,FLIPX AND FLIPY)) DIM GLOBAL ITEMS(3) REM ITEMS(ID)=ON/OFF (1 OR 0) ON MEANS THAT THE CHARACTER HAS EQUIPPED IT DIM GLOBAL LASERS(4,2) LASERCOUNT=0 GAME_JUST_STARTED=-1 DIM GLOBAL TABLES(0,5,2) REM TABLES(TABLE NUMBER, TABLE ITEM, VARIABLES) REM TABLE 0: EQUIPPED ITEM OFFSET TABLE, EQUIPPED ITEM, X AND Y OFFSETS REM SET TABLE OFFSETS TABLES(0,0,0)=-1 TABLES(0,0,1)=2 TABLES(0,0,2)=1 TABLES(0,1,0)=4 TABLES(0,1,1)=-2 TABLES(0,1,2)=-4 TABLES(0,2,0)=-1 TABLES(0,2,1)=-1 TABLES(0,2,2)=1 TABLES(0,3,0)=-1 TABLES(0,3,1)=0 TABLES(0,3,2)=1 GLOBAL SCORE,JUMP,LIVES,LASER_REFRESH_TIME,ATTACK_TIME REM FRAMES TO REFRESH LASER STATE (THE LOWER THE HARDER THE GAME IS) LASER_REFRESH_TIME=60 RESET: REM RANGE CHECK X/Y RCX=0 RCY=0 LIVES=3 LEVEL=1 DIED: REM PROGRAM JUMP VARIABLE (TO POSTPONE A GOTO TO AVOID A MEMORY LEAK) JUMP=0 SCORE=0 IF GAME_JUST_STARTED THEN GAME_JUST_STARTED=0 ELSE CALL SOUNDS(4) END IF ACT_X=9 ACT_Y=0 ACT_DIR=0 ACT_FALL=0 ACT_JUMP=0 ACT_FLIP=0 REM PLAYERS SIZE ACT_SX=6.5 ACT_SY=6.5 REM ACTOR DELTA X/Y ACT_DX=0 ACT_DY=0 ACT_DIR=0 ACT_ANIM=0 ACT_TIMER=TIMER ACT_GRAV=0 ATTACK_TIME=0 GRAVMAX=2 GRAVACC=0.1 REM COLLISION FLAG VARIABLE COL1=0 COL2=0 COL3=0 COL4=0 REM SET LEVEL PALETTE LEVELPAL=0 MAINLOOP: MAINGAMEINIT: REM REMOVE EQUIPPED ITEMS FOR I=0 TO 3 ITEMS(I)=0 NEXT I SPRITE OFF 15 TO 19 LASERCOUNT=0 GOSUB GETLEVEL REM TURN ALL LASERS ON IF 0 THEN FOR I=0 TO LASERCOUNT LASERS(I,2)=1 NEXT I END IF RANDOMIZE TIMER REM SPAWN ITEMS: IF 0 THEN FOR I=0 TO 5 ITEMSPAWN: TMPX=1+(RND(17)) TMPY=1+(RND(11)) CALL MAP(TMPX*8,TMPY*8,COL1) IF COL1<>0 THEN GOTO ITEMSPAWN SPRITE 10+I,TMPX*8,TMPY*8,80+I SPRITE 10+I PAL 1 SPRITE 16+I PAL 1 NEXT I END IF MAINGAMELOOP: GOSUB PLAYERMOVEMENT CALL UPDATE_ITEMS(ACT_X,ACT_Y,ACT_FLIP) CALL UPDATE_LASERS(LASERCOUNT) IF PAUSE THEN GOSUB MENUPAUSE WAIT VBL GOTO MAINGAMELOOP PLAYERMOVEMENT: ACT_DIR=0 REM KD = JOYPAD RIGHT=1, LEFT=-1 REM KU = JOYPAD DOWN=1, UP=-1 KD=RIGHT(0)-LEFT(0) KU=DOWN(0)-UP(0) TMP=ACT_TIMER IF TIMER-TMP>=10 THEN ACT_TIMER=TIMER 'ACT_ANIM=(ACT_ANIM+1) MOD 2 ADD ACT_ANIM,1,0 TO 1 END IF IF KD=-1 THEN REM JOYPAD RIGHT ACT_DX=0.8 ACT_FLIP=0 ACT_DIR=1 ELSE IF KD=1 THEN REM JOYPAD LEFT ACT_DX=-0.8 ACT_FLIP=1 ACT_DIR=1 ELSE ACT_DX=0 END IF REM COLLISION (LEFT/RIGHT SIDE) CHECKS CALL MAP(ACT_X+ACT_DX,ACT_Y+ACT_DY,COL1) CALL MAP(ACT_X+ACT_DX+ACT_SX,ACT_Y+ACT_DY,COL2) CALL MAP(ACT_X+ACT_DX,ACT_Y+ACT_DY+ACT_SY,COL3) CALL MAP(ACT_X+ACT_DX+ACT_SX,ACT_Y+ACT_DY+ACT_SY,COL4) IF COL1>0 OR COL2>0 OR COL3>0 OR COL4>0 THEN ACT_DX=0 IF JUMP=2 THEN GOTO RESET IF JUMP=1 THEN GOTO DIED REM GRAVITY+COLLISION CALL MAP(ACT_X+ACT_DX ,ACT_Y+ACT_DY+ACT_SY+1,COL1) CALL MAP(ACT_X+ACT_DX+ACT_SX,ACT_Y+ACT_DY+ACT_SY+1,COL2) IF COL1>0 OR COL2>0 THEN ACT_DY = 0 ELSE ACT_DY=ACT_DY+0.1 IF ACT_DY>2 THEN ACT_DY=2 END IF REM JUMPING + COLLISION REM G-9 ADDED JETPACK IF BUTTON(0,1) THEN IF ACT_DY=0 THEN ACT_DY=-2.3 ELSE IF ITEMS(3)=1 THEN REM FLY ACT_DY=-1.3 CALL SOUNDS(0) END IF END IF REM SWORD SWING IF FIREBUTTON THEN REM CHECK IF THE PLAYER IS WITHIN THE COORDINATES (FOR THE ARRAY CHECK) TMPX=(ACT_X+4+ACT_DX)/8 TMPY=(ACT_Y+ACT_DY)/8 TMPA=0 TMPB=0 TMPC=0 TMPD=0 REM ADD RANDOM GEM FOR DESTRUCTIBLE BLOCK! IF RND(3)=1 THEN TMPA=87 TMPB=3 END IF IF KU=-1 THEN REM JOY UP TMPC=1 ELSE IF KU=1 THEN REM JOY DOWN TMPC=-1 ELSE REM PLAYER FACING LEFT/RIGHT IF ACT_FLIP=1 THEN TMPD=1 ELSE TMPD=-1 END IF END IF IF (TMPX>0 AND TMPX<20) AND (TMPY>0 AND TMPY<15) THEN IF CELL.C(TMPX-TMPD,TMPY+TMPC)=4 THEN LVL (TMPX-TMPD,TMPY+TMPC,0)=TMPA LVL (TMPX-TMPD,TMPY+TMPC,1)=TMPB LVL (TMPX-TMPD,TMPY+TMPC,2)=0 PAL TMPB CELL TMPX-TMPD,TMPY+TMPC,TMPA ADD SCORE,20 END IF END IF END IF REM CEILING COLLISION CALL MAP(ACT_X+ACT_DX ,ACT_Y+ACT_DY+1,COL3) CALL MAP(ACT_X+ACT_DX+ACT_SX,ACT_Y+ACT_DY+1,COL4) IF ACT_DY<0 AND (COL3>0 OR COL4>0) THEN ACT_DY = 0 END IF ACT_X=ACT_X+ACT_DX ACT_Y=ACT_Y+ACT_DY REM LIMIT PLAYER TO THE SCREEN COORDINATES: IF ACT_Y>112 THEN GOTO DIED END IF IF ACT_Y<0 THEN ACT_Y=0 IF ACT_X<0 THEN ACT_X=0 IF ACT_X>152 THEN ACT_X=152 REM DRAW THE PLAYER CALL MAINSPRITE(ACT_X, ACT_Y, ACT_DIR, ACT_ANIM, ACT_FLIP) REM RESERVED FOR SCORE AND LIVES ?! OR SOMETHING ELSE REM OK, OK PAL 0 TEXT 0,15,"SCORE:"+STR$(SCORE) TEXT 12,15,"LIVES:"+STR$(LIVES) RETURN GETLEVEL: REM LEGEND: REM #: CELL REM X: SPIKE REM >: LASER RIGHT REM <: LASER LEFT REM ^: LASER UP REM V: LASER DOWN REM S: SWORD REM D: SHIELD REM A: ARMOR REM J: JETPACK REM P: POWER-UP REM C: CHARACTER CLONER (WE COULD REMOVE THIS ONE) REM $: DIAMONDS REM @: PLAYER STARTING POSITION REM +: DESTRUCTIBLE TILE REM NOT YET IMPLEMENTED ITEMS - THESE ARE JUST IDEAS THEY DON'T ALL HAVE TO BE ADDED REM H: HEALTH PACK REM *: KEY REM B: BUTTON A$="" REM LEVEL RANGE CHECK, INCREASE THE SECOND IF WHEN MORE LEVELS ARE ADDED IF LEVEL<0 THEN LEVEL=1 IF LEVEL>2 THEN LEVEL=2 IF LEVEL=1 THEN LEVELPAL=4 A$=A$+"#@ ###+++++########" A$=A$+"# $ $ $ #" A$=A$+"#++++ ## # #" A$=A$+"# # # #" A$=A$+"# <# #" A$=A$+"#S ++++++ # ^ #" A$=A$+"#++++++++++ ####" A$=A$+"#> #++###V #" A$=A$+"+ $ # D#" A$=A$+"+### # ++++ ## +#" A$=A$+"+A + #$ +" A$=A$+"+#### # ## $#+++" A$=A$+"# # ++++ +" A$=A$+"#XXXXXXX## $ $ J#" A$=A$+"####################" ELSE IF LEVEL=2 THEN LEVELPAL=2 A$=A$+"# @ ################" A$=A$+"# D#" A$=A$+"##### ###### ##" A$=A$+"# # #P ## ##" A$=A$+"## # ##> ##" A$=A$+"#> # # ##" A$=A$+"###### # ##" A$=A$+"#A V # ########" A$=A$+"## # #" A$=A$+"#### ######## ##" A$=A$+"# # #" A$=A$+"##### # ## ####" A$=A$+"# ## V##### #" A$=A$+"#J ^## SX#" A$=A$+"####################" REM COPY AND PASTE THE LEVELMAP FROM THE LEVEL 1, PRESS INSERT KEY FOR EASY EDIT (AT LEAST ON WINDOWS, THE OVERWRITE MODE IS TURNED ON) REM RIP IPHONE USERS :3 ELSE IF LEVEL=3 THEN ELSE IF LEVEL=4 THEN ELSE IF LEVEL=5 THEN END IF CLS ACT_X=-1 ACT_Y=-1 ACT_TMPX=-1 FOR Y=0 TO 14 FOR X=0 TO 19 TMP$=MID$(A$,X+1+(Y*20),1) IF TMP$="#" THEN 'CELL LVL (X,Y,0)=1 LVL (X,Y,1)=LEVELPAL LVL (X,Y,2)=0 ELSE IF TMP$="X" THEN 'SPIKES LVL (X,Y,0)=2 LVL (X,Y,1)=1 LVL (X,Y,2)=0 ELSE IF TMP$=">" THEN 'LASER RIGHT LVL (X,Y,0)=48 LVL (X,Y,1)=1 LVL (X,Y,2)=0 LASERS(LASERCOUNT,0)=X LASERS(LASERCOUNT,1)=Y INC LASERCOUNT ELSE IF TMP$="<" THEN 'LASER LEFT LVL (X,Y,0)=48 LVL (X,Y,1)=1 LVL (X,Y,2)=1 LASERS(LASERCOUNT,0)=X LASERS(LASERCOUNT,1)=Y INC LASERCOUNT ELSE IF TMP$="^" THEN 'LASER UP LVL (X,Y,0)=52 LVL (X,Y,1)=1 LVL (X,Y,2)=0 LASERS(LASERCOUNT,0)=X LASERS(LASERCOUNT,1)=Y INC LASERCOUNT ELSE IF TMP$="V" THEN 'LASER DOWN LVL (X,Y,0)=52 LVL (X,Y,1)=1 LVL (X,Y,2)=2 LASERS(LASERCOUNT,0)=X LASERS(LASERCOUNT,1)=Y INC LASERCOUNT ELSE IF TMP$="S" THEN 'SWORD LVL (X,Y,0)=81 LVL (X,Y,1)=1 LVL (X,Y,2)=0 ELSE IF TMP$="D" THEN 'SHIELD LVL (X,Y,0)=80 LVL (X,Y,1)=1 LVL (X,Y,2)=0 ELSE IF TMP$="A" THEN 'ARMOR LVL (X,Y,0)=82 LVL (X,Y,1)=1 LVL (X,Y,2)=0 ELSE IF TMP$="J" THEN 'JETPACK LVL (X,Y,0)=83 LVL (X,Y,1)=1 LVL (X,Y,2)=0 ELSE IF TMP$="P" THEN 'POWER-UP LVL (X,Y,0)=84 LVL (X,Y,1)=1 LVL (X,Y,2)=0 ELSE IF TMP$="C" THEN 'CHARACTER CLONER LVL (X,Y,0)=85 LVL (X,Y,1)=1 LVL (X,Y,2)=0 ELSE IF TMP$="$" THEN 'VALUABLE ITEM (INCREASES SCORE) LVL (X,Y,0)=87 LVL (X,Y,1)=3 LVL (X,Y,2)=0 ELSE IF TMP$="H" THEN 'HEALTH PACK 'LVL (X,Y,0)=2 'LVL (X,Y,1)=1 'LVL (X,Y,2)=0 ELSE IF TMP$="*" THEN 'KEY 'LVL (X,Y,0)=2 'LVL (X,Y,1)=1 'LVL (X,Y,2)=0 ELSE IF TMP$="B" THEN 'BUTTON 'LVL (X,Y,0)=2 'LVL (X,Y,1)=1 'LVL (X,Y,2)=0 ELSE IF TMP$="@" THEN ACT_X=X*8 ACT_Y=Y*8 ACT_TMPX=X*8 ELSE IF TMP$="+" THEN 'DESTRUCTIBLE TILE LVL (X,Y,0)=4 LVL (X,Y,1)=LEVELPAL LVL (X,Y,2)=0 ELSE REM REMEMBER THE FIRST EMPTY SPOT IN THE LEVEL MAP IF ACT_TMPX=-1 THEN ACT_TMPX=X*8 ACT_TMPY=Y*8 END IF LVL (X,Y,0)=0 LVL (X,Y,1)=0 LVL (X,Y,2)=0 END IF CELL X,Y,LVL(X,Y,0) TINT X,Y PAL LVL(X,Y,1) FLIP LVL(X,Y,2) MOD 2,LVL(X,Y,2)\2 'IF TMP$="X" THEN TINT X,Y PAL 1 NEXT X NEXT Y DEC LASERCOUNT REM FALLBACK STRATEGY - PLAYER WAS NOT DEFINED IN THE MAP, SET HIM TO THE FIRST EMPTY SPOT IN THE LEVEL MAP IF ACT_X=-1 THEN ACT_X=ACT_TMPX ACT_Y=ACT_TMPY END IF RETURN MENUPAUSE: PAL 1 BG FILL 0,6 TO 19,10 CHAR 32 PAL 2 BG FILL 1,7 TO 18,9 CHAR 32 MP=0 QUITRESET=0 REPEAT IF MP=0 THEN PAL 2 ELSE PAL 0 TEXT 3,7,"TESTING "+MID$(MUSTXT$,(PLAYTESTING*3)+1,3) IF MP=1 THEN PAL 2 ELSE PAL 0 TEXT 4,8,"MUSIC "+MID$(MUSTXT$,(MUS*3)+1,3) IF MP=2 THEN PAL 2 ELSE PAL 0 TEXT 4,9,"SOUND "+MID$(MUSTXT$,(SND*3)+1,3) IF UP (0) THEN MP=MP-1 IF MP<=0 THEN MP=0 WAIT 8 END IF IF DOWN(0) THEN MP=MP+1 IF MP>=2 THEN MP=2 WAIT 8 END IF IF PAUSE THEN QUITRESET=1 IF BUTTON (0,0) THEN WAIT 8 IF MP=0 THEN PLAYTESTING=(PLAYTESTING+1) MOD 2 END IF IF MP=1 THEN MUS=(MUS+1) MOD 2 IF MUS=1 THEN MUSIC IF MUS=0 THEN STOP END IF IF MP=2 THEN SND=(SND+1) MOD 2 END IF END IF WAIT VBL UNTIL QUITRESET=1 WAIT 2 FOR Y=0 TO 14 FOR X=0 TO 19 CELL X,Y,LVL(X,Y,0) TINT X,Y PAL LVL(X,Y,1) FLIP LVL(X,Y,2) MOD 2,LVL(X,Y,2)\2 NEXT X NEXT Y RETURN REM DEFINE SOUNDS IN HERE, USE NUMBERS TO PLAY, IF THE SND VARIABLE IS SET TO 0 THEN NO SOUND WILL PLAY SUB SOUNDS(NR) SOUND SOURCE ROM(14) REM VOICE 0 IS USED FOR MUSIC REM VOICE 1 IS USED FOR SOUND EFFECTS REM VOICE 2 IS USED FOR TRACK-BASED SOUND EFFECTS (BECAUSE TRACKS DON'T STOP THEMSELVES (AND ALLOW "PLAY" COMMANDS TO WORK ON THAT VOICE)) REM DEFAULT SETTINGS, IDK WHAT THEY SHOULD BE SOUND 1,0,8,10 ENVELOPE 1,0,10,5,5 LFO WAVE 1,0,0,0,0 LFO 1,0,0,0,0 IF SND=1 THEN IF NR=0 THEN REM JETPACK SOUND 1,3,,10 PLAY 1,25,1 ELSE IF NR=1 THEN REM SWORD ENVELOPE 1,1,10,5,5 SOUND 1,3,,10 PLAY 1,40,1 ELSE IF NR=2 THEN REM MONEY PICKUP TRACK 0,2 ELSE IF NR=3 THEN REM ITEM PICKUP SOUND 1,1,,10 ENVELOPE 1,0,10,5,5 LFO WAVE 1,1,1,1,1 LFO 1,15,10,, PLAY 1,66,9 ELSE IF NR=4 THEN REM RESTART ENVELOPE 1,0,10,5,5 SOUND 1,3,,10 PLAY 1,40,1 ELSE IF NR=5 THEN END IF REM POSSIBLE SOUNDS: SWORD DESTROY BLOCK, SHIELD BLOCK, ARMOR BREAK, LEVEL COMPLETE, GAME OVER, ENEMY SOUNDS, MAYBE LASER SOUNDS END IF SOUND SOURCE ROM(15) END SUB SUB MAP(X,Y,COL1) IF INT(X/8)>=0 AND INT(X/8)<=20 AND INT(Y/8)>=0 AND INT(Y/8)<=15 THEN COL1=LVL(INT(X/8),INT(Y/8),0) COL2=CELL.C(INT(X/8),INT(Y/8)) FATAL=0 REM LETHAL COLLISION CHECK IF JUMP=0 THEN REM I BETTER NOT JUMP OUTSIDE A SUB AND CAUSE A MEMORY LEAK REM CHECK IF THE SHIELD IS EQUIPED AND COLLISION WITH THE LASERS HAS OCCURED IF (COL2>=49 AND COL2<=51) or (col2>=53 and COL2<=55) then IF ITEMS(0)=0 THEN FATAL=1 ELSE FATAL=0 END IF END IF REM CHECK IF THE ARMOR IS EQUIPED AND COLLISION WITH THE SPIKES HAS OCCURED IF COL2=2 AND FATAL=0 then if ITEMS(2)=0 THEN FATAL=1 ELSE FATAL=0 END IF END IF IF PLAYTESTING=0 AND FATAL=1 THEN JUMP=1 DEC LIVES IF LIVES=-1 THEN JUMP=2 END IF END IF REM DISABLE COLLISION FOR ITEMS AND LASERS IF COL1>47 THEN COL1=0 ELSE COL1=0 END IF END SUB SUB MAINSPRITE(X,Y,SET, AN, FL) REM SET = DEFINE SPRITE ANIMATION NUMBERS REM AN = ANIMATION FRAME IN THE SET (IF ANY) REM FL = DOES THE SPRITE NEED TO BE FLIPPED ? 'USING SPRITES 1,2,3,4 'SET DEFAULT PICTURE FRAMES SP3=0 SP4=0 REM: STANDING, 1 FRAME - UP/DOWN IF SET=0 THEN SP1=64 REM RUNNING 2 FRAME IF SET=1 THEN IF AN=0 THEN SP1=65 ELSE SP1=66 END IF END IF REM - FALLING DOWN IF SET=2 THEN SP1=67 REM SPRITE IS COMPOSED BY UP+DOWN IMAGES IF FL=0 THEN SPRITE 30 FLIP 0,0 SPRITE 30,X,Y,SP1 ELSE SPRITE 30 FLIP 1,0 SPRITE 30,X,Y,SP1 END IF END SUB SUB UPDATE_ITEMS(ACT_X,ACT_Y,ACT_FLIP) REM PICK UP ITEMS REM THESE ARE THE ITEM-PICKUP HITBOXES: (WE COULD CHANGE THIS TO USE THE COL1-COL4 VARS) X=(ACT_X+4)/8 Y=(ACT_Y+4)/8 C=CELL.C(X,Y) IF C\16=5 THEN ADD SCORE,100 IF C<84 THEN REM EQUIP ITEM ITEMS(C-80)=1 SPRITE C-64,,,C SPRITE C-64 PAL 1 CALL SOUNDS(3) ELSE IF C=87 THEN CALL SOUNDS(2) END IF CELL X,Y,0 FOR J=0 to 2 LVL(X,Y,J)=0 NEXT J END IF FIREBUTTON=0 REM UPDATE EQUIPPED ITEMS F=SGN(ACT_FLIP) FOR I=0 TO 3 IF ITEMS(I)=1 THEN SPRITE 16+I,ACT_X+TABLES(0,I,F*2),ACT_Y+TABLES(0,I,1), IF (BUTTON TAP(0,0) OR TIMER-ATTACK_TIME<4) AND I=1 THEN SPRITE 17 FLIP F-1,1 SPRITE 15,ACT_X+TABLES(0,I,F*2),ACT_Y+TABLES(0,I,1),96 CALL SOUNDS(1) SPRITE 15 FLIP F-1,0 FIREBUTTON=1 IF BUTTON TAP(0,0) THEN ATTACK_TIME=TIMER ELSE SPRITE 16+I FLIP F-1,0 IF I=1 THEN SPRITE OFF 15 END IF END IF NEXT I END SUB SUB UPDATE_LASERS(LASERCOUNT) REM SWITCH LASERS ON AND OFF IF TIMER MOD LASER_REFRESH_TIME = 0 THEN FOR I=0 TO LASERCOUNT LASERS(I,2)=INT(RND*2) NEXT I END IF IF TIMER MOD 8=0 THEN FOR I=0 TO LASERCOUNT X=LASERS(I,0) Y=LASERS(I,1) S=LASERS(I,2) X1=X Y1=Y C=LVL(X,Y,0) F=LVL(X,Y,2) IF C/4=12 THEN REM HORIZONTAL LASER DX=1-SGN(F)*2 DY=0 FLIP F MOD 2,(TIMER\8)MOD 2 ELSE REM VERTICAL LASER DX=0 DY=SGN(F)*2-1 FLIP (TIMER\8)MOD 2,F\2 END IF REM RAYCAST LASER ADD X,DX ADD Y,DY REPEAT ADD X,DX ADD Y,DY CH=CELL.C(X,Y) UNTIL CH<>0 AND CH<>50 AND CH<>51 AND CH<>54 AND CH<>55 AND CH<>87 ADD X,-DX ADD Y,-DY PAL 1 REM DRAW LASER IF S=1 THEN REM ON BG FILL X1,Y1 TO X,Y CHAR C+2 BG FILL X,Y TO X1,Y1 CHAR C+2 CELL X1,Y1,C+1 CELL X,Y,C+3 ELSE REM OFF PAL 0 FLIP 0,0 BG FILL X1,Y1 TO X,Y CHAR 0 BG FILL X,Y TO X1,Y1 CHAR 0 PAL 1 FLIP F MOD 2,F\2 CELL X1,Y1,C END IF NEXT I PAL 0 FLIP 0,0 END IF END SUB #1:MAIN PALETTES 053F2A00002A1530003C0C00003C3834 001B031700343025003B3726001E0D09 #2:MAIN CHARACTERS FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF FE8181818181817F017F7F7F7F7F7FFF 001038387C7CFEFE0010382868202000 3C7EFFFFFBFFFFFF3C66C381858181FF 7EA58193C193C17E10FF7FFF7F7F7F6C 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 FFFFFFFFFFFFFFFF0000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000040400000000080C08080C08000 1008007F7F0020001088C0BFBFC0A000 000000FFFF000000000000FFFF000000 040107FFFF010904000000FFFF000000 0000000000001800000000000000247E 18181858981A180018181858981A247E 18181818181818181818181818181818 7E38B91A181818181818181818181818 00000000000000000000000000000000 80C0C0C04040400000404040C0C0C080 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 3838107C545428280000000000000000 383810F0103844820000000000000000 38381070901828300000000000000000 0000107C545428283838000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 003C3C3C3C1800007E425A525A241800 C0E070381C0800000000000002040A01 0000000000000000387C44007C383838 0000000000000E0400040E0E6E3E0A04 3C7EFFFFFFFF7E3C0408103E7C081020 007E7E7E7E7E7E000000182020180000 006CFEFE7C381000006CF2FA7C381000 0000080C0E04081000103874F27C3810 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 1E316060C0C0C0C00000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 003C7EAFAFFF7E7E003C42D1D181427E 0000003C7EAF7EFF0000003C42D142FF #3:MAIN BG 00001410000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000 #14:SOUND EFFECTS 2800308A000000001800846C003A0000 08006060000000002800303019FE0000 38002020000000003800505000000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 00404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 490F004E0F000000F10000F000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 #15:MUSIC 280086A8153A80001800846C003A0000 08006060000000002800303019FE0000 38002020000000003800505000000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 804040400140404002C0404003404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 4B0CE6440C00460C00440C00450C0044 0C00460C00440C004B0C00440C004C0C 00440C004B0C00440C004A0C00440C00 470C00440C00460C00440C00450C0044 0C00460C00440C004B0C00440C004C0C 00440C004B0C00440C004A0C00440C00 460C00430C00450C00430C004A0C0043 0C004B0C00430C004A0C00430C004B0C 00430C004A0C00430C00490C00430C00 460C00430C00450C00430C004A0C0043 0C004B0C00430C004A0C00430C004B0C 00430C004A0C00430C00490C00430C00 4E0C00470C004F0C00470C004E0C0047 0C00490C00470C004E0C00470C004D0C 00470C00480C00470C004D0C00470C00 4A0C00470C004F0C00470C004E0C0047 0C00490C00470C004E0C00470C00490C 00470C00480C00470C004D0C00470C00