From 84881164da2d349a3f102ab5fd76fb02b0835c35 Mon Sep 17 00:00:00 2001 From: zohassadar Date: Fri, 3 Jan 2025 01:34:24 +0000 Subject: [PATCH 1/5] anydas build flag --- build.js | 6 ++ src/boot.asm | 6 ++ src/constants.asm | 26 +++++- src/modes/hz.asm | 2 + src/nametables/game_type_menu.js | 135 ++++++++++++++++--------------- src/playstate/active.asm | 53 ++++++++++++ src/playstate/spawnnext.asm | 6 ++ src/ram.asm | 9 +++ 8 files changed, 175 insertions(+), 68 deletions(-) diff --git a/build.js b/build.js index 2b6eb256..ae38611a 100644 --- a/build.js +++ b/build.js @@ -23,6 +23,7 @@ if (args.includes('-h')) { -m mapper -a faster aeppoz + press select to end game +-A build anydas -s disable highscores/SRAM -k Famicom Keyboard support -w force WASM compiler @@ -87,11 +88,16 @@ if (args.includes('-o')) { console.log('cnrom override for autodetect'); } +if (args.includes('-A')) { + compileFlags.push('-D', 'ANYDAS=1'); + console.log('anydas enabled'); +} console.log(); // build / compress nametables console.time('nametables'); +process.env['GYM_FLAGS'] = compileFlags.join(' '); require('./src/nametables/build'); console.timeEnd('nametables'); diff --git a/src/boot.asm b/src/boot.asm index f6d496e8..b9dcd0cf 100644 --- a/src/boot.asm +++ b/src/boot.asm @@ -31,7 +31,13 @@ sta paceModifier lda #$10 +.if ANYDAS <> 1 sta dasModifier +.else + sta anydasDASValue + lda #$06 + sta anydasARRValue +.endif lda #INITIAL_LINECAP_LEVEL sta linecapLevel diff --git a/src/constants.asm b/src/constants.asm index 6d9143ed..a481311f 100644 --- a/src/constants.asm +++ b/src/constants.asm @@ -19,6 +19,10 @@ KEYBOARD := 0 CNROM_OVERRIDE := 0 .endif +.ifndef ANYDAS +ANYDAS = 0 +.endif + NO_MUSIC := 1 ; dev flags @@ -81,7 +85,9 @@ MODE_TAPQTY MODE_CHECKERBOARD MODE_GARBAGE MODE_DROUGHT +.if ANYDAS <> 1 MODE_DAS +.endif MODE_LOWSTACK MODE_KILLX2 MODE_INVISIBLE @@ -98,12 +104,19 @@ MODE_DARK MODE_GOOFY MODE_DEBUG MODE_LINECAP +.if ANYDAS <> 1 MODE_DASONLY +.endif MODE_QUAL MODE_PAL +.if ANYDAS = 1 +MODE_DAS_VALUE +MODE_ARR_VALUE +MODE_ARE_CHARGE +.endif +MODE_QUANTITY .endenum -MODE_QUANTITY = MODE_PAL + 1 MODE_GAME_QUANTITY = MODE_HARDDROP + 1 SCORING_CLASSIC := 0 ; for scoringModifier @@ -149,7 +162,9 @@ MENU_TOP_MARGIN_SCROLL := 7 ; in blocks .byte $8 ; MODE_CHECKERBOARD .byte $4 ; MODE_GARBAGE .byte $12 ; MODE_DROUGHT +.if ANYDAS <> 1 .byte $10 ; MODE_DAS +.endif .byte $12 ; MODE_LOWSTACK .byte $0 ; MODE_KILLX2 .byte $0 ; MODE_INVISIBLE @@ -166,9 +181,16 @@ MENU_TOP_MARGIN_SCROLL := 7 ; in blocks .byte $1 ; MODE_GOOFY .byte $1 ; MODE_DEBUG .byte $1 ; MODE_LINECAP +.if ANYDAS <> 1 .byte $1 ; MODE_DASONLY +.endif .byte $1 ; MODE_QUAL .byte $1 ; MODE_PAL +.if ANYDAS = 1 + .byte $40 ; MODE_DAS_VALUE + .byte $40 ; MODE_ARR_VALUE + .byte $1 ; MODE_ARE_CHARGE +.endif .endmacro .macro MODENAMES @@ -188,7 +210,9 @@ MENU_TOP_MARGIN_SCROLL := 7 ; in blocks .byte "CKRBRD" .byte "GARBGE" .byte "LOBARS" +.if ANYDAS <> 1 .byte "DASDLY" +.endif .byte "LOWSTK" .byte "KILLX2" .byte "INVZBL" diff --git a/src/modes/hz.asm b/src/modes/hz.asm index f61863b4..66d32cc2 100644 --- a/src/modes/hz.asm +++ b/src/modes/hz.asm @@ -80,6 +80,7 @@ hzTap: lda #0 sta hzDebounceCounter +.if ANYDAS <> 1 lda dasOnlyFlag beq :+ lda #0 @@ -104,6 +105,7 @@ hzTap: lda #1 sta dasOnlyShiftDisabled : +.endif ; ignore 1 tap lda hzTapCounter diff --git a/src/nametables/game_type_menu.js b/src/nametables/game_type_menu.js index 45cc8a47..f9893668 100644 --- a/src/nametables/game_type_menu.js +++ b/src/nametables/game_type_menu.js @@ -7,6 +7,8 @@ const { flatLookup, } = require('./nametables'); +const anydas = !!process.env['GYM_FLAGS']?.match(/-D ANYDAS=1/); + const lookup = flatLookup(` 0123456789ABCDEF GHIJKLMNOPQRSTUV @@ -29,71 +31,72 @@ WXYZ-,˙>######## const buffer = blankNT(); const extra = [...buffer]; -drawTiles(buffer, lookup, ` -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a TETRIS d# -#a T-SPINS d# -#a SEED d# -#a STACKING d# -#a PACE d# -#a SETUPS d# -#a B-TYPE d# -#a FLOOR d# -#a CRUNCH d# -#a (QUICK)TAP d# -#a TRANSITION d# -#a MARATHON d# -#a TAP QUANTITY d# -#a CHECKERBOARD d# -#a GARBAGE d# -#a DROUGHT d# -#a DAS DELAY d# -#a LOW STACK d# -#a KILLSCREEN »2 d# -#a INVISIBLE d# -#a HARD DROP d# -`);drawTiles(extra, lookup, ` -#a TAP/ROLL SPEED d# -#a SCORING d# -#a CRASH d# -#a STRICT CRASH d# -#a HZ DISPLAY d# -#a INPUT DISPLAY d# -#a DISABLE FLASH d# -#a DISABLE PAUSE d# -#a DARK MODE d# -#a GOOFY FOOT d# -#a BLOCK TOOL d# -#a LINECAP d# -#a DAS ONLY d# -#a QUAL MODE d# -#a PAL MODE d# -#a d# -#a d# -#a V6 d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -#a d# -`); +modes = ` +TETRIS +T-SPINS +SEED +STACKING +PACE +SETUPS +B-TYPE +FLOOR +CRUNCH +(QUICK)TAP +TRANSITION +MARATHON +TAP QUANTITY +CHECKERBOARD +GARBAGE +DROUGHT +DAS DELAY +LOW STACK +KILLSCREEN »2 +INVISIBLE +HARD DROP +TAP/ROLL SPEED +SCORING +CRASH +STRICT CRASH +HZ DISPLAY +INPUT DISPLAY +DISABLE FLASH +DISABLE PAUSE +DARK MODE +GOOFY FOOT +BLOCK TOOL +LINECAP +DAS ONLY +QUAL MODE +PAL MODE +` + .trim() + .split('\n'); + +if (anydas) { + modes.splice(modes.indexOf('DAS DELAY'), 1); + modes.splice(modes.indexOf('DAS ONLY'), 1); + modes.push('DAS', 'ARR', 'ARE CHARGE'); +} + +const modeStartRow = 9; +const modeOffset = 6; +const modeIdx = modeStartRow * 32 + modeOffset; + +const urlX = 3; +const urlY = 17; + +menuScreens = [...Array(30 * 2)] + .map(() => '#a d#'.split('')) + .flat(); + +modes.forEach((mode, i) => + menuScreens.splice(i * 32 + modeIdx, mode.length, ...mode), +); + +menuScreens.splice((30 + urlY) * 32 + urlX, 2, ...'V6'); + +drawTiles(buffer, lookup, menuScreens.splice(0, 32*30).join('')); +drawTiles(extra, lookup, menuScreens.join('')); const background = ` ɢ##############################ɳ @@ -133,8 +136,6 @@ drawTiles(extra, lookup, background); drawRect(buffer, 8, 2, 10, 5, 0xB0); // draw logo -const urlX = 3; -const urlY = 17; drawRect(extra, urlX, urlY, 12, 1, 0x74); drawRect(extra, urlX+12, urlY, 12, 1, 0x84); diff --git a/src/playstate/active.asm b/src/playstate/active.asm index b3fb5d5a..6d9bbb9c 100644 --- a/src/playstate/active.asm +++ b/src/playstate/active.asm @@ -393,6 +393,7 @@ framesPerDropTablePAL: .byte $02,$02,$02,$01,$01,$01,$01,$01 .byte $01,$01,$01,$01,$01,$01 shift_tetrimino: +.if ANYDAS <> 1 ; dasOnlyFlag lda dasOnlyShiftDisabled beq @dasOnlyEnd @@ -438,6 +439,7 @@ shift_tetrimino: lda #$08 sta dasValuePeriod @shiftTetrimino: +.endif lda tetriminoX sta originalY @@ -450,6 +452,18 @@ shift_tetrimino: lda heldButtons and #$03 beq @ret +.if ANYDAS = 1 + dec autorepeatX + lda autorepeatX + cmp #$01 + bpl @ret + lda anydasARRValue + sta autorepeatX + beq @zeroArr + bne @buttonHeldDown +@resetAutorepeatX: + lda anydasDASValue +.else inc autorepeatX lda autorepeatX cmp dasValueDelay @@ -460,6 +474,7 @@ shift_tetrimino: @resetAutorepeatX: lda #$00 +.endif sta autorepeatX @buttonHeldDown: lda heldButtons @@ -486,6 +501,44 @@ shift_tetrimino: @restoreX: lda originalY sta tetriminoX +.if ANYDAS = 1 + lda #$01 +.else lda dasValueDelay +.endif sta autorepeatX @ret: rts + +.if ANYDAS = 1 +@zeroArr: + lda heldButtons + and #BUTTON_RIGHT + beq @checkLeftPressed +@shiftRight: + inc tetriminoX + jsr isPositionValid + bne @shiftBackToLeft + lda #$03 + sta soundEffectSlot1Init + jmp @shiftRight +@checkLeftPressed: + lda heldButtons + and #BUTTON_LEFT + beq @leftNotPressed +@shiftLeft: + dec tetriminoX + jsr isPositionValid + bne @shiftBackToRight + lda #$03 + sta soundEffectSlot1Init + jmp @shiftLeft +@shiftBackToLeft: + dec tetriminoX + dec tetriminoX +@shiftBackToRight: + inc tetriminoX + lda #$01 + sta autorepeatX +@leftNotPressed: + rts +.endif diff --git a/src/playstate/spawnnext.asm b/src/playstate/spawnnext.asm index 0ca043bb..a27f2206 100644 --- a/src/playstate/spawnnext.asm +++ b/src/playstate/spawnnext.asm @@ -53,6 +53,12 @@ playState_spawnNextTetrimino: jsr incrementPieceStat jsr chooseNextTetrimino sta nextPiece +.if ANYDAS = 1 + lda anydasARECharge + beq :+ + sta autorepeatX ; store 1 if ARE Charge is on +: +.endif @resetDownHold: lda #$00 sta autorepeatY diff --git a/src/ram.asm b/src/ram.asm index f021f206..c730978d 100755 --- a/src/ram.asm +++ b/src/ram.asm @@ -335,7 +335,9 @@ tapqtyModifier: .res 1 checkerModifier: .res 1 garbageModifier: .res 1 droughtModifier: .res 1 +.if ANYDAS <> 1 dasModifier: .res 1 +.endif lowStackRowModifier: .res 1 scoringModifier: .res 1 crashModifier: .res 1 @@ -348,8 +350,15 @@ darkModifier: .res 1 goofyFlag: .res 1 debugFlag: .res 1 linecapFlag: .res 1 +.if ANYDAS <> 1 dasOnlyFlag: .res 1 +.endif qualFlag: .res 1 palFlag: .res 1 +.if ANYDAS = 1 +anydasDASValue: .res 1 +anydasARRValue: .res 1 +anydasARECharge: .res 1 +.endif ; ... $7FF From 36b10621058f224922ba0c88039595dad8d1b8ed Mon Sep 17 00:00:00 2001 From: zohassadar Date: Fri, 29 Aug 2025 19:15:46 +0000 Subject: [PATCH 2/5] add zerodas support --- src/playstate/active.asm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/playstate/active.asm b/src/playstate/active.asm index 93c3bc3a..42992513 100644 --- a/src/playstate/active.asm +++ b/src/playstate/active.asm @@ -464,12 +464,14 @@ shift_tetrimino: lda autorepeatX cmp #$01 bpl @ret +@zeroDas: lda anydasARRValue sta autorepeatX beq @zeroArr bne @buttonHeldDown @resetAutorepeatX: lda anydasDASValue + beq @zeroDas .else inc autorepeatX lda autorepeatX From bafb0c513a987ada4f07c9b65cfc9d3a1bb9d590 Mon Sep 17 00:00:00 2001 From: zohassadar Date: Tue, 21 Oct 2025 11:44:35 +0000 Subject: [PATCH 3/5] add kitaru option for are charge --- src/constants.asm | 2 +- src/gamemodestate/updateplayer1.asm | 31 +++++++++++++++++++++++++++++ src/playstate/spawnnext.asm | 11 ++++++---- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/constants.asm b/src/constants.asm index a481311f..c70f1e46 100644 --- a/src/constants.asm +++ b/src/constants.asm @@ -189,7 +189,7 @@ MENU_TOP_MARGIN_SCROLL := 7 ; in blocks .if ANYDAS = 1 .byte $40 ; MODE_DAS_VALUE .byte $40 ; MODE_ARR_VALUE - .byte $1 ; MODE_ARE_CHARGE + .byte $2 ; MODE_ARE_CHARGE .endif .endmacro diff --git a/src/gamemodestate/updateplayer1.asm b/src/gamemodestate/updateplayer1.asm index edf9da24..a5e17d47 100644 --- a/src/gamemodestate/updateplayer1.asm +++ b/src/gamemodestate/updateplayer1.asm @@ -11,6 +11,37 @@ gameModeState_updatePlayer1: jsr practiseAdvanceGame jsr practiseGameHUD jsr branchOnPlayStatePlayer1 +.if ANYDAS = 1 +; do nothing while piece is active (playstate = 1) + ldx playState + dex + beq @stageSprite +; do nothing if not kitaru charge + lda anydasARECharge + cmp #2 + bne @stageSprite +; do nothing when down is held + lda heldButtons + and #BUTTON_DOWN + bne @stageSprite +; reset das on new input + lda newlyPressedButtons + and #BUTTON_LEFT|BUTTON_RIGHT + bne @resetDas + lda heldButtons + and #BUTTON_LEFT|BUTTON_RIGHT + beq @stageSprite +; charge das (unless charged) + ldx autorepeatX + dex + beq @stageSprite + dec autorepeatX ; will clear zero flag + bne @stageSprite +@resetDas: + lda anydasDASValue + sta autorepeatX +@stageSprite: +.endif jsr stageSpriteForCurrentPiece jsr stageSpriteForNextPiece diff --git a/src/playstate/spawnnext.asm b/src/playstate/spawnnext.asm index 491b5573..e5e4bc4a 100644 --- a/src/playstate/spawnnext.asm +++ b/src/playstate/spawnnext.asm @@ -53,10 +53,13 @@ playState_spawnNextTetrimino: jsr chooseNextTetrimino sta nextPiece .if ANYDAS = 1 - lda anydasARECharge - beq :+ - sta autorepeatX ; store 1 if ARE Charge is on -: + ldx anydasARECharge + beq @noCharge + txa + dex + bne @noCharge ; kitaru charge handled in playstate branch + sta autorepeatX ; store 1 if ARE Charge is on (hydrant charge) +@noCharge: .endif @resetDownHold: lda #$00 From 908d2fe2ce0959d3a26dfec69f4955cf5a86d932 Mon Sep 17 00:00:00 2001 From: zohassadar Date: Wed, 22 Oct 2025 03:36:08 +0000 Subject: [PATCH 4/5] charge before playstate branch --- src/gamemodestate/updateplayer1.asm | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/gamemodestate/updateplayer1.asm b/src/gamemodestate/updateplayer1.asm index a5e17d47..5fd41489 100644 --- a/src/gamemodestate/updateplayer1.asm +++ b/src/gamemodestate/updateplayer1.asm @@ -10,37 +10,37 @@ gameModeState_updatePlayer1: jsr checkDebugGameplay jsr practiseAdvanceGame jsr practiseGameHUD - jsr branchOnPlayStatePlayer1 .if ANYDAS = 1 ; do nothing while piece is active (playstate = 1) ldx playState dex - beq @stageSprite + beq @branchOnPlaystate ; do nothing if not kitaru charge lda anydasARECharge cmp #2 - bne @stageSprite + bne @branchOnPlaystate ; do nothing when down is held lda heldButtons and #BUTTON_DOWN - bne @stageSprite + bne @branchOnPlaystate ; reset das on new input lda newlyPressedButtons and #BUTTON_LEFT|BUTTON_RIGHT bne @resetDas lda heldButtons and #BUTTON_LEFT|BUTTON_RIGHT - beq @stageSprite + beq @branchOnPlaystate ; charge das (unless charged) ldx autorepeatX dex - beq @stageSprite + beq @branchOnPlaystate dec autorepeatX ; will clear zero flag - bne @stageSprite + bne @branchOnPlaystate @resetDas: lda anydasDASValue sta autorepeatX -@stageSprite: +@branchOnPlaystate: + jsr branchOnPlayStatePlayer1 .endif jsr stageSpriteForCurrentPiece jsr stageSpriteForNextPiece From 04faf1940ac516bbdf4d95b2d825649ec366ba8e Mon Sep 17 00:00:00 2001 From: zohassadar Date: Wed, 22 Oct 2025 03:39:30 +0000 Subject: [PATCH 5/5] are charge -> entry charge --- src/nametables/game_type_menu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nametables/game_type_menu.js b/src/nametables/game_type_menu.js index f9893668..87509b4e 100644 --- a/src/nametables/game_type_menu.js +++ b/src/nametables/game_type_menu.js @@ -75,7 +75,7 @@ PAL MODE if (anydas) { modes.splice(modes.indexOf('DAS DELAY'), 1); modes.splice(modes.indexOf('DAS ONLY'), 1); - modes.push('DAS', 'ARR', 'ARE CHARGE'); + modes.push('DAS', 'ARR', 'ENTRY CHARGE'); } const modeStartRow = 9;