Decoupled release.

This commit is contained in:
Randy Thiemann 2023-10-23 12:16:16 +02:00
parent 246b760bfb
commit 3576cb9bc6
14 changed files with 774 additions and 376 deletions

Binary file not shown.

View File

@ -6,7 +6,7 @@ The game is heavily inspired by the TGM series of games and has the following fe
- IRS (initial rotation system). - IRS (initial rotation system).
- IHS (initial hold system) as well as holds. - IHS (initial hold system) as well as holds.
- Faithful implementations of concepts such are lock delay, piece spawn delay and DAS. - 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 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. - A choice between traditional ARS for rotation, or TGM3 era ARS with extra kicks.
- Scoring is a hybrid between TGM1 and TGM2. - 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. - A rock solid 60FPS with a traditional 20x10 grid.
## Modes ## Options
There are eight available game modes: ### Buttons
- TGM1: 4 history w/ 4 rerolls, never start with O, S or Z. Switch between whether A or B rotates clockwise and vice versa.
- 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. ### RNG Mode
- HELL: Pure random piece generation. Choose between a few randomizer options:
- EASY: 4 history w/ 256 rerolls, never start with O, S or Z. Sonic drop. - TGM1: 4 history, 4 rerolls.
- TGW2: TGM2 but with hard drop. - TGM2: 4 history, 6 rerolls.
- TGW3: TGM3 but with hard drop. - TGM3: The TGM3 RNG system.
- EAWY: EASY but with hard drop. - 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 ## Scoring
@ -59,9 +77,8 @@ Please do not try running it on older emulators such as VBA, since this game use
## Controls ## Controls
### Menu ### Menu
- A/B/Start — Start the game - A/B/Start — Start the game
- Left/Right — Switch A/B rotation direction - Up/Down — Change which option is selected
- Up/Down — Select starting level - Left/Right — Change the value of the option
- Select — Select game mode
### Gameplay ### Gameplay
- A — Rotate 1 - A — Rotate 1
@ -86,8 +103,6 @@ The game can be built using gnu make and the RGBDS toolchain.
## Future Goals ## Future Goals
- Improve main menu.
- Decouple rotation rules, rng rules, and speed curve from each other.
- Multiplayer with items. - Multiplayer with items.
- Colorization. - Colorization.
- ... - ...

View File

@ -89,10 +89,31 @@ sPause::
db " P A U S E" db " P A U S E"
db "P A U S E " 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 sOption0::
sEaster1:: db $D5, $D7, $D9, $DB, $DD db "NORM"
sEaster2:: db $DE, $E0, $D8, $DA, $DC db " INV"
sEaster3:: db $DF, $E1, $D9, $DB, $DD 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. sPieceXOffsets:: ; How to draw each piece. X-offsets of the sprites.
db 0, 8, 16, 24 ; I db 0, 8, 16, 24 ; I
db 0, 8, 8, 16 ; Z db 0, 8, 8, 16 ; Z

View File

@ -781,7 +781,7 @@ FieldProcess::
; HANDLE ROTATION ; HANDLE ROTATION
; Want rotate CCW? ; Want rotate CCW?
.wantrotccw .wantrotccw
ldh a, [hSwapAB] ld a, [wSwapABState]
cp a, 0 cp a, 0
jr z, .ldb1 jr z, .ldb1
.lda1 .lda1
@ -800,7 +800,7 @@ FieldProcess::
; Want rotate CW? ; Want rotate CW?
.wantrotcw .wantrotcw
ldh a, [hSwapAB] ld a, [wSwapABState]
cp a, 0 cp a, 0
jr z, .lda2 jr z, .lda2
.ldb2 .ldb2
@ -862,13 +862,9 @@ FieldProcess::
; I piece only kicks in TGM3/TGW3/EASY/EAWY ; I piece only kicks in TGM3/TGW3/EASY/EAWY
cp a, PIECE_I cp a, PIECE_I
jr nz, :+ jr nz, :+
ldh a, [hSimulationMode] ld a, [wRotModeState]
cp a, MODE_TGM1 cp a, ROT_MODE_ARSTI
jp z, .norot jp nz, .norot
cp a, MODE_TGM2
jp z, .norot
cp a, MODE_HELL
jp z, .norot
jr .trykickright jr .trykickright
; T/L/J only kick if not through the middle axis. ; 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. ; In TGM3, TGW3, EASY, and EAWY modes, there are a few other kicks possible.
.maybetgm3rot .maybetgm3rot
ldh a, [hSimulationMode] ld a, [wRotModeState]
cp a, MODE_TGM1 cp a, ROT_MODE_ARSTI
jp z, .norot jp nz, .norot
cp a, MODE_TGM2
jp z, .norot
cp a, MODE_HELL
jp z, .norot
; In the case of a T piece, try the space above. ; In the case of a T piece, try the space above.
.checkt .checkt
@ -1179,16 +1171,10 @@ FieldProcess::
jr z, .postdrop jr z, .postdrop
; What kind, if any? ; What kind, if any?
ldh a, [hSimulationMode] ld a, [wDropModeState]
cp a, MODE_TGM1 cp a, DROP_MODE_NONE
jr z, .postdrop jr z, .postdrop
cp a, MODE_HELL cp a, DROP_MODE_HARD
jr z, .postdrop
cp a, MODE_TGW2
jr z, .harddrop
cp a, MODE_TGW3
jr z, .harddrop
cp a, MODE_EAWY
jr z, .harddrop jr z, .harddrop
; Sonic drop. ; 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. ; Check if we are in a TGM3 mode and thus need to handle line counts of 3 and 4 differently.
ldh a, [hLineClearCt] ldh a, [hLineClearCt]
ld e, a ld e, a
ldh a, [hSimulationMode] ld a, [wRotModeState]
cp a, MODE_TGM3 cp a, ROT_MODE_ARSTI
jr z, .modifylines
cp a, MODE_TGW3
jr z, .modifylines jr z, .modifylines
jr .applylines jr .applylines
.modifylines .modifylines

View File

@ -108,23 +108,7 @@ DEF PALETTE_LIGHTER_0 EQU %11100100
DEF PALETTE_LIGHTER_1 EQU %10010000 DEF PALETTE_LIGHTER_1 EQU %10010000
DEF PALETTE_LIGHTER_2 EQU %01000000 DEF PALETTE_LIGHTER_2 EQU %01000000
DEF PALETTE_LIGHTER_3 EQU %00000000 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_X EQU 120
DEF NEXT_BASE_Y EQU 40 DEF NEXT_BASE_Y EQU 40
DEF HOLD_BASE_X EQU 120 DEF HOLD_BASE_X EQU 120
@ -134,8 +118,9 @@ DEF SCORE_BASE_Y EQU 115
DEF LEVEL_BASE_X EQU 120 DEF LEVEL_BASE_X EQU 120
DEF CLEVEL_BASE_Y EQU 136 DEF CLEVEL_BASE_Y EQU 136
DEF NLEVEL_BASE_Y EQU 148 DEF NLEVEL_BASE_Y EQU 148
DEF SCURVE_N_ENTRIES EQU 32
DEF SCURVE_ENTRY_SIZE EQU 8 DEF SCURVE_ENTRY_SIZE EQU 8
DEF PIECE_I EQU 0 DEF PIECE_I EQU 0
DEF PIECE_Z EQU 1 DEF PIECE_Z EQU 1
DEF PIECE_S EQU 2 DEF PIECE_S EQU 2
@ -144,6 +129,7 @@ DEF PIECE_L EQU 4
DEF PIECE_O EQU 5 DEF PIECE_O EQU 5
DEF PIECE_T EQU 6 DEF PIECE_T EQU 6
DEF PIECE_NONE EQU 255 DEF PIECE_NONE EQU 255
DEF SFX_IRS EQU 7 DEF SFX_IRS EQU 7
DEF SFX_DROP EQU 8 DEF SFX_DROP EQU 8
DEF SFX_LOCK EQU 9 DEF SFX_LOCK EQU 9
@ -153,20 +139,71 @@ DEF SFX_RANK_UP EQU 12
DEF SFX_LEVEL_UP EQU 13 DEF SFX_LEVEL_UP EQU 13
DEF SFX_IHS EQU 14 DEF SFX_IHS EQU 14
DEF SFX_READY_GO EQU 15 DEF SFX_READY_GO EQU 15
DEF STACK_SIZE EQU 64 DEF STACK_SIZE EQU 64
DEF GAME_OVER_R10 EQU 133 DEF GAME_OVER_R10 EQU 133
DEF GAME_OVER_R12 EQU 153 DEF GAME_OVER_R12 EQU 153
DEF GAME_OVER_R14 EQU 173 DEF GAME_OVER_R14 EQU 173
DEF GAME_OVER_OTHER EQU 131 DEF GAME_OVER_OTHER EQU 131
DEF LEADY_GO_TIME EQU 90 DEF LEADY_GO_TIME EQU 90
DEF MODE_TGM1 EQU 0
DEF MODE_TGM2 EQU 1 DEF BUTTON_MODE_NORM EQU 0
DEF MODE_TGM3 EQU 2 DEF BUTTON_MODE_INVR EQU 1
DEF MODE_HELL EQU 3 DEF BUTTON_MODE_COUNT EQU 2
DEF MODE_EASY EQU 4
DEF MODE_TGW2 EQU 5 DEF TILE_RNG_MODE_BASE EQU 217
DEF MODE_TGW3 EQU 6 DEF RNG_MODE_TGM1 EQU 0
DEF MODE_EAWY EQU 7 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 ENDC

View File

@ -345,6 +345,15 @@ DoSpeedUp:
ldh [hSpeedCurvePtr], a ldh [hSpeedCurvePtr], a
ld a, h ld a, h
ldh [hSpeedCurvePtr+1], a 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 ret

View File

@ -27,10 +27,15 @@ INCLUDE "res/title_map.inc"
SECTION "High Globals", HRAM SECTION "High Globals", HRAM
hGameState:: ds 1 hGameState:: ds 1
hSwapAB:: ds 1
hSimulationMode:: ds 1
SECTION "Globals", WRAM0 SECTION "Globals", WRAM0
wSwapABState:: ds 1
wRNGModeState:: ds 1
wRotModeState:: ds 1
wDropModeState:: ds 1
wSpeedCurveState:: ds 1
wAlways20GState:: ds 1
wInitialA:: ds 1 wInitialA:: ds 1
wInitialB:: ds 1 wInitialB:: ds 1
wInitialC:: ds 1 wInitialC:: ds 1
@ -41,9 +46,13 @@ wInitialL:: ds 1
SECTION "Persistent Globals", SRAM SECTION "Persistent Globals", SRAM
rMagic:: ds 3 rMagic:: ds 4
rSwapAB:: ds 1 rSwapABState:: ds 1
rSimulationMode:: ds 1 rRNGModeState:: ds 1
rRotModeState:: ds 1
rDropModeState:: ds 1
rSpeedCurveState:: ds 1
rAlways20GState:: ds 1
SECTION "Stack", WRAM0 SECTION "Stack", WRAM0
@ -95,35 +104,70 @@ Main::
; Check for save data. ; Check for save data.
ld a, [rMagic] ld a, [rMagic]
cp a, "T" cp a, "D"
jr nz, .nosavedata
ld a, [rMagic+1]
cp a, "G"
jr nz, .nosavedata jr nz, .nosavedata
ld a, [rMagic+1] ld a, [rMagic+1]
cp a, "M" cp a, "M"
jr nz, .nosavedata jr nz, .nosavedata
ld a, [rMagic+2]
cp a, "G"
jr nz, .nosavedata
ld a, [rMagic+3]
cp a, "0"
jr nz, .nosavedata
.savedata .savedata
ld a, [rSwapAB] ld a, [rSwapABState]
ldh [hSwapAB], a ld [wSwapABState], a
ld a, [rSimulationMode] ld a, [rRNGModeState]
ldh [hSimulationMode], a 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 jr .otherinit
.nosavedata .nosavedata
ld a, "T" ld a, "D"
ld [rMagic], a ld [rMagic], a
ld a, "G"
ld [rMagic+1], a
ld a, "M" ld a, "M"
ld [rMagic+1], a
ld a, "G"
ld [rMagic+2], a ld [rMagic+2], a
xor a, a ld a, "0"
ldh [hSwapAB], a ld [rMagic+3], a
ld [rSwapAB], a
ld a, MODE_TGM2 ld a, BUTTON_MODE_NORM
ldh [hSimulationMode], a ld [rSwapABState], a
ld [rSimulationMode], 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 .otherinit
ld hl, sSpeedCurve ld hl, sSpeedCurve

Binary file not shown.

Binary file not shown.

View File

@ -406,44 +406,12 @@ Tiles::
DB $03,$03,$03,$03,$0F,$0F,$00,$00 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 $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 $C0,$C0,$F0,$F0,$FC,$FC,$FF,$FF
DB $00,$00,$00,$00,$03,$03,$00,$00 DB $FC,$FC,$F0,$F0,$C0,$C0,$00,$00
DB $BA,$BA,$22,$22,$22,$22,$B2,$B2 DB $C0,$00,$F0,$00,$FC,$00,$FF,$00
DB $A2,$A2,$A2,$A2,$BB,$BB,$00,$00 DB $FC,$00,$F0,$00,$C0,$00,$00,$00
DB $00,$00,$00,$00,$00,$00,$00,$00 DB $38,$38,$44,$44,$9A,$9A,$A2,$A2
DB $00,$00,$00,$00,$80,$80,$00,$00 DB $9A,$9A,$44,$44,$38,$38,$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 $7C,$7C,$42,$42,$41,$41,$5D,$48 DB $7C,$7C,$42,$42,$41,$41,$5D,$48
DB $6E,$4C,$5B,$4A,$79,$49,$00,$00 DB $6E,$4C,$5B,$4A,$79,$49,$00,$00
DB $68,$58,$58,$68,$68,$58,$48,$78 DB $68,$58,$58,$68,$68,$58,$48,$78
@ -472,6 +440,54 @@ Tiles::
DB $2D,$25,$3D,$3D,$01,$01,$00,$00 DB $2D,$25,$3D,$3D,$01,$01,$00,$00
DB $01,$01,$3D,$3D,$2D,$35,$C5,$FD DB $01,$01,$3D,$3D,$2D,$35,$C5,$FD
DB $08,$F8,$10,$F0,$E0,$E0,$00,$00 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 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,$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 $00,$00,$00,$00,$00,$00,$00,$00
DB $4A,$4A,$4E,$4E,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$A4,$A4,$EC,$EC,$A4,$A4 DB $00,$00,$00,$00,$00,$00,$00,$00
DB $A4,$A4,$AE,$AE,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$EE,$EE,$48,$48,$4A,$4A DB $00,$00,$00,$00,$00,$00,$00,$00
DB $4A,$4A,$4E,$4E,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$AC,$AC,$E2,$E2,$A4,$A4 DB $00,$00,$00,$00,$00,$00,$00,$00
DB $A8,$A8,$AE,$AE,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$EE,$EE,$48,$48,$4A,$4A DB $00,$00,$00,$00,$00,$00,$00,$00
DB $4A,$4A,$4E,$4E,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$AC,$AC,$E2,$E2,$A4,$A4 DB $00,$00,$00,$00,$00,$00,$00,$00
DB $A2,$A2,$AC,$AC,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$AE,$AE,$A8,$A8,$EE,$EE DB $00,$00,$00,$00,$00,$00,$00,$00
DB $A8,$A8,$AE,$AE,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$88,$88,$88,$88,$88,$88 DB $00,$00,$00,$00,$00,$00,$00,$00
DB $88,$88,$EE,$EE,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$E4,$E4,$8A,$8A,$CE,$CE DB $44,$44,$44,$44,$28,$28,$28,$28
DB $8A,$8A,$EA,$EA,$00,$00,$00,$00 DB $28,$28,$10,$10,$12,$12,$00,$00
DB $00,$00,$6A,$6A,$8A,$8A,$44,$44 DB $C4,$C4,$2A,$2A,$2A,$2A,$4A,$4A
DB $24,$24,$C4,$C4,$00,$00,$00,$00 DB $8A,$8A,$8A,$8A,$E4,$E4,$00,$00
DB $00,$00,$EE,$EE,$48,$48,$4A,$4A DB $CC,$CC,$22,$22,$22,$22,$44,$44
DB $4A,$4A,$4E,$4E,$00,$00,$00,$00 DB $82,$82,$82,$82,$EC,$EC,$00,$00
DB $00,$00,$AC,$AC,$A2,$A2,$A4,$A4 DB $44,$44,$CA,$CA,$4A,$4A,$4A,$4A
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 $4A,$4A,$4A,$4A,$E4,$E4,$00,$00 DB $4A,$4A,$4A,$4A,$E4,$E4,$00,$00
DB $00,$00,$00,$00,$CC,$CC,$22,$22 DB $CC,$CC,$22,$22,$22,$22,$44,$44
DB $44,$44,$82,$82,$EC,$EC,$00,$00 DB $82,$82,$82,$82,$EC,$EC,$00,$00
DB $00,$00,$00,$00,$0C,$0C,$0A,$0A DB $0C,$0C,$0A,$0A,$0A,$0A,$0A,$0A
DB $0C,$0C,$0A,$0A,$0C,$0C,$00,$00 DB $0A,$0A,$0A,$0A,$0C,$0C,$00,$00
TilesEnd:: TilesEnd::

View File

@ -21,69 +21,69 @@ DEF TITLE_MAP_INC EQU 1
SECTION "Title Screen Tilemap", ROM0 SECTION "Title Screen Tilemap", ROM0
TitleScreenTilemap:: TitleScreenTilemap::
DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $C3,$5B,$4C,$59,$4F,$5A,$5D,$4C,$01,$59
DB $01,$01,$01,$01,$FA,$FB,$FC,$FD,$FE,$FF 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,$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,$01,$01,$01,$01,$01,$01,$01
DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $01,$01,$01,$01,$5B,$5D,$50,$5E,$5E,$01
DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$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,$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,$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,$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 $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 $01,$01,$C2,$01,$5D,$5A,$5F,$01,$58,$5A
DB $5F,$66,$01,$01,$01,$01,$01,$01,$01,$01 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,$01,$01,$01,$01,$01,$01
DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $C2,$01,$5E,$5B,$50,$50,$4F,$01,$4E,$60
DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$01 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,$7E,$01,$57,$50,$61,$50
DB $57,$01,$01,$81,$42,$42,$42,$42,$82,$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,$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 $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 $7F,$01,$4D,$60,$5F,$5F,$5A,$59,$5E,$01 DB $5E,$5F,$4C,$5D,$5F,$01,$57,$50,$61,$50
DB $81,$4C,$80,$4D,$82,$01,$01,$01,$01,$01 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
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,$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

View File

@ -69,8 +69,8 @@ RNGInit::
ldh [hHeldPiece], a ldh [hHeldPiece], a
; If we're in HELL mode, we don't care about anything but a random piece to start with. ; If we're in HELL mode, we don't care about anything but a random piece to start with.
ldh a, [hSimulationMode] ld a, [wRNGModeState]
cp a, MODE_HELL cp a, RNG_MODE_HELL
jr nz, .complexinit jr nz, .complexinit
call Next7Piece call Next7Piece
ld [hNextPiece], a ld [hNextPiece], a
@ -84,8 +84,8 @@ RNGInit::
ldh [hPieceHistory+2], a ldh [hPieceHistory+2], a
ldh [hPieceHistory+3], a ldh [hPieceHistory+3], a
ldh a, [hSimulationMode] ld a, [wRNGModeState]
cp a, MODE_TGM1 cp a, RNG_MODE_TGM1
jr z, :+ jr z, :+
ld a, PIECE_S ld a, PIECE_S
ldh [hPieceHistory+2], a ldh [hPieceHistory+2], a
@ -177,29 +177,14 @@ GetNextTGM2Piece:
: jr ShiftHistory : jr ShiftHistory
; 4 History, (basically) infinite rerolls. ; 1 history, 1 reroll.
GetNextEasyPiece: GetNextNesPiece:
ld a, 0
ld e, a
: dec e
jr z, :+
call Next7Piece call Next7Piece
ld hl, hPieceHistory ld hl, hPieceHistory
cp a, [hl] cp a, [hl]
jr z, :- jr nz, ShiftHistory
inc hl call Next7Piece
cp a, [hl] jr nz, ShiftHistory
jr z, :-
inc hl
cp a, [hl]
jr z, :-
inc hl
cp a, [hl]
jr z, :-
: jr ShiftHistory
; TGM3 mode... It's complex. ; TGM3 mode... It's complex.
@ -355,23 +340,17 @@ GetNextTGM3Piece:
GetNextPiece:: GetNextPiece::
ldh a, [hSimulationMode] ld a, [wRNGModeState]
cp a, MODE_HELL cp a, RNG_MODE_HELL
jp z, GetNextHellPiece jp z, GetNextHellPiece
cp a, MODE_TGM1 cp a, RNG_MODE_TGM1
jp z, GetNextTGM1Piece jp z, GetNextTGM1Piece
cp a, MODE_TGM2 cp a, RNG_MODE_TGM2
jp z, GetNextTGM2Piece jp z, GetNextTGM2Piece
cp a, MODE_TGW2 cp a, RNG_MODE_TGM3
jp z, GetNextTGM2Piece
cp a, MODE_TGM3
jp z, GetNextTGM3Piece jp z, GetNextTGM3Piece
cp a, MODE_TGW3 cp a, RNG_MODE_NES
jp z, GetNextTGM3Piece jp z, GetNextNesPiece
cp a, MODE_EASY
jp z, GetNextEasyPiece
cp a, MODE_EAWY
jp z, GetNextEasyPiece
Next35Piece: Next35Piece:

View File

@ -63,13 +63,22 @@ SwitchToGameplay::
ld bc, GameplayTilemapEnd - GameplayTilemap ld bc, GameplayTilemapEnd - GameplayTilemap
call UnsafeMemCopy call UnsafeMemCopy
; Place a tell on the screen for mode. ; Place a tell on the screen for modes.
ld hl, FIELD_MODE ld hl, FIELD_RNG
ldh a, [hSimulationMode] ld a, [wRNGModeState]
sla a add a, TILE_RNG_MODE_BASE
add a, TILE_MODE_FAINT_0 ld [hl], a
ld [hl+], a ld hl, FIELD_ROT
inc a 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 ld [hl], a
; Clear OAM. ; Clear OAM.
@ -214,7 +223,7 @@ fetchPieceMode:
; Check if IRS is requested. ; Check if IRS is requested.
; Apply the rotation if so. ; Apply the rotation if so.
.checkIRSA .checkIRSA
ldh a, [hSwapAB] ld a, [wSwapABState]
cp a, 0 cp a, 0
jr z, .lda1 jr z, .lda1
.ldb1 .ldb1
@ -237,7 +246,7 @@ fetchPieceMode:
call SFXEnqueue call SFXEnqueue
.checkIRSB .checkIRSB
ldh a, [hSwapAB] ld a, [wSwapABState]
cp a, 0 cp a, 0
jr z, .ldb2 jr z, .ldb2
.lda2 .lda2
@ -530,7 +539,7 @@ DoHold:
; Check if IRS is requested. ; Check if IRS is requested.
; Apply the rotation if so. ; Apply the rotation if so.
.checkIRSHA .checkIRSHA
ldh a, [hSwapAB] ld a, [wSwapABState]
cp a, 0 cp a, 0
jr z, .lda3 jr z, .lda3
.ldb3 .ldb3
@ -554,7 +563,7 @@ DoHold:
jr .doHoldOperation jr .doHoldOperation
.checkIRSHB .checkIRSHB
ldh a, [hSwapAB] ld a, [wSwapABState]
cp a, 0 cp a, 0
jr z, .ldb4 jr z, .ldb4
.lda4 .lda4

View File

@ -22,6 +22,10 @@ DEF STATE_TITLE_ASM EQU 1
INCLUDE "globals.asm" INCLUDE "globals.asm"
SECTION "Title Variables", WRAM0
wSelected: ds 1
SECTION "Title Functions", ROM0 SECTION "Title Functions", ROM0
SwitchToTitle:: SwitchToTitle::
; Turn the screen off if it's on. ; Turn the screen off if it's on.
@ -77,6 +81,7 @@ SwitchToTitle::
; Install the event loop handlers. ; Install the event loop handlers.
ld a, 0 ld a, 0
ldh [hGameState], a ldh [hGameState], a
ld [wSelected], a
; And turn the LCD back on before we start. ; And turn the LCD back on before we start.
ld a, LCDCF_ON | LCDCF_BGON | LCDCF_BLK01 ld a, LCDCF_ON | LCDCF_BGON | LCDCF_BLK01
@ -89,22 +94,9 @@ SwitchToTitle::
TitleEventLoopHandler:: 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? ; Start game?
: ldh a, [hStartState] .abstart
ldh a, [hStartState]
ld b, a ld b, a
ldh a, [hAState] ldh a, [hAState]
ld c, a ld c, a
@ -112,37 +104,149 @@ TitleEventLoopHandler::
or a, b or a, b
or a, c or a, c
cp a, 1 cp a, 1
jr nz, :+ jr nz, .up
call SwitchToGameplay call SwitchToGameplay
jp EventLoopPostHandler jp EventLoopPostHandler
; Toggle A/B? ; Change menu selection?
: ldh a, [hLeftState] .up
ld b, a 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] ldh a, [hRightState]
or a, b
cp a, 1 cp a, 1
jr nz, :+ jr nz, .done
ldh a, [hSwapAB] jp IncrementOption
cpl
ldh [hSwapAB], a .done
ld [rSwapAB], a
jp EventLoopPostHandler jp EventLoopPostHandler
; Start level up? DecrementOption:
: ldh a, [hUpState] .opt0
cp a, 1 ld a, [wSelected]
jr nz, :+ cp a, 0
jr IncrementLevel 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 jp EventLoopPostHandler
; Start level down? .opt1
: ldh a, [hDownState]
cp a, 1 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 jr DecrementLevel
: jp EventLoopPostHandler jp EventLoopPostHandler
DecrementLevel: DecrementLevel:
; Decrement ; Decrement
@ -156,7 +260,104 @@ DecrementLevel:
ldh [hStartSpeed], a ldh [hStartSpeed], a
ld a, h ld a, h
ldh [hStartSpeed+1], a 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: IncrementLevel:
; Increment ; Increment
@ -172,7 +373,6 @@ IncrementLevel:
ldh [hStartSpeed+1], a ldh [hStartSpeed+1], a
jr CheckLevelRange jr CheckLevelRange
CheckLevelRange: CheckLevelRange:
; At end? ; At end?
ld bc, sSpeedCurveEnd ld bc, sSpeedCurveEnd
@ -207,88 +407,188 @@ CheckLevelRange:
TitleVBlankHandler:: TitleVBlankHandler::
; Draw level. ld a, TILE_UNSELECTED
ldh a, [hStartSpeed] ld hl, TITLE_OPTION_0
ld l, a ld [hl], a
ldh a, [hStartSpeed+1] ld hl, TITLE_OPTION_1
ld h, a ld [hl], a
ld a, [hl] ld hl, TITLE_OPTION_2
swap a ld [hl], a
and a, $0F ld hl, TITLE_OPTION_3
ld b, a ld [hl], a
ld a, TILE_0 ld hl, TITLE_OPTION_4
add a, b ld [hl], a
ld hl, TITLE_LEVEL+2 ld hl, TITLE_OPTION_5
ld [hl], a
ld hl, TITLE_OPTION_6
ld [hl], a ld [hl], a
ldh a, [hStartSpeed] ld a, [wSelected]
ld l, a ld hl, TITLE_OPTION_0
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]
cp a, 0 cp a, 0
jr nz, :+ jr z, :+
ld hl, TITLE_A ld hl, TITLE_OPTION_1
ld a, TILE_A cp a, 1
ld [hl+], a jr z, :+
inc hl ld hl, TITLE_OPTION_2
inc a cp a, 2
ld [hl], a jr z, :+
wait_vblank_end ld hl, TITLE_OPTION_3
jp EventLoop 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_SELECTED
ld a, TILE_B ld [hl], a
ld [hl+], a
inc hl ; Draw option 0.
dec a 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 ld [hl], a
wait_vblank_end
jp EventLoop jp EventLoop