'NOT SID MEIER'S BREAKOUT 'BY MARTIN (MOECHOFE) MAUCHAUFFEE 2018-9 'REV27ALPHA 'TODO '==== 'TODO IMPLEMENTS BONUS BRICK 'TODO IMPLEMENTS MALUS BRICK 'TODO IMPLEMENTS SPEED INCREASE 'TODO DECREASE SPEED WHEN PASS A LEVEL 'TODO TRY TO REDUCE THE SIZE OF THE TRACE 'TODO BLOCK THE DOOR WHEN JUMPBACK 'TODO DESTROY JUMPBACK BALL WHEN JUMPING NEXT 'TODO DO NOT REDISPLAY DOOR WHEN JUMPING TO STAGE WITH NO FORCE 'TODO DISPLAY OPEN EFFECT ON DOOR 'TODO DISPLAY LOCKED EFFECT ON DOOR 'TODO SHOW DOORANIM ALWAYS 'TODO PREVENT BRICK TO BE HIT DURING ANIM 'TODO ANIMATE THE OPTION APPEAR, TO PREVENT AUTO ACTIVATE IT. 'TODO HIDE BAT AT TITLE SCREEN 'TODO DISPLAY LAST SCORE IN TITLE SCREEN 'SPEED MANAGMENT 'REDUCE BOOST DURATION 'REMOVE MULTIBALL 'PLAY RANDOM TRACK 'REMOVE STOPNOW FEATURE 'ALLOW TO PLAY WITH 2 PLAYERS 'REDUCE STAGE LOAD CPU CONSUMPTION 'DONE '==== 'CHANGE BAT CONTROLS 'FIX SHIFTED GROUP ID 'REMOVE BROKEN GEM ASSET 'MOVE SOME CHARACTERS 'USE BG TO REDUCE CELL OPERATION AND TOKENS COUNT 'ADD AN AUTO LAUNCH CONTROL 'REDO ANGLE GIVEN BY THE BAT 'ABOUT BRICKS FORMAT '=================== 'FOR EACH BRICKS: '- 1ST BYTE ----XXXX: 16 ASSET MODELS/OPTIONS '- 1ST BYTE -XXX----: 8 PALETTE CHOICE '- 1ST BYTE 1-------: START HIDDEN '- 2ND BYTE -----XXX: 8 SCORE VALUE '- 2ND BYTE --XXX---: 8 GROUP 'CX,CY BACKGOUND CELL POSITIONS 'CT,CP BACKGROUND CELL TILE AND PALETTE 'BX,BY BRICK POSITIONS 'AX,AY BALL POSITIONS 'AA,AS BALL ANGLE AND SPEED 'AT BALL SPEED STEP 'NL ANGLE STEP LENGTH 'NX,NY ANGLE AXIS ADVANCE VALUE '================================================================== TOUCHSCREEN 'CTRL SENSIBILITY CTRLSENS=2 'BRICKS DATA (X,Y,FIELD) 'FIELD 0: BRICK TYPE/ASSET MODEL (0-15) 'FIELD 1: PALETTE 'FIELD 2: HIT BEFORE DESTROY/ACTIVATE 'FIELD 3: SCORE VALUE 'FIELD 4: GROUP 'FIELD 5+6: NEXT BRICK POSITION OF SAME GROUP 'FIELD 7: ORIGINAL HIT POINT DIM GLOBAL BRICKS(16,8,7) 'GROUP REPEAT COUNTER DIM REPEATS(6) 'BAT POSITION Y BATY=10 'LEVEL ADDR LEVELADDR=ROM(5) LEVELCOLS=10 'BALLS DATA (I,F) 'FIELD 0: STATUS: 0=NOT ACTIVE, 1=ACTIVE AND MOVING ON THE BOARD, ' >1=ACTIVE AND WAIT A NUMBER OF FRAME BEFORE BEING ' LAUNCHED OF NEXT LEVEL, <-1=ACTIVE AND ' WAITING TO JUMP TO PREV STAGE. 'FIELD 1: ANGLE 'FIELD 2: SPEED 'FIELD 3: SIGN ON X (-1: LEFT, 1: RIGHT) 'FIELD 4: SIGN ON Y (-1: UP, 1: DOWN) 'FIELD 5: SPEED STEP (1,3,5,7) 'FIELD 6: BOOST SPEED 'FIELD 7: BOOST DURATION DIM GLOBAL BALLS(1,7) SPRITE.A 0,1 SPRITE.A 1,1 'ANGLES DATA (I,FIELD) 'FIELD 0: LENGTH 'FIELD 1-2: 1ST X,Y 'FIELD 3-4: 2ND X,Y 'FIELD 5-6: 3RD X,Y 'FIELD 7-8: 4TH X,Y DIM ANGLES(11,8) RESTORE ANGLESDATA FOR I=0 TO 11 FOR J=0 TO 8 READ ANGLES(I,J) NEXT J NEXT I DIM HITTOANGLE(10) RESTORE HITDATA FOR I=0 TO 10 READ HITTOANGLE(I) NEXT I 'SCORES VALUES DIM SCORES(7) DIM BONUSS(7) RESTORE SCORESDATA FOR I=0 TO 7 READ SCORES(I),BONUSS(I) NEXT I 'NUMBER OF SPRITES USED BY THE FADIN LINE BEHIND THE BALLS TRACENUM=54 'BALL TRACE (I,FIELD) 'FIELD 0: CURRENT DELAY 'FIELD 1: INITIAL DELAY DIM TRACES(TRACENUM-1,1) 'BRICK COORD TO CLEAR (I,FIELD) 'FIELD 0: X 'FIELD 1: Y DIM TOCLEAR(3,1) 'BECAUSE TIMER FAIL WHEN USING WAIT TICK=0 'ANIMATION STEP (I,FIELD) 'FIELD 0: BRICK X 'FIELD 1: BRICK Y 'FIELD 2: ANIM TYPE '0: NOT USED '1: RESHOW AFTER DELAY '2: HIDE AFTER DELAY 'FIELD 3: ANIM STEP OR DELAY DIM ANIMS(15,3) ANIMNEXT=-1 'GROUPS LINKED LIST (GROUPID,FIELD) 'FIELD 0-1: BRICK POSITION DIM GROUPS(6,1) 'NUMBER OF ACTIVE BRICK IN THE BOARD DIM GROUPSCOUNTER(6) DIM GROUPSINITIAL(6) 'PLAYER (I,FIELD) 'FIELD 0: LIFE COUNT 'FIELD 1: SCORE 'FIELD 2: LETTER FLAGS 'FIELD 3: ACT DIM PLAYERS(1,3) 'FOR CURRENT GAME SESSION GLOBAL SCORE,BONUS 'LIST OF LEVELS FOR THE SESSION DIM LEVELIDS(31) 'PACKED CACHED LEVEL DIM CACHED$(7) GLOBAL TITLEX,TITLEY,TITLEPAL 'SFX VOICE SFX=0 'MUSIC TRACK IN THE DB DIM VOICES(1) VOICES(0)=-1 VOICES(1)=-1 'NUM OF TRACK GROUPS TRACKGROUPSNUM=5 'TRACKS DATA RESTORE TRACKDATA DIM TRACKS(2*TRACKGROUPSNUM-1) FOR I=0 TO 2*TRACKGROUPSNUM-1 READ TRACKS(I) NEXT I LASTTRACK=-1 STOPNOW=0 '================================================================== GOTO YYY FORCE=7 GOSUB PACK TTT: 'GOSUB PACK 'WAIT VBL GOSUB UNPACK 'WAIT VBL GOTO TTT YYY: GOTO TITLESCREEN ENDGAME: GOTO TITLESCREEN PAUSE NEWGAME: 'CLEAR BALL TRACES FOR I=0 TO TRACENUM-1 SPRITE.A 7+I,1 NEXT I TRACENEXT=-1 'CLEAR THE BRICK TO CLEAR TABLE, NORMALLY NOT NEEDED. FOR I=0 TO 3 TOCLEAR(I,0)=-1 NEXT I 'RANDOMIZE LIST OF LEVEL ID FOR I=0 TO 31 LEVELIDS(I)=-1 NEXT I 'GET NUMBER OF LEVELS C=PEEK(ROM(4)) FOR I=1 TO C _PICKALEVELID: J=INT(RND*C) 'CHECK IF THE LEVEL HAS BEEN PICKED ALREADY P=0 FOR K=0 TO 31 IF LEVELIDS(K)=J THEN P=-1 NEXT K 'PICK AND OTHER LEVEL ID IF P THEN GOTO _PICKALEVELID 'PLACE THE PICKED ID LEVELIDS(I-1)=J NEXT I 'CLEAR PLAYERS FOR I=0 TO PLAYERCOUNT-1 PLAYERS(I,0)=3 PLAYERS(I,1)=0 PLAYERS(I,2)=0 PLAYERS(I,3)=0 NEXT I 'CLEAR CACHED FOR I=0 TO 7 CACHED$(I)="" NEXT I CURRPLAYER=-1 GOTO NEXTPLAYER NEXTPLAYER: TRACE "=NEXTPLAYER" CURRPLAYER=(CURRPLAYER+1) MOD PLAYERCOUNT 'CHECK LIFE NUM IF PLAYERS(CURRPLAYER,0)=0 THEN 'CHECK OTHER PLAYER LIFE NUM C=0 FOR P=0 TO PLAYERCOUNT IF PLAYERS(P,0)>0 THEN C=-1 NEXT P IF C THEN GOTO NEXTPLAYER GOTO ENDGAME END IF 'RETRIEVE PLAYER STATUS BALLSc=PLAYERS(CURRPLAYER,0) SCORE=PLAYERS(CURRPLAYER,1) LETTERS=PLAYERS(CURRPLAYER,2) CURRACT=PLAYERS(CURRPLAYER,3) CURRSTAGE=-1 BONUS=0 MULTI=1 GOSUB NEXTSTAGE GOTO STARTPLAY NEXTSTAGE: TRACE "=NEXTSTAGE" CURRSTAGE=CURRSTAGE+1 IF CURRSTAGE=4 THEN GOTO NEXTACT 'RETRIEVE THE LEVELID I=CURRACT*4+CURRSTAGE CURRLEVEL=LEVELIDS(I) IF CURRLEVEL=-1 THEN GOTO WINGAME 'CHECK IF ITS IN CACHE J=CURRPLAYER*4+CURRSTAGE GOSUB RESETLEVEL 'LOAD FROM CACHE IF CACHED$(J)<>"" THEN PACKED$=CACHED$(J) GOSUB UNPACK 'LOAD FROM ROM ELSE GOSUB LOADLEVEL END IF RETURN PREVSTAGE: TRACE "=PREVSTAGE" CURRSTAGE=CURRSTAGE-1 IF CURRSTAGE=-1 THEN GOTO BALLLOST 'RETREIVE THE LEVELID I=CURRACT*4+CURRSTAGE CURRLEVEL=LEVELIDS(I) J=CURRPLAYER*4+CURRSTAGE GOSUB RESETLEVEL 'LOAD FROM CACHE PACKED$=CACHED$(J) GOSUB UNPACK RETURN STORELEVEL: 'STORE LEVEL IN CACHE IF CURRSTAGE>=0 THEN J=CURRPLAYER*4+CURRSTAGE GOSUB PACK CACHED$(J)=PACKED$ END IF RETURN JUMPNEXTORPREV: FOR J=0 TO 10 TRACE J GOSUB UPDATEDOORANIM GOSUB UPDATETRACE GOSUB UPDATEANIMS WAIT VBL NEXT J GOSUB STORELEVEL IF BALLTONEXT>0 THEN TRACE "=JUMPNEXT" GOSUB NEXTSTAGE ELSE TRACE "=JUMPBACK" GOSUB PREVSTAGE END IF GOSUB DRAWDOOR GOSUB DRAWBOTTOM GOSUB DRAWBRICKS BALLTONEXT=0 BALLTOPREV=0 FOR B=0 TO 1 C=BALLS(B,0) IF C<0 THEN BALLS(B,0)=-C NEXT B GOTO PLAYLOOP NEXTACT: TRACE "=NEXTACT" 'CLEAR CACHED FOR THE CURRENT USER J=CURRPLAYER*4 FOR I=J TO J+4 CACHED$(I)="" NEXT I CURRACT=CURRACT+1 PLAYERS(CURRPLAYER,3)=CURRACT CURRSTAGE=-1 GOTO JUMPNEXTORPREV '================================================================== '================================================================== 'FOR EACH BRICKS '1ST BYTE: %----XXXX BRICK TYPE ASSET MODEL '1ST BYTE: %-XXX---- BRICK PALETTE '2ND BYTE: %-----XXX BRICK HIT POINTS '2ND BYTE: %--XXX--- BRICK SCORE BASE '3RD WORD: %XXXXXXXX XY-ID OF THE NEXT BRICK IN SAME GROUP '4TH WORD: %-----XXX BRICK GROUP '4TH WORD: %--XXX--- ORIGINAL HIT POINT PACK: TRACE "=PACK" PACKED$="" 'PACK THE DOOR FORCE PACKED$=PACKED$+CHR$(FORCE+1) 'PACK THE GROUPS LINKED LIST FIRST ENTRY FOR I=0 TO 6 IF GROUPS(I,0)=-1 THEN V=255 ELSE V=GROUPS(I,0)+GROUPS(I,1)*17 IF V=0 THEN V=254 END IF PACKED$=PACKED$+CHR$(V) 'AND BRICKS COUNTER PACKED$=PACKED$+CHR$(GROUPSCOUNTER(I)+1) PACKED$=PACKED$+CHR$(GROUPSINITIAL(I)+1) PACKED$=PACKED$+CHR$(REPEATS(I)+1) NEXT I WAIT VBL 'PACK BRICKS STATUS FOR X=0 TO 16 FOR Y=0 TO 8 V=128 V=V+(BRICKS(X,Y,0) AND %1111) V=V+((BRICKS(X,Y,1) AND %111)*16) PACKED$=PACKED$+CHR$(V) V=128 V=V+(BRICKS(X,Y,2) AND %111) V=V+((BRICKS(X,Y,3) AND %111)*8) PACKED$=PACKED$+CHR$(V) IF BRICKS(X,Y,5)=-1 THEN V=255 ELSE V=BRICKS(X,Y,5)+BRICKS(X,Y,6)*17 IF V=0 THEN V=254 END IF PACKED$=PACKED$+CHR$(V) '4TH WORD: %-----XXX BRICK GROUP '4TH WORD: %--XXX--- ORIGINAL HIT POINT V=128 V=V+(BRICKS(X,Y,4) AND %111) V=V+((BRICKS(X,Y,7) AND %111)*8) PACKED$=PACKED$+CHR$(V) IF Y MOD 5=4 THEN WAIT VBL NEXT Y WAIT VBL NEXT X RETURN UNPACK: TRACE "=UNPACK" 'UNPACK THE FORCE FORCE=ASC(PACKED$)-1 PACKED$=RIGHT$(PACKED$,LEN(PACKED$)-1) 'UNPACK GROUPS LINKED LIST AND COUNTER FOR I=0 TO 6 V=ASC(PACKED$) AND %11111111 PACKED$=RIGHT$(PACKED$,LEN(PACKED$)-1) IF V=254 THEN V=0 IF V=255 THEN GROUPS(I,0)=-1 ELSE GROUPS(I,0)=V MOD 17 GROUPS(I,1)=V\17 END IF GROUPSCOUNTER(I)=ASC(PACKED$)-1 PACKED$=RIGHT$(PACKED$,LEN(PACKED$)-1) GROUPSINITIAL(I)=ASC(PACKED$)-1 PACKED$=RIGHT$(PACKED$,LEN(PACKED$)-1) REPEATS(I)=ASC(PACKED$)-1 PACKED$=RIGHT$(PACKED$,LEN(PACKED$)-1) NEXT I WAIT VBL 'UNPACK BRICKS FOR X=0 TO 16 FOR Y=0 TO 8 V=ASC(PACKED$) PACKED$=RIGHT$(PACKED$,LEN(PACKED$)-1) BRICKS(X,Y,0)=V AND %1111 BRICKS(X,Y,1)=(V AND %1110000)/16 V=ASC(PACKED$) PACKED$=RIGHT$(PACKED$,LEN(PACKED$)-1) BRICKS(X,Y,2)=V AND %111 BRICKS(X,Y,3)=(V AND %111000)/8 V=ASC(PACKED$) AND %11111111 PACKED$=RIGHT$(PACKED$,LEN(PACKED$)-1) IF V=254 THEN V=0 IF V=255 THEN BRICKS(X,Y,5)=-1 ELSE BRICKS(X,Y,5)=V MOD 17 BRICKS(X,Y,6)=V\17 END IF V=ASC(PACKED$)-128 '4TH WORD: %-----XXX BRICK GROUP '4TH WORD: %--XXX--- ORIGINAL HIT POINT PACKED$=RIGHT$(PACKED$,LEN(PACKED$)-1) BRICKS(X,Y,4)=V AND %111 BRICKS(X,Y,7)=(V AND %111000)/8 IF Y MOD 5=4 THEN WAIT VBL NEXT Y WAIT VBL NEXT X RETURN LOADLEVEL: TRACE "=LOADLEVEL" A=CURRLEVEL*6+1+ROM(4) LEVELFILE=PEEK(A) LEVELADDR=PEEK(A+1)*255+PEEK(A+2) LEVELSIZE=PEEK(A+3)*255+PEEK(A+4) LEVELCOLS=PEEK(A+5) A=LEVELADDR+ROM(LEVELFILE) FOR G=0 TO 6 R=PEEK(A) IF R=0 THEN V=1 ELSE IF R=1 THEN V=2 ELSE IF R=2 THEN V=5 ELSE IF R=3 THEN V=9 END IF REPEATS(G)=V A=A+1 NEXT G FOR X=16 TO 16-LEVELCOLS+1 STEP -1 FOR Y=0 TO 8 F=PEEK(A) S=PEEK(A+1) T=F AND %00001111 IF T=2 OR T=8 OR T>=10 THEN W=2 ELSE IF T=5 THEN W=6 ELSE W=1 END IF G=((S AND %00111000)/8)-1 H=-(F AND %10000000)/128 BRICKS(X,Y,0)=T BRICKS(X,Y,1)=(F AND %01110000)/16 IF H THEN BRICKS(X,Y,2)=0 ELSE BRICKS(X,Y,2)=W END IF BRICKS(X,Y,3)=S AND %111 BRICKS(X,Y,4)=G+1 BRICKS(X,Y,7)=W IF G>=0 THEN IF NOT H THEN GROUPSCOUNTER(G)=GROUPSCOUNTER(G)+1 GROUPSINITIAL(G)=GROUPSINITIAL(G)+1 END IF IF GROUPS(G,0)>=0 THEN BRICKS(X,Y,5)=GROUPS(G,0) BRICKS(X,Y,6)=GROUPS(G,1) ELSE BRICKS(X,Y,5)=-1 END IF GROUPS(G,0)=X GROUPS(G,1)=Y END IF A=A+2 NEXT Y NEXT X FORCE=7 RETURN RESETLEVEL: TRACE "=RESETLEVEL" 'RESET GROUPS FOR I=0 TO 6 REPEATS(I)=0 GROUPS(I,0)=-1 GROUPSCOUNTER(I)=0 GROUPSINITIAL(I)=0 NEXT I 'RESET BRICKS FOR X=16 TO 0 STEP -1 FOR Y=0 TO 8 BRICKS(X,Y,0)=0 BRICKS(X,Y,1)=0 BRICKS(X,Y,2)=0 BRICKS(X,Y,3)=0 BRICKS(X,Y,4)=0 BRICKS(X,Y,5)=0 BRICKS(X,Y,6)=0 BRICKS(X,Y,7)=0 NEXT Y NEXT X RETURN '================================================================== BALLLOST: TRACE "=BALLLOST" FOR II=1 TO 50 GOSUB UPDATETRACE WAIT 1 NEXT II GOTO COMPUTESCORE WINGAME: TRACE "=WINGAME" FOR II=1 TO 50 GOSUB UPDATETRACE WAIT VBL NEXT II 'ADD BALL TO BONUS FOR II=BALLSc TO 1 STEP -1 BALLSc=BALLSc-1 BONUS=BONUS+1000 GOSUB DRAWLIFE GOSUB DRAWSCORE WAIT 50 NEXT II PLAYERS(CURRPLAYER,0)=0 WAIT 50 GOTO COMPUTESCORE COMPUTESCORE: TRACE "=COMPUTESCORE" B$=STR$(BONUS) B=LEN(B$) FOR I=1 TO B V$=RIGHT$(B$,1) B$=LEFT$(B$,B-I) V=VAL(V$) T=1*10^(I-1) FOR J=1 TO V BONUS=BONUS-T SCORE=SCORE+T*MULTI GOSUB DRAWSCORE WAIT 4+I*2 NEXT J WAIT 4 NEXT I WAIT 50 GOTO NEXTPLAYER '================================================================== STARTPLAY: TRACE "=STARTPLAY" RANDOMIZE TIMER TICK=0 BALLTONEXT=0 BALLTOPREV=0 GOSUB DRAWWALLS GOSUB DRAWDOOR GOSUB DRAWBOTTOM GOSUB DRAWBRICKS C=0 FOR B=0 TO 1 BALLS(B,0)=0 NEXT B TM=0 SPRITE.A 2,1 SPRITE.A 3,1 LC=0 LT=0 PLACEBALL: GOSUB CTRLBAT SPRITE 0,12,BATY+9,C GOSUB DRAWBAT GOSUB UPDATEDOORANIM WAIT VBL TICK=(TICK+1) MOD 5184000 LC=LC+1 IF TICK=6 THEN BALLSc=BALLSc-1 PLAYERS(CURRPLAYER,0)=BALLSc GOSUB DRAWLIFE C=127 END IF IF TOUCH THEN IF LC=40 OR LC=80 THEN TRACK 1,SFX SFX=(SFX+1) MOD 2 END IF IF LC>=40 AND LC<=48 THEN LT=70+(LC-40)\3 ELSE IF LC=49 THEN LT=0 ELSE IF LC>=80 AND LC<=88 THEN LT=102+(LC-80)\3 ELSE IF LC=89 THEN LT=0 ELSE IF LC=120 THEN TRACK 3,SFX SFX=(SFX+1) MOD 2 CALL NEWBALL(13,BATY+10,6,2,1,1) 'CALL NEWBALL(13,BATY+10,11,2,1,1) GOTO PLAYLOOP END IF IF LT>0 THEN SPRITE 2,16,48,LT SPRITE 3,16,56,LT+16 ELSE SPRITE OFF 2 SPRITE OFF 3 END IF ELSE LC=0 SPRITE OFF 2 SPRITE OFF 3 END IF GOTO PLACEBALL PLAYLOOP: GOSUB UPDATEDOORANIM GOSUB CTRLBAT GOSUB DRAWBAT GOSUB UPDATETRACE GOSUB UPDATEBALL GOSUB UPDATEANIMS 'GOSUB MUSICFOLLOW WAIT VBL TICK=(TICK+1) MOD 5184000 IF STOPNOW>0 THEN WAIT STOPNOW STOPNOW=0 END IF GOTO PLAYLOOP '================================================================== BRICKTOCELL: R=BY MOD 2 CX=BX+2 CY=BY*2-(BY\2) BG R RETURN DRAWBRICKS: FOR BX=16 TO 0 STEP -1 FOR BY=0 TO 8 GOSUB DRAWBRICK NEXT BY NEXT BX RETURN DRAWBRICK: ATTR BRICKS(BX,BY,1)+1 GOSUB BRICKTOCELL BT=BRICKS(BX,BY,0) BH=BRICKS(BX,BY,2) IF BT>=10 AND BH>1 THEN CT=1+R*32 ELSE IF BT=8 THEN IF BH=1 THEN CT=1+R*32 ELSE CT=0 ELSE IF BT>=10 THEN ATTR 1 IF BH>0 THEN CT=BT+R*32 ELSE CT=0 END IF END IF CELL CX,CY,CT CELL CX,CY+1,CT+16 'DEBUG GROUP 'TT$=STR$(BRICKS(BX,BY,4)) 'IF BRICKS(BX,BY,0)>0 THEN 'TEXT CX,CY+1-(BY MOD 2),TT$ 'END IF 'DEBUG GROUP COUNT 'GG=BRICKS(BX,BY,4) 'IF GG>0 THEN 'TT$=STR$(GROUPSCOUNTER(GG-1)) 'TEXT CX,CY+1-(BY MOD 2),TT$ 'END IF RETURN DRAWHIT: ATTR 1 GOSUB BRICKTOCELL CT=69+R*32 CELL CX,CY,CT CELL CX,CY+1,CT+16 RETURN DRAWWALLS: BG 1 FOR CX=0 TO 19 ATTR 0 CELL CX,0,89 CELL CX,14,105 CELL CX,15,121 NEXT CX BG 0 CELL 19,0,89 RETURN DRAWDOOR: BG 1 C=126 IF FORCE=0 THEN C=125 FOR CY=0 TO 13 CELL 19,CY,C NEXT CY RETURN DRAWBOTTOM: BG 0 ATTR 0 TEXT 0,14,"! "+CHR$(34)+"#$% &'() *+,-" CELL 1,14,218+CURRPLAYER TEXT 0,15," @ " CELL 0,15,CURRACT+209 CELL 2,15,CURRSTAGE+209 TEXT 4,15,STR$(SCORE) TEXT 10,15,STR$(BONUS) GOSUB DRAWFORCE GOSUB DRAWMULTI GOSUB DRAWLIFE RETURN DRAWLIFE: BG 0 ATTR 1 C=0 IF BALLSc>=2 THEN C=206 ELSE IF BALLSc=1 THEN C=207 END IF CELL 2,14,C C=0 IF BALLSc=3 THEN C=207 CELL 3,14,C RETURN DRAWMULTI: BG 0 ATTR 0 CELL 14,14,217+MULTI RETURN DRAWFORCE: BG 0 ATTR 0 F=FORCE X=16 FOR X=16 TO 19 IF F>=2 THEN C=141 ELSE IF F>=1 THEN C=142 ELSE IF F=0 AND FORCE>0 THEN C=143 ELSE C=0 END IF CELL X,15,C F=F-2 NEXT X RETURN S$=" " IF FORCE>=7 THEN S$="XXXY" ELSE IF FORCE=6 THEN S$="XXXZ" ELSE IF FORCE=5 THEN S$="XXY " ELSE IF FORCE=4 THEN S$="XXZ " ELSE IF FORCE=3 THEN S$="XY " ELSE IF FORCE=2 THEN S$="XZ " ELSE IF FORCE=1 THEN S$="Y " END IF BG 0 ATTR 0 TEXT 16,15,S$ RETURN DRAWSCORE: BG 0 ATTR 0 TEXT 4,15,STR$(SCORE) TEXT 10,15,STR$(BONUS) RETURN DRAWBAT: SPRITE.A 6,128+1 SPRITE 6,-8,BATY,77 RETURN '================================================================== CTRLBAT: IF TOUCH THEN BATY=MIN(92,MAX(3,TOUCH.Y-9)) END IF RETURN SUB NEWBALL(BX,BY,A,S,SX,SY) SB=0 FOR B=0 TO 1 IF BALLS(B,0)=0 THEN SB=-1 BALLS(B,0)=1 BALLS(B,1)=A BALLS(B,2)=S BALLS(B,3)=SX BALLS(B,4)=SY BALLS(B,5)=1 BALLS(B,6)=0 BALLS(B,7)=0 'SPRITE.A B,1 SPRITE B,BX-1,BY-1,127 EXIT SUB END IF NEXT B IF NOT SB THEN SCORE=SCORE+1000 GOSUB DRAWSCORE END IF END SUB SUB DELBALL(B) BALLS(B,0)=0 SPRITE OFF B END SUB UPDATEBALL: 'FOR EACH ACTIVE BALL FOR B=0 TO 1 AI=BALLS(B,0) IF AI>1 THEN BALLS(B,0)=AI-1 ELSE IF AI=1 THEN 'GET FIELDS AX=SPRITE.X(B)+1 AY=SPRITE.Y(B)+1 AS=BALLS(B,2) AH=BALLS(B,3) AV=BALLS(B,4) AT=BALLS(B,5) AD=BALLS(B,7) 'ADD BOOST IF AD>0 THEN AD=AD-1 OS=BALLS(B,6) AS=MIN(8,AS+OS) IF AD=0 AND OS>0 THEN BALLS(B,6)=OS-1 AD=15 END IF BALLS(B,7)=AD END IF 'FOR EACH SPEED STEP FOR I=1 TO AS 'GET ANGLE DIRECTION AA=BALLS(B,1) L=ANGLES(AA,0)*2 NX=ANGLES(AA,AT) NY=ANGLES(AA,AT+1) AT=AT+2 IF AT>L THEN AT=1 DX=NX*AH DY=NY*AV 'RESULT DIRECTION FOR THIS BALL AT THIS STEP CANX=1 CANY=1 'PROJECTED POSITION AFTER MOVE TARGETX=AX+DX TARGETY=AY+DY 'TEST IF COLLIDE ON WALL IF TARGETY=111 OR TARGETY=3 THEN CANY=-1 END IF 'TEST IF COLLIDE ON DOOR IF TARGETX=151 THEN IF FORCE>0 THEN FORCE=MAX(0,FORCE-1) TRACK 4,SFX SFX=(SFX+1) MOD 2 GOSUB DRAWDOOR GOSUB DRAWFORCE CANX=-1 OY=(TARGETY-4)\8 BG 1 ATTR 1 ODI=90 FOR OYY=OY TO 0 STEP -1 CELL 19,OYY,ODI IF ODI<92 THEN ODI=ODI+1 ELSE ODI=126 NEXT OYY ODI=106 FOR OYY=OY+1 TO 13 CELL 19,OYY,ODI IF ODI<108 THEN ODI=ODI+1 ELSE ODI=126 NEXT OYY END IF END IF 'TEST IF GO NEXT LEVEL IF TARGETX>162 THEN BALLTONEXT=BALLTONEXT+1 BALLS(B,0)=-BALLTONEXT*20 SPRITE B,-3,, AX=-3 DX=0 AS=0 'CHECK TO JUMP NEXT JN=-1 FOR K=0 TO 1 IF BALLS(K,0)=1 THEN JN=0 NEXT K IF JN THEN GOTO JUMPNEXTORPREV END IF 'TEST IF COLLIDE WITH BAT E=9-(TARGETY-BATY) 'IF TARGETX=11 AND AH<0 AND TOUCH THEN 'CANX=-1 'ELSE IF TARGETX=11 AND AH<0 THEN 'WAIT VBL 'WAIT 100 'CANX=-1 IF E>=0 AND E<11 THEN AH=1 AV=-1 BALLS(B,1)=HITTOANGLE(E) PLAY SFX,53 SOUND 0 SFX=(SFX+1) MOD 2 ELSE IF E>=-11 AND E<0 THEN E=ABS(E+1) AH=1 AV=1 BALLS(B,1)=HITTOANGLE(E) PLAY SFX,53 SOUND 0 SFX=(SFX+1) MOD 2 END IF ELSE IF TARGETX>8 AND TARGETX<11 AND AH<0 AND 999=666 THEN 'TRACE TARGETY,BATY,10-(TARGETY-BATY) AH=1 BALLS(B,1)=0 IF E>=-10 AND E<0 THEN AV=1 ELSE IF E>=0 AND E<10 THEN AV=-1 END IF 'BOUND UP 'IF TARGETY>=BATY AND TARGETY=0 AND RX<=16 AND RY>=0 AND RY<=8 THEN RT=BRICKS(RX,RY,0) RH=BRICKS(RX,RY,2) END IF 'DETECT IF SENSOR IS OVER THEN SPACE BETWEEN TWO BRICKS IF (TV MOD 12)=11 OR (TU MOD 8)=7 THEN ELSE 'A BRICK IS UNDER THE BALL IF RT>0 AND RH>0 THEN 'REGISTER TO HIT BRICK TOCLEAR(UVI,0)=RX TOCLEAR(UVI,1)=RY 'BALL DO NOT COLLIDE ON GEM IF RT<>9 THEN 'ADD SENSOR TO THE COLLISION SIGNATURE SIGN=SIGN+1*(2^UVI) END IF END IF END IF NEXT V NEXT U 'FOR EACH REGISTERED HIT FOR J=0 TO 3 'THE BRICK POSITION BX=TOCLEAR(J,0) BY=TOCLEAR(J,1) IF BX>=0 THEN 'CHECK FOR DOUBLOON IN THE LIST FOR K=J+1 TO 3 IF TOCLEAR(K,0)=BX AND TOCLEAR(K,1)=BY THEN TOCLEAR(J,0)=-1 BX=-1 END IF NEXT K END IF IF BX>=0 THEN BT=BRICKS(BX,BY,0) 'REDUCE HIT POINT OF THE BRICK BH=BRICKS(BX,BY,2) BH=BH-1 BRICKS(BX,BY,2)=BH 'SHOW HIT (WHITE FLASH) IF BT=9 THEN ELSE GOSUB DRAWHIT END IF ANIMNEXT=(ANIMNEXT+1) MOD 15 ANIMS(ANIMNEXT,0)=BX ANIMS(ANIMNEXT,1)=BY ANIMS(ANIMNEXT,3)=2 'WHEN HIT POINTS ARE DEPLETED IF BH=0 THEN PLAY SFX,41,2 SOUND 0 SFX=(SFX+1) MOD 2 'INCREASE SCORE SP=SCORES(BRICKS(BX,BY,3)) IF BT=9 THEN BONUS=BONUS+SP ELSE SCORE=SCORE+SP END IF GOSUB DRAWSCORE 'REMOVE THE BRICK FROM THE BOARD 'BRICKS(BX,BY,0)=0 ANIMS(ANIMNEXT,2)=2 'CHECK IF GROUP IS EMPTY G=BRICKS(BX,BY,4)-1 IF G>=0 THEN GC=GROUPSCOUNTER(G) GC=GC-1 IF GC=0 THEN 'INCREASE BONUS BONUS=BONUS+BONUSS(G) GOSUB DRAWSCORE 'DECREASE GROUP REPEAT GR=REPEATS(G) IF GR>0 THEN REPEATS(G)=GR-1 'WILL RESPAWN BRICKS FROM GROUP XX=BX YY=BY BX=GROUPS(G,0) BY=GROUPS(G,1) GC=0 WHILE BX>=0 CS=-1 'PREVENT BRICKS TO APPEAR WITH BALL INSIDE KX=(BX+2)*8 KY=BY*12+4 FOR K=0 TO 1 IF BALLS(K,0) AND SPRITE.X(K)>KX-3 AND SPRITE.X(K)KY-3 AND SPRITE.Y(K)=10 THEN BRICKS(BX,BY,0)=1 BRICKS(BX,BY,7)=1 END IF 'MAKE BRICK FROM A GROUP REAPPEAR IF CS THEN BRICKS(BX,BY,2)=BRICKS(BX,BY,7) GOSUB DRAWBRICK GC=GC+1 END IF NBX=BRICKS(BX,BY,5) NBY=BRICKS(BX,BY,6) BX=NBX BY=NBY WEND BX=XX BY=YY 'REINIT GROUPS BRICK COUNTERS GROUPSCOUNTER(G)=GC GROUPSINITIAL(G)=GC END IF ELSE GROUPSCOUNTER(G)=GC END IF END IF 'BOOSTER BRICK IF BT=4 THEN BALLS(B,6)=2 BALLS(B,7)=AD+15 END IF 'SPLITTER BRICK IF BT=6 THEN XX=BX YY=BY PP=BRICKS(BX,BY,1) SS=BRICKS(BX,BY,3) FOR BX=XX-1 TO XX+1 FOR BY=YY-1 TO YY+1 IF BX>=0 AND BY>=0 AND BX<=16 AND BY<=8 AND (BX<>XX OR BY<>YY) THEN IF BRICKS(BX,BY,0)=0 OR BRICKS(BX,BY,2)=0 THEN 'PREVENT TO SPAWN BRICK UNDER BALLS CS=-1 KX=(BX+2)*8 KY=BY*12+4 FOR K=0 TO 1 IF BALLS(K,0) AND SPRITE.X(K)>KX-3 AND SPRITE.X(K)KY-3 AND SPRITE.Y(K)0 THEN GROUPSCOUNTER(G)=GROUPSCOUNTER(G)+1 END IF GOSUB DRAWBRICK END IF END IF END IF NEXT BY NEXT BX BX=XX BY=YY END IF 'TURN BRICK IF BT=7 THEN BALLS(B,1)=(AA+6) MOD 12 END IF 'NEW BALL IF BT=11 THEN CALL NEWBALL(TARGETX,TARGETY,AA,1,-AH,-AV) END IF 'MULTI BONUS IF BT=12 THEN MULTI=MIN(MULTI+1,6) GOSUB DRAWMULTI END IF 'BONUS BRICK IF BT=14 THEN '- E: ONE RANDOM PRO EFFECT: DECREASE DOOR STRENGTH, BALL GO STRAIGHT, 3 FAST NEW BALL, BONUS +100, PASS THE DOOR (NOT AT LAST LEVEL) R=INT(RND*5) IF R=0 THEN FORCE=MAX(0,FORCE-1) GOSUB DRAWFORCE ELSE IF R=1 THEN BALLS(B,1)=11 ELSE IF R=2 THEN CALL NEWBALL(TARGETX,TARGETY,AA,6,-AH,-AV) ELSE IF R=3 THEN BONUS=BONUS+100 GOSUB DRAWSCORE END IF END IF 'MALUS BRICK '- F: ONE RANDOM CONS EFFECT: INCREASE DOOR STRENGTH, INCREASE BALL FORCE, INCREASE SPEED IF BT=15 THEN R=INT(RND*3) IF R=0 THEN FORCE=MAX(7,FORCE+1) GOSUB DRAWFORCE END IF END IF 'FLASH THE BRICK ELSE ANIMS(ANIMNEXT,2)=1 END IF TOCLEAR(J,0)=-1 END IF NEXT J 'ADD BALL DIRECTION IN THE SIGNATURE IF AH<0 THEN SIGN=SIGN+16 IF AV<0 THEN SIGN=SIGN+32 'BOUNCE ON VERTICAL SIDE IF SIGN=12 OR SIGN=44 OR SIGN=19 OR SIGN=51 THEN CANX=-1 'BOUNCE ON HORIZONTAL SIDE ELSE IF SIGN=26 OR SIGN=10 OR SIGN=53 OR SIGN=37 THEN CANY=-1 'BOUNCE AND DEVIATE ON BRICK ANGLE ELSE IF SIGN=8 OR SIGN=18 OR SIGN=36 OR SIGN=49 THEN MX=TARGETX MOD 8 MY=TARGETY MOD 12 IF MX=7 AND MY=3 THEN CANX=-1 CANY=-1 BALLS(B,1)=(AA+6) MOD 12 ELSE IF MX=7 THEN CANX=-1 ELSE CANY=-1 END IF 'DEVIATE MAYBE ON BRICK ANGLE ELSE IF SIGN=2 OR SIGN=50 OR SIGN=40 OR SIGN=24 OR SIGN=33 OR SIGN=17 OR SIGN=4 OR SIGN=52 THEN MX=TARGETX MOD 8 MY=TARGETY MOD 12 IF MX=7 AND MY=3 AND AA<5 THEN BALLS(B,1)=(AA+6) MOD 12 ELSE IF MX=7 AND MY=3 THEN ELSE IF MX=7 THEN CANX=-1 ELSE CANY=-1 END IF 'REVERSE DIRECTION ON BRICK CORNER ELSE IF SIGN=14 OR SIGN=41 OR SIGN=25 OR SIGN=55 OR SIGN=45 OR SIGN=27 OR SIGN=6 OR SIGN=22 THEN CANX=-1 CANY=-1 'BALL IS INSIDE A BRICK 'ELSE IF SIGN=5 OR SIGN=31 OR SIGN=15 THEN 'TRACE "INSIDE" 'WAIT 300 'OTHER SITUATION 'ELSE IF SIGN<>0 AND SIGN<>32 AND SIGN<>48 AND SIGN<>16 THEN 'TRACE "SIGN",SIGN 'WAIT 30 END IF 'COMPUTE NEW BALL POSITION AND DIRECTION SIDE AX=AX+DX*CANX AY=AY+DY*CANY AH=AH*CANX AV=AV*CANY 'ADD BALL TRACE EFFECT TRACENEXT=(TRACENEXT+1) MOD TRACENUM TRACES(TRACENEXT,0)=AS\2 TRACES(TRACENEXT,1)=AS\2 SPRITE 7+TRACENEXT,AX-1,AY-1,76 NEXT I 'STORE NEW DIRECTION SIDE ANS DIRECTION STEP BALLS(B,3)=AH BALLS(B,4)=AV BALLS(B,5)=AT 'STORE POSITION AND DRAW THE BALL SPRITE B,AX-1,AY-1, 'DESTROY IF BALL IS LOST IF AY<-10 OR AY>138 OR AX<-10 OR AX>170 THEN CALL DELBALL(B) END IF NEXT B RETURN UPDATETRACE: FOR I=0 TO TRACENUM-1 T=SPRITE.C(7+I) IF T>73 THEN D=TRACES(I,0) IF D>1 THEN TRACES(I,0)=D-1 ELSE TRACES(I,0)=TRACES(I,1) SPRITE 7+I,,,T-1 END IF END IF NEXT I RETURN UPDATEANIMS: FOR I=0 TO 15 A=ANIMS(I,2) D=ANIMS(I,3) IF A>0 THEN IF D>1 THEN ANIMS(I,3)=D-1 ELSE BX=ANIMS(I,0) BY=ANIMS(I,1) ANIMS(I,2)=0 IF A=1 OR A=2 THEN GOSUB DRAWBRICK END IF END IF END IF NEXT I RETURN UPDATEDOORANIM: IF TIMER MOD 3=0 THEN BG 1 ATTR 1 FOR Y=0 TO 13 T=CELL.C(19,Y) IF T=90 OR T=106 OR T=91 OR T=107 THEN CELL 19,Y,T+1 ELSE T=126 IF FORCE=0 THEN T=125-(TIMER MOD 4) CELL 19,Y,T END IF NEXT Y END IF RETURN '================================================================== INPUTNAME: CLS BG 0 INPUTLOOP: WAIT VBL GOTO INPUTLOOP TITLERANDOMCOL: C=INT(RND*4)*16+INT(RND*4)*4+INT(RND*4) IF RND>0.8 THEN PALETTE TITLEPAL,0,63,C,C AND %110110110 ELSE PALETTE TITLEPAL,0,0,C,C END IF RETURN TITLESCREEN: CLS BG 0 PALETTE 0,0,0,0,0 ATTR 0 BG COPY 0,0,16,4 TO 0,0 PALETTE 2,0,63,21,0 ATTR 2 TEXT 2,6,"TAP TO PLAY" SCROLL 0,-16,-32 TICK=0 TITLELOOP: TITLEX=0 TITLEY=0 TITLEPAL=(TITLEPAL+1) MOD 2 GOSUB TITLERANDOMCOL ATTR TITLEPAL ON VBL CALL TITLEINTER FOR I=0 TO 100 IF TAP THEN COPY ROM(1),32 TO $FF00 CLS PLAYERCOUNT=1 ON VBL OFF GOTO NEWGAME END IF 'GOSUB MUSICFOLLOW WAIT VBL TICK=(TICK+1) MOD 5184000 NEXT I GOTO TITLELOOP SUB TITLEINTER CELL TITLEX,TITLEY, TITLEY=(TITLEY+1) MOD 4 IF TITLEY=0 THEN TITLEX=TITLEX+1 IF TITLEX=16 THEN ON VBL OFF END SUB '================================================================== MUSICFOLLOW: T=TICK MOD 256 IF T=0 THEN VO=0 GOSUB PICKTRACK VO=1 GOSUB PICKTRACK END IF RETURN PICKTRACK: IF TICK MOD 1024=0 THEN TR=INT(RND*TRACKGROUPSNUM)*2 IF TR=LASTTRACK THEN TR=(TR+2) MOD TRACKGROUPSNUM VOICES(VO)=TR LASTTRACK=TR ELSE IF TICK MOD 512=0 THEN TR=VOICES(VO)+1 VOICES(VO)=TR ELSE TR=VOICES(VO) END IF TRACE "VOICES(",VO,TR,TRACKS(TR) TRACK TRACKS(TR),VO+2 RETURN '================================================================== ANGLESDATA: 'LENGTH, X,Y,X,Y,.. DATA 4,0,1,1,1,0,1,0,1 DATA 3,0,1,1,1,0,1,0,0 DATA 2,0,1,1,1,0,0,0,0 DATA 3,1,1,0,1,1,1,0,0 DATA 4,1,1,0,1,1,1,1,1 DATA 1,1,1,0,0,0,0,0,0 DATA 4,1,0,1,1,1,0,1,0 DATA 3,1,0,1,1,1,0,0,0 DATA 2,1,0,1,1,0,0,0,0 DATA 3,1,1,1,0,1,1,0,0 DATA 4,1,1,1,0,1,1,1,1 DATA 1,1,0,0,0,0,0,0,0 HITDATA: DATA 6,7,8,9,10,5,4,3,2,1,0 SCORESDATA: DATA 5,1,10,2,15,3,25,5,40,8,60,13,80,21,100,34 TRACKDATA: '2 TRACKS PER GROUP DATA 2,7,5,6,8,9,10,10,11,11 #1:MAIN PALETTES 003F0106003F2A1500362010001F0702 000E0A05003D2814002B2611003A2410 #2:MAIN CHARACTERS 00000000000000000000000000000000 00000000FEFCC0C00000000000023E3E 0000000000023E3E00000000FEFEFEFE 00000000007E424200000000FEFEC6C6 00000000E2B8F062000000001C7E7EFE 000000000002061600000000FEFEFEFE 00000000EE8888880000000000666666 00000000E6B2E64C00000000187E7EFE 00000000002A542A0000000054AA54AA 000000001028306C000000000018081C 000000007CC2829A00000000003E7E7E 000000007CC282B200000000003E7E7E 000000007CC282AA00000000003E7E7E 000000007CC2829200000000003E7E7E 000000007CC282B200000000003E7E7E 000000007CC2829200000000003E7E7E 00000000000000000000000000000000 C0C0C0C0C0C080003E3E3E3E3E3E7E00 3E3E3E3E3E3E7E00FEFEFEFEFEFEFE00 4242424242427E00C6C6C6C6C6FEFE00 460E9CB8F0624600FEFE7E7E7EFEFE00 16161616063E7E00FEFEFEFEFEFEFE00 8800EE88888888006600006666666600 E6B2184CE64C18007E7EFEFE7EFEFE00 542A542A542A540054AA54AA54AA5400 74AA5864382010000C5E747830381000 A2BA8AB282867C007E7E7E7E7E7E7C00 AAB2AABA82867C007E7E7E7E7E7E7C00 BABAAAAA82867C007E7E7E7E7E7E7C00 AABAAAAA82867C007E7E7E7E7E7E7C00 8A9A829282867C007E7E7E7E7E7E7C00 9292829282867C007E7E7E7E7E7E7C00 00000000000000000000000000000000 FEFCC0C0C0C0C0C000023E3E3E3E3E3E 00023E3E3E3E3E3EFEFEFEFEFEFEFEFE 007E424242424242FEFEC6C6C6C6C6C6 F09CB8F062460E9C0E7E7E7EFEFEFE7E 0002061616161616FEFEFEFEFEFEFEFE EE8888888800EE880066666666000066 984CE6B2184CE64C66FE7E7EFEFE7EFE 002A542A542A542A54AA54AA54AA54AA 1028306C74AA58640018081C0C5E7478 7CC2829AA2BA8AB2003E7E7E7E7E7E7E 7CC282B2AAB2AABA003E7E7E7E7E7E7E 7CC282AABABAAAAA003E7E7E7E7E7E7E 7CC28292AABAAAAA003E7E7E7E7E7E7E 7CC282B28A9A8292003E7E7E7E7E7E7E 7CC2829292928292003E7E7E7E7E7E7E 00000000000000000000000000000000 C0C08000000000003E3E7E0000000000 3E3E7E0000000000FEFEFE0000000000 42427E0000000000C6FEFE0000000000 B8F06200000000007E7EFE0000000000 063E7E0000000000FEFEFE0000000000 88888800000000006666660000000000 18B2E60000000000FE7E7E0000000000 542A54000000000054AA540000000000 38201000000000003038100000000000 82867C00000000007E7E7C0000000000 82867C00000000007E7E7C0000000000 82867C00000000007E7E7C0000000000 82867C00000000007E7E7C0000000000 82867C00000000007E7E7C0000000000 82867C00000000007E7E7C0000000000 0000000C0E3E2C2E0000007CFEC654DE 0000000C0E2E2C2E0000007CFED654D6 0000000C0E3E1C1E0000007CFEC66CEE 0000000C0E3E2C2E0000007CFECE54D6 0000000C0E1E2C2E0000007CFEEE54D6 00000000FEFCFCFC0000000000020202 003C7E6606060E1C0000000000000000 0000000000000000003C7E6606060E1C 003C7E6606060E1C003C7E6606060E1C 00000000000000000000000000000000 00400000000000000040000000000000 00000000000000000040000000000000 00400000000000000000000000000000 3366CC993366CC990000000000000000 00000000000000000000000000000000 4040404040404040A0A0A0A0A0A0A0A0 3E2E2E3C0C080000CEDED6447C381000 1E2E2E2C0C080000EED6D6547C381000 1E1E1E1C0C080000EEEEEE6C7C381000 3E2E2E2C0C080000CED6D6547C381000 3E2E2E2C0C080000C6D6D6547C381000 FCFCFCFCFCFC80000202020202027E00 38706060607E7E000000000000000000 000000000000000038706060607E7E00 38706060607E7E0038706060607E7E00 0000FF0000000000FFFF000000000000 40A0D0E8F4FAFDFEBF5F2F170B050201 BFDFAF978B8582817F7F7F7F7F7F7F7F C0A0D0E8F4FAFDFE40205068747A7D7E 3366CC993366CC990000000000000000 00000000000000000000000000000000 4040404040404040A0A0A0A0A0A0A0A0 0C0E3E2C2E3E2E2E7CFEC654DECEDED6 0C0E2E2C2E1E2E2E7CFED654D6EED6D6 0C0E3E1C1E1E1E1E7CFEC66CEEEEEEEE 0C0E3E2C2E3E2E2E7CFECE54D6CED6D6 0C0E1E2C2E3E2E2E7CFEEE54D6C6D6D6 FEFCFCFCFCFCFCFC0002020202020202 00387818181818180000000000000000 00000000000000000038781818181818 00387818181818180038781818181818 FFFFFFFFFFFFFFFF00FFFFFFFFFFFFFF FDFAF4E8D0A0408002050B172F5FBF7F 82858B97AFDFBFFF7F7F7F7F7F7F7F7F FDFAF4E8D0A0C0807D7A746850204000 3366CC993366CC990000000000000000 00000000000000000000000000000000 4040404000000000A0A0A0A000000000 3C0C080000000000447C381000000000 2C0C080000000000547C381000000000 1C0C0800000000006C7C381000000000 2C0C080000000000547C381000000000 2C0C080000000000547C381000000000 FCFC80000000000002027E0000000000 18181818187E7E000000000000000000 000000000000000018181818187E7E00 18181818187E7E0018181818187E7E00 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 7C7E7C08000000087C7E7C0800000008 7C08000000087C7E7C08000000087C7E 000000087C7E7C08000000087C7E7C08 00087C7E7C08000000087C7E7C080000 80808080808080800000000000000000 40E0400000000000A000A00000000000 00000000000000000000D1FBDBDBD900 00000000000000000000CF666666C600 000000000000000000000E181E061C00 00000000000000000000F7666666F700 0000000000000000000086C7C6C68600 00000000000000000000C7ECAEACAF00 00000000000000000000793333337B00 00000000000000000000DE1B9E1ADB00 000000000000000000004E581E061C00 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0077777777770000FF8888888888FF00 0070707070700000F88888888888F800 00000000000000008080808080808000 0000000E6640406600FFFFF3F3FFFFF3 0000000005050100000000CFCF0F0FCF 0000000080809C14000000F0F03C3CF0 000000001F15515C0000003F3FF0F0FC 00000000071F16070000003F3F3C3C3F 0000000081818181000000C3C3F3F3F3 00000070E77525E5000000CFCFFCFCFC 0000070707071F07000F0F3C3C3C3C3C 000080808181E18100C0C0F3F3F3F3F3 00000070F07070F1000000CFCFCFCFCF 00000000392920300000003F3F0F0F0F 00000000C04040C0000000C0C0000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0E00244200000000F3FFFFFFFF0000C5 000000010F000000CFCFCF0F0F0000BB 1010141C00000000F030303C3C000056 1C51551F00000000FCF0F0FFFF00006C 000000203C0000003F3C3C3C3C0000DA 20300082F3000000F3F3F3F3F30000CD 04040507C0000000FCCCCCCFCF000008 04343427000000003C3C3C0F0F000030 80B0B09000000000F3F3F3C0C0000083 7160600407000000CFCFCFFFFF000004 30303F393F0000000F0F0F0F0F000030 C0C0C0C0C000000000000000000000D8 000000000000000000000000000000DD 0000000000000000000000000000006C 000000000000000000000000000000DB 000000000000000000000000000000B0 00000000000000004DCDCD00DA9A929B 0000000000000000B92BAB006D654C6D 000000000000000066545600B236A6B6 0000000000000000686C68004D6D696D 0000000000000000D8DA9A002BAB3AAB 0000000000000000A9ACAD006C6A4A6A 000000000000000004494D006D2D242D 000000000000000010346400B096A0B0 000000000000000082D152007253A3E3 0000000000000000084D4D0053732322 0000000000000000102024006A2A6A6C 000000000000000054D4D4008A8A8AC4 00000000000000005CD5D5009854D4D4 0000000000000000446C2C005BDAD2DA 00000000000000008BDA5A002B292B13 0000000000000000B0A0B0004A4C4A6A 00000000000000000000000000000000 00003C363E3030000000000000000000 000039637B1B71000000000000000000 0000CE1B1B1BCE000000000000000000 0000786D79696D000000000000000000 0000E080C080E0000000000000000000 00006C7E6A6A6A000000000000000000 0000D9DBDBDB7B000000000000000000 00003D181818D9000000000000000000 0000E0C0CAC4EA000000000000000000 00003963736361000000000000000000 0000CF6D6F6DCD000000000000000000 00001CB131319D000000000000000000 0000E080C080E0000000000000000000 00000022772200000000005500550000 00000020702000000000005000500000 00386C6C6C3800007CC6929292C67C00 00183818183C00003C64446466427E00 00384C38607C00007CC6B2C69E82FE00 00384C1C4C3800007CC6B2E2B2C67C00 003064647C04000078CE9A9A82FA0E00 007C603C4C380000FE829EC2B2C67C00 00386078643800007CC49C869AC67C00 007C4C1818180000FE82B2E624243C00 00386C7C6C3800007CC6928292C67C00 00386C3C0C3800007CC692C272467C00 00007030303078000000000000000000 00007018306078000000000000000000 00007018381870000000000000000000 00002060687808000000000000000000 00007860381870000000000000000000 00003860786870000000000000000000 000000380000000000007C447C000000 FEFEEEFCECECC800FE8692829292FE00 FEFEEEF8EEFCC000FE8692869282FE00 FEFEE0EEEEFEC000FEC29E9E9E82FE00 FEFEEEECECFCC000FE8692929282FE00 FEFEE0FEE2FEC000FEC29E869E82FE00 FEFEE0FEE2EECE00FEC29E869E9EFE00 FEFEE0EEE4FCC000FEC29E929A82FE00 FEFEEEFCECECC800FE9692829292FE00 FEFEF2F6F6FEC200FE86CECECE86FE00 FEFEF8FAFAFAE200FEC2E6E6A6C6FE00 FEFEECF8EEECC800FE9292869292FE00 FEEEEEEEE6FCC000FEDE9E9E9A82FE00 FEFEFCFCECECC800FEBA92829292FE00 FEFEFEECECECC800FE9682929292FE00 FEFEECECECF8C200FEC292929286FE00 FEFEEEFCE0EECE00FE8692829E9EFE00 FEFEECECE8FEC000FEC292929682FE00 FEFEEEF8EEECC800FE8692869292FE00 FEFEE0FECEFCC000FEC29E86F282FE00 FEFEF8FAFAFAE200FE82C6C6C6C6FE00 FEFEECECFCF8C200FE9292928286FE00 FEFEECFCF8F2E600FE92928286CEFE00 FEFEECFCFCE8EA00FE92928282D6FE00 FEFEECF8EEECC000FE9292C69292FE00 FEFEFCF8FAFAE200FE9282C6C6C6FE00 FEFEDCF8F2FCC000FE82E2C68E82FE00 0000E5B6F6B6B6000000000000000000 00009BDEDEDADB000000000000000000 00007A3333337B000000000000000000 0000C76C6D6C67000000000000000000 00000000808080000000000000000000 #3:MAIN BG 00001410800081008200830084008500 86008700880000010000000000000000 00000000000000000000000090009100 92009300940095009600970098009900 9A009B00000000000000000000000000 00000000A000A100A200A300A400A500 A600A700A800A900AA00AB00AC00AD00 AE00AF000000000000000000B000B100 B200B300B400B500B600B700B800B900 BA00BB00BC00BD00BE00BF0000000000 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 #4:NSMP! ADDRESS 0C05000200BB0A0500BD00DF0C05019D 00A90905024700DF0C05032700DF0C05 040700730605047A00F10D05056C00DF 0C05064C01040E05075000BB0A05080C 00DF0C0508EB00DF0C #5:NSMP! LEVELS 09CB0303010200000041086111141A00 00510352035203282428240000410861 11141A00005A03520352032824C80900 0041086111141A000051035203520300 00C809000041086111141A0000510352 03C8090000C809000041086111141A00 005E030000C809A925C8090000410861 11141A0000E812A925C809A925000000 0041086111141AA925E812A9250000A9 250000000041086111E812A9250000A9 250000000000000000410800000000A9 25000000000000000000000000030101 03030102083BA908A908A908083BC910 C910C910083B00001132113211320000 612A612A612A00000000113206041132 0000612A0604612A0000000011321132 113200006A2A612A612A0000083BE92A E92AE92A083BB921B921B921083B0000 31213121312100005119511951190000 00003B21060431210000511906045119 00000000312131213121000051195119 51190000883BD919D919D919883B9932 99329932883B00004110411041100000 21082108210800000000411006044110 00002108060421080000000041104110 4110000021082C082108000003030201 0300000F2C012C012C012C012C012C01 2C012C012C4123412341234123412341 23412341234123611A611A611A6A1A61 1A611A611A611A611A51115111511151 11511151115111511151112108210821 082108210821082B0821082108000000 000000000000000000000000000000A4 0BE91DA40BE91DA40BE91DA40BE91DA4 0B000000000000000000000000000000 000000C926D414C926D414C926D414C9 26D414C9260000000000000065050000 00000000050500000000000065056505 872B872B872B05058733873387336505 55051828183818281505183018381830 55056505000000000000050500000000 000065056505841A841A841A05058422 84228422650555051808181818081505 18101820181055056505000000000000 05050000000000006505650500008609 00000505000086110000650565050000 00000000050500000000000065056505 00008609000005050000861100006505 65050000000000000505000000000000 6505E90CC13CCA3CCF3CC93CCC3CCB3C C13CE914030303010101000800312941 1A010305060103411A312908000000C9 183229411A0F03411A3229C918000021 31D910C9183129411A3129C918990861 2151122231D910C9183229C918990862 21110A0A0351122131D9100000990861 21110A0A030506010351122231000062 21110A01030506010351122131D91000 0099086B21110A010351122231D91000 00B128000099086221110A2131D91000 00A13000009108000099086121000000 00D1100000C1180000B1280000000000 00E120000091080000A1300000C11800 00B1280000A1300000D1100000E12000 00E12003030303030301483D483D483D 483D483D483D483D483D483DC904C904 C904C904C904C904C904C904C9045233 52335233522B522B522B522352235223 941A941A941A941294129412940A940A 940AD131DE31D131D129DA29D129D121 DC21D121171817181718171017101710 17081708170803030103030000411800 00B12BB22BB22BB22BB12B0000110841 1941180000B12BB22BB12B0000110821 114118411941180000B12B0000110821 11110800004B18411941180000110821 111B080000E124000041184119612421 1111080000E124E224E124000061243E 2E61240000E124E224E1240000110821 116124411941180000E1240000110821 11110800004118411941180000110821 11110800009909000041184119411821 11110800009909A91299090000411841 19110800009909A9129909A912990900 0041180000000000009909A912990900 00000000000000000000000000990900 0000000000000003010301020202182C 182C182C183418341834183C183C183C 00000000000000000000000000000000 000000000000C723C723C723C723C723 C723C723C923C9234123412341234123 4D2341234123E91AE91A621A621A621A 621A621A621A621AE91AE91A621A621A 621A621A621A621A621A000000000000 0000000000000000000000000000A411 0000A4110000A4110000A41100000000 00000000000000000000000000000000 2F11211121112111211121112111A911 A9115208520852085208520852085208 D908D908520852085208520852085208 5208D908D90803030303000303AD26A2 3EA136B10EB23EB116C136C23EC11EA1 25A23DA135B10DB23DB115C135C23DC1 1DA124A23CA134B10CB23CB114CA34C2 3CC11CA123A23BA133B10BB23BB113C1 33C23BC11BA122A23AA132B10AB23AB1 12C132C23AC11AA121A239AB31B109B2 39B111C131C239C119A728A728A728B7 28B728B728C728C728C7280000000000 00000000000000000000000000000000 00000000003938000000000000000000 00000000003930000039300000000000 00000000000000000039280000000000 00000000002910000000000000000000 00490800002920000029100000000000 00490800004918000029200000000000 00000000004918000002020203030300 020C020C020C021C021C021C02140214 0214520B520B520B521B521B521B5213 52135213410A410A410A4E1A4E1A4E1A 41124112411200000000000000000000 00000000000000000000050000002935 00002935000005000000000005002926 000029350000292E0500000008000500 05000500050005000500050008000000 00000000000000000000000000000000 0000E62100000000000000000000E629 0000000000000000A431A431A4310000 00000000030303030300000128012801 28012801280128012801280128000000 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 0000 #15:MAIN SOUND 57036010002270007801F04F0AFF0000 24002126090800002800303019FE0000 7801F00F02FF00005803501D004F0000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0D0C4040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 310AE13508003807003D060000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 2E0FE12F0F00300F0000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 1A2F0000000000000000000043190000 0000000000000000163C00000000163C 00000000431900000000000000000000 163C0000000000000000000043190000 0000000000000000163C00000000152F 001D2F00431900152F001C2F00000000 380FE1390F003A0F003B0F003C0F0000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 5917E158160057150056160055170000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 3227003524003227003524003E260035 24003926003524003227003524003228 003524003E2800352400392900352400 322900352400322A003524003E2A0035 2400392B00352400322A003524003229 003524003E2700352400392700352400 2E27003224002E27003224003A270032 24003528003224002E28003224002E28 003224003A2900322400352900322400 2E29003224002E2A003224003A2A0032 2400352A003224002E2B003224002E2A 003224003A2900322400352800322400 162F0000000000000000000043190000 0000000000000000113C00000000113C 00000000431900000000000000000000 113C0000000000000000000043190000 0000000000000000113C00000000162F 001A2F00431900122F00182F00000000 1A2F0000000000000000000043190000 0000113D000000001C2F000000004117 00431900000000000000113D00000000 1D2F0000000000000000000043190000 0000113D000000001F2F000000004117 00431900000000113D00212F00000000 162F0000000000000000000043190000 0000113D00000000182F000000004117 00431900000000000000113D00000000 1A2F0000000000000000000043190000 0000113D000000001C2F000000004117 00431900000000113D001D2F00000000 113D005E47005E4B005E47004319005E 47005E4B005E4700113D005E47005E4B 005E47004319005E47005E4B005E4700 113D005E47005E4B005E47004319005E 47005E4B005E4700113D005E47005E4B 005E47004319005E47005E4B005E4700 000000113F0043190000000000000011 3F00431900000000000000113F004319 00000000000000113F00431900000000 000000113F0043190000000000000011 3F00431900000000000000113F004319 00000000000000113F00431900000000 1A2D311A2F321A2D321A2E311A2D3326 2E321A2F311A2D311C2E321C2F311C2E 311C2C321C2F31282C341C2C321C2D32 1D2F311D2E311D2F311D2C321D2F3129 2C341D2D321D2C321F2F321F2C311F2D 321F2E321F2C342B2D341F2D311F2F32 325F00000000355F000000003E5F0000 0000325F00355F000000003E5F000000 00325F00355F000000003E5F00000000 3E5F000000003E540000000035530000 00003E54000000003552000000003E53 000000003551000000003E5200000000 2E5F00000000325F000000003A5F0000 00002E5F00325F000000003A5F000000 002E5F00325F000000003A5F00000000 3A5F000000003A540000000032530000 00003A54000000003252000000003A53 000000003251000000003A5200000000