'MINESWEEPER 2022-06-23 BY NATHANIEL BABIAK. REPEAT 'BOX STATES. "DN" MEANS DOWN, "X" MEANS WRONG. GLOBAL B_NONE, B_UP, B_DOWN, B_FLAG, B_DNFLAG, B_MINE, B_XFLAG, B_XMINE READ B_NONE, B_UP, B_DOWN, B_FLAG, B_DNFLAG, B_MINE, B_XFLAG, B_XMINE DATA -1, 9, 10, 11, 12, 13, 14, 15 'DISPLAY. D_CX AND D_CY CONTAIN UPPER-LEFT TILE COORDINATE FOR START OF GRID. GLOBAL D_CX, D_CY DIM GLOBAL D_BOX2BG0TILE(15), D_BOX2BG0PAL(15), D_BOX2BG1TILE(15), D_BOX2BG1PAL(15) 'GRID. G_DATA IS THE GRID (HIDDEN, TO BE REVEALED). G_STATE IS THE BUTTONS THE USER CLICKS. GLOBAL G_WIDTH, G_HEIGHT, G_MINES, G_FLAGS, G_UP DIM GLOBAL G_DATA(19,14), G_STATE(19,14) 'GAME STATUS. GLOBAL G_PLAY, G_WIN, G_LOOSE READ G_PLAY, G_WIN, G_LOOSE DATA 0, 1, 2 'CLOCK. GLOBAL C_FRAMES 'TOUCHSCREEN. GLOBAL T_DELAY 'QUEUE. GLOBAL Q_LO, Q_HI, Q_CHORD DIM GLOBAL Q_GX(299), Q_GY(299) 'ZONE SETTINGS. (SUBSEQUENT Z_EVENT IS ALSO A SETTING). GLOBAL Z_PAL 'ZONE STATUS GETTERS. GLOBAL Z_EVENT, Z_CUR, Z_IN_X, Z_IN_Y, Z_EVAL, Z_TIMEDOWN 'ZONE EVENTS. Z_NONE MAY ALSO BE USED BY ZONE SETTINGS. Z_DRAG INAPPLICABLE/VESTIGIAL. GLOBAL Z_NONE, Z_DOWN, Z_UP, Z_OUT, Z_DRAG READ Z_NONE, Z_DOWN, Z_UP, Z_OUT, Z_DRAG DATA -1, 1, 2, 3, 4 'ZONE INTERNAL. DIM GLOBAL Z_CX(9), Z_CY(9), Z_CW(9), Z_CH(9), Z_PL(9) UNTIL 1 CALL MAIN_INIT CALL MAIN_LOOP END SUB MAIN_INIT TOUCHSCREEN RESTORE MAIN_INI1 MAIN_INI1: ' 0 1 2 3 DATA 22,0, 32,2, 22,0, 33,2, 22,0, 34,2, 22,0, 35,2 ' 4 5 6 7 DATA 22,0, 36,3, 22,0, 37,3, 22,0, 38,3, 22,0, 39,1 ' 8 B_UP 9 B_DOWN 10 B_FLAG 11 DATA 22,0, 40,1, 5,0, 7,4, 5,1, 0,0, 8,0, 2,5 ' B_DNFLAG 12 B_MINE 13 B_XFLAG 14 B_XMINE 15 DATA 5,1, 2,5, 22,0, 1,1, 23,0, 1,1, 24,0, 1,1 FOR BOX_TYPE = 0 TO 15 READ BG0TILE, BG0PAL, BG1TILE, BG1PAL D_BOX2BG0TILE( BOX_TYPE ) = BG0TILE D_BOX2BG0PAL( BOX_TYPE ) = BG0PAL D_BOX2BG1TILE( BOX_TYPE ) = BG1TILE D_BOX2BG1PAL( BOX_TYPE ) = BG1PAL NEXT BOX_TYPE END SUB SUB MAIN_LOOP IS_PICK_MENU1 = 0 DO IS_RESTART1 = 0 IS_FIRST_MOVE1 = 1 CALL GAME_RESTART DO IF IS_PICK_MENU1 THEN IS_PICK_MENU1 = 0 CALL MENU_LOOP( IS_RESTART1 ) ELSE CALL GAME_LOOP( IS_RESTART1, IS_PICK_MENU1, IS_FIRST_MOVE1 ) END IF IF IS_RESTART1 THEN EXIT LOOP LOOP END SUB SUB MENU_LOOP( IS_RESTART0 ) REPEATBUTTON = $FF REPEATTIME = 0 CALL MENU_SCREEN CALL MENU_NUMBRS WIDTH1 = G_WIDTH HEIGHT1 = G_HEIGHT MINES1 = G_MINES DO CALL ZONE_UPDATE IS_EDIT = Z_CUR >= 0 AND Z_CUR <= 7 IS_BACK = Z_CUR = 8 IF Z_EVENT = Z_DOWN THEN REPEATTIME = 0 IF Z_EVENT = Z_NONE AND REPEATTIME = Z_TIMEDOWN THEN Z_EVENT = REPEATBUTTON IF IS_EDIT THEN IF Z_EVENT = Z_DOWN OR Z_EVENT = REPEATBUTTON THEN WIDTH2 = G_WIDTH HEIGHT2 = G_HEIGHT MINES2 = G_MINES DELAY2 = T_DELAY IS_CHANGE2 = 0 CALL MENU_CALCS CALL MENU_EVAL_CHANGE( WIDTH2, HEIGHT2, MINES2, DELAY2, IS_CHANGE2 ) IF IS_CHANGE2 THEN CALL MENU_NUMBRS CALL PERSIST_SAVE CALL MY_SFX( "CLICK" ) IF REPEATTIME <= 15 THEN ADD REPEATTIME, 15 ELSE ADD REPEATTIME, 3 ELSE CALL MY_SFX( "CLICK HOLLOW" ) ADD REPEATTIME, 15 END IF END IF ELSE IF IS_BACK AND Z_EVENT = Z_UP THEN CALL MENU_EVAL_CHANGE( WIDTH1, HEIGHT1, MINES1, T_DELAY, IS_RESTART0 ) CALL MY_SFX( "CLICK" ) EXIT END IF WAIT VBL LOOP END SUB SUB MENU_SCREEN CLS BG 1 BG COPY 0, 16, 20, 16 TO 0, 0 BG 0 BG COPY 0, 0, 20, 16 TO 0, 0 FOR SN = 0 TO 6 SPRITE SN FLIP 1, 1 SPRITE SN, 8 * SN + 103, 95, 22 NEXT SN CALL ZONE_RESET Z_PAL = 1 CALL ZONE_SET( 0, 12, 2, 1, 1 ) CALL ZONE_SET( 1, 16, 2, 1, 1 ) CALL ZONE_SET( 2, 12, 3, 1, 1 ) CALL ZONE_SET( 3, 16, 3, 1, 1 ) CALL ZONE_SET( 4, 12, 4, 1, 1 ) CALL ZONE_SET( 5, 16, 4, 1, 1 ) CALL ZONE_SET( 6, 12, 5, 1, 1 ) CALL ZONE_SET( 7, 16, 5, 1, 1 ) CALL ZONE_SET( 8, 8, 0, 4, 1 ) END SUB SUB MENU_NUMBRS FONT 128 PAL 4 DELAY_MILLISECONDS = INT( T_DELAY / 60 * 1000 + 0.5 ) CALL MY_NUMBR( 13, 2, G_WIDTH, 3 ) CALL MY_NUMBR( 13, 3, G_HEIGHT, 3 ) CALL MY_NUMBR( 13, 4, G_MINES, 3 ) CALL MY_NUMBR( 13, 5, DELAY_MILLISECONDS, 3 ) END SUB SUB MENU_CALCS HIT_W1 = 0 HIT_H1 = 0 HIT_M1 = 0 HIT_D1 = 0 FLAG_INC = Z_CUR AND %001 IF Z_CUR \ 2 = %00 THEN ADD HIT_W1, 2 * FLAG_INC - 1 IF Z_CUR \ 2 = %01 THEN ADD HIT_H1, 2 * FLAG_INC - 1 IF Z_CUR \ 2 = %10 THEN ADD HIT_M1, 2 * FLAG_INC - 1 IF Z_CUR \ 2 = %11 THEN ADD HIT_D1, 2 * FLAG_INC - 1 IF HIT_W1 OR HIT_H1 THEN AREA_OLD = G_WIDTH * G_HEIGHT ADD G_WIDTH, 2 * HIT_W1 ADD G_HEIGHT, 7 * HIT_H1 CALL MY_CLAMP( G_WIDTH, 8, 20 ) CALL MY_CLAMP( G_HEIGHT, 8, 15 ) AREA_NEW = G_WIDTH * G_HEIGHT G_MINES = INT( G_MINES * AREA_NEW / AREA_OLD + 0.5 ) CALL MY_CLAMP( G_MINES, 10, ( G_WIDTH - 1 ) * ( G_HEIGHT - 1 ) ) ELSE IF HIT_M1 THEN ADD G_MINES, HIT_M1 CALL MY_WRAP( G_MINES, 10, ( G_WIDTH - 1 ) * ( G_HEIGHT - 1 ) ) ELSE IF HIT_D1 THEN ADD T_DELAY, HIT_D1 CALL MY_CLAMP( T_DELAY, 4, 30 ) END IF END SUB SUB MENU_EVAL_CHANGE( WIDTH0, HEIGHT0, MINES0, DELAY0, IS_CHANGE0 ) IS_CHANGE0 = WIDTH0<>G_WIDTH OR HEIGHT0<>G_HEIGHT OR MINES0<>G_MINES OR DELAY0<>T_DELAY END SUB SUB PERSIST_LOAD G_WIDTH = PEEKW( $E000 ) G_HEIGHT = PEEKW( $E002 ) G_MINES = PEEKW( $E004 ) T_DELAY = PEEKW( $E006 ) END SUB SUB PERSIST_SAVE POKEW $E000, G_WIDTH POKEW $E002, G_HEIGHT POKEW $E004, G_MINES POKEW $E006, T_DELAY END SUB SUB GAME_RESTART CALL PERSIST_LOAD 'PERSIST_LOAD MIGHT PROVIDE ALL-ZERO'D VALUES (I.E., WHEN RUN ONLINE OR FIRST-TIME). IF G_WIDTH = 0 THEN G_WIDTH = 8 G_HEIGHT = 8 G_MINES = 10 T_DELAY = 12 END IF 'RESET NUMBER OF USER-IDENTIFIED FLAGS, AND RESET NUMBER OF "UP" GRID SPACES. G_FLAGS = 0 G_UP = G_WIDTH * G_HEIGHT 'RESET ALL GRID DATA (TO 0) AND RESET ALL GRID STATES (TO B_UP). FOR GY1 = 0 TO G_HEIGHT - 1 FOR GX1 = 0 TO G_WIDTH - 1 G_DATA( GX1, GY1 ) = 0 G_STATE( GX1, GY1 ) = B_UP NEXT GX1 NEXT GY1 'CALC UPPER-LEFT GRID COORDINATE (0,0) IN CELL-SPACE. D_CX = 10 - G_WIDTH \ 2 IF G_HEIGHT = 8 THEN D_CY = 4 IF G_HEIGHT = 15 THEN D_CY = 1 'RESET CLOCK. C_FRAMES = 0 END SUB SUB GAME_LOOP( IS_RESTART0, IS_PICK_MENU0, IS_FIRST_MOVE0 ) CALL GAME_SCREEN ANIMTIME1 = 0 STATUS1 = G_PLAY REPEAT IF IS_FIRST_MOVE0 THEN CALL GAME_ANIM( ANIMTIME1, 600 ) ELSE INC C_FRAMES END IF CALL GAME_NUMBRS( MAX( G_MINES - G_FLAGS, 0 ), C_FRAMES \ 60 ) CALL ZONE_UPDATE IS_PICK_GRID1 = Z_CUR = 0 IS_PICK_MENU0 = Z_CUR = 1 AND Z_EVENT = Z_UP IS_RESTART0 = ( Z_CUR = 2 OR Z_CUR = 3 ) AND Z_EVENT = Z_UP IF IS_PICK_GRID1 THEN TRACE G_UP BOX1 = G_STATE( Z_IN_X, Z_IN_Y ) IF BOX1 = 0 THEN CALL GAME_ZERO ELSE IF BOX1 >= 1 AND BOX1 <= 8 THEN CALL GAME_1TO8( STATUS1 ) ELSE IF BOX1 = B_UP OR BOX1 = B_DOWN THEN CALL GAME_UP( IS_FIRST_MOVE0, STATUS1 ) ELSE IF BOX1 = B_FLAG OR BOX1 = B_DNFLAG THEN CALL GAME_FLAG END IF END IF WAIT VBL UNTIL STATUS1 <> G_PLAY OR IS_PICK_MENU0 OR IS_RESTART0 IF STATUS1 <> G_PLAY THEN CALL GAME_OVER( STATUS1, IS_PICK_MENU0 ) IS_RESTART0 = 1 END IF CALL MY_SFX( "CLICK" ) END SUB SUB GAME_SCREEN CLS CALL MY_RECT( D_CX - 1, D_CY - 1, G_WIDTH + 1, G_HEIGHT + 1 ) CALL SHOW_TOOLBAR( "BUTTONS" ) CALL SHOW_TOOLBAR( "HAPPY" ) CALL GAME_NUMBRS( G_MINES, 0 ) CALL GAME_GRID_SHOW SPRITE OFF CALL ZONE_RESET Z_PAL = Z_NONE CALL ZONE_SET( 0, D_CX, D_CY, G_WIDTH, G_HEIGHT ) Z_PAL = 1 CALL ZONE_SET( 1, 8, 0, 4, 1 ) IF G_HEIGHT = 8 THEN CALL ZONE_SET( 2, 8, 1, 4, 3 ) IF G_HEIGHT = 15 THEN CALL ZONE_SET( 2, 5, 0, 3, 1 ) IF G_HEIGHT = 15 THEN CALL ZONE_SET( 3, 12, 0, 3, 1 ) END SUB SUB GAME_NUMBRS( MINES0, SECONDS0 ) FONT 32 PAL 6 TEXT 0, 0, ":000:" TEXT 15, 0, ":000:" NUMBER 1, 0, MINES0, 3 NUMBER 16, 0, SECONDS0, 3 END SUB SUB GAME_GRID_SHOW FOR GY1 = 0 TO G_HEIGHT - 1 FOR GX1 = 0 TO G_WIDTH - 1 CALL SHOW_BOX( GX1, GY1 ) NEXT GX1 NEXT GY1 END SUB SUB GAME_ZERO IF Z_EVENT = Z_UP THEN CALL MY_SFX( "CLICK HOLLOW" ) END SUB SUB GAME_1TO8( STATUS0 ) MINE1 = G_STATE( Z_IN_X, Z_IN_Y ) IF Z_EVENT = Z_DOWN THEN CALL REQUEUE CALL QUEUE_CHORD_FILL( B_UP ) UP1 = Q_HI CALL QUEUE_RPLC( B_DOWN ) CALL QUEUE_SHOW CALL REQUEUE CALL QUEUE_CHORD_FILL( B_FLAG ) FLAG1 = Q_HI IF MINE1 = FLAG1 AND UP1 > 0 THEN CALL SHOW_TOOLBAR( "FEAR" ) ELSE IF Z_EVENT = Z_OUT OR Z_EVENT = Z_UP AND MINE1 <> Q_HI THEN IF MINE1 = Q_HI THEN CALL SHOW_TOOLBAR( "HAPPY" ) CALL REQUEUE CALL QUEUE_CHORD_FILL( B_DOWN ) CALL QUEUE_RPLC( B_UP ) CALL QUEUE_SHOW IF Z_EVENT = Z_UP THEN CALL MY_SFX( "CLICK HOLLOW" ) ELSE IF Z_EVENT = Z_UP AND MINE1 = Q_HI THEN CALL REQUEUE CALL QUEUE_CHORD_FILL( B_DOWN ) DOWN1 = Q_HI IF DOWN1 = 0 THEN CALL MY_SFX( "CLICK HOLLOW" ) ELSE CALL QUEUE_CALC_LOOSE( STATUS0 ) IF STATUS0 = G_PLAY THEN CALL QUEUE_FLOOD_FILL CALL QUEUE_DEC_UP( STATUS0 ) CALL QUEUE_COPY CALL QUEUE_SHOW CALL SHOW_TOOLBAR( "HAPPY" ) CALL MY_SFX( "CLICK" ) ELSE CALL MY_SFX( "CLICK" ) END IF END IF END IF END SUB SUB GAME_UP( IS_FIRST_MOVE0, STATUS0 ) IF Z_EVENT = Z_DOWN THEN DIM MAT1( 19, 14 ) CALL REQUEUE CALL ENQUEUE( Z_IN_X, Z_IN_Y, MAT1() ) CALL QUEUE_RPLC( B_DOWN ) CALL QUEUE_SHOW CALL SHOW_TOOLBAR( "FEAR" ) ELSE IF Z_EVENT = Z_OUT THEN CALL QUEUE_RPLC( B_UP ) CALL QUEUE_SHOW CALL SHOW_TOOLBAR( "HAPPY" ) ELSE IF Z_TIMEDOWN = T_DELAY THEN CALL QUEUE_RPLC( B_FLAG ) CALL QUEUE_SHOW INC G_FLAGS CALL SHOW_TOOLBAR( "HAPPY" ) CALL MY_SFX( "CLICK" ) Z_EVENT = Z_OUT ELSE IF Z_EVENT = Z_UP THEN IF IS_FIRST_MOVE0 THEN DIM MAT1( 19, 14 ) IS_FIRST_MOVE0 = 0 CALL QUEUE_CHORD_FILL( B_UP ) CALL GAME_GRID_RND CALL REQUEUE CALL ENQUEUE( Z_IN_X, Z_IN_Y, MAT1() ) END IF CALL QUEUE_CALC_LOOSE( STATUS0 ) IF STATUS0 = G_PLAY THEN CALL QUEUE_FLOOD_FILL CALL QUEUE_DEC_UP( STATUS0 ) CALL QUEUE_COPY CALL QUEUE_SHOW CALL SHOW_TOOLBAR( "HAPPY" ) CALL MY_SFX( "CLICK" ) ELSE CALL MY_SFX( "CLICK" ) END IF END IF END SUB SUB GAME_FLAG TRACE 403, Z_EVENT IF Z_EVENT = Z_DOWN THEN DIM MAT1( 19, 14 ) CALL REQUEUE CALL ENQUEUE( Z_IN_X, Z_IN_Y, MAT1() ) CALL QUEUE_RPLC( B_DNFLAG ) CALL QUEUE_SHOW ELSE IF Z_EVENT = Z_OUT OR Z_EVENT = Z_UP THEN CALL QUEUE_RPLC( B_FLAG ) CALL QUEUE_SHOW IF Z_EVENT = Z_UP THEN CALL MY_SFX( "CLICK HOLLOW" ) ELSE IF Z_TIMEDOWN = T_DELAY THEN CALL QUEUE_RPLC( B_UP ) CALL QUEUE_SHOW DEC G_FLAGS CALL MY_SFX( "CLICK" ) Z_EVENT = Z_OUT END IF END SUB SUB GAME_OVER( STATUS0, IS_PICK_MENU0 ) IF STATUS0 = G_WIN THEN CALL SHOW_TOOLBAR( "COOL" ) CALL MY_SFX( "WIN" ) ELSE IF STATUS0 = G_LOOSE THEN CALL SHOW_TOOLBAR( "DEAD" ) CALL MY_SFX( "LOOSE" ) CALL GAME_OVER_LOOSE CALL QUEUE_RPLC( B_XMINE ) CALL GAME_GRID_SHOW END IF ANIMTIME1 = 75 REPEAT CALL GAME_ANIM( ANIMTIME1, 120 ) CALL ZONE_UPDATE IS_PICK_GRID1 = Z_CUR = 0 IS_PICK_MENU0 = Z_CUR = 1 IS_PICK_FACE1 = Z_CUR = 2 OR Z_CUR = 3 WAIT VBL UNTIL ( IS_PICK_MENU0 OR IS_PICK_FACE1 ) AND Z_EVENT = Z_UP END SUB SUB GAME_OVER_LOOSE FOR GY1 = 0 TO G_HEIGHT - 1 FOR GX1 = 0 TO G_WIDTH - 1 IF G_STATE( GX1, GY1 ) = B_UP AND G_DATA( GX1, GY1 ) = B_MINE THEN G_STATE( GX1, GY1 ) = B_MINE ELSE IF G_STATE( GX1, GY1 ) = B_FLAG AND G_DATA( GX1, GY1 ) <> B_MINE THEN G_STATE( GX1, GY1 ) = B_XFLAG END IF NEXT GX1 NEXT GY1 END SUB SUB GAME_ANIM( TIME0, PERIOD0 ) IF TIME0 = 0 THEN FRAME1 = 0 ELSE FRAME1 = TIME0 - PERIOD0 IF FRAME1 >= 0 THEN COPY $8000 + 16 * ( FRAME1 + 112 ), 16 TO $8000 + 16 * 7 COPY $8000 + 16 * ( FRAME1 + 240 ), 16 TO $8000 + 16 * 8 END IF IF FRAME1 = 11 THEN TIME0 = 0 ELSE INC TIME0 END SUB SUB GAME_GRID_RND RANDOMIZE TIMER + G_WIDTH * Z_IN_Y + Z_IN_X FOR I1 = 0 TO Q_HI - 1 G_DATA( Q_GX( I1 ), Q_GY( I1 ) ) = -1 NEXT I1 FOR MINES1 = 1 TO G_MINES REPEAT GX1 = RND( G_WIDTH - 1 ) GY1 = RND( G_HEIGHT - 1 ) UNTIL G_DATA( GX1, GY1 ) = 0 G_DATA( GX1, GY1 ) = B_MINE NEXT MINES1 FOR I1 = 0 TO Q_HI - 1 G_DATA( Q_GX( I1 ), Q_GY( I1 ) ) = -1 NEXT I1 FOR GY2 = 0 TO G_HEIGHT - 1 FOR GX2 = 0 TO G_WIDTH - 1 IF G_DATA( GX2, GY2 ) <> B_MINE THEN QTY1 = 0 FOR GY3 = GY2 - 1 TO GY2 + 1 FOR GX3 = GX2 - 1 TO GX2 + 1 IF GX3 >= 0 AND GX3 < G_WIDTH AND GY3 >= 0 AND GY3 < G_HEIGHT THEN IF G_DATA( GX3, GY3 ) = B_MINE THEN INC QTY1 END IF NEXT GX3 NEXT GY3 G_DATA( GX2, GY2 ) = QTY1 END IF NEXT GX2 NEXT GY2 END SUB SUB REQUEUE Q_LO = 0 Q_HI = 0 END SUB SUB ENQUEUE( GX0, GY0, MAT0() ) IF MAT0( GX0, GY0 ) THEN EXIT SUB INC MAT0( GX0, GY0 ) Q_GX( Q_HI ) = GX0 Q_GY( Q_HI ) = GY0 INC Q_HI END SUB SUB DEQUEUE( GX0, GY0 ) GX0 = Q_GX( Q_LO ) GY0 = Q_GY( Q_LO ) INC Q_LO END SUB SUB QUEUE_RPLC( STATE0 ) FOR I1 = 0 TO Q_HI - 1 G_STATE( Q_GX( I1 ), Q_GY( I1 ) ) = STATE0 NEXT I1 END SUB SUB QUEUE_SHOW FOR I1 = 0 TO Q_HI - 1 CALL SHOW_BOX( Q_GX( I1 ), Q_GY( I1 ) ) NEXT I1 END SUB SUB QUEUE_CALC_LOOSE( STATUS0 ) FOR I1 = 0 TO Q_HI - 1 IF G_DATA( Q_GX( I1 ), Q_GY( I1 ) ) = B_MINE THEN STATUS0 = G_LOOSE NEXT I1 END SUB SUB QUEUE_CHORD_FILL( B0 ) DIM MAT1( 19, 14 ) X1 = Z_IN_X Y1 = Z_IN_Y XM = X1 - 1 YM = Y1 - 1 XP = X1 + 1 YP = Y1 + 1 XE = X1 > 0 YE = Y1 > 0 XF = X1 < G_WIDTH - 1 YF = Y1 < G_HEIGHT - 1 IF XE AND YE THEN IF G_STATE( XM, YM ) = B0 THEN CALL ENQUEUE( XM, YM, MAT1() ) IF YE THEN IF G_STATE( X1, YM ) = B0 THEN CALL ENQUEUE( X1, YM, MAT1() ) IF XF AND YE THEN IF G_STATE( XP, YM ) = B0 THEN CALL ENQUEUE( XP, YM, MAT1() ) IF XE THEN IF G_STATE( XM, Y1 ) = B0 THEN CALL ENQUEUE( XM, Y1, MAT1() ) IF XF THEN IF G_STATE( XP, Y1 ) = B0 THEN CALL ENQUEUE( XP, Y1, MAT1() ) IF XE AND YF THEN IF G_STATE( XM, YP ) = B0 THEN CALL ENQUEUE( XM, YP, MAT1() ) IF YF THEN IF G_STATE( X1, YP ) = B0 THEN CALL ENQUEUE( X1, YP, MAT1() ) IF XF AND YF THEN IF G_STATE( XP, YP ) = B0 THEN CALL ENQUEUE( XP, YP, MAT1() ) END SUB SUB QUEUE_FLOOD_FILL DIM MAT1( 19, 14 ) FOR I1 = 0 TO Q_HI - 1 INC MAT1( Q_GX( I1 ), Q_GY( I1 ) ) NEXT I1 X1 = 0 Y1 = 0 REPEAT CALL DEQUEUE( X1, Y1 ) IS_FILLABLE = G_DATA( X1, Y1 ) = 0 IF IS_FILLABLE THEN XM = X1 - 1 YM = Y1 - 1 XP = X1 + 1 YP = Y1 + 1 XE = X1 > 0 YE = Y1 > 0 XF = X1 < G_WIDTH - 1 YF = Y1 < G_HEIGHT - 1 IF XE AND YE THEN CALL ENQUEUE( XM, YM, MAT1() ) IF YE THEN CALL ENQUEUE( X1, YM, MAT1() ) IF XF AND YE THEN CALL ENQUEUE( XP, YM, MAT1() ) IF XE THEN CALL ENQUEUE( XM, Y1, MAT1() ) IF XF THEN CALL ENQUEUE( XP, Y1, MAT1() ) IF XE AND YF THEN CALL ENQUEUE( XM, YP, MAT1() ) IF YF THEN CALL ENQUEUE( X1, YP, MAT1() ) IF XF AND YF THEN CALL ENQUEUE( XP, YP, MAT1() ) END IF UNTIL Q_LO = Q_HI END SUB SUB QUEUE_DEC_UP( STATUS0 ) FOR I1 = 0 TO Q_HI - 1 IF G_STATE(Q_GX(I1),Q_GY(I1)) <> G_DATA(Q_GX(I1),Q_GY(I1)) THEN DEC G_UP NEXT I1 IF G_MINES = G_UP THEN STATUS0 = G_WIN END SUB SUB QUEUE_COPY FOR I1 = 0 TO Q_HI - 1 G_STATE(Q_GX(I1),Q_GY(I1)) = G_DATA(Q_GX(I1),Q_GY(I1)) NEXT I1 END SUB SUB SHOW_TOOLBAR( ARG0$ ) IF G_HEIGHT = 8 THEN IF ARG0$ = "BUTTONS" THEN BG 1 BG COPY 23, 1, 4, 1 TO 8, 0 BG 0 BG COPY 23, 5, 4, 4 TO 8, 0 ELSE BG 1 IF ARG0$ = "HAPPY" THEN CY1 = 9 IF ARG0$ = "FEAR" THEN CY1 = 12 IF ARG0$ = "COOL" THEN CY1 = 15 IF ARG0$ = "DEAD" THEN CY1 = 18 BG COPY 23, CY1, 4, 3 TO 8, 1 BG 0 END IF ELSE IF G_HEIGHT = 15 THEN IF ARG0$ = "BUTTONS" THEN BG COPY 20, 0, 10, 1 TO 5, 0 ELSE BG 1 IF ARG0$ = "HAPPY" THEN CY1 = 1 IF ARG0$ = "FEAR" THEN CY1 = 2 IF ARG0$ = "COOL" THEN CY1 = 3 IF ARG0$ = "DEAD" THEN CY1 = 4 BG COPY 20, CY1, 10, 1 TO 5, 0 BG 0 END IF END IF END SUB SUB SHOW_BOX( GX0, GY0 ) BOX1 = G_STATE( GX0, GY0 ) BG 1 PAL D_BOX2BG1PAL( BOX1 ) CELL D_CX + GX0, D_CY + GY0, D_BOX2BG1TILE( BOX1 ) BG 0 PAL D_BOX2BG0PAL( BOX1 ) CELL D_CX + GX0, D_CY + GY0, D_BOX2BG0TILE( BOX1 ) END SUB SUB MY_RECT( CX0, CY0, CW0, CH0 ) PAL 0 CELL CX0 , CY0 , 9 CELL CX0 + CW0, CY0 , 9 + 2 CELL CX0 , CY0 + CH0, 9 + 32 CELL CX0 + CW0, CY0 + CH0, 9 + 2 + 32 FOR CX1=CX0+1 TO CX0+CW0-1 CELL CX1 , CY0 , 9 + 1 CELL CX1 , CY0 + CH0, 9 + 1 + 32 NEXT CX1 FOR CY1=CY0+1 TO CY0+CH0-1 CELL CX0 , CY1 , 9 + 16 CELL CX0+CW0, CY1 , 9 + 2 + 16 NEXT CY1 END SUB SUB MY_CLAMP( NUM0, LO, HI ) NUM0 = MIN( MAX( NUM0, LO ), HI ) END SUB SUB MY_WRAP( NUM0, LO, HI ) IF NUM0 < LO THEN NUM0 = HI ELSE IF NUM0 > HI THEN NUM0 = LO END SUB SUB MY_NUMBR( CX0, CY0, NUM0, D0 ) IF D0 = 3 THEN IF NUM0 < 10 THEN R1$ = " " ELSE R1$ = "" IF NUM0 < 100 THEN L1$ = " " ELSE L1$ = "" TEXT CX0, CY0, LEFT$( L1$ + STR$( INT( NUM0 ) ) + R1$, 3 ) END IF END SUB SUB MY_SFX( SND$ ) IF SND$ = "CLICK" THEN PLAY 0, 78 SOUND 0 ELSE IF SND$ = "CLICK HOLLOW" THEN PLAY 0, 66 SOUND 1 ELSE IF SND$ = "WIN" THEN TRACK 0, 2 ELSE IF SND$ = "LOOSE" THEN TRACK 1, 2 END IF END SUB 'ZONE SUBPROGRAMS BELOW BASED ON "TOUCH ZONES GUI LIBRARY" 2020-10-18 BY TIMO KLOSS. SUB ZONE_RESET FOR ZN = 0 TO UBOUND( Z_CX ) CALL ZONE_CLEAR( ZN ) NEXT ZN Z_CUR = Z_NONE Z_PAL = Z_NONE END SUB SUB ZONE_CLEAR( ZN ) CALL ZONE_SET( ZN, 0, 0, 0, 0 ) END SUB SUB ZONE_SET( ZN, CX, CY, CW, CH ) Z_CX( ZN ) = CX Z_CY( ZN ) = CY Z_CW( ZN ) = CW Z_CH( ZN ) = CH IF Z_PAL >= 0 AND Z_PAL < 8 THEN PL = 16 * Z_PAL + CELL.A(CX,CY) MOD 8 ELSE PL = Z_NONE Z_PL( ZN ) = PL END SUB SUB ZONE_UPDATE CUR_CX = TOUCH.X \ 8 CUR_CY = TOUCH.Y \ 8 IF Z_EVENT = Z_UP OR Z_EVENT = Z_OUT THEN Z_CUR = Z_NONE Z_EVENT = Z_NONE IF TAP THEN FOR ZN = 0 TO UBOUND( Z_CX ) CALL ZONE_EVAL( ZN, CUR_CX, CUR_CY ) IF Z_EVAL THEN Z_CUR = ZN Z_IN_X = CUR_CX - Z_CX( ZN ) Z_IN_Y = CUR_CY - Z_CY( ZN ) Z_EVENT = Z_DOWN CALL ZONE_TINT( ZN, 1 ) END IF NEXT ZN ELSE IF Z_CUR <> Z_NONE THEN IF TOUCH THEN CALL ZONE_EVAL( Z_CUR, CUR_CX, CUR_CY ) IF Z_EVAL THEN IF Z_IN_X <> CUR_CX - Z_CX( Z_CUR ) OR Z_IN_Y <> CUR_CY - Z_CY( Z_CUR ) THEN 'TWO LINES INSERTED, THREE LINES COMMENTED-OUT. Z_EVENT = Z_OUT CALL ZONE_TINT( Z_CUR, 0 ) 'Z_IN_X=CUR_CX-Z_CX(Z_CUR)\.Z_IN_Y=CUR_CY-Z_CY(Z_CUR)\.Z_EVENT=Z_DRAG END IF ELSE Z_EVENT = Z_OUT CALL ZONE_TINT( Z_CUR, 0 ) END IF ELSE Z_EVENT = Z_UP CALL ZONE_TINT( Z_CUR, 0 ) END IF END IF 'ONE LINE INSERTED. IF Z_CUR = Z_NONE THEN Z_TIMEDOWN = Z_NONE ELSE INC Z_TIMEDOWN END SUB SUB ZONE_EVAL( ZN, CX, CY ) IF Z_CW(ZN) THEN Z_EVAL=CX>=Z_CX(ZN) AND CX=Z_CY(ZN) AND CY Z_NONE THEN IF BOOL THEN PL = PL \ 16 ELSE PL = PL MOD 16 BG TINT Z_CX(ZN), Z_CY(ZN) TO Z_CX(ZN) + Z_CW(ZN) - 1, Z_CY(ZN) + Z_CH(ZN) - 1 PAL PL END IF END SUB #1:MAIN PALETTES 2A30153F2A003F152A0308202A121005 2A3F2F162A3015002A3010002A00283C #2:MAIN CHARACTERS 00000000000000000000000000000000 00385C7C7C3800000000200000000000 000038380808000000000808081C0000 0010307C301000000000000000000000 0010187C181000000000000000000000 FE80808080808000FE8181818181817F 00502050000000000050205000000000 00000000000000000000000000000000 FE80808080808000FE8181818181817F FF80808080808080FF80808080808081 FF00000000000000FF000000000000FF FE00000000000000FE01010101010101 00111B15111111000000000000000000 000000183C201C000000000000000000 000000F1898988000000000000000000 000000101010F0000000000000000000 FF80808080808000FF8080808080807F FF00000000000000FF000000000000FF FF00000000000000FF000000000000FF FE00000000000000FE010101010101FF FE80808080808080FE81818181818181 8080808080808000818181818181817F 000000000000000001000100010001AA 02060C183060C00001000100010001AA FEC6828282C6FE0001000100010001AA 80808080808080808181818181818181 00502050000000000050205000000000 80808080808080808181818181818181 001E111E11111E000000000000000000 00000038043C3C000000000000000000 00010179818179000000000000000000 00000010E01010000000000000000000 00000000000000000000000000000000 00183818183C00000000000000000000 000000000000000000384C18307C0000 00780C180C78000000780C180C780000 006C6C7C0C0C00000000000000000000 0000000000000000007C60781C780000 003C607C6C7C0000003C607C6C7C0000 007C0C18303000000000000000000000 007C6C7C6C7C0000007C6C7C6C7C0000 8080808080808000808080808080807F FF00000000000000FF000000000000FF 800000000000000081010101010101FF FF80808080808000FF8080808080807F FF00000000000000FF000000000000FF FE00000000000000FE010101010101FF 00502050000000000050205000000000 FFFFFFC3FFFFFFFFC3BDBDFFBDBDC3FF C3BFBFC3BFBFC3FFFFFDFDFFFDFDFFFF FFBFBFFFFDFDFFFFC3FDFDC3BFBFC3FF FFBFBFFFBFBFFFFFC3FDFDC3FDFDC3FF C3FFFFFFBFBFC3FFFFBDBDC3FDFDFFFF FFFDFDFFBFBFFFFFC3BFBFC3FDFDC3FF FFFDFDFFFFFFFFFFC3BFBFC3BDBDC3FF FFBFBFC3BFBFC3FFC3FDFDFFFDFDFFFF FFFFFFFFFFFFFFFFC3BDBDC3BDBDC3FF FFFFFFFFBFBFC3FFC3BDBDC3FDFDFFFF FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 00502050000000000050205000000000 003C7E7E7E7E3C00003C5A7E5A663C00 003C5A7E7E7E3C0000187E7E66663C00 003C6E767E7E3C00003C52087E5A2400 003C5A7E7E7E3C00003C7E7E665A3C00 00000000000000000000000000000000 000000071F3F7FFF00000000071F3F7F 000000E0F8FCFEFF00000000E0F8FCFE 00000000000000000000000000000000 00000000000000000000000000000000 000000071F3F7FF300000000071F3F7F 000000E0F8FCFECF00000000E0F8FCFE 00000000000000000000000000000000 00000000000000000000000000000000 000000071F3F7FFF00000000071F3F7F 000000E0F8FCFEFF00000000E0F8FCFE 00000000000000000000000000000000 00000000000000000000000000000000 000000071F3F7FFF00000000071F3F6B 000000E0F8FCFEFF00000000E0F8FCD6 00000000000000000000000000000000 00010101010101000000000000000000 FFFFFFFFFFFFFFFF73F3FFFFFFFFEF77 FFFFFFFFFFFFFFFFCECFFFFFFFFFF7EE 00808080808080000000000000000000 00010101010101000000000000000000 EDEDF3FFFFFDFBFF73F3FFFFFFFEFD7B B7B7CFFFFFBFDFFFCECFFFFFFF7FBFDE 00808080808080000000000000000000 00010101010101000000000000000000 FFFFFFEFFFFFFFEF60C1A173FFFFFF77 FFFFFFF7FFFFFFF7068385CEFFFFFFEE 00808080808080000000000000000000 00010101010101000000000000000000 FFFFFFFFFFFFFFFF77EBFFFFFFFFF877 FFFFFFFFFFFFFFFFEED7FFFFFFFF1FEE 00808080808080000000000000000000 00000000000000000000000000000000 FF7F3F1F07000000783F1F0700000000 FFFEFCF8E00000001EFCF8E000000000 00000000000000000000000000000000 00000000000000000000000000000000 FB7D3F1F070000007D3E1F0700000000 DFBEFCF8E0000000BE7CF8E000000000 00000000000000000000000000000000 00000000000000000000000000000000 F77F3F1F07000000783F1F0700000000 EFFEFCF8E00000001EFCF8E000000000 00000000000000000000000000000000 00000000000000000000000000000000 FF7F3F1F070000006F3F1F0700000000 FFFEFCF8E0000000F6FCF8E000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000040000000000000 00000000000000000020400000000000 00000000000000000010204000000000 00000000000000000008102040000000 00000000000000000004081020400000 00000000000000000002040810204000 00000000000000000000020408102000 00000000000000000000000204081000 00000000000000000000000002040800 00000000000000000000000000020400 00000000000000000000000000000200 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00000000000000000000000000000000 00181404040C100C00000C1C1C0C080C 004812121200000000247E3612000000 0024601B12401B1200001E3F363E3F12 000830271021170400000E1F1E1F1F04 00401132040C11230022753A142A5723 00102A021013001D000C1E3A7E773A1D 0010040C1800000000081C3C18000000 0008160C0800000600040E3C38180C06 0030000002060C180000180C0E1E3C18 00002012402708120000040A3E3F2C12 000018144027040C0000000C3E3F1C0C 0000000010040C1800000000081C3C18 00000000603F0000000000001E3F0000 000000000010040C0000000000081C0C 00040B060C1830200002071E3C787020 002058110119031E001C3E7F777F3F1E 001024040404403F00081C1C1C1C3E3F 00205833060C003F001C3E3F1E3C7E3F 002058330041031E001C3E3F06273F1E 00665501390101030000337F3F070703 00605F003801433E001E3F7C3E073F3E 00102E001811031E000C1E7C7E773F1E 00603903060C0818001E3F0F1E3C3818 002058031811031E001C3E3F7E773F1E 002058011941031E001C3E3F1F273F1E 000000100C100C00000000080C080C00 000000100C100C18000000080C083C18 000008160C0000060000040E3C180C06 000000603F403F000000001E3F3E3F00 0000300000060C18000000180C1E3C18 00205833060C100C001C3E3F1E0C080C 002058191117001E001C3E777F773C1E 001020180119113300081C7E7F7F7733 006058031811033E001C3E7F7E777F3E 002058131010031E001C3E7370763F1E 006050101113063C00183C76777F7E3C 00605F001C10003F001E3F787C707E3F 00605F001C101030001E3F787C707030 00205E1C1111031E001C3E7277773F1E 00665501191111330000337F7F777733 003006040404001E000C1E1C1C1C3C1E 001C09010141031E00020F0707273F1E 00645B06041010330002377E7C7C7633 006050101010003F0000307070707E3F 0042450901191133000023777F7F7733 00664501111111330000337F7F777733 002058111111031E001C3E7777773F1E 006058031E101030001C3E7F7E707030 002058111111001F001C3E777B7D3E1F 0060580306101033001C3E7F7E7C7633 00205F001801033E001E3F3C1E077F3E 007027040404040C000E3F1C1C1C1C0C 006655111111031E0000337777773F1E 006655111103060C00003377773F1E0C 00665515011931210000336B7F7F7321 00640B06001811330002371E3C7E7733 0066550B0604040C000033371E1C1C0C 006033060C58003F001E3F1E3C387E3F 00302E080808001E000C1E3838383C1E 0060000000000101000030180C060301 003812020202021E00041E0E0E0E3E1E 001020183300000000081C7E33000000 000000000000603F0000000000001E3F FF80808080808080FF80808080808080 FF00000000000000FF00000000000000 FF00000000000000FF00000000000000 FE00000000000000FE01010101010101 00000000000000010000000000000000 000000000010107D0000000000000000 00000000000000000000000000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 80808080808080808080808080808080 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000101010101010101 00010107010100010000000000000000 FE9F9FFFFFFFFE7D0060600000000000 000000C0000000000000000000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 00502050000000000050205000000000 8080808080808000808080808080807F 000000000000000000000000000000FF 000000000000000000000000000000FF 000000000000000001010101010101FF 00000000000000000000000000000000 10100000000000000000000000000000 00000000000000000000000000000000 00502050000000000050205000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 FE80808080808000FE8181818181817F FEC0808080808000FEC181818181817F FEA0C08080808000FEA1C1818181817F FE90A0C080808000FE91A1C18181817F FE8890A0C0808000FE8991A1C181817F FE848890A0C08000FE858991A1C1817F FE82848890A0C000FE83858991A1C17F FE8082848890A000FE8183858991A17F FE80808284889000FE8181838589917F FE80808082848800FE8181818385897F FE80808080828400FE8181818183857F FE80808080808200FE8181818181837F #3:MAIN BG 00002020000000000000000000000000 00000000100011001200130000000000 000000000000C401C501C6012C002D00 2E0010001100120013002C002D002E00 00000000000000000000000000000000 00000000000000000000000000000000 000000000000D401D501D60100003C07 00000C010D010E010F0100003C070000 000000000000B704A904A404B404A804 00000000000000000000000005000000 000000000500E401E501E60100003D07 00000C010D010E010F0100003D070000 000000000000A804A504A904A704A804 B4040000000000000000000005000000 00000000050000000000000000003E07 00000C010D010E010F0100003E070000 000000000000AD04A904AE04A504B304 00000000000000000000000005000000 00000000050000000000000000003F07 00000C010D010E010F0100003F070000 000000000000A804AF04AC04A4048004 A604AF04B20480040205000005000000 000000000500AD04B304000000000000 00001000110012001300000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000C000C100C200C300000000000000 0000000000000000C401C501C6010000 00000000000000000000000000000000 0000C401C501C6010000000000000000 0000D000D100D200D300000000000000 0000000000000000D401D501D6010000 A304AF04AE04B404B204AF04AC04B304 0000D401D501D6010000000000000000 0000E000E100E200E300000000000000 0000000000000000E401E501E6010000 00000000000000000000000000000000 0000E401E501E6010000000000000000 00004007410742074307000000000000 000000000000B404A104B0048004A104 AE04A4048004A804AF04AC04A4040000 A604AF04B20480040205000000000000 00005007510752075307000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00006007610762076307000000000000 00000000B404AF040000A304A804AF04 B204A4040000B404A104B00400002102 22022302240325032601270100000000 00004407450746074707000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00005407550756075707000000000000 0000000000000000B404AF040000B204 A504B304B404A104B204B4040000B404 A104B00480043C070000000000000000 00006407650766076707000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000480749074A074B07000000000000 00000000000000000000000000000000 000000001C011D011E011F0100000000 00000000000000000000000000000000 0000580759075A075B07000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 0000680769076A076B07000000000000 00000000000000000000000000000000 00000000000000000000000003010000 00000000040100000000000000000000 00004C074D074E074F07000000000000 00000000000000000000000000000000 00000000000000000000000003010000 00000000040100000000000000000000 00005C075D075E075F07000000000000 00000000000000000000000000000000 00000000000000000000000003010000 00000000040100000000000000000000 00006C076D076E076F07000000000000 00000000000000000000000000000000 00000000000000000000000003010000 00000000040100000000000000000000 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 00000000000000000000000000001600 16001600160016001600160000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000 #15:MAIN SOUND 24000000000000002200000000000000 680A305A100840002800303019FE0000 38002020000000003800505000000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 0800000F000000000800000F00000000 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 40404040404040404040404040404040 2426002526002726002926002A26002C 26002E26003026000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 3026D024260030260024260030260024 26000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 420F0000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000