RANDOMIZE TIMER GAMEPAD 1 GLOBAL BGX,BGY,INTRO$,LN DIM GLOBAL RAIN(9) MAXPART=6 DIM PARTS(MAXPART) FOR I=0 TO MAXPART PARTS(I)=I+1 NEXT I GLOBAL MAXEN,NEXTEN,ECOUNT MAXEN=7 DIM GLOBAL ENX(MAXEN),ENY(MAXEN),ENDIR(MAXEN) GLOBAL LEVEL 'READ FROM PERSISTENT RAM HIGHSCORE=PEEKL($E000) MUSIC SOUND SOURCE ROM(14) TITLE: LEVEL=1 SCORE=0 CLS SPRITE OFF BG 0 BG SOURCE ROM(4) BG COPY 0,0,20,16 TO 0,0 BG 1 ATTR (0,0,0,0) BG FILL 3,9 TO 16,10 CHAR 18 ATTR (3,0,0,1) TEXT 2,0,"** GUT RUNNER **" SPRITE.A 0,(1,0,0,0,3) PY=-32 BGX=0 LN=1 INTRO$="HIGHSCORE: "+STR$(HIGHSCORE)+" * DESIGN/CODE: TIMO KLOSS * MUSIC: DESBYC * INUTILIS SOFTWARE 2019 FOR #FC_JAM 4 *** " RESTORE RAINBOW1 FOR I=0 TO 9 READ RAIN(I) NEXT I ON RASTER CALL TITLERASTER WAIT 30 DO ADD PY,1,-32 TO 80 SPRITE 0,140-PY,PY,140 BG 0 IF TIMER MOD 60<30 THEN BG COPY 0,10,20,4 TO 0,9 ELSE BG COPY 0,9,20,4 TO 0,9 END IF INC BGX CALL SCROLLTEXT IF BUTTON TAP(0) THEN GOTO GAME WAIT VBL LOOP LEVELDONE: ADD SCORE,LEVEL*100 INC LEVEL CLS SPRITE OFF BG 0 BG SOURCE ROM(4) BG COPY 0,16,20,16 TO 0,0 BG 1 ATTR (3,0,0,1) TEXT 2,0,"** LEVEL DONE **" FOR I=0 TO 3 SPRITE.A I,(0,0,0,0,1) NEXT I PY=0 BGX=0 LN=1 INTRO$=" " RESTORE RAINBOW2 FOR I=0 TO 9 READ RAIN(I) NEXT I ON RASTER CALL TITLERASTER WAIT 30 DO ADD PY,0.01,0 TO 1 FOR I=0 TO 3 Y=MAX(0,PY*PY*PY*128-I*8) SPRITE I,92+Y/4+SIN(Y/16),32+Y,138 NEXT I IF PY>=0.8 AND PY<0.81 THEN PLAY 3,73 SOUND 5 INC BGX CALL SCROLLTEXT CALL WATERFX IF BUTTON TAP(0) THEN GOTO GAME WAIT VBL LOOP GAMEOVER: CLS SPRITE OFF BG 0 BG SOURCE ROM(4) BG COPY 0,32,20,16 TO 0,0 FOR I=0 TO 5 SPRITE.A I,(5,0,0,0,1) NEXT I PY=0 BGX=0 LN=1 IF SCORE>HIGHSCORE THEN HIGHSCORE=SCORE INTRO$="NEW HIGHSCORE: "+STR$(SCORE)+" *** " 'WRITE TO PERSISTENT RAM POKEL $E000,HIGHSCORE ELSE INTRO$="GAME OVER * SCORE "+STR$(SCORE)+" * HIGHSCORE: "+STR$(HIGHSCORE)+" *** " END IF RESTORE RAINBOW3 FOR I=0 TO 9 READ RAIN(I) NEXT I ON RASTER CALL TITLERASTER WAIT 30 DO INC BGX FOR I=0 TO 5 PY=(BGX*(2+I*0.65)) MOD 96 SPRITE I,40+PY*(0.65+I*0.03),PY,170 IF PY>92 THEN PLAY 3,73 SOUND 5 NEXT I CALL SCROLLTEXT CALL WATERFX IF BUTTON TAP(0) THEN GOTO TITLE WAIT VBL LOOP SUB SCROLLTEXT IF BGX MOD 8=0 THEN BG 1 ATTR (3,0,0,1) TEXT 20+(BGX\8),15,MID$(INTRO$,LN,1) ADD LN,1,1 TO LEN(INTRO$) BG 0 END IF END SUB SUB WATERFX IF TIMER MOD 4=0 THEN FOR I=0 TO 15 ROR $8000+153*16+I,1 NEXT I END IF END SUB SUB TITLERASTER IF RASTER<16 THEN SCROLL 1,SIN((TIMER+RASTER*0.5)*0.03)*32,-RASTER/2 ELSE IF RASTER>=120 THEN SCROLL 1,BGX,0 ELSE SCROLL 1,0,0 END IF PALETTE 0,RAIN((RASTER+TIMER+SIN((RASTER-TIMER)/20)*16)/4 MOD 10),,, END SUB GAME: 'SHUFFLE FOR I=1 TO 40 P=RND(MAXPART-1) SWAP PARTS(P),PARTS(P+1) NEXT I PARTI=0 MOVED=0 ECOUNT=0 CLS SPRITE OFF ON RASTER CALL LEVELRASTER PALETTE 0,0,,, BG 1 BG SOURCE ROM(5) BG COPY 0,0,20,16 TO 0,1 BG 0 BG SOURCE ROM(3) BG COPY 0,0,20,16 TO 0,0 PX=72 PY=0 BGY=0 AUTOMOVE=64 PUNISH=0 C1=0 C2=0 SPRITE.A 0,1 SPRITE.A 1,(5,0,0,1,1) CALL RESETENEMIES PLAY 3,50 SOUND 2 DO REACHING=(BGY>(MAXPART+1.5)*128) TURBO=0 IF BUTTON(0) AND MOVED AND NOT REACHING THEN TURBO=-1 IF BUTTON TAP(0) THEN PLAY 3,50 SOUND 4 INC SCORE END IF IF TIMER MOD 8=0 OR PUNISH>0 OR TURBO THEN IF BGY MOD 128=0 THEN IF PARTI=MAXPART+1 THEN P=0 ELSE IF PARTI=MAXPART+2 THEN GOTO LEVELDONE ELSE P=PARTS(PARTI) END IF BG COPY 0,16*P,20,16 TO 0,16+BGY/8 INC PARTI END IF IF BGY MOD 8=0 THEN CALL CHECKNEWENEMIES INC SCORE END IF INC BGY END IF IF PUNISH>0 THEN DEC PUNISH SCROLL 0,RND*4-2,BGY+RND*4-2 ELSE SCROLL 0,0,BGY END IF SCROLL 1,0,BGY/2 HH=(LEFT(0) OR RIGHT(0)) VV=(UP(0) OR DOWN(0)) IF LEFT(0) THEN CALL CHECK(PX-1,PY,C1) CALL CHECK(PX-1,PY+7,C2) IF C1 AND C2 THEN DEC PX ELSE IF C1 THEN IF NOT VV THEN DEC PY ELSE IF C2 THEN IF NOT VV THEN INC PY END IF END IF IF RIGHT(0) THEN CALL CHECK(PX+8,PY,C1) CALL CHECK(PX+8,PY+7,C2) IF C1 AND C2 THEN INC PX ELSE IF C1 THEN IF NOT VV THEN DEC PY ELSE IF C2 THEN IF NOT VV THEN INC PY END IF END IF IF UP(0) THEN CALL CHECK(PX,PY-1,C1) CALL CHECK(PX+7,PY-1,C2) IF C1 AND C2 THEN DEC PY ELSE IF C1 THEN IF NOT HH THEN DEC PX ELSE IF C2 THEN IF NOT HH THEN INC PX END IF END IF IF (DOWN(0) OR AUTOMOVE>0 OR PY-BGY<0) AND PY-BGY<124 THEN CALL CHECK(PX,PY+8,C1) CALL CHECK(PX+7,PY+8,C2) IF C1 AND C2 THEN INC PY ELSE IF C1 THEN IF NOT HH THEN DEC PX ELSE IF C2 THEN IF NOT HH THEN INC PX END IF END IF IF DOWN(0) THEN MOVED=-1 DEC AUTOMOVE SPRITE 0,PX,PY-BGY,64+(TIMER/20 MOD 2) CX=(PX+4)/8 CY=(PY+4)/8 IF CELL.C(CX,CY)=32 THEN ATTR 0 CELL CX,CY,18 ADD SCORE,LEVEL*20 PLAY 3,70 SOUND 1 END IF CALL UPDENEMIES IF PUNISH<=0 AND SPRITE HIT(0,8 TO 8+MAXEN) THEN PLAY 3,40 SOUND 0 PUNISH=32 END IF IF PY120 THEN GOTO LEVELDONE BG 1 ATTR (3,0,0,1) NUMBER 0,0,SCORE,5 TEXT 14,0,"LVL" NUMBER 18,0,LEVEL,2 BG 0 WAIT VBL LOOP SUB LEVELRASTER IF RASTER<8 THEN SCROLL 1,0,0 EXIT SUB END IF X=SIN(TIMER*0.05+RASTER*0.01)*4 Y=SIN(TIMER*0.05+RASTER*0.05)*4+4 SCROLL 1,X,Y END SUB SUB CHECK(X,Y,R) C=CELL.C(X/8,Y/8) R=(C=18 OR C=32 OR C=48) END SUB SUB CHECKE(X,Y,R) C=CELL.C(X/8,Y/8) R=(C=18 OR C=32) END SUB SUB RESETENEMIES FOR I=0 TO MAXEN CALL RESETENEMY(I) NEXT I END SUB SUB RESETENEMY(N) ENX(N)=0 ENY(N)=0 ENDIR(N)=0 SPRITE OFF 8+N END SUB SUB CHECKNEWENEMIES CY=(BGY+128)\8 CX=0 ATTR 0 FOR CX=0 TO 19 IF CELL.C(CX,CY)=16 THEN TRACE ECOUNT,LEVEL IF ECOUNT MOD (1+LEVEL)>0 THEN CALL PUTENEMY(CX,CY) END IF INC ECOUNT CELL CX,CY,18 END IF NEXT CX END SUB SUB PUTENEMY(CX,CY) N=NEXTEN ENX(N)=CX*8 ENY(N)=CY*8 IF CELL.C(CX-1,CY)=18 OR CELL.C(CX+1,CY)=18 THEN ENDIR(N)=RND(1) ELSE ENDIR(N)=RND(1)+2 END IF SPRITE.A 8+N,(5,0,0,0,0) ADD NEXTEN,1,0 TO MAXEN END SUB SUB UPDENEMIES FOR I=0 TO MAXEN CALL UPDENEMY(I) NEXT I END SUB SUB UPDENEMY(N) X=ENX(N) IF X=0 THEN EXIT SUB Y=ENY(N) IF Y