diff --git a/DMGTRIS.GB b/DMGTRIS.GB index 3ed0ec5..ba018aa 100644 Binary files a/DMGTRIS.GB and b/DMGTRIS.GB differ diff --git a/README.md b/README.md index f995c97..e71b94a 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ The game is heavily inspired by the TGM series of games and has the following fe - IRS (initial rotation system). - IHS (initial hold system) as well as holds. - Faithful implementations of concepts such are lock delay, piece spawn delay and DAS. -- Several RNG options available. You can choose between pure RNG, 4 history with 4 retries, 4 history with 6 retries, 4 history with infinite retries, or a 35bag with 4 history and 6 retries with drought prevention. +- Several RNG options available. You can choose between pure RNG, 4 history with 4 retries, 4 history with 6 retries, 4 history with infinite retries, a 35bag with 4 history and 6 retries with drought prevention, NES style RNG, or pure RNG. - A choice between sonic drop (pressing up grounds the piece but does not lock it), hard drop (pressing up locks the piece), or neither (pressing up does nothing at all.) - A choice between traditional ARS for rotation, or TGM3 era ARS with extra kicks. - Scoring is a hybrid between TGM1 and TGM2. @@ -14,16 +14,34 @@ The game is heavily inspired by the TGM series of games and has the following fe - A rock solid 60FPS with a traditional 20x10 grid. -## Modes -There are eight available game modes: -- TGM1: 4 history w/ 4 rerolls, never start with O, S or Z. -- TGM2: 4 history w/ 6 rerolls, never start with O, S or Z. Sonic drop. -- TGM3: 4 history w/ 6 rerolls and drought protection, never start with O, S or Z. Sonic drop. Extra floor and wall kicks for I and T pieces. -- HELL: Pure random piece generation. -- EASY: 4 history w/ 256 rerolls, never start with O, S or Z. Sonic drop. -- TGW2: TGM2 but with hard drop. -- TGW3: TGM3 but with hard drop. -- EAWY: EASY but with hard drop. +## Options +### Buttons +Switch between whether A or B rotates clockwise and vice versa. + +### RNG Mode +Choose between a few randomizer options: +- TGM1: 4 history, 4 rerolls. +- TGM2: 4 history, 6 rerolls. +- TGM3: The TGM3 RNG system. +- HELL: Pure Random. +- NES: Reroll once if you get the same piece as the previous one. + +### Rot Mode +Select the rotation rules: +- ARS1: Classic ARS from TGM1 and TGM2. +- ARS2: ARS from TGM3. + +### Drop Mode +Select whether up performs a sonic drop, a hard drop, or nothing at all. + +### Speed Curve +Check back later! For now you're stuck with the default. + +### Always 20G +Whether you want instant-drop gravity to be active at any level. + +### Start Level +Choose any of the speed breakpoints to start the game at. ## Scoring @@ -59,9 +77,8 @@ Please do not try running it on older emulators such as VBA, since this game use ## Controls ### Menu - A/B/Start — Start the game -- Left/Right — Switch A/B rotation direction -- Up/Down — Select starting level -- Select — Select game mode +- Up/Down — Change which option is selected +- Left/Right — Change the value of the option ### Gameplay - A — Rotate 1 @@ -86,8 +103,6 @@ The game can be built using gnu make and the RGBDS toolchain. ## Future Goals -- Improve main menu. -- Decouple rotation rules, rng rules, and speed curve from each other. - Multiplayer with items. - Colorization. - ... diff --git a/src/constants.asm b/src/constants.asm index 2b053ee..0b021be 100644 --- a/src/constants.asm +++ b/src/constants.asm @@ -89,10 +89,31 @@ sPause:: db " P A U S E" db "P A U S E " db " P A U S E" -sEaster0:: db $D4, $D6, $D8, $DA, $DC -sEaster1:: db $D5, $D7, $D9, $DB, $DD -sEaster2:: db $DE, $E0, $D8, $DA, $DC -sEaster3:: db $DF, $E1, $D9, $DB, $DD +sOption0:: + db "NORM" + db " INV" +sOption1:: + db "TGM1" + db "TGM2" + db "TGM3" + db "HELL" + db " NES" +sOption2:: + db "ARS1" + db "ARS2" +sOption3:: + db "SNIC" + db "HARD" + db "NONE" +sOption4:: + db "DMGT" +sOption5:: + db " NO" + db " YES" +sEaster0:: db $C4, $C6, $C8, $CA, $CC +sEaster1:: db $C5, $C7, $C9, $CB, $CD +sEaster2:: db $CE, $D0, $C8, $CA, $CC +sEaster3:: db $CF, $D1, $C9, $CB, $CD sPieceXOffsets:: ; How to draw each piece. X-offsets of the sprites. db 0, 8, 16, 24 ; I db 0, 8, 8, 16 ; Z diff --git a/src/field.asm b/src/field.asm index 7c1f580..3979a3c 100644 --- a/src/field.asm +++ b/src/field.asm @@ -781,7 +781,7 @@ FieldProcess:: ; HANDLE ROTATION ; Want rotate CCW? .wantrotccw - ldh a, [hSwapAB] + ld a, [wSwapABState] cp a, 0 jr z, .ldb1 .lda1 @@ -800,7 +800,7 @@ FieldProcess:: ; Want rotate CW? .wantrotcw - ldh a, [hSwapAB] + ld a, [wSwapABState] cp a, 0 jr z, .lda2 .ldb2 @@ -862,13 +862,9 @@ FieldProcess:: ; I piece only kicks in TGM3/TGW3/EASY/EAWY cp a, PIECE_I jr nz, :+ - ldh a, [hSimulationMode] - cp a, MODE_TGM1 - jp z, .norot - cp a, MODE_TGM2 - jp z, .norot - cp a, MODE_HELL - jp z, .norot + ld a, [wRotModeState] + cp a, ROT_MODE_ARSTI + jp nz, .norot jr .trykickright ; T/L/J only kick if not through the middle axis. @@ -948,13 +944,9 @@ FieldProcess:: ; In TGM3, TGW3, EASY, and EAWY modes, there are a few other kicks possible. .maybetgm3rot - ldh a, [hSimulationMode] - cp a, MODE_TGM1 - jp z, .norot - cp a, MODE_TGM2 - jp z, .norot - cp a, MODE_HELL - jp z, .norot + ld a, [wRotModeState] + cp a, ROT_MODE_ARSTI + jp nz, .norot ; In the case of a T piece, try the space above. .checkt @@ -1179,16 +1171,10 @@ FieldProcess:: jr z, .postdrop ; What kind, if any? - ldh a, [hSimulationMode] - cp a, MODE_TGM1 + ld a, [wDropModeState] + cp a, DROP_MODE_NONE jr z, .postdrop - cp a, MODE_HELL - jr z, .postdrop - cp a, MODE_TGW2 - jr z, .harddrop - cp a, MODE_TGW3 - jr z, .harddrop - cp a, MODE_EAWY + cp a, DROP_MODE_HARD jr z, .harddrop ; Sonic drop. @@ -1793,10 +1779,8 @@ FieldDelay:: ; Check if we are in a TGM3 mode and thus need to handle line counts of 3 and 4 differently. ldh a, [hLineClearCt] ld e, a - ldh a, [hSimulationMode] - cp a, MODE_TGM3 - jr z, .modifylines - cp a, MODE_TGW3 + ld a, [wRotModeState] + cp a, ROT_MODE_ARSTI jr z, .modifylines jr .applylines .modifylines diff --git a/src/include/globals.asm b/src/include/globals.asm index a4b5036..96929f2 100644 --- a/src/include/globals.asm +++ b/src/include/globals.asm @@ -108,23 +108,7 @@ DEF PALETTE_LIGHTER_0 EQU %11100100 DEF PALETTE_LIGHTER_1 EQU %10010000 DEF PALETTE_LIGHTER_2 EQU %01000000 DEF PALETTE_LIGHTER_3 EQU %00000000 -DEF TITLE_A EQU $99CD -DEF TITLE_B EQU $99CF -DEF TITLE_LEVEL EQU $996C -DEF TITLE_MODE EQU $9A2E -DEF FIELD_MODE EQU $9811 -DEF FIELD_TOP_LEFT EQU $9800+1 -DEF EASTER_0 EQU $9885 -DEF EASTER_1 EQU $98A5 -DEF TILE_FIELD_EMPTY EQU 4 -DEF TILE_PIECE_0 EQU 10 -DEF TILE_0 EQU 66 -DEF TILE_MODE_FAINT_0 EQU 196 -DEF TILE_MODE_0 EQU 234 -DEF TILE_CLEARING EQU 124 -DEF TILE_GHOST EQU 125 -DEF TILE_A EQU 76 -DEF TILE_B EQU 77 + DEF NEXT_BASE_X EQU 120 DEF NEXT_BASE_Y EQU 40 DEF HOLD_BASE_X EQU 120 @@ -134,8 +118,9 @@ DEF SCORE_BASE_Y EQU 115 DEF LEVEL_BASE_X EQU 120 DEF CLEVEL_BASE_Y EQU 136 DEF NLEVEL_BASE_Y EQU 148 -DEF SCURVE_N_ENTRIES EQU 32 + DEF SCURVE_ENTRY_SIZE EQU 8 + DEF PIECE_I EQU 0 DEF PIECE_Z EQU 1 DEF PIECE_S EQU 2 @@ -144,6 +129,7 @@ DEF PIECE_L EQU 4 DEF PIECE_O EQU 5 DEF PIECE_T EQU 6 DEF PIECE_NONE EQU 255 + DEF SFX_IRS EQU 7 DEF SFX_DROP EQU 8 DEF SFX_LOCK EQU 9 @@ -153,20 +139,71 @@ DEF SFX_RANK_UP EQU 12 DEF SFX_LEVEL_UP EQU 13 DEF SFX_IHS EQU 14 DEF SFX_READY_GO EQU 15 + DEF STACK_SIZE EQU 64 DEF GAME_OVER_R10 EQU 133 DEF GAME_OVER_R12 EQU 153 DEF GAME_OVER_R14 EQU 173 DEF GAME_OVER_OTHER EQU 131 DEF LEADY_GO_TIME EQU 90 -DEF MODE_TGM1 EQU 0 -DEF MODE_TGM2 EQU 1 -DEF MODE_TGM3 EQU 2 -DEF MODE_HELL EQU 3 -DEF MODE_EASY EQU 4 -DEF MODE_TGW2 EQU 5 -DEF MODE_TGW3 EQU 6 -DEF MODE_EAWY EQU 7 + +DEF BUTTON_MODE_NORM EQU 0 +DEF BUTTON_MODE_INVR EQU 1 +DEF BUTTON_MODE_COUNT EQU 2 + +DEF TILE_RNG_MODE_BASE EQU 217 +DEF RNG_MODE_TGM1 EQU 0 +DEF RNG_MODE_TGM2 EQU 1 +DEF RNG_MODE_TGM3 EQU 2 +DEF RNG_MODE_HELL EQU 3 +DEF RNG_MODE_NES EQU 4 +DEF RNG_MODE_COUNT EQU 5 + +DEF TILE_ROT_MODE_BASE EQU 225 +DEF ROT_MODE_ARS EQU 0 +DEF ROT_MODE_ARSTI EQU 1 +DEF ROT_MODE_COUNT EQU 2 + +DEF TILE_DROP_MODE_BASE EQU 229 +DEF DROP_MODE_SONIC EQU 0 +DEF DROP_MODE_HARD EQU 1 +DEF DROP_MODE_NONE EQU 2 +DEF DROP_MODE_COUNT EQU 3 + +DEF SCURVE_DMGT EQU 0 +DEF SCURVE_COUNT EQU 1 + +DEF TILE_HIG_MODE_BASE EQU 232 +DEF HIG_MODE_OFF EQU 0 +DEF HIG_MODE_ON EQU 1 +DEF HIG_MODE_COUNT EQU 2 + +DEF TILE_FIELD_EMPTY EQU 4 +DEF TILE_PIECE_0 EQU 10 +DEF TILE_0 EQU 66 +DEF TILE_CLEARING EQU 124 +DEF TILE_GHOST EQU 125 +DEF TILE_SELECTED EQU 193 +DEF TILE_UNSELECTED EQU 194 + +DEF TITLE_OPTIONS EQU 7 +DEF TITLE_OPTION_0 EQU $98E0 +DEF TITLE_OPTION_1 EQU $9920 +DEF TITLE_OPTION_2 EQU $9960 +DEF TITLE_OPTION_3 EQU $99A0 +DEF TITLE_OPTION_4 EQU $99E0 +DEF TITLE_OPTION_5 EQU $9A20 +DEF TITLE_OPTION_6 EQU $9A60 +DEF TITLE_OPTION_OFFSET EQU 15 + +DEF FIELD_RNG EQU $9852 +DEF FIELD_ROT EQU $9892 +DEF FIELD_DROP EQU $9912 +DEF FIELD_HIG EQU $9952 +DEF FIELD_TOP_LEFT EQU $9800+1 + +DEF EASTER_0 EQU $9845 +DEF EASTER_1 EQU $9865 ENDC diff --git a/src/level.asm b/src/level.asm index cc8c561..890902e 100644 --- a/src/level.asm +++ b/src/level.asm @@ -345,6 +345,15 @@ DoSpeedUp: ldh [hSpeedCurvePtr], a ld a, h ldh [hSpeedCurvePtr+1], a + + ; Do we want to force 20G? + ld a, [wAlways20GState] + cp a, 0 + ret z + ld a, 20 + ldh [hCurrentGravityPerTick], a + ld a, 1 + ldh [hCurrentFramesPerGravityTick], a ret diff --git a/src/main.asm b/src/main.asm index 26f1abe..2b2cd2b 100644 --- a/src/main.asm +++ b/src/main.asm @@ -27,10 +27,15 @@ INCLUDE "res/title_map.inc" SECTION "High Globals", HRAM hGameState:: ds 1 -hSwapAB:: ds 1 -hSimulationMode:: ds 1 + SECTION "Globals", WRAM0 +wSwapABState:: ds 1 +wRNGModeState:: ds 1 +wRotModeState:: ds 1 +wDropModeState:: ds 1 +wSpeedCurveState:: ds 1 +wAlways20GState:: ds 1 wInitialA:: ds 1 wInitialB:: ds 1 wInitialC:: ds 1 @@ -41,9 +46,13 @@ wInitialL:: ds 1 SECTION "Persistent Globals", SRAM -rMagic:: ds 3 -rSwapAB:: ds 1 -rSimulationMode:: ds 1 +rMagic:: ds 4 +rSwapABState:: ds 1 +rRNGModeState:: ds 1 +rRotModeState:: ds 1 +rDropModeState:: ds 1 +rSpeedCurveState:: ds 1 +rAlways20GState:: ds 1 SECTION "Stack", WRAM0 @@ -95,35 +104,70 @@ Main:: ; Check for save data. ld a, [rMagic] - cp a, "T" - jr nz, .nosavedata - ld a, [rMagic+1] - cp a, "G" + cp a, "D" jr nz, .nosavedata ld a, [rMagic+1] cp a, "M" jr nz, .nosavedata + ld a, [rMagic+2] + cp a, "G" + jr nz, .nosavedata + ld a, [rMagic+3] + cp a, "0" + jr nz, .nosavedata .savedata - ld a, [rSwapAB] - ldh [hSwapAB], a - ld a, [rSimulationMode] - ldh [hSimulationMode], a + ld a, [rSwapABState] + ld [wSwapABState], a + ld a, [rRNGModeState] + ld [wRNGModeState], a + ld a, [rRotModeState] + ld [wRotModeState], a + ld a, [rDropModeState] + ld [wDropModeState], a + ld a, [rSpeedCurveState] + ld [wSpeedCurveState], a + ld a, [rAlways20GState] + ld [wAlways20GState], a jr .otherinit .nosavedata - ld a, "T" + ld a, "D" ld [rMagic], a - ld a, "G" - ld [rMagic+1], a ld a, "M" + ld [rMagic+1], a + ld a, "G" ld [rMagic+2], a - xor a, a - ldh [hSwapAB], a - ld [rSwapAB], a - ld a, MODE_TGM2 - ldh [hSimulationMode], a - ld [rSimulationMode], a + ld a, "0" + ld [rMagic+3], a + + ld a, BUTTON_MODE_NORM + ld [rSwapABState], a + ld [wSwapABState], a + + ld a, RNG_MODE_TGM3 + ld [rRNGModeState], a + ld [wRNGModeState], a + + ld a, RNG_MODE_TGM3 + ld [rRNGModeState], a + ld [wRNGModeState], a + + ld a, ROT_MODE_ARSTI + ld [rRotModeState], a + ld [wRotModeState], a + + ld a, DROP_MODE_SONIC + ld [rDropModeState], a + ld [wDropModeState], a + + ld a, SCURVE_DMGT + ld [rSpeedCurveState], a + ld [wSpeedCurveState], a + + ld a, HIG_MODE_OFF + ld [rAlways20GState], a + ld [wAlways20GState], a .otherinit ld hl, sSpeedCurve diff --git a/src/res/sources/tiles.gbr b/src/res/sources/tiles.gbr index dc4620d..2c6fa61 100644 Binary files a/src/res/sources/tiles.gbr and b/src/res/sources/tiles.gbr differ diff --git a/src/res/sources/title_map.gbm b/src/res/sources/title_map.gbm index b247a68..1800fc8 100644 Binary files a/src/res/sources/title_map.gbm and b/src/res/sources/title_map.gbm differ diff --git a/src/res/tiles.inc b/src/res/tiles.inc index 634ad36..ac943c6 100644 --- a/src/res/tiles.inc +++ b/src/res/tiles.inc @@ -406,44 +406,12 @@ Tiles:: DB $03,$03,$03,$03,$0F,$0F,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00 - DB $03,$03,$02,$02,$02,$02,$03,$03 - DB $00,$00,$00,$00,$03,$03,$00,$00 - DB $BA,$BA,$22,$22,$22,$22,$B2,$B2 - DB $A2,$A2,$A2,$A2,$BB,$BB,$00,$00 - DB $00,$00,$00,$00,$00,$00,$00,$00 - DB $00,$00,$00,$00,$80,$80,$00,$00 - DB $00,$00,$EE,$00,$48,$00,$4A,$00 - DB $4A,$00,$4E,$00,$00,$00,$00,$00 - DB $00,$00,$A4,$00,$EC,$00,$A4,$00 - DB $A4,$00,$AE,$00,$00,$00,$00,$00 - DB $00,$00,$EE,$00,$48,$00,$4A,$00 - DB $4A,$00,$4E,$00,$00,$00,$00,$00 - DB $00,$00,$AC,$00,$E2,$00,$A4,$00 - DB $A8,$00,$AE,$00,$00,$00,$00,$00 - DB $00,$00,$EE,$00,$48,$00,$4A,$00 - DB $4A,$00,$4E,$00,$00,$00,$00,$00 - DB $00,$00,$AC,$00,$E2,$00,$A4,$00 - DB $A2,$00,$AC,$00,$00,$00,$00,$00 - DB $00,$00,$AE,$00,$A8,$00,$EE,$00 - DB $A8,$00,$AE,$00,$00,$00,$00,$00 - DB $00,$00,$88,$00,$88,$00,$88,$00 - DB $88,$00,$EE,$00,$00,$00,$00,$00 - DB $00,$00,$E4,$00,$8A,$00,$CE,$00 - DB $8A,$00,$EA,$00,$00,$00,$00,$00 - DB $00,$00,$6A,$00,$8A,$00,$44,$00 - DB $24,$00,$C4,$00,$00,$00,$00,$00 - DB $00,$00,$EE,$00,$48,$00,$4A,$00 - DB $4A,$00,$4E,$00,$00,$00,$00,$00 - DB $00,$00,$AC,$00,$A2,$00,$A4,$00 - DB $E8,$00,$AE,$00,$00,$00,$00,$00 - DB $00,$00,$EE,$00,$48,$00,$4A,$00 - DB $4A,$00,$4E,$00,$00,$00,$00,$00 - DB $00,$00,$AC,$00,$A2,$00,$A4,$00 - DB $E2,$00,$AC,$00,$00,$00,$00,$00 - DB $00,$00,$E4,$00,$8A,$00,$CE,$00 - DB $8A,$00,$EA,$00,$00,$00,$00,$00 - DB $00,$00,$AA,$00,$AA,$00,$A4,$00 - DB $E4,$00,$A4,$00,$00,$00,$00,$00 + DB $C0,$C0,$F0,$F0,$FC,$FC,$FF,$FF + DB $FC,$FC,$F0,$F0,$C0,$C0,$00,$00 + DB $C0,$00,$F0,$00,$FC,$00,$FF,$00 + DB $FC,$00,$F0,$00,$C0,$00,$00,$00 + DB $38,$38,$44,$44,$9A,$9A,$A2,$A2 + DB $9A,$9A,$44,$44,$38,$38,$00,$00 DB $7C,$7C,$42,$42,$41,$41,$5D,$48 DB $6E,$4C,$5B,$4A,$79,$49,$00,$00 DB $68,$58,$58,$68,$68,$58,$48,$78 @@ -472,6 +440,54 @@ Tiles:: DB $2D,$25,$3D,$3D,$01,$01,$00,$00 DB $01,$01,$3D,$3D,$2D,$35,$C5,$FD DB $08,$F8,$10,$F0,$E0,$E0,$00,$00 + DB $00,$00,$7C,$7C,$44,$44,$7C,$7C + DB $44,$44,$44,$44,$00,$00,$00,$00 + DB $00,$00,$7C,$7C,$40,$40,$5C,$5C + DB $44,$44,$7C,$7C,$00,$00,$00,$00 + DB $00,$00,$7C,$7C,$44,$44,$78,$78 + DB $44,$44,$7C,$7C,$00,$00,$00,$00 + DB $00,$00,$7C,$7C,$10,$10,$10,$10 + DB $10,$10,$10,$10,$00,$00,$00,$00 + DB $00,$00,$7C,$7C,$40,$40,$7C,$7C + DB $04,$04,$7C,$7C,$00,$00,$00,$00 + DB $00,$00,$7C,$7C,$40,$40,$5C,$5C + DB $44,$44,$7C,$7C,$00,$00,$00,$00 + DB $00,$00,$7C,$7C,$44,$44,$78,$78 + DB $44,$44,$7C,$7C,$00,$00,$00,$00 + DB $00,$75,$00,$47,$00,$55,$00,$55 + DB $00,$75,$00,$00,$00,$3E,$00,$00 + DB $00,$75,$00,$47,$00,$55,$00,$55 + DB $00,$75,$00,$00,$00,$36,$00,$00 + DB $00,$75,$00,$47,$00,$55,$00,$55 + DB $00,$75,$00,$00,$00,$2A,$00,$00 + DB $00,$00,$00,$3E,$00,$7F,$00,$6B + DB $00,$3E,$00,$2A,$00,$00,$00,$00 + DB $00,$00,$00,$FF,$20,$81,$76,$81 + DB $20,$81,$00,$FF,$00,$00,$00,$00 + DB $00,$00,$00,$00,$28,$28,$10,$10 + DB $28,$28,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$28,$28,$10,$10 + DB $28,$28,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$28,$28,$10,$10 + DB $28,$28,$00,$00,$00,$00,$00,$00 + DB $00,$26,$00,$55,$00,$76,$00,$55 + DB $00,$55,$00,$00,$00,$3E,$00,$00 + DB $00,$26,$00,$55,$00,$76,$00,$55 + DB $00,$55,$00,$00,$00,$2A,$00,$00 + DB $00,$00,$00,$00,$28,$28,$10,$10 + DB $28,$28,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$28,$28,$10,$10 + DB $28,$28,$00,$00,$00,$00,$00,$00 + DB $02,$70,$02,$40,$02,$70,$07,$10 + DB $07,$70,$02,$00,$00,$1F,$00,$00 + DB $02,$50,$02,$50,$02,$70,$07,$50 + DB $07,$50,$02,$00,$00,$1F,$00,$00 + DB $02,$50,$02,$50,$02,$20,$07,$50 + DB $07,$50,$02,$00,$00,$1F,$00,$00 + DB $00,$3E,$02,$61,$04,$51,$24,$49 + DB $00,$45,$30,$43,$00,$3E,$00,$00 + DB $00,$00,$00,$62,$00,$15,$00,$25 + DB $00,$45,$00,$72,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00 @@ -488,50 +504,34 @@ Tiles:: DB $00,$00,$00,$00,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00 - DB $00,$00,$EE,$EE,$48,$48,$4A,$4A - DB $4A,$4A,$4E,$4E,$00,$00,$00,$00 - DB $00,$00,$A4,$A4,$EC,$EC,$A4,$A4 - DB $A4,$A4,$AE,$AE,$00,$00,$00,$00 - DB $00,$00,$EE,$EE,$48,$48,$4A,$4A - DB $4A,$4A,$4E,$4E,$00,$00,$00,$00 - DB $00,$00,$AC,$AC,$E2,$E2,$A4,$A4 - DB $A8,$A8,$AE,$AE,$00,$00,$00,$00 - DB $00,$00,$EE,$EE,$48,$48,$4A,$4A - DB $4A,$4A,$4E,$4E,$00,$00,$00,$00 - DB $00,$00,$AC,$AC,$E2,$E2,$A4,$A4 - DB $A2,$A2,$AC,$AC,$00,$00,$00,$00 - DB $00,$00,$AE,$AE,$A8,$A8,$EE,$EE - DB $A8,$A8,$AE,$AE,$00,$00,$00,$00 - DB $00,$00,$88,$88,$88,$88,$88,$88 - DB $88,$88,$EE,$EE,$00,$00,$00,$00 - DB $00,$00,$E4,$E4,$8A,$8A,$CE,$CE - DB $8A,$8A,$EA,$EA,$00,$00,$00,$00 - DB $00,$00,$6A,$6A,$8A,$8A,$44,$44 - DB $24,$24,$C4,$C4,$00,$00,$00,$00 - DB $00,$00,$EE,$EE,$48,$48,$4A,$4A - DB $4A,$4A,$4E,$4E,$00,$00,$00,$00 - DB $00,$00,$AC,$AC,$A2,$A2,$A4,$A4 - DB $E8,$E8,$AE,$AE,$00,$00,$00,$00 - DB $00,$00,$EE,$EE,$48,$48,$4A,$4A - DB $4A,$4A,$4E,$4E,$00,$00,$00,$00 - DB $00,$00,$AC,$AC,$A2,$A2,$A4,$A4 - DB $E2,$E2,$AC,$AC,$00,$00,$00,$00 - DB $00,$00,$E4,$E4,$8A,$8A,$CE,$CE - DB $8A,$8A,$EA,$EA,$00,$00,$00,$00 - DB $00,$00,$AA,$AA,$AA,$AA,$A4,$A4 - DB $E4,$E4,$A4,$A4,$00,$00,$00,$00 - DB $00,$00,$00,$00,$A0,$A0,$A0,$A0 - DB $A0,$A0,$A0,$A0,$48,$48,$00,$00 - DB $00,$00,$00,$00,$C4,$C4,$2A,$2A - DB $4A,$4A,$8A,$8A,$E4,$E4,$00,$00 - DB $00,$00,$00,$00,$CC,$CC,$22,$22 - DB $4C,$4C,$82,$82,$EC,$EC,$00,$00 - DB $00,$00,$00,$00,$44,$44,$CA,$CA + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $00,$00,$00,$00,$00,$00,$00,$00 + DB $44,$44,$44,$44,$28,$28,$28,$28 + DB $28,$28,$10,$10,$12,$12,$00,$00 + DB $C4,$C4,$2A,$2A,$2A,$2A,$4A,$4A + DB $8A,$8A,$8A,$8A,$E4,$E4,$00,$00 + DB $CC,$CC,$22,$22,$22,$22,$44,$44 + DB $82,$82,$82,$82,$EC,$EC,$00,$00 + DB $44,$44,$CA,$CA,$4A,$4A,$4A,$4A DB $4A,$4A,$4A,$4A,$E4,$E4,$00,$00 - DB $00,$00,$00,$00,$CC,$CC,$22,$22 - DB $44,$44,$82,$82,$EC,$EC,$00,$00 - DB $00,$00,$00,$00,$0C,$0C,$0A,$0A - DB $0C,$0C,$0A,$0A,$0C,$0C,$00,$00 + DB $CC,$CC,$22,$22,$22,$22,$44,$44 + DB $82,$82,$82,$82,$EC,$EC,$00,$00 + DB $0C,$0C,$0A,$0A,$0A,$0A,$0A,$0A + DB $0A,$0A,$0A,$0A,$0C,$0C,$00,$00 TilesEnd:: diff --git a/src/res/title_map.inc b/src/res/title_map.inc index e212f0a..f190f69 100644 --- a/src/res/title_map.inc +++ b/src/res/title_map.inc @@ -21,69 +21,69 @@ DEF TITLE_MAP_INC EQU 1 SECTION "Title Screen Tilemap", ROM0 TitleScreenTilemap:: - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$FA,$FB,$FC,$FD,$FE,$FF + DB $C3,$5B,$4C,$59,$4F,$5A,$5D,$4C,$01,$59 + DB $5A,$61,$4C,$01,$FA,$FB,$FC,$FD,$FE,$FF DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$68 + DB $6A,$6C,$6E,$70,$72,$74,$76,$78,$7A,$01 + DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$69,$6B,$6D,$6F,$71,$73,$75,$77,$79 + DB $7B,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$68,$6A,$6C,$6E,$70,$72,$74 - DB $76,$78,$7A,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$69,$6B,$6D,$6F,$71 - DB $73,$75,$77,$79,$7B,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$5B,$5D,$50,$5E,$5E,$01 + DB $5E,$5F,$4C,$5D,$5F,$66,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$C1,$01,$4D,$60,$5F,$5F + DB $5A,$59,$5E,$01,$01,$01,$01,$01,$81,$01 + DB $01,$01,$01,$82,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$01,$01,$01,$01,$C2,$01 + DB $5D,$59,$52,$01,$58,$5A,$4F,$50,$01,$01 + DB $01,$01,$81,$01,$01,$01,$01,$82,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $5B,$5D,$50,$5E,$5E,$01,$5E,$5F,$4C,$5D - DB $5F,$66,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$C2,$01,$5D,$5A,$5F,$01,$58,$5A + DB $4F,$50,$01,$01,$01,$01,$81,$01,$01,$01 + DB $01,$82,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$01,$01,$C2,$01,$4F,$5D + DB $5A,$5B,$01,$58,$5A,$4F,$50,$01,$01,$01 + DB $81,$01,$01,$01,$01,$82,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$7E,$01,$57,$50,$61,$50 - DB $57,$01,$01,$81,$42,$42,$42,$42,$82,$01 + DB $C2,$01,$5E,$5B,$50,$50,$4F,$01,$4E,$60 + DB $5D,$61,$50,$01,$81,$01,$01,$01,$01,$82 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$C2,$01,$4C,$57,$62,$4C + DB $64,$5E,$01,$44,$42,$52,$01,$01,$81,$01 + DB $01,$01,$01,$82,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $7F,$01,$4D,$60,$5F,$5F,$5A,$59,$5E,$01 - DB $81,$4C,$80,$4D,$82,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$C1,$C2,$C3,$58,$5A - DB $4F,$50,$01,$01,$01,$01,$01,$81,$C4,$C5 - DB $82,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 - DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 + DB $01,$01,$01,$01,$01,$01,$01,$01,$C2,$01 + DB $5E,$5F,$4C,$5D,$5F,$01,$57,$50,$61,$50 + DB $57,$01,$81,$01,$01,$01,$01,$82,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 diff --git a/src/rng.asm b/src/rng.asm index 6d6567e..93c3fd0 100644 --- a/src/rng.asm +++ b/src/rng.asm @@ -69,8 +69,8 @@ RNGInit:: ldh [hHeldPiece], a ; If we're in HELL mode, we don't care about anything but a random piece to start with. - ldh a, [hSimulationMode] - cp a, MODE_HELL + ld a, [wRNGModeState] + cp a, RNG_MODE_HELL jr nz, .complexinit call Next7Piece ld [hNextPiece], a @@ -84,8 +84,8 @@ RNGInit:: ldh [hPieceHistory+2], a ldh [hPieceHistory+3], a - ldh a, [hSimulationMode] - cp a, MODE_TGM1 + ld a, [wRNGModeState] + cp a, RNG_MODE_TGM1 jr z, :+ ld a, PIECE_S ldh [hPieceHistory+2], a @@ -177,29 +177,14 @@ GetNextTGM2Piece: : jr ShiftHistory - ; 4 History, (basically) infinite rerolls. -GetNextEasyPiece: - ld a, 0 - ld e, a - -: dec e - jr z, :+ - + ; 1 history, 1 reroll. +GetNextNesPiece: call Next7Piece ld hl, hPieceHistory cp a, [hl] - jr z, :- - inc hl - cp a, [hl] - jr z, :- - inc hl - cp a, [hl] - jr z, :- - inc hl - cp a, [hl] - jr z, :- - -: jr ShiftHistory + jr nz, ShiftHistory + call Next7Piece + jr nz, ShiftHistory ; TGM3 mode... It's complex. @@ -355,23 +340,17 @@ GetNextTGM3Piece: GetNextPiece:: - ldh a, [hSimulationMode] - cp a, MODE_HELL + ld a, [wRNGModeState] + cp a, RNG_MODE_HELL jp z, GetNextHellPiece - cp a, MODE_TGM1 + cp a, RNG_MODE_TGM1 jp z, GetNextTGM1Piece - cp a, MODE_TGM2 + cp a, RNG_MODE_TGM2 jp z, GetNextTGM2Piece - cp a, MODE_TGW2 - jp z, GetNextTGM2Piece - cp a, MODE_TGM3 + cp a, RNG_MODE_TGM3 jp z, GetNextTGM3Piece - cp a, MODE_TGW3 - jp z, GetNextTGM3Piece - cp a, MODE_EASY - jp z, GetNextEasyPiece - cp a, MODE_EAWY - jp z, GetNextEasyPiece + cp a, RNG_MODE_NES + jp z, GetNextNesPiece Next35Piece: diff --git a/src/state_gameplay.asm b/src/state_gameplay.asm index 1f497f3..78dce6c 100644 --- a/src/state_gameplay.asm +++ b/src/state_gameplay.asm @@ -63,13 +63,22 @@ SwitchToGameplay:: ld bc, GameplayTilemapEnd - GameplayTilemap call UnsafeMemCopy - ; Place a tell on the screen for mode. - ld hl, FIELD_MODE - ldh a, [hSimulationMode] - sla a - add a, TILE_MODE_FAINT_0 - ld [hl+], a - inc a + ; Place a tell on the screen for modes. + ld hl, FIELD_RNG + ld a, [wRNGModeState] + add a, TILE_RNG_MODE_BASE + ld [hl], a + ld hl, FIELD_ROT + ld a, [wRotModeState] + add a, TILE_ROT_MODE_BASE + ld [hl], a + ld hl, FIELD_DROP + ld a, [wDropModeState] + add a, TILE_DROP_MODE_BASE + ld [hl], a + ld hl, FIELD_HIG + ld a, [wAlways20GState] + add a, TILE_HIG_MODE_BASE ld [hl], a ; Clear OAM. @@ -214,7 +223,7 @@ fetchPieceMode: ; Check if IRS is requested. ; Apply the rotation if so. .checkIRSA - ldh a, [hSwapAB] + ld a, [wSwapABState] cp a, 0 jr z, .lda1 .ldb1 @@ -237,7 +246,7 @@ fetchPieceMode: call SFXEnqueue .checkIRSB - ldh a, [hSwapAB] + ld a, [wSwapABState] cp a, 0 jr z, .ldb2 .lda2 @@ -530,7 +539,7 @@ DoHold: ; Check if IRS is requested. ; Apply the rotation if so. .checkIRSHA - ldh a, [hSwapAB] + ld a, [wSwapABState] cp a, 0 jr z, .lda3 .ldb3 @@ -554,7 +563,7 @@ DoHold: jr .doHoldOperation .checkIRSHB - ldh a, [hSwapAB] + ld a, [wSwapABState] cp a, 0 jr z, .ldb4 .lda4 diff --git a/src/state_title.asm b/src/state_title.asm index 8f7f226..a713d86 100644 --- a/src/state_title.asm +++ b/src/state_title.asm @@ -22,6 +22,10 @@ DEF STATE_TITLE_ASM EQU 1 INCLUDE "globals.asm" +SECTION "Title Variables", WRAM0 +wSelected: ds 1 + + SECTION "Title Functions", ROM0 SwitchToTitle:: ; Turn the screen off if it's on. @@ -77,6 +81,7 @@ SwitchToTitle:: ; Install the event loop handlers. ld a, 0 ldh [hGameState], a + ld [wSelected], a ; And turn the LCD back on before we start. ld a, LCDCF_ON | LCDCF_BGON | LCDCF_BLK01 @@ -89,22 +94,9 @@ SwitchToTitle:: TitleEventLoopHandler:: - ; Increment mode? - ldh a, [hSelectState] - cp a, 1 - jr nz, :+ - ldh a, [hSimulationMode] - inc a - cp a, 8 - jr nz, .write - xor a, a -.write - ldh [hSimulationMode], a - ld [rSimulationMode], a - jp EventLoopPostHandler - ; Start game? -: ldh a, [hStartState] +.abstart + ldh a, [hStartState] ld b, a ldh a, [hAState] ld c, a @@ -112,37 +104,149 @@ TitleEventLoopHandler:: or a, b or a, c cp a, 1 - jr nz, :+ + jr nz, .up call SwitchToGameplay jp EventLoopPostHandler - ; Toggle A/B? -: ldh a, [hLeftState] - ld b, a + ; Change menu selection? +.up + ldh a, [hUpState] + cp a, 1 + jr nz, .down + ld a, [wSelected] + cp a, 0 + jr z, :+ + dec a + ld [wSelected], a + jp EventLoopPostHandler +: ld a, TITLE_OPTIONS-1 + ld [wSelected], a + jp EventLoopPostHandler + +.down + ldh a, [hDownState] + cp a, 1 + jr nz, .left + ld a, [wSelected] + cp a, TITLE_OPTIONS-1 + jr z, :+ + inc a + ld [wSelected], a + jp EventLoopPostHandler +: xor a, a + ld [wSelected], a + jp EventLoopPostHandler + +.left + ldh a, [hLeftState] + cp a, 1 + jr nz, .right + jp DecrementOption + +.right ldh a, [hRightState] - or a, b cp a, 1 - jr nz, :+ - ldh a, [hSwapAB] - cpl - ldh [hSwapAB], a - ld [rSwapAB], a + jr nz, .done + jp IncrementOption + +.done jp EventLoopPostHandler - ; Start level up? -: ldh a, [hUpState] - cp a, 1 - jr nz, :+ - jr IncrementLevel +DecrementOption: +.opt0 + ld a, [wSelected] + cp a, 0 + jr nz, .opt1 + ld a, [wSwapABState] + cp a, 0 + jr z, :+ + dec a + ld [wSwapABState], a + ld [rSwapABState], a + jp EventLoopPostHandler +: ld a, BUTTON_MODE_COUNT-1 + ld [wSwapABState], a + ld [rSwapABState], a jp EventLoopPostHandler - ; Start level down? -: ldh a, [hDownState] +.opt1 cp a, 1 - jr nz, :+ + jr nz, .opt2 + ld a, [wRNGModeState] + cp a, 0 + jr z, :+ + dec a + ld [wRNGModeState], a + ld [rRNGModeState], a + jp EventLoopPostHandler +: ld a, RNG_MODE_COUNT-1 + ld [wRNGModeState], a + ld [rRNGModeState], a + jp EventLoopPostHandler + +.opt2 + cp a, 2 + jr nz, .opt3 + ld a, [wRotModeState] + cp a, 0 + jr z, :+ + dec a + ld [wRotModeState], a + ld [rRotModeState], a + jp EventLoopPostHandler +: ld a, ROT_MODE_COUNT-1 + ld [wRotModeState], a + ld [rRotModeState], a + jp EventLoopPostHandler + +.opt3 + cp a, 3 + jr nz, .opt4 + ld a, [wDropModeState] + cp a, 0 + jr z, :+ + dec a + ld [wDropModeState], a + ld [rDropModeState], a + jp EventLoopPostHandler +: ld a, DROP_MODE_COUNT-1 + ld [wDropModeState], a + ld [rDropModeState], a + jp EventLoopPostHandler + +.opt4 + cp a, 4 + jr nz, .opt5 + ld a, [wSpeedCurveState] + cp a, 0 + jr z, :+ + dec a + ld [wSpeedCurveState], a + ld [rSpeedCurveState], a + jp EventLoopPostHandler +: ld a, SCURVE_COUNT-1 + ld [wSpeedCurveState], a + ld [rSpeedCurveState], a + jp EventLoopPostHandler + +.opt5 + cp a, 5 + jr nz, .opt6 + ld a, [wAlways20GState] + cp a, 0 + jr z, :+ + dec a + ld [wAlways20GState], a + ld [rAlways20GState], a + jp EventLoopPostHandler +: ld a, HIG_MODE_COUNT-1 + ld [wAlways20GState], a + ld [rAlways20GState], a + jp EventLoopPostHandler + +.opt6 jr DecrementLevel -: jp EventLoopPostHandler - + jp EventLoopPostHandler DecrementLevel: ; Decrement @@ -156,7 +260,104 @@ DecrementLevel: ldh [hStartSpeed], a ld a, h ldh [hStartSpeed+1], a - jr CheckLevelRange + jp CheckLevelRange + + +IncrementOption: +.opt0 + ld a, [wSelected] + cp a, 0 + jr nz, .opt1 + ld a, [wSwapABState] + cp a, BUTTON_MODE_COUNT-1 + jr z, :+ + inc a + ld [wSwapABState], a + ld [rSwapABState], a + jp EventLoopPostHandler +: xor a, a + ld [wSwapABState], a + ld [rSwapABState], a + jp EventLoopPostHandler + +.opt1 + cp a, 1 + jr nz, .opt2 + ld a, [wRNGModeState] + cp a, RNG_MODE_COUNT-1 + jr z, :+ + inc a + ld [wRNGModeState], a + ld [rRNGModeState], a + jp EventLoopPostHandler +: xor a, a + ld [wRNGModeState], a + ld [rRNGModeState], a + jp EventLoopPostHandler + +.opt2 + cp a, 2 + jr nz, .opt3 + ld a, [wRotModeState] + cp a, ROT_MODE_COUNT-1 + jr z, :+ + inc a + ld [wRotModeState], a + ld [rRotModeState], a + jp EventLoopPostHandler +: xor a, a + ld [wRotModeState], a + ld [rRotModeState], a + jp EventLoopPostHandler + +.opt3 + cp a, 3 + jr nz, .opt4 + ld a, [wDropModeState] + cp a, DROP_MODE_COUNT-1 + jr z, :+ + inc a + ld [wDropModeState], a + ld [rDropModeState], a + jp EventLoopPostHandler +: xor a, a + ld [wDropModeState], a + ld [rDropModeState], a + jp EventLoopPostHandler + +.opt4 + cp a, 4 + jr nz, .opt5 + ld a, [wSpeedCurveState] + cp a, SCURVE_COUNT-1 + jr z, :+ + inc a + ld [wSpeedCurveState], a + ld [rSpeedCurveState], a + jp EventLoopPostHandler +: xor a, a + ld [wSpeedCurveState], a + ld [rSpeedCurveState], a + jp EventLoopPostHandler + +.opt5 + cp a, 5 + jr nz, .opt6 + ld a, [wAlways20GState] + cp a, HIG_MODE_COUNT-1 + jr z, :+ + inc a + ld [wAlways20GState], a + ld [rAlways20GState], a + jp EventLoopPostHandler +: xor a, a + ld [wAlways20GState], a + ld [rAlways20GState], a + jp EventLoopPostHandler + +.opt6 + jr IncrementLevel + jp EventLoopPostHandler IncrementLevel: ; Increment @@ -172,7 +373,6 @@ IncrementLevel: ldh [hStartSpeed+1], a jr CheckLevelRange - CheckLevelRange: ; At end? ld bc, sSpeedCurveEnd @@ -207,88 +407,188 @@ CheckLevelRange: TitleVBlankHandler:: - ; Draw level. - ldh a, [hStartSpeed] - ld l, a - ldh a, [hStartSpeed+1] - ld h, a - ld a, [hl] - swap a - and a, $0F - ld b, a - ld a, TILE_0 - add a, b - ld hl, TITLE_LEVEL+2 + ld a, TILE_UNSELECTED + ld hl, TITLE_OPTION_0 + ld [hl], a + ld hl, TITLE_OPTION_1 + ld [hl], a + ld hl, TITLE_OPTION_2 + ld [hl], a + ld hl, TITLE_OPTION_3 + ld [hl], a + ld hl, TITLE_OPTION_4 + ld [hl], a + ld hl, TITLE_OPTION_5 + ld [hl], a + ld hl, TITLE_OPTION_6 ld [hl], a - ldh a, [hStartSpeed] - ld l, a - ldh a, [hStartSpeed+1] - ld h, a - ld a, [hl] - and a, $0F - ld b, a - ld a, TILE_0 - add a, b - ld hl, TITLE_LEVEL+3 - ld [hl], a - - ldh a, [hStartSpeed] - ld l, a - ldh a, [hStartSpeed+1] - ld h, a - inc hl - ld a, [hl] - swap a - and a, $0F - ld b, a - ld a, TILE_0 - add a, b - ld hl, TITLE_LEVEL+0 - ld [hl], a - - ldh a, [hStartSpeed] - ld l, a - ldh a, [hStartSpeed+1] - ld h, a - inc hl - ld a, [hl] - and a, $0F - ld b, a - ld a, TILE_0 - add a, b - ld hl, TITLE_LEVEL+1 - ld [hl], a - - ; Draw Mode - ld hl, TITLE_MODE - ldh a, [hSimulationMode] - sla a - add a, TILE_MODE_0 - ld [hl+], a - inc a - ld [hl], a - - ; Draw A/B - ldh a, [hSwapAB] + ld a, [wSelected] + ld hl, TITLE_OPTION_0 cp a, 0 - jr nz, :+ - ld hl, TITLE_A - ld a, TILE_A - ld [hl+], a - inc hl - inc a - ld [hl], a - wait_vblank_end - jp EventLoop + jr z, :+ + ld hl, TITLE_OPTION_1 + cp a, 1 + jr z, :+ + ld hl, TITLE_OPTION_2 + cp a, 2 + jr z, :+ + ld hl, TITLE_OPTION_3 + cp a, 3 + jr z, :+ + ld hl, TITLE_OPTION_4 + cp a, 4 + jr z, :+ + ld hl, TITLE_OPTION_5 + cp a, 5 + jr z, :+ + ld hl, TITLE_OPTION_6 -: ld hl, TITLE_A - ld a, TILE_B - ld [hl+], a - inc hl - dec a +: ld a, TILE_SELECTED + ld [hl], a + + ; Draw option 0. + xor a, a + ld b, a + ld a, [wSwapABState] + rlc a + rlc a + ld c, a + ld hl, sOption0 + add hl, bc + ld d, h + ld e, l + ld hl, TITLE_OPTION_0+TITLE_OPTION_OFFSET + ld bc, 4 + call UnsafeMemCopy + + ; Draw option 1. + xor a, a + ld b, a + ld a, [wRNGModeState] + rlc a + rlc a + ld c, a + ld hl, sOption1 + add hl, bc + ld d, h + ld e, l + ld hl, TITLE_OPTION_1+TITLE_OPTION_OFFSET + ld bc, 4 + call UnsafeMemCopy + + ; Draw option 2. + xor a, a + ld b, a + ld a, [rRotModeState] + rlc a + rlc a + ld c, a + ld hl, sOption2 + add hl, bc + ld d, h + ld e, l + ld hl, TITLE_OPTION_2+TITLE_OPTION_OFFSET + ld bc, 4 + call UnsafeMemCopy + + ; Draw option 3. + xor a, a + ld b, a + ld a, [rDropModeState] + rlc a + rlc a + ld c, a + ld hl, sOption3 + add hl, bc + ld d, h + ld e, l + ld hl, TITLE_OPTION_3+TITLE_OPTION_OFFSET + ld bc, 4 + call UnsafeMemCopy + + ; Draw option 5. + xor a, a + ld b, a + ld a, [wSpeedCurveState] + rlc a + rlc a + ld c, a + ld hl, sOption4 + add hl, bc + ld d, h + ld e, l + ld hl, TITLE_OPTION_4+TITLE_OPTION_OFFSET + ld bc, 4 + call UnsafeMemCopy + + ; Draw option 5. + xor a, a + ld b, a + ld a, [wAlways20GState] + rlc a + rlc a + ld c, a + ld hl, sOption5 + add hl, bc + ld d, h + ld e, l + ld hl, TITLE_OPTION_5+TITLE_OPTION_OFFSET + ld bc, 4 + call UnsafeMemCopy + + ; Draw option 6. + ldh a, [hStartSpeed] + ld l, a + ldh a, [hStartSpeed+1] + ld h, a + ld a, [hl] + swap a + and a, $0F + ld b, a + ld a, TILE_0 + add a, b + ld hl, TITLE_OPTION_6+TITLE_OPTION_OFFSET+2 + ld [hl], a + + ldh a, [hStartSpeed] + ld l, a + ldh a, [hStartSpeed+1] + ld h, a + ld a, [hl] + and a, $0F + ld b, a + ld a, TILE_0 + add a, b + ld hl, TITLE_OPTION_6+TITLE_OPTION_OFFSET+3 + ld [hl], a + + ldh a, [hStartSpeed] + ld l, a + ldh a, [hStartSpeed+1] + ld h, a + inc hl + ld a, [hl] + swap a + and a, $0F + ld b, a + ld a, TILE_0 + add a, b + ld hl, TITLE_OPTION_6+TITLE_OPTION_OFFSET+0 + ld [hl], a + + ldh a, [hStartSpeed] + ld l, a + ldh a, [hStartSpeed+1] + ld h, a + inc hl + ld a, [hl] + and a, $0F + ld b, a + ld a, TILE_0 + add a, b + ld hl, TITLE_OPTION_6+TITLE_OPTION_OFFSET+1 ld [hl], a - wait_vblank_end jp EventLoop