Secret SMOL mode

This commit is contained in:
Randy Thiemann 2023-10-28 19:04:55 +02:00
parent 252e538d01
commit eab894cd47
20 changed files with 4299 additions and 1158 deletions

Binary file not shown.

Binary file not shown.

View File

@ -19,29 +19,50 @@ IF !DEF(BANKID_ASM)
DEF BANKID_ASM EQU 1 DEF BANKID_ASM EQU 1
SECTION "Bank ID 0", ROM0[$0] INCLUDE "globals.asm"
REPT 7
rst $00
ENDR
db $00
SECTION "Bank ID 1", ROMX[$4000], BANK[1]
REPT 7
rst $00
ENDR
db $01
SECTION "Bank ID 2", ROMX[$4000], BANK[2] SECTION "Bank ID BANK_MAIN", ROM0[$0]
REPT 7 REPT 7
rst $00 rst $00
ENDR ENDR
db $02 db BANK_MAIN
SECTION "Bank ID 3", ROMX[$4000], BANK[3] SECTION "Bank ID BANK_OTHER", ROMX[$4000], BANK[BANK_OTHER]
REPT 7 REPT 7
rst $00 rst $00
ENDR ENDR
db $03 db BANK_OTHER
SECTION "Bank ID BANK_SFX", ROMX[$4000], BANK[BANK_SFX]
REPT 7
rst $00
ENDR
db BANK_SFX
SECTION "Bank ID BANK_MUSIC", ROMX[$4000], BANK[BANK_MUSIC]
REPT 7
rst $00
ENDR
db BANK_MUSIC
SECTION "Bank ID BANK_TITLE", ROMX[$4000], BANK[BANK_TITLE]
REPT 7
rst $00
ENDR
db BANK_TITLE
SECTION "Bank ID BANK_GAMEPLAY", ROMX[$4000], BANK[BANK_GAMEPLAY]
REPT 7
rst $00
ENDR
db BANK_GAMEPLAY
SECTION "Bank ID BANK_GAMEPLAY_BIG", ROMX[$4000], BANK[BANK_GAMEPLAY_BIG]
REPT 7
rst $00
ENDR
db BANK_GAMEPLAY_BIG
ENDC ENDC

View File

@ -22,23 +22,37 @@ DEF BANKING_ASM EQU 1
INCLUDE "globals.asm" INCLUDE "globals.asm"
SECTION "High Banking Variables", HRAM SECTION "Banking Variables", WRAM0
hBankBackup: ds 1 wBankBackup: ds 4
SECTION "Switch Bank", ROM0[$08] SECTION "Switch Bank", ROM0[$08]
; Saves the current bank and switches to the bank in b. ; Pushes the current bank to the stach, switches to bank in B.
RSTSwitchBank:: RSTSwitchBank::
ld a, [wBankBackup+2]
ld [wBankBackup+3], a
ld a, [wBankBackup+1]
ld [wBankBackup+2], a
ld a, [wBankBackup+0]
ld [wBankBackup+1], a
ld a, [rBANKID] ld a, [rBANKID]
ldh [hBankBackup], a ld [wBankBackup+0], a
ld a, b ld a, b
ld [rROMB0], a ld [rROMB0], a
ret ret
SECTION "Restore Bank", ROM0[$18] SECTION "Restore Bank", ROM0[$28]
; Restore the bank previously saved. The current one is not saved. ; Pops a bank from the stack ans switches to it.
RSTRestoreBank:: RSTRestoreBank::
ld a, [hBankBackup] ld a, [wBankBackup+0]
ld b, a
ld a, [wBankBackup+1]
ld [wBankBackup+0], a
ld a, [wBankBackup+2]
ld [wBankBackup+1], a
ld a, [wBankBackup+3]
ld [wBankBackup+2], a
ld a, b
ld [rROMB0], a ld [rROMB0], a
ret ret

View File

@ -1,940 +0,0 @@
; DMGTRIS
; Copyright (C) 2023 - Randy Thiemann <randy.thiemann@gmail.com>
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <https://www.gnu.org/licenses/>.
IF !DEF(CONSTANTS_ASM)
DEF CONSTANTS_ASM EQU 1
CHARMAP " ", 1
CHARMAP "0", 66
CHARMAP "1", 67
CHARMAP "2", 68
CHARMAP "3", 69
CHARMAP "4", 70
CHARMAP "5", 71
CHARMAP "6", 72
CHARMAP "7", 73
CHARMAP "8", 74
CHARMAP "9", 75
CHARMAP "A", 76
CHARMAP "B", 77
CHARMAP "C", 78
CHARMAP "D", 79
CHARMAP "E", 80
CHARMAP "F", 81
CHARMAP "G", 82
CHARMAP "H", 83
CHARMAP "I", 84
CHARMAP "J", 85
CHARMAP "K", 86
CHARMAP "L", 87
CHARMAP "M", 88
CHARMAP "N", 89
CHARMAP "O", 90
CHARMAP "P", 91
CHARMAP "Q", 92
CHARMAP "R", 93
CHARMAP "S", 94
CHARMAP "T", 95
CHARMAP "U", 96
CHARMAP "V", 97
CHARMAP "W", 98
CHARMAP "X", 99
CHARMAP "Y", 100
CHARMAP "Z", 101
CHARMAP "!", 102
CHARMAP "?", 103
CHARMAP "[", 129
CHARMAP "]", 130
CHARMAP "/", 128
CHARMAP "-", 127
CHARMAP "#", 126
CHARMAP ".", 216
CHARMAP ":", 222
SECTION "Static Data", ROMX, BANK[1]
sLeady:: db " READY? "
sGo:: db " GO "
sPause::
db "P A U S E "
db " P A U S E"
sOption0::
db "NORM"
db " INV"
sOption1::
db "TGM1"
db "TGM2"
db "TGM3"
db "HELL"
db " NES"
sOption2::
db "ARS1"
db "ARS2"
db " NES"
sOption3::
db "FIRM"
db "SNIC"
db "HARD"
db "LOCK"
db "NONE"
sOption4::
db "DMGT"
db "TGM1"
db "TGM3"
db "DEAT"
db "SHIR"
db "CHIL"
sOption5::
db " NO"
db " YES"
sDisabled::
db "----"
sEasterM0:: db $C4, $C6, $C8, $CA, $CC
sEasterM1:: db $C5, $C7, $C9, $CB, $CD
sEasterC0:: db $CE, $D0, $C8, $CA, $CC, $72, $74, $76, $78, $7A, $D6, $D7
sEasterC1:: db $CF, $D1, $C9, $CB, $CD, $73, $75, $77, $79, $7B, $01, $01
sEasterA0:: db $D2, $D4, $C8, $CA, $CC, $72, $74, $76, $78, $7A, $D6, $D7
sEasterA1:: db $D3, $D5, $C9, $CB, $CD, $73, $75, $77, $79, $7B, $01, $01
sEasterS0:: db $F7, $F9, $C8, $CA, $CC
sEasterS1:: db $F8, $FA, $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
db 0, 8, 8, 16 ; S
db 0, 8, 16, 16 ; J
db 0, 0, 8, 16 ; L
db 8, 8, 16, 16 ; O
db 0, 8, 8, 16 ; T
sPieceYOffsets:: ; How to draw each piece. Y-offsets of the sprites.
db 0, 0, 0, 0 ; I
db 0, 0, 7, 7 ; Z
db 7, 7, 0, 0 ; S
db 0, 0, 0, 7 ; J
db 7, 0, 0, 0 ; L
db 0, 7, 0, 7 ; O
db 0, 0, 7, 0 ; T
; Speed curve data is defined as follows:
; N blocks of:
; dw BCD_START_LEVEL, START_LEVEL, BCD_NEXT_100_LEVEL_BREAKPOINT
; db GRID_CELLS_PER_MOVE_ON_OVERFLOW, INCREMENT_PER_FRAME (0 means overflow each frame)
; db NORMAL_ARE, LINE_ARE, DAS, LOCK_DELAY, CLEAR_DELAY
;
; Followed by one single:
; dw $FFFF
sDMGTSpeedCurve:: ; Speed curve of the game.
dw $0000, 0, $0100 ; Level 0000
db 1, 16
db 25, 15, 14, 30, 40
dw $0015, 15, $0100 ; Level 0015
db 1, 17
db 25, 15, 14, 30, 40
dw $0030, 30, $0100 ; Level 0030
db 1, 18
db 25, 15, 14, 30, 40
dw $0040, 40, $0100 ; Level 0040
db 1, 20
db 25, 15, 14, 30, 40
dw $0050, 50, $0100 ; Level 0050
db 1, 21
db 25, 15, 14, 30, 40
dw $0060, 60, $0100 ; Level 0060
db 1, 23
db 25, 15, 14, 30, 40
dw $0070, 70, $0100 ; Level 0070
db 1, 26
db 25, 15, 14, 30, 40
dw $0080, 80, $0100 ; Level 0080
db 1, 28
db 25, 15, 14, 30, 40
dw $0090, 90, $0100 ; Level 0090
db 1, 32
db 25, 15, 14, 30, 40
dw $0100, 100, $0200 ; Level 0100
db 1, 37
db 25, 15, 14, 30, 40
dw $0150, 150, $0200 ; Level 0150
db 1, 43
db 25, 15, 14, 30, 40
dw $0200, 200, $0300 ; Level 0200
db 1, 51
db 25, 15, 14, 30, 40
dw $0225, 225, $0300 ; Level 0225
db 1, 64
db 25, 15, 14, 30, 40
dw $0250, 250, $0300 ; Level 0250
db 1, 85
db 25, 15, 14, 30, 40
dw $0275, 275, $0300 ; Level 0275
db 1, 128
db 25, 15, 14, 30, 40
dw $0300, 300, $0400 ; Level 0300
db 1, $00
db 25, 7, 14, 30, 32
dw $0350, 350, $0350 ; Level 0350
db 2, $00
db 25, 7, 14, 30, 32
dw $0400, 400, $0400 ; Level 0400
db 3, $00
db 25, 7, 14, 30, 32
dw $0450, 450, $0500 ; Level 0450
db 4, $00
db 25, 7, 14, 30, 32
dw $0475, 475, $0500 ; Level 0475
db 5, $00
db 25, 7, 14, 30, 32
dw $0500, 500, $0600 ; Level 0500
db 20, $00
db 25, 6, 14, 30, 24
dw $0600, 600, $0700 ; Level 0600
db 20, $00
db 25, 6, 8, 30, 24
dw $0700, 700, $0800 ; Level 0700
db 20, $00
db 20, 6, 8, 30, 24
dw $0900, 900, $1000 ; Level 0900
db 20, $00
db 16, 4, 6, 25, 16
dw $1100, 1100, $1200 ; Level 1100
db 20, $00
db 12, 4, 6, 25, 16
dw $1200, 1200, $1300 ; Level 1200
db 20, $00
db 12, 4, 6, 25, 8
dw $1300, 1300, $1400 ; Level 1300
db 20, $00
db 10, 4, 6, 20, 7
dw $1400, 1400, $1500 ; Level 1400
db 20, $00
db 10, 4, 6, 18, 6
dw $1500, 1500, $1600 ; Level 1500
db 20, $00
db 8, 4, 4, 16, 5
dw $1600, 1600, $1700 ; Level 1600
db 20, $00
db 8, 4, 4, 14, 4
dw $1700, 1700, $1800 ; Level 1700
db 20, $00
db 6, 4, 4, 12, 3
dw $1800, 1800, $1900 ; Level 1800
db 20, $00
db 6, 4, 4, 10, 3
dw $1900, 1900, $2000 ; Level 1900
db 20, $00
db 4, 4, 4, 8, 3
dw $2000, 2000, $2100 ; Level 2000
db 20, $00
db 4, 4, 3, 8, 3
dw $2500, 2500, $2600 ; Level 2500
db 20, $00
db 2, 2, 1, 8, 2
dw $3000, 3000, $3100 ; Level 3000
db 20, $00
db 1, 1, 1, 8, 1
dw $4000, 4000, $4100 ; Level 4000
db 20, $00
db 1, 1, 1, 6, 1
dw $5000, 5000, $5100 ; Level 5000
db 20, $00
db 1, 1, 1, 4, 1
dw $6666, 6666, $6700 ; Level 6666
db 20, $00
db 1, 1, 1, 2, 1
dw $9999, 9999, $9999 ; Level 9999
db 20, $00
db 1, 1, 1, 1, 1
sDMGTSpeedCurveEnd::
dw $FFFF ; End.
sTGM1SpeedCurve::
dw $0000, 0, $0100
db 1, 4
db 30, 30, 16, 30, 41
dw $0030, 30, $0100
db 1, 6
db 30, 30, 16, 30, 41
dw $0035, 35, $0100
db 1, 8
db 30, 30, 16, 30, 41
dw $0040, 40, $0100
db 1, 10
db 30, 30, 16, 30, 41
dw $0050, 50, $0100
db 1, 12
db 30, 30, 16, 30, 41
dw $0060, 60, $0100
db 1, 16
db 30, 30, 16, 30, 41
dw $0070, 70, $0100
db 1, 32
db 30, 30, 16, 30, 41
dw $0080, 80, $0100
db 1, 48
db 30, 30, 16, 30, 41
dw $0090, 90, $0100
db 1, 64
db 30, 30, 16, 30, 41
dw $0100, 100, $0200
db 1, 80
db 30, 30, 16, 30, 41
dw $0120, 120, $0200
db 1, 96
db 30, 30, 16, 30, 41
dw $0140, 140, $0200
db 1, 112
db 30, 30, 16, 30, 41
dw $0160, 160, $0200
db 1, 128
db 30, 30, 16, 30, 41
dw $0170, 170, $0200
db 1, 144
db 30, 30, 16, 30, 41
dw $0200, 200, $0300
db 1, 4
db 30, 30, 16, 30, 41
dw $0220, 220, $0300
db 1, 32
db 30, 30, 16, 30, 41
dw $0230, 230, $0300
db 1, 64
db 30, 30, 16, 30, 41
dw $0233, 233, $0300
db 1, 96
db 30, 30, 16, 30, 41
dw $0236, 236, $0300
db 1, 128
db 30, 30, 16, 30, 41
dw $0239, 239, $0300
db 1, 160
db 30, 30, 16, 30, 41
dw $0243, 243, $0300
db 1, 192
db 30, 30, 16, 30, 41
dw $0247, 239, $0300
db 1, 224
db 30, 30, 16, 30, 41
dw $0251, 251, $0300
db 1, $00
db 30, 30, 16, 30, 41
dw $0300, 300, $0400
db 2, $00
db 30, 30, 16, 30, 41
dw $0330, 330, $0400
db 3, $00
db 30, 30, 16, 30, 41
dw $0360, 360, $0400
db 4, $00
db 30, 30, 16, 30, 41
dw $0400, 400, $0500
db 5, $00
db 30, 30, 16, 30, 41
dw $0420, 420, $0500
db 4, $00
db 30, 30, 16, 30, 41
dw $0450, 450, $0500
db 3, $00
db 30, 30, 16, 30, 41
dw $0500, 500, $0600
db 20, $00
db 30, 30, 16, 30, 41
sTGM1SpeedCurveEnd::
dw $FFFF
sCHILSpeedCurve::
dw $0000, 0, $0100
db 1, 5
db 10, 10, 16, 25, 17
dw $0100, 100, $0200
db 1, 6
db 10, 10, 16, 25, 17
dw $0200, 200, $0300
db 1, 7
db 10, 10, 16, 25, 17
dw $0300, 300, $0400
db 1, 8
db 10, 10, 16, 25, 17
dw $0400, 400, $0500
db 1, 9
db 10, 10, 16, 25, 17
dw $0500, 500, $0600
db 1, 11
db 10, 10, 16, 25, 17
dw $0600, 600, $0700
db 1, 14
db 10, 10, 16, 25, 17
dw $0700, 700, $0800
db 1, 20
db 10, 10, 16, 25, 17
dw $0800, 800, $0900
db 1, 32
db 10, 10, 16, 25, 17
dw $0900, 900, $1000
db 1, 43
db 10, 10, 16, 25, 17
dw $1000, 1000, $1100
db 1, 51
db 10, 10, 16, 25, 17
dw $1300, 1300, $1400
db 1, 64
db 10, 10, 16, 25, 17
dw $1600, 1600, $1700
db 1, 85
db 10, 10, 16, 25, 17
dw $1900, 1900, $2000
db 1, 128
db 10, 10, 16, 25, 17
dw $2900, 2900, $3000
db 1, $00
db 10, 10, 16, 25, 17
dw $3333, 3333, $3400
db 2, $00
db 10, 10, 12, 25, 17
dw $4444, 4444, $4500
db 3, $00
db 10, 10, 12, 25, 17
dw $5555, 5555, $5600
db 4, $00
db 10, 10, 12, 25, 17
dw $6666, 6666, $6700
db 5, $00
db 10, 10, 12, 25, 17
dw $7777, 7777, $7800
db 20, $00
db 10, 10, 8, 25, 17
dw $8888, 8888, $8900
db 20, $00
db 10, 10, 6, 18, 17
dw $9999, 9999, $9999
db 20, $00
db 5, 5, 6, 14, 10
sCHILSpeedCurveEnd::
dw $FFFF
sTGM3SpeedCurve::
dw $0000, 0, $0100
db 1, 4
db 27, 27, 16, 30, 40
dw $0030, 30, $0100
db 1, 6
db 27, 27, 16, 30, 40
dw $0035, 35, $0100
db 1, 8
db 27, 27, 16, 30, 40
dw $0040, 40, $0100
db 1, 10
db 27, 27, 16, 30, 40
dw $0050, 50, $0100
db 1, 12
db 27, 27, 16, 30, 40
dw $0060, 60, $0100
db 1, 16
db 27, 27, 16, 30, 40
dw $0070, 70, $0100
db 1, 32
db 27, 27, 16, 30, 40
dw $0080, 80, $0100
db 1, 48
db 27, 27, 16, 30, 40
dw $0090, 90, $0100
db 1, 64
db 27, 27, 16, 30, 40
dw $0100, 100, $0200
db 1, 80
db 27, 27, 16, 30, 40
dw $0120, 120, $0200
db 1, 96
db 27, 27, 16, 30, 40
dw $0140, 140, $0200
db 1, 112
db 27, 27, 16, 30, 40
dw $0160, 160, $0200
db 1, 128
db 27, 27, 16, 30, 40
dw $0170, 170, $0200
db 1, 144
db 27, 27, 16, 30, 40
dw $0200, 200, $0300
db 1, 4
db 27, 27, 16, 30, 40
dw $0220, 220, $0300
db 1, 32
db 27, 27, 16, 30, 40
dw $0230, 230, $0300
db 1, 64
db 27, 27, 16, 30, 40
dw $0233, 233, $0300
db 1, 96
db 27, 27, 16, 30, 40
dw $0236, 236, $0300
db 1, 128
db 27, 27, 16, 30, 40
dw $0239, 239, $0300
db 1, 160
db 27, 27, 16, 30, 40
dw $0243, 243, $0300
db 1, 192
db 27, 27, 16, 30, 40
dw $0247, 239, $0300
db 1, 224
db 27, 27, 16, 30, 40
dw $0251, 251, $0300
db 1, $00
db 27, 27, 16, 30, 40
dw $0300, 300, $0400
db 2, $00
db 27, 27, 16, 30, 40
dw $0330, 330, $0400
db 3, $00
db 27, 27, 16, 30, 40
dw $0360, 360, $0400
db 4, $00
db 27, 27, 16, 30, 40
dw $0400, 400, $0500
db 5, $00
db 27, 27, 16, 30, 40
dw $0420, 420, $0500
db 4, $00
db 27, 27, 16, 30, 40
dw $0450, 450, $0500
db 3, $00
db 27, 27, 16, 30, 40
dw $0500, 500, $0600
db 20, $00
db 27, 27, 10, 30, 25
dw $0600, 600, $0700
db 20, $00
db 27, 18, 10, 30, 16
dw $0700, 700, $0800
db 20, $00
db 18, 14, 10, 30, 12
dw $0800, 800, $0900
db 20, $00
db 14, 8, 10, 30, 6
dw $0900, 900, $1000
db 20, $00
db 14, 8, 8, 17, 6
dw $1000, 1000, $1100
db 20, $00
db 8, 8, 8, 17, 6
dw $1100, 1000, $1200
db 20, $00
db 7, 7, 8, 15, 6
dw $1200, 1000, $1300
db 20, $00
db 6, 6, 8, 15, 6
sTGM3SpeedCurveEnd::
dw $FFFF
sDEATSpeedCurve::
dw $0000, 0, $0100
db 20, $00
db 18, 14, 12, 30, 12
dw $0100, 0, $0200
db 20, $00
db 14, 8, 12, 26, 6
dw $0200, 0, $0300
db 20, $00
db 14, 8, 11, 22, 6
dw $0300, 0, $0400
db 20, $00
db 8, 8, 10, 18, 6
dw $0400, 0, $0500
db 20, $00
db 7, 7, 8, 15, 5
dw $0500, 0, $0600
db 20, $00
db 6, 6, 8, 15, 4
sDEATSpeedCurveEnd::
dw $FFFF
sSHIRSpeedCurve::
dw $0000, 0, $0100
db 20, $00
db 12, 8, 10, 18, 6
dw $0100, 100, $0200
db 20, $00
db 12, 7, 8, 18, 5
dw $0200, 200, $0300
db 20, $00
db 12, 6, 8, 17, 4
dw $0300, 300, $0400
db 20, $00
db 6, 6, 8, 15, 4
dw $0500, 500, $0600
db 20, $00
db 6, 5, 6, 13, 3
dw $1100, 1100, $1200
db 20, $00
db 6, 5, 6, 10, 3
dw $1200, 1200, $1300
db 20, $00
db 6, 5, 6, 8, 3
sSHIRSpeedCurveEnd::
dw $FFFF
sPieceFastRotationStates::
; I
db 14, 1, 1, 1
db 2, 14, 14, 14
db 14, 1, 1, 1
db 2, 14, 14, 14
; Z
db 14, 1, 14, 1
db 2, 13, 1, 13
db 14, 1, 14, 1
db 2, 13, 1, 13
; S
db 15, 1, 12, 1
db 0, 14, 1, 14
db 15, 1, 12, 1
db 0, 14, 1, 14
; J
db 14, 1, 1, 14
db 1, 1, 13, 14
db 14, 14, 1, 1
db 1, 14, 13, 1
; L
db 14, 1, 1, 12
db 1, 14, 14, 1
db 16, 12, 1, 1
db 0, 1, 14, 14
; O
db 15, 1, 13, 1
db 15, 1, 13, 1
db 15, 1, 13, 1
db 15, 1, 13, 1
; T
db 14, 1, 1, 13
db 1, 14, 1, 13
db 15, 13, 1, 1
db 1, 13, 1, 14
sPieceRotationStates:: ; How each piece is rotated.
; I
db %0000
db %1111
db %0000
db %0000
db %0010
db %0010
db %0010
db %0010
db %0000
db %1111
db %0000
db %0000
db %0010
db %0010
db %0010
db %0010
; Z
db %0000
db %1100
db %0110
db %0000
db %0010
db %0110
db %0100
db %0000
db %0000
db %1100
db %0110
db %0000
db %0010
db %0110
db %0100
db %0000
; S
db %0000
db %0110
db %1100
db %0000
db %1000
db %1100
db %0100
db %0000
db %0000
db %0110
db %1100
db %0000
db %1000
db %1100
db %0100
db %0000
; J
db %0000
db %1110
db %0010
db %0000
db %0110
db %0100
db %0100
db %0000
db %0000
db %1000
db %1110
db %0000
db %0100
db %0100
db %1100
db %0000
; L
db %0000
db %1110
db %1000
db %0000
db %0100
db %0100
db %0110
db %0000
db %0000
db %0010
db %1110
db %0000
db %1100
db %0100
db %0100
db %0000
; O
db %0000
db %0110
db %0110
db %0000
db %0000
db %0110
db %0110
db %0000
db %0000
db %0110
db %0110
db %0000
db %0000
db %0110
db %0110
db %0000
; T
db %0000
db %1110
db %0100
db %0000
db %0100
db %0110
db %0100
db %0000
db %0000
db %0100
db %1110
db %0000
db %0100
db %1100
db %0100
db %0000
sTGM3Bag::
db 0, 0, 0, 0, 0
db 1, 1, 1, 1, 1
db 2, 2, 2, 2, 2
db 3, 3, 3, 3, 3
db 4, 4, 4, 4, 4
db 5, 5, 5, 5, 5
db 6, 6, 6, 6, 6
sTGM3Droughts::
db 0, 0, 0, 0, 0, 0, 0
ENDC

File diff suppressed because it is too large Load Diff

View File

@ -23,6 +23,55 @@ INCLUDE "hardware.inc"
INCLUDE "structs.asm" INCLUDE "structs.asm"
; Set up charmap.
CHARMAP " ", 1
CHARMAP "0", 66
CHARMAP "1", 67
CHARMAP "2", 68
CHARMAP "3", 69
CHARMAP "4", 70
CHARMAP "5", 71
CHARMAP "6", 72
CHARMAP "7", 73
CHARMAP "8", 74
CHARMAP "9", 75
CHARMAP "A", 76
CHARMAP "B", 77
CHARMAP "C", 78
CHARMAP "D", 79
CHARMAP "E", 80
CHARMAP "F", 81
CHARMAP "G", 82
CHARMAP "H", 83
CHARMAP "I", 84
CHARMAP "J", 85
CHARMAP "K", 86
CHARMAP "L", 87
CHARMAP "M", 88
CHARMAP "N", 89
CHARMAP "O", 90
CHARMAP "P", 91
CHARMAP "Q", 92
CHARMAP "R", 93
CHARMAP "S", 94
CHARMAP "T", 95
CHARMAP "U", 96
CHARMAP "V", 97
CHARMAP "W", 98
CHARMAP "X", 99
CHARMAP "Y", 100
CHARMAP "Z", 101
CHARMAP "!", 102
CHARMAP "?", 103
CHARMAP "[", 129
CHARMAP "]", 130
CHARMAP "/", 128
CHARMAP "-", 127
CHARMAP "#", 126
CHARMAP ".", 216
CHARMAP ":", 222
; Waits for PPU mode to be 0 or 1. ; Waits for PPU mode to be 0 or 1.
; We don't wait for 2 because it's super short and impractical to do much of anything in. ; We don't wait for 2 because it's super short and impractical to do much of anything in.
MACRO wait_vram MACRO wait_vram
@ -87,11 +136,14 @@ MACRO lb
ENDM ENDM
; Magic bytes for save files. ; Bank names
DEF SAVE_MAGIC_0 EQU "D" DEF BANK_MAIN EQU 0
DEF SAVE_MAGIC_1 EQU "M" DEF BANK_OTHER EQU 1
DEF SAVE_MAGIC_2 EQU "G" DEF BANK_SFX EQU 2
DEF SAVE_MAGIC_3 EQU "5" DEF BANK_MUSIC EQU 3
DEF BANK_TITLE EQU 4
DEF BANK_GAMEPLAY EQU 5
DEF BANK_GAMEPLAY_BIG EQU 6
; Some useful palettes. ; Some useful palettes.
DEF PALETTE_REGULAR EQU %11100100 DEF PALETTE_REGULAR EQU %11100100
@ -231,6 +283,8 @@ DEF LEADY_TIME EQU 80
DEF GO_TIME EQU 40 DEF GO_TIME EQU 40
DEF PIECE_SPAWN_X EQU 5 DEF PIECE_SPAWN_X EQU 5
DEF PIECE_SPAWN_Y EQU 3 DEF PIECE_SPAWN_Y EQU 3
DEF PIECE_SPAWN_X_BIG EQU 3
DEF PIECE_SPAWN_Y_BIG EQU 3
DEF ROTATION_STATE_DEF EQU 0 DEF ROTATION_STATE_DEF EQU 0
DEF ROTATION_STATE_CW EQU 1 DEF ROTATION_STATE_CW EQU 1
DEF ROTATION_STATE_180 EQU 2 DEF ROTATION_STATE_180 EQU 2
@ -239,6 +293,7 @@ DEF ROTATION_STATE_CCW EQU 3
; Game states. (Let these increase by 3) ; Game states. (Let these increase by 3)
DEF STATE_TITLE EQU 0 DEF STATE_TITLE EQU 0
DEF STATE_GAMEPLAY EQU 3 DEF STATE_GAMEPLAY EQU 3
DEF STATE_GAMEPLAY_BIG EQU 6
; Other ; Other
DEF STACK_SIZE EQU 64 DEF STACK_SIZE EQU 64

View File

@ -43,6 +43,10 @@ hPrevHundreds:: ds 1
SECTION "Level Functions", ROM0 SECTION "Level Functions", ROM0
; Loads the initial state of the speed curve. ; Loads the initial state of the speed curve.
LevelInit:: LevelInit::
; Bank to speed curve data.
ld b, BANK_OTHER
rst RSTSwitchBank
xor a, a xor a, a
ldh [hRequiresLineClear], a ldh [hRequiresLineClear], a
@ -98,6 +102,9 @@ LevelInit::
and a, $0F and a, $0F
ldh [hNLevel], a ldh [hNLevel], a
; Restore the bank before returning.
rst RSTRestoreBank
jp DoSpeedUp jp DoSpeedUp
@ -303,6 +310,10 @@ LevelUp::
; Iterates over the speed curve and loads the new constants. ; Iterates over the speed curve and loads the new constants.
DoSpeedUp: DoSpeedUp:
; Bank to speed curve data.
ld b, BANK_OTHER
rst RSTSwitchBank
; Load curve ptr. ; Load curve ptr.
ldh a, [hSpeedCurvePtr] ldh a, [hSpeedCurvePtr]
ld l, a ld l, a
@ -344,12 +355,12 @@ DoSpeedUp:
; Do we want to force 20G? ; Do we want to force 20G?
ld a, [wAlways20GState] ld a, [wAlways20GState]
cp a, 0 cp a, 0
ret z jp z, RSTRestoreBank
ld a, 20 ld a, 20
ldh [hCurrentIntegerGravity], a ldh [hCurrentIntegerGravity], a
ld a, $00 ld a, $00
ldh [hCurrentFractionalGravity], a ldh [hCurrentFractionalGravity], a
ret jp RSTRestoreBank
ENDC ENDC

View File

@ -20,9 +20,7 @@ DEF MAIN_ASM EQU 1
INCLUDE "globals.asm" INCLUDE "globals.asm"
INCLUDE "res/tiles.inc" INCLUDE "res/other_data.inc"
INCLUDE "res/gameplay_map.inc"
INCLUDE "res/title_map.inc"
SECTION "High Globals", HRAM SECTION "High Globals", HRAM
@ -85,13 +83,13 @@ Main::
ld [rRAMG], a ld [rRAMG], a
xor a, a xor a, a
ld [rRAMB], a ld [rRAMB], a
ld a, BANK("Static Data") ld a, BANK_OTHER
ld [rROMB0], a ld [rROMB0], a
; We use a single set of tiles for the entire game, so we copy it at the start. ; We use a single set of tiles for the entire game, so we copy it at the start.
ld de, Tiles ld de, sTiles
ld hl, _VRAM ld hl, _VRAM
ld bc, TilesEnd - Tiles ld bc, sTilesEnd - sTiles
call SafeMemCopy call SafeMemCopy
; Clear OAM. ; Clear OAM.
@ -138,6 +136,7 @@ EventLoop::
.eventloopjumps .eventloopjumps
jp TitleEventLoopHandler jp TitleEventLoopHandler
jp GamePlayEventLoopHandler jp GamePlayEventLoopHandler
jp GamePlayBigEventLoopHandler
EventLoopPostHandler:: EventLoopPostHandler::
; Wait for vblank. ; Wait for vblank.
@ -157,6 +156,7 @@ EventLoopPostHandler::
.vblankjumps .vblankjumps
jp TitleVBlankHandler jp TitleVBlankHandler
jp BlitField jp BlitField
jp BlitField
; The VBlank Handler is expected to end with jp EventLoop. ; The VBlank Handler is expected to end with jp EventLoop.

View File

@ -15,12 +15,232 @@
; along with this program. If not, see <https://www.gnu.org/licenses/>. ; along with this program. If not, see <https://www.gnu.org/licenses/>.
IF !DEF(GAMEPLAY_MAP_INC) IF !DEF(GAMEPLAY_BIG_MAP_INC)
DEF GAMEPLAY_MAP_INC EQU 1 DEF GAMEPLAY_BIG_MAP_INC EQU 1
SECTION "Gameplay Tilemap", ROMX, BANK[1] INCLUDE "globals.asm"
GameplayTilemap::
SECTION "Gameplay Big Static Data", ROMX, BANK[BANK_GAMEPLAY_BIG]
sBigLeady:: db " READY? "
sBigGo:: db " GO "
sBigPause::
db "P A U S E "
db " P A U S E"
sBigPieceXOffsets:: ; How to draw each piece. X-offsets of the sprites.
db 0, 8, 16, 24 ; I
db 0, 8, 8, 16 ; Z
db 0, 8, 8, 16 ; S
db 0, 8, 16, 16 ; J
db 0, 0, 8, 16 ; L
db 8, 8, 16, 16 ; O
db 0, 8, 8, 16 ; T
sBigPieceYOffsets:: ; How to draw each piece. Y-offsets of the sprites.
db 0, 0, 0, 0 ; I
db 0, 0, 7, 7 ; Z
db 7, 7, 0, 0 ; S
db 0, 0, 0, 7 ; J
db 7, 0, 0, 0 ; L
db 0, 7, 0, 7 ; O
db 0, 0, 7, 0 ; T
sBigPieceFastRotationStates::
; I
db 14, 1, 1, 1
db 2, 14, 14, 14
db 14, 1, 1, 1
db 2, 14, 14, 14
; Z
db 14, 1, 14, 1
db 2, 13, 1, 13
db 14, 1, 14, 1
db 2, 13, 1, 13
; S
db 15, 1, 12, 1
db 0, 14, 1, 14
db 15, 1, 12, 1
db 0, 14, 1, 14
; J
db 14, 1, 1, 14
db 1, 1, 13, 14
db 14, 14, 1, 1
db 1, 14, 13, 1
; L
db 14, 1, 1, 12
db 1, 14, 14, 1
db 16, 12, 1, 1
db 0, 1, 14, 14
; O
db 15, 1, 13, 1
db 15, 1, 13, 1
db 15, 1, 13, 1
db 15, 1, 13, 1
; T
db 14, 1, 1, 13
db 1, 14, 1, 13
db 15, 13, 1, 1
db 1, 13, 1, 14
sBigPieceRotationStates:: ; How each piece is rotated.
; I
db %0000
db %1111
db %0000
db %0000
db %0010
db %0010
db %0010
db %0010
db %0000
db %1111
db %0000
db %0000
db %0010
db %0010
db %0010
db %0010
; Z
db %0000
db %1100
db %0110
db %0000
db %0010
db %0110
db %0100
db %0000
db %0000
db %1100
db %0110
db %0000
db %0010
db %0110
db %0100
db %0000
; S
db %0000
db %0110
db %1100
db %0000
db %1000
db %1100
db %0100
db %0000
db %0000
db %0110
db %1100
db %0000
db %1000
db %1100
db %0100
db %0000
; J
db %0000
db %1110
db %0010
db %0000
db %0110
db %0100
db %0100
db %0000
db %0000
db %1000
db %1110
db %0000
db %0100
db %0100
db %1100
db %0000
; L
db %0000
db %1110
db %1000
db %0000
db %0100
db %0100
db %0110
db %0000
db %0000
db %0010
db %1110
db %0000
db %1100
db %0100
db %0100
db %0000
; O
db %0000
db %0110
db %0110
db %0000
db %0000
db %0110
db %0110
db %0000
db %0000
db %0110
db %0110
db %0000
db %0000
db %0110
db %0110
db %0000
; T
db %0000
db %1110
db %0100
db %0000
db %0100
db %0110
db %0100
db %0000
db %0000
db %0100
db %1110
db %0000
db %0100
db %1100
db %0100
db %0000
sBigGameplayTileMap::
DB $02,$01,$01,$01,$01,$01,$01,$01,$01,$01 DB $02,$01,$01,$01,$01,$01,$01,$01,$01,$01
DB $01,$03,$09,$01,$01,$01,$01,$01,$01,$09 DB $01,$03,$09,$01,$01,$01,$01,$01,$01,$09
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
@ -87,7 +307,7 @@ GameplayTilemap::
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DB $02,$00,$00,$00,$00,$00,$00,$00,$00,$00 DB $02,$00,$00,$00,$00,$00,$00,$00,$00,$00
DB $00,$03,$09,$01,$01,$01,$01,$01,$01,$09 DB $00,$03,$09,$01,$01,$01,$01,$01,$01,$09
GameplayTilemapEnd:: sBigGameplayTileMapEnd::
ENDC ENDC

325
src/res/gameplay_data.inc Normal file
View File

@ -0,0 +1,325 @@
; DMGTRIS
; Copyright (C) 2023 - Randy Thiemann <randy.thiemann@gmail.com>
; This program is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <https://www.gnu.org/licenses/>.
IF !DEF(GAMEPLAY_MAP_INC)
DEF GAMEPLAY_MAP_INC EQU 1
INCLUDE "globals.asm"
SECTION "Gameplay Static Data", ROMX, BANK[BANK_GAMEPLAY]
sLeady:: db " READY? "
sGo:: db " GO "
sPause::
db "P A U S E "
db " P A U S E"
sPieceXOffsets:: ; How to draw each piece. X-offsets of the sprites.
db 0, 8, 16, 24 ; I
db 0, 8, 8, 16 ; Z
db 0, 8, 8, 16 ; S
db 0, 8, 16, 16 ; J
db 0, 0, 8, 16 ; L
db 8, 8, 16, 16 ; O
db 0, 8, 8, 16 ; T
sPieceYOffsets:: ; How to draw each piece. Y-offsets of the sprites.
db 0, 0, 0, 0 ; I
db 0, 0, 7, 7 ; Z
db 7, 7, 0, 0 ; S
db 0, 0, 0, 7 ; J
db 7, 0, 0, 0 ; L
db 0, 7, 0, 7 ; O
db 0, 0, 7, 0 ; T
sPieceFastRotationStates::
; I
db 14, 1, 1, 1
db 2, 14, 14, 14
db 14, 1, 1, 1
db 2, 14, 14, 14
; Z
db 14, 1, 14, 1
db 2, 13, 1, 13
db 14, 1, 14, 1
db 2, 13, 1, 13
; S
db 15, 1, 12, 1
db 0, 14, 1, 14
db 15, 1, 12, 1
db 0, 14, 1, 14
; J
db 14, 1, 1, 14
db 1, 1, 13, 14
db 14, 14, 1, 1
db 1, 14, 13, 1
; L
db 14, 1, 1, 12
db 1, 14, 14, 1
db 16, 12, 1, 1
db 0, 1, 14, 14
; O
db 15, 1, 13, 1
db 15, 1, 13, 1
db 15, 1, 13, 1
db 15, 1, 13, 1
; T
db 14, 1, 1, 13
db 1, 14, 1, 13
db 15, 13, 1, 1
db 1, 13, 1, 14
sPieceRotationStates:: ; How each piece is rotated.
; I
db %0000
db %1111
db %0000
db %0000
db %0010
db %0010
db %0010
db %0010
db %0000
db %1111
db %0000
db %0000
db %0010
db %0010
db %0010
db %0010
; Z
db %0000
db %1100
db %0110
db %0000
db %0010
db %0110
db %0100
db %0000
db %0000
db %1100
db %0110
db %0000
db %0010
db %0110
db %0100
db %0000
; S
db %0000
db %0110
db %1100
db %0000
db %1000
db %1100
db %0100
db %0000
db %0000
db %0110
db %1100
db %0000
db %1000
db %1100
db %0100
db %0000
; J
db %0000
db %1110
db %0010
db %0000
db %0110
db %0100
db %0100
db %0000
db %0000
db %1000
db %1110
db %0000
db %0100
db %0100
db %1100
db %0000
; L
db %0000
db %1110
db %1000
db %0000
db %0100
db %0100
db %0110
db %0000
db %0000
db %0010
db %1110
db %0000
db %1100
db %0100
db %0100
db %0000
; O
db %0000
db %0110
db %0110
db %0000
db %0000
db %0110
db %0110
db %0000
db %0000
db %0110
db %0110
db %0000
db %0000
db %0110
db %0110
db %0000
; T
db %0000
db %1110
db %0100
db %0000
db %0100
db %0110
db %0100
db %0000
db %0000
db %0100
db %1110
db %0000
db %0100
db %1100
db %0100
db %0000
sTGM3Bag::
db 0, 0, 0, 0, 0
db 1, 1, 1, 1, 1
db 2, 2, 2, 2, 2
db 3, 3, 3, 3, 3
db 4, 4, 4, 4, 4
db 5, 5, 5, 5, 5
db 6, 6, 6, 6, 6
sTGM3Droughts::
db 0, 0, 0, 0, 0, 0, 0
sGameplayTileMap::
DB $02,$01,$01,$01,$01,$01,$01,$01,$01,$01
DB $01,$03,$09,$01,$01,$01,$01,$01,$01,$09
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$02,$01,$01,$01,$01,$01,$01,$01
DB $01,$01,$01,$03,$09,$59,$50,$63,$5F,$01
DB $01,$09,$00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$00,$00,$02,$01,$01,$01,$01,$01
DB $01,$01,$01,$01,$01,$03,$09,$01,$01,$01
DB $01,$01,$01,$09,$00,$00,$00,$00,$00,$00
DB $00,$00,$00,$00,$00,$00,$02,$01,$01,$01
DB $01,$01,$01,$01,$01,$01,$01,$03,$09,$01
DB $01,$01,$01,$01,$01,$09,$00,$00,$00,$00
DB $00,$00,$00,$00,$00,$00,$00,$00,$02,$01
DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$03
DB $09,$01,$01,$01,$01,$01,$01,$09,$00,$00
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DB $02,$01,$01,$01,$01,$01,$01,$01,$01,$01
DB $01,$03,$09,$01,$01,$01,$01,$01,$01,$09
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$02,$01,$01,$01,$01,$01,$01,$01
DB $01,$01,$01,$03,$08,$06,$06,$06,$06,$06
DB $06,$07,$00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$00,$00,$02,$01,$01,$01,$01,$01
DB $01,$01,$01,$01,$01,$03,$09,$53,$5A,$57
DB $4F,$01,$01,$09,$00,$00,$00,$00,$00,$00
DB $00,$00,$00,$00,$00,$00,$02,$01,$01,$01
DB $01,$01,$01,$01,$01,$01,$01,$03,$09,$01
DB $01,$01,$01,$01,$01,$09,$00,$00,$00,$00
DB $00,$00,$00,$00,$00,$00,$00,$00,$02,$01
DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$03
DB $09,$01,$01,$01,$01,$01,$01,$09,$00,$00
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DB $02,$01,$01,$01,$01,$01,$01,$01,$01,$01
DB $01,$03,$09,$01,$01,$01,$01,$01,$01,$09
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$02,$01,$01,$01,$01,$01,$01,$01
DB $01,$01,$01,$03,$09,$01,$01,$01,$01,$01
DB $01,$09,$00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$00,$00,$02,$01,$01,$01,$01,$01
DB $01,$01,$01,$01,$01,$03,$08,$06,$06,$06
DB $06,$06,$06,$07,$00,$00,$00,$00,$00,$00
DB $00,$00,$00,$00,$00,$00,$02,$01,$01,$01
DB $01,$01,$01,$01,$01,$01,$01,$03,$09,$5E
DB $4E,$5A,$5D,$50,$01,$09,$00,$00,$00,$00
DB $00,$00,$00,$00,$00,$00,$00,$00,$02,$01
DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$03
DB $09,$01,$01,$01,$01,$01,$01,$09,$00,$00
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DB $02,$01,$01,$01,$01,$01,$01,$01,$01,$01
DB $01,$03,$08,$06,$06,$06,$06,$06,$06,$07
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$02,$01,$01,$01,$01,$01,$01,$01
DB $01,$01,$01,$03,$09,$57,$50,$61,$50,$57
DB $01,$09,$00,$00,$00,$00,$00,$00,$00,$00
DB $00,$00,$00,$00,$02,$01,$01,$01,$01,$01
DB $01,$01,$01,$01,$01,$03,$09,$01,$01,$01
DB $01,$01,$01,$09,$00,$00,$00,$00,$00,$00
DB $00,$00,$00,$00,$00,$00,$02,$01,$01,$01
DB $01,$01,$01,$01,$01,$01,$01,$03,$09,$01
DB $05,$05,$05,$05,$01,$09,$00,$00,$00,$00
DB $00,$00,$00,$00,$00,$00,$00,$00,$02,$01
DB $01,$01,$01,$01,$01,$01,$01,$01,$01,$03
DB $09,$01,$01,$01,$01,$01,$01,$09,$00,$00
DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00
DB $02,$00,$00,$00,$00,$00,$00,$00,$00,$00
DB $00,$03,$09,$01,$01,$01,$01,$01,$01,$09
sGameplayTileMapEnd::
ENDC

View File

@ -18,7 +18,11 @@
IF !DEF(MUSIC_DATA_INC) IF !DEF(MUSIC_DATA_INC)
DEF MUSIC_DATA_INC EQU 1 DEF MUSIC_DATA_INC EQU 1
SECTION "Music Data", ROMX, BANK[3]
INCLUDE "globals.asm"
SECTION "Music Data", ROMX, BANK[BANK_MUSIC]
sMusicMenu:: sMusicMenu::
db REG_NR12_CH1_VOLEV, $00, REG_NR14_CH1_FRQHI, $80, REG_NR22_CH2_VOLEV, $00, REG_NR24_CH2_FRQHI, $80 db REG_NR12_CH1_VOLEV, $00, REG_NR14_CH1_FRQHI, $80, REG_NR22_CH2_VOLEV, $00, REG_NR24_CH2_FRQHI, $80

View File

@ -18,8 +18,614 @@
IF !DEF(TILES_INC) IF !DEF(TILES_INC)
DEF TILES_INC EQU 1 DEF TILES_INC EQU 1
SECTION "Tile data", ROMX, BANK[1]
Tiles:: INCLUDE "globals.asm"
SECTION "Tile data", ROMX, BANK[BANK_OTHER]
; Speed curve data is defined as follows:
; N blocks of:
; dw BCD_START_LEVEL, START_LEVEL, BCD_NEXT_100_LEVEL_BREAKPOINT
; db GRID_CELLS_PER_MOVE_ON_OVERFLOW, INCREMENT_PER_FRAME (0 means overflow each frame)
; db NORMAL_ARE, LINE_ARE, DAS, LOCK_DELAY, CLEAR_DELAY
;
; Followed by one single:
; dw $FFFF
sDMGTSpeedCurve:: ; Speed curve of the game.
dw $0000, 0, $0100 ; Level 0000
db 1, 16
db 25, 15, 14, 30, 40
dw $0015, 15, $0100 ; Level 0015
db 1, 17
db 25, 15, 14, 30, 40
dw $0030, 30, $0100 ; Level 0030
db 1, 18
db 25, 15, 14, 30, 40
dw $0040, 40, $0100 ; Level 0040
db 1, 20
db 25, 15, 14, 30, 40
dw $0050, 50, $0100 ; Level 0050
db 1, 21
db 25, 15, 14, 30, 40
dw $0060, 60, $0100 ; Level 0060
db 1, 23
db 25, 15, 14, 30, 40
dw $0070, 70, $0100 ; Level 0070
db 1, 26
db 25, 15, 14, 30, 40
dw $0080, 80, $0100 ; Level 0080
db 1, 28
db 25, 15, 14, 30, 40
dw $0090, 90, $0100 ; Level 0090
db 1, 32
db 25, 15, 14, 30, 40
dw $0100, 100, $0200 ; Level 0100
db 1, 37
db 25, 15, 14, 30, 40
dw $0150, 150, $0200 ; Level 0150
db 1, 43
db 25, 15, 14, 30, 40
dw $0200, 200, $0300 ; Level 0200
db 1, 51
db 25, 15, 14, 30, 40
dw $0225, 225, $0300 ; Level 0225
db 1, 64
db 25, 15, 14, 30, 40
dw $0250, 250, $0300 ; Level 0250
db 1, 85
db 25, 15, 14, 30, 40
dw $0275, 275, $0300 ; Level 0275
db 1, 128
db 25, 15, 14, 30, 40
dw $0300, 300, $0400 ; Level 0300
db 1, $00
db 25, 7, 14, 30, 32
dw $0350, 350, $0350 ; Level 0350
db 2, $00
db 25, 7, 14, 30, 32
dw $0400, 400, $0400 ; Level 0400
db 3, $00
db 25, 7, 14, 30, 32
dw $0450, 450, $0500 ; Level 0450
db 4, $00
db 25, 7, 14, 30, 32
dw $0475, 475, $0500 ; Level 0475
db 5, $00
db 25, 7, 14, 30, 32
dw $0500, 500, $0600 ; Level 0500
db 20, $00
db 25, 6, 14, 30, 24
dw $0600, 600, $0700 ; Level 0600
db 20, $00
db 25, 6, 8, 30, 24
dw $0700, 700, $0800 ; Level 0700
db 20, $00
db 20, 6, 8, 30, 24
dw $0900, 900, $1000 ; Level 0900
db 20, $00
db 16, 4, 6, 25, 16
dw $1100, 1100, $1200 ; Level 1100
db 20, $00
db 12, 4, 6, 25, 16
dw $1200, 1200, $1300 ; Level 1200
db 20, $00
db 12, 4, 6, 25, 8
dw $1300, 1300, $1400 ; Level 1300
db 20, $00
db 10, 4, 6, 20, 7
dw $1400, 1400, $1500 ; Level 1400
db 20, $00
db 10, 4, 6, 18, 6
dw $1500, 1500, $1600 ; Level 1500
db 20, $00
db 8, 4, 4, 16, 5
dw $1600, 1600, $1700 ; Level 1600
db 20, $00
db 8, 4, 4, 14, 4
dw $1700, 1700, $1800 ; Level 1700
db 20, $00
db 6, 4, 4, 12, 3
dw $1800, 1800, $1900 ; Level 1800
db 20, $00
db 6, 4, 4, 10, 3
dw $1900, 1900, $2000 ; Level 1900
db 20, $00
db 4, 4, 4, 8, 3
dw $2000, 2000, $2100 ; Level 2000
db 20, $00
db 4, 4, 3, 8, 3
dw $2500, 2500, $2600 ; Level 2500
db 20, $00
db 2, 2, 1, 8, 2
dw $3000, 3000, $3100 ; Level 3000
db 20, $00
db 1, 1, 1, 8, 1
dw $4000, 4000, $4100 ; Level 4000
db 20, $00
db 1, 1, 1, 6, 1
dw $5000, 5000, $5100 ; Level 5000
db 20, $00
db 1, 1, 1, 4, 1
dw $6666, 6666, $6700 ; Level 6666
db 20, $00
db 1, 1, 1, 2, 1
dw $9999, 9999, $9999 ; Level 9999
db 20, $00
db 1, 1, 1, 1, 1
sDMGTSpeedCurveEnd::
dw $FFFF ; End.
sTGM1SpeedCurve::
dw $0000, 0, $0100
db 1, 4
db 30, 30, 16, 30, 41
dw $0030, 30, $0100
db 1, 6
db 30, 30, 16, 30, 41
dw $0035, 35, $0100
db 1, 8
db 30, 30, 16, 30, 41
dw $0040, 40, $0100
db 1, 10
db 30, 30, 16, 30, 41
dw $0050, 50, $0100
db 1, 12
db 30, 30, 16, 30, 41
dw $0060, 60, $0100
db 1, 16
db 30, 30, 16, 30, 41
dw $0070, 70, $0100
db 1, 32
db 30, 30, 16, 30, 41
dw $0080, 80, $0100
db 1, 48
db 30, 30, 16, 30, 41
dw $0090, 90, $0100
db 1, 64
db 30, 30, 16, 30, 41
dw $0100, 100, $0200
db 1, 80
db 30, 30, 16, 30, 41
dw $0120, 120, $0200
db 1, 96
db 30, 30, 16, 30, 41
dw $0140, 140, $0200
db 1, 112
db 30, 30, 16, 30, 41
dw $0160, 160, $0200
db 1, 128
db 30, 30, 16, 30, 41
dw $0170, 170, $0200
db 1, 144
db 30, 30, 16, 30, 41
dw $0200, 200, $0300
db 1, 4
db 30, 30, 16, 30, 41
dw $0220, 220, $0300
db 1, 32
db 30, 30, 16, 30, 41
dw $0230, 230, $0300
db 1, 64
db 30, 30, 16, 30, 41
dw $0233, 233, $0300
db 1, 96
db 30, 30, 16, 30, 41
dw $0236, 236, $0300
db 1, 128
db 30, 30, 16, 30, 41
dw $0239, 239, $0300
db 1, 160
db 30, 30, 16, 30, 41
dw $0243, 243, $0300
db 1, 192
db 30, 30, 16, 30, 41
dw $0247, 239, $0300
db 1, 224
db 30, 30, 16, 30, 41
dw $0251, 251, $0300
db 1, $00
db 30, 30, 16, 30, 41
dw $0300, 300, $0400
db 2, $00
db 30, 30, 16, 30, 41
dw $0330, 330, $0400
db 3, $00
db 30, 30, 16, 30, 41
dw $0360, 360, $0400
db 4, $00
db 30, 30, 16, 30, 41
dw $0400, 400, $0500
db 5, $00
db 30, 30, 16, 30, 41
dw $0420, 420, $0500
db 4, $00
db 30, 30, 16, 30, 41
dw $0450, 450, $0500
db 3, $00
db 30, 30, 16, 30, 41
dw $0500, 500, $0600
db 20, $00
db 30, 30, 16, 30, 41
sTGM1SpeedCurveEnd::
dw $FFFF
sCHILSpeedCurve::
dw $0000, 0, $0100
db 1, 5
db 10, 10, 16, 25, 17
dw $0100, 100, $0200
db 1, 6
db 10, 10, 16, 25, 17
dw $0200, 200, $0300
db 1, 7
db 10, 10, 16, 25, 17
dw $0300, 300, $0400
db 1, 8
db 10, 10, 16, 25, 17
dw $0400, 400, $0500
db 1, 9
db 10, 10, 16, 25, 17
dw $0500, 500, $0600
db 1, 11
db 10, 10, 16, 25, 17
dw $0600, 600, $0700
db 1, 14
db 10, 10, 16, 25, 17
dw $0700, 700, $0800
db 1, 20
db 10, 10, 16, 25, 17
dw $0800, 800, $0900
db 1, 32
db 10, 10, 16, 25, 17
dw $0900, 900, $1000
db 1, 43
db 10, 10, 16, 25, 17
dw $1000, 1000, $1100
db 1, 51
db 10, 10, 16, 25, 17
dw $1300, 1300, $1400
db 1, 64
db 10, 10, 16, 25, 17
dw $1600, 1600, $1700
db 1, 85
db 10, 10, 16, 25, 17
dw $1900, 1900, $2000
db 1, 128
db 10, 10, 16, 25, 17
dw $2900, 2900, $3000
db 1, $00
db 10, 10, 16, 25, 17
dw $3333, 3333, $3400
db 2, $00
db 10, 10, 12, 25, 17
dw $4444, 4444, $4500
db 3, $00
db 10, 10, 12, 25, 17
dw $5555, 5555, $5600
db 4, $00
db 10, 10, 12, 25, 17
dw $6666, 6666, $6700
db 5, $00
db 10, 10, 12, 25, 17
dw $7777, 7777, $7800
db 20, $00
db 10, 10, 8, 25, 17
dw $8888, 8888, $8900
db 20, $00
db 10, 10, 6, 18, 17
dw $9999, 9999, $9999
db 20, $00
db 5, 5, 6, 14, 10
sCHILSpeedCurveEnd::
dw $FFFF
sTGM3SpeedCurve::
dw $0000, 0, $0100
db 1, 4
db 27, 27, 16, 30, 40
dw $0030, 30, $0100
db 1, 6
db 27, 27, 16, 30, 40
dw $0035, 35, $0100
db 1, 8
db 27, 27, 16, 30, 40
dw $0040, 40, $0100
db 1, 10
db 27, 27, 16, 30, 40
dw $0050, 50, $0100
db 1, 12
db 27, 27, 16, 30, 40
dw $0060, 60, $0100
db 1, 16
db 27, 27, 16, 30, 40
dw $0070, 70, $0100
db 1, 32
db 27, 27, 16, 30, 40
dw $0080, 80, $0100
db 1, 48
db 27, 27, 16, 30, 40
dw $0090, 90, $0100
db 1, 64
db 27, 27, 16, 30, 40
dw $0100, 100, $0200
db 1, 80
db 27, 27, 16, 30, 40
dw $0120, 120, $0200
db 1, 96
db 27, 27, 16, 30, 40
dw $0140, 140, $0200
db 1, 112
db 27, 27, 16, 30, 40
dw $0160, 160, $0200
db 1, 128
db 27, 27, 16, 30, 40
dw $0170, 170, $0200
db 1, 144
db 27, 27, 16, 30, 40
dw $0200, 200, $0300
db 1, 4
db 27, 27, 16, 30, 40
dw $0220, 220, $0300
db 1, 32
db 27, 27, 16, 30, 40
dw $0230, 230, $0300
db 1, 64
db 27, 27, 16, 30, 40
dw $0233, 233, $0300
db 1, 96
db 27, 27, 16, 30, 40
dw $0236, 236, $0300
db 1, 128
db 27, 27, 16, 30, 40
dw $0239, 239, $0300
db 1, 160
db 27, 27, 16, 30, 40
dw $0243, 243, $0300
db 1, 192
db 27, 27, 16, 30, 40
dw $0247, 239, $0300
db 1, 224
db 27, 27, 16, 30, 40
dw $0251, 251, $0300
db 1, $00
db 27, 27, 16, 30, 40
dw $0300, 300, $0400
db 2, $00
db 27, 27, 16, 30, 40
dw $0330, 330, $0400
db 3, $00
db 27, 27, 16, 30, 40
dw $0360, 360, $0400
db 4, $00
db 27, 27, 16, 30, 40
dw $0400, 400, $0500
db 5, $00
db 27, 27, 16, 30, 40
dw $0420, 420, $0500
db 4, $00
db 27, 27, 16, 30, 40
dw $0450, 450, $0500
db 3, $00
db 27, 27, 16, 30, 40
dw $0500, 500, $0600
db 20, $00
db 27, 27, 10, 30, 25
dw $0600, 600, $0700
db 20, $00
db 27, 18, 10, 30, 16
dw $0700, 700, $0800
db 20, $00
db 18, 14, 10, 30, 12
dw $0800, 800, $0900
db 20, $00
db 14, 8, 10, 30, 6
dw $0900, 900, $1000
db 20, $00
db 14, 8, 8, 17, 6
dw $1000, 1000, $1100
db 20, $00
db 8, 8, 8, 17, 6
dw $1100, 1000, $1200
db 20, $00
db 7, 7, 8, 15, 6
dw $1200, 1000, $1300
db 20, $00
db 6, 6, 8, 15, 6
sTGM3SpeedCurveEnd::
dw $FFFF
sDEATSpeedCurve::
dw $0000, 0, $0100
db 20, $00
db 18, 14, 12, 30, 12
dw $0100, 0, $0200
db 20, $00
db 14, 8, 12, 26, 6
dw $0200, 0, $0300
db 20, $00
db 14, 8, 11, 22, 6
dw $0300, 0, $0400
db 20, $00
db 8, 8, 10, 18, 6
dw $0400, 0, $0500
db 20, $00
db 7, 7, 8, 15, 5
dw $0500, 0, $0600
db 20, $00
db 6, 6, 8, 15, 4
sDEATSpeedCurveEnd::
dw $FFFF
sSHIRSpeedCurve::
dw $0000, 0, $0100
db 20, $00
db 12, 8, 10, 18, 6
dw $0100, 100, $0200
db 20, $00
db 12, 7, 8, 18, 5
dw $0200, 200, $0300
db 20, $00
db 12, 6, 8, 17, 4
dw $0300, 300, $0400
db 20, $00
db 6, 6, 8, 15, 4
dw $0500, 500, $0600
db 20, $00
db 6, 5, 6, 13, 3
dw $1100, 1100, $1200
db 20, $00
db 6, 5, 6, 10, 3
dw $1200, 1200, $1300
db 20, $00
db 6, 5, 6, 8, 3
sSHIRSpeedCurveEnd::
dw $FFFF
sTiles::
DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
DB $00,$00,$00,$00,$00,$00,$00,$00 DB $00,$00,$00,$00,$00,$00,$00,$00
@ -532,7 +1138,7 @@ Tiles::
DB $8A,$8A,$8A,$8A,$E4,$E4,$00,$00 DB $8A,$8A,$8A,$8A,$E4,$E4,$00,$00
DB $00,$00,$62,$62,$94,$94,$88,$88 DB $00,$00,$62,$62,$94,$94,$88,$88
DB $94,$94,$62,$62,$00,$00,$00,$00 DB $94,$94,$62,$62,$00,$00,$00,$00
TilesEnd:: sTilesEnd::
ENDC ENDC

View File

@ -1,7 +1,11 @@
IF !DEF(SFX_DATA_INC) IF !DEF(SFX_DATA_INC)
DEF SFX_DATA_INC EQU 1 DEF SFX_DATA_INC EQU 1
SECTION "SFX Data", ROMX, BANK[2]
INCLUDE "globals.asm"
SECTION "SFX Data", ROMX, BANK[BANK_SFX]
; These sound effects can contain any channel. ; These sound effects can contain any channel.
sSFXPieceI:: sSFXPieceI::
db REG_NR12_CH1_VOLEV, $F0, REG_NR22_CH2_VOLEV, $F0, REG_NR11_CH1_LENDT, $BF, REG_NR11_CH1_LENDT, $BF db REG_NR12_CH1_VOLEV, $F0, REG_NR22_CH2_VOLEV, $F0, REG_NR11_CH1_LENDT, $BF, REG_NR11_CH1_LENDT, $BF

View File

@ -19,8 +19,61 @@ IF !DEF(TITLE_MAP_INC)
DEF TITLE_MAP_INC EQU 1 DEF TITLE_MAP_INC EQU 1
SECTION "Title Screen Tilemap", ROMX, BANK[1] INCLUDE "globals.asm"
TitleScreenTilemap::
SECTION "Title Screen Static Data", ROMX, BANK[BANK_TITLE]
sEasterM0:: db $C4, $C6, $C8, $CA, $CC
sEasterM1:: db $C5, $C7, $C9, $CB, $CD
sEasterC0:: db $CE, $D0, $C8, $CA, $CC, $72, $74, $76, $78, $7A, $D6, $D7
sEasterC1:: db $CF, $D1, $C9, $CB, $CD, $73, $75, $77, $79, $7B, $01, $01
sEasterA0:: db $D2, $D4, $C8, $CA, $CC, $72, $74, $76, $78, $7A, $D6, $D7
sEasterA1:: db $D3, $D5, $C9, $CB, $CD, $73, $75, $77, $79, $7B, $01, $01
sEasterS0:: db $F7, $F9, $C8, $CA, $CC
sEasterS1:: db $F8, $FA, $C9, $CB, $CD
sOption0::
db "NORM"
db " INV"
sOption1::
db "TGM1"
db "TGM2"
db "TGM3"
db "HELL"
db " NES"
sOption2::
db "ARS1"
db "ARS2"
db " NES"
sOption3::
db "FIRM"
db "SNIC"
db "HARD"
db "LOCK"
db "NONE"
sOption4::
db "DMGT"
db "TGM1"
db "TGM3"
db "DEAT"
db "SHIR"
db "CHIL"
sOption5::
db " NO"
db " YES"
sDisabled::
db "----"
sTitleScreenTileMap::
DB $C3,$5B,$4C,$59,$4F,$5A,$5D,$4C,$01,$59 DB $C3,$5B,$4C,$59,$4F,$5A,$5D,$4C,$01,$59
DB $5A,$61,$4C,$01,$01,$FB,$FC,$FD,$FE,$FF DB $5A,$61,$4C,$01,$01,$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
@ -89,7 +142,7 @@ TitleScreenTilemap::
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 DB $01,$01
TitleScreenTilemapEnd:: sTitleScreenTileMapEnd::
ENDC ENDC

View File

@ -58,6 +58,8 @@ RNGInit::
ldh [hRNGSeed+3], a ldh [hRNGSeed+3], a
; TGM3 vars ; TGM3 vars
ld b, BANK_GAMEPLAY
rst RSTSwitchBank
ld de, sTGM3Bag ld de, sTGM3Bag
ld hl, wTGM3Bag ld hl, wTGM3Bag
ld bc, 35 ld bc, 35
@ -66,6 +68,7 @@ RNGInit::
ld hl, wTGM3Droughts ld hl, wTGM3Droughts
ld bc, 7 ld bc, 7
call UnsafeMemCopy call UnsafeMemCopy
rst RSTRestoreBank
; Start with a random non-S/Z piece held. ; Start with a random non-S/Z piece held.
: call Next7Piece : call Next7Piece

View File

@ -421,7 +421,8 @@ SFXPlayNoise::
; Bail if it's null ; Bail if it's null
ret z ret z
ld b, BANK("SFX Data") ; Bank to sound effects.
ld b, BANK_SFX
rst RSTSwitchBank rst RSTSwitchBank
; Get the register to write to ; Get the register to write to
@ -469,10 +470,10 @@ SFXPlay::
ldh a, [hPlayQueue] ldh a, [hPlayQueue]
cp a, MUSIC_MENU cp a, MUSIC_MENU
jr nz, :+ jr nz, :+
ld b, BANK("Music Data") ld b, BANK_MUSIC
rst RSTSwitchBank rst RSTSwitchBank
jr .play jr .play
: ld b, BANK("SFX Data") : ld b, BANK_SFX
rst RSTSwitchBank rst RSTSwitchBank
; Load the playhead position into HL. ; Load the playhead position into HL.

View File

@ -176,8 +176,18 @@ ApplyNext::
sub a, 7 sub a, 7
; X positions ; X positions
ld b, a
ldh a, [hGameState]
cp a, STATE_GAMEPLAY_BIG
ld a, b
jr nz, .regular
ld hl, sBigPieceXOffsets
ld de, sBigPieceYOffsets
jr .postoffsets
.regular
ld hl, sPieceXOffsets ld hl, sPieceXOffsets
ld de, sPieceYOffsets ld de, sPieceYOffsets
.postoffsets
cp 0 cp 0
jr z, .skipoffn jr z, .skipoffn
.getoffn .getoffn
@ -296,8 +306,18 @@ ApplyHold::
; X positions ; X positions
.x .x
ld b, a
ldh a, [hGameState]
cp a, STATE_GAMEPLAY_BIG
ld a, b
jr nz, .regular
ld hl, sBigPieceXOffsets
ld de, sBigPieceYOffsets
jr .postoffsets
.regular
ld hl, sPieceXOffsets ld hl, sPieceXOffsets
ld de, sPieceYOffsets ld de, sPieceYOffsets
.postoffsets
cp 0 cp 0
jr z, .skipoffh jr z, .skipoffh
.getoffh .getoffh

View File

@ -20,6 +20,8 @@ DEF STATE_GAMEPLAY_ASM EQU 1
INCLUDE "globals.asm" INCLUDE "globals.asm"
INCLUDE "res/gameplay_data.inc"
INCLUDE "res/gameplay_big_data.inc"
DEF MODE_LEADY EQU 0 DEF MODE_LEADY EQU 0
@ -47,9 +49,43 @@ hPrePause: ds 1
hRequestedJingle: ds 1 hRequestedJingle: ds 1
SECTION "Gameplay Functions", ROM0 SECTION "Gameplay Function Trampolines", ROM0
; Change to game play mode. The event loop will call the event loop and vblank handlers for this mode after this returns. ; Trampolines to the banked function.
SwitchToGameplay:: SwitchToGameplay::
ld b, BANK_GAMEPLAY
rst RSTSwitchBank
call SwitchToGameplayB
rst RSTRestoreBank
jp EventLoopPostHandler
; Trampolines to the banked function.
SwitchToGameplayBig::
ld b, BANK_GAMEPLAY_BIG
rst RSTSwitchBank
call SwitchToGameplayBigB
rst RSTRestoreBank
jp EventLoopPostHandler
; Banks and jumps to the actual handler.
GamePlayEventLoopHandler::
ld b, BANK_GAMEPLAY
rst RSTSwitchBank
call GamePlayEventLoopHandlerB
rst RSTRestoreBank
jp EventLoopPostHandler
; Banks and jumps to the actual handler.
GamePlayBigEventLoopHandler::
ld b, BANK_GAMEPLAY_BIG
rst RSTSwitchBank
call GamePlayBigEventLoopHandlerB
rst RSTRestoreBank
jp EventLoopPostHandler
SECTION "Gameplay Function Banked", ROMX, BANK[BANK_GAMEPLAY]
; Change to game play mode. The event loop will call the event loop and vblank handlers for this mode after this returns.
SwitchToGameplayB:
; Turn the screen off if it's on. ; Turn the screen off if it's on.
ldh a, [rLCDC] ldh a, [rLCDC]
and LCDCF_ON and LCDCF_ON
@ -59,9 +95,9 @@ SwitchToGameplay::
ldh [rLCDC], a ldh [rLCDC], a
; Load the gameplay tilemap. ; Load the gameplay tilemap.
: ld de, GameplayTilemap : ld de, sGameplayTileMap
ld hl, $9800 ld hl, $9800
ld bc, GameplayTilemapEnd - GameplayTilemap ld bc, sGameplayTileMapEnd - sGameplayTileMap
call UnsafeMemCopy call UnsafeMemCopy
; Clear OAM. ; Clear OAM.
@ -115,7 +151,7 @@ SwitchToGameplay::
; Main gameplay event loop. ; Main gameplay event loop.
GamePlayEventLoopHandler:: GamePlayEventLoopHandlerB::
; What mode are we in? ; What mode are we in?
ld hl, .modejumps ld hl, .modejumps
ldh a, [hMode] ldh a, [hMode]
@ -577,9 +613,7 @@ drawStaticInfo:
ld de, hNLevel ld de, hNLevel
call ApplyNumbers call ApplyNumbers
call GBCGameplayProcess jp GBCGameplayProcess
jp EventLoopPostHandler
; Do the hold action. ; Do the hold action.
@ -657,4 +691,612 @@ DoHold:
ret ret
SECTION "Gameplay Function Big Banked", ROMX, BANK[BANK_GAMEPLAY_BIG]
; Change to game play mode. The event loop will call the event loop and vblank handlers for this mode after this returns.
SwitchToGameplayBigB:
; Turn the screen off if it's on.
ldh a, [rLCDC]
and LCDCF_ON
jr z, :+ ; Screen is already off.
wait_vram
xor a, a
ldh [rLCDC], a
; Load the gameplay tilemap.
: ld de, sBigGameplayTileMap
ld hl, $9800
ld bc, sBigGameplayTileMapEnd - sBigGameplayTileMap
call UnsafeMemCopy
; Clear OAM.
call ClearOAM
call SetNumberSpritePositions
call ApplyTells
; Set up the palettes.
ld a, PALETTE_REGULAR
set_bg_palette
set_obj0_palette
ld a, PALETTE_LIGHTER_1
set_obj1_palette
; Initialize the RNG.
call RNGInit
; Initialize the score, level and field.
call ScoreInit
call LevelInit
call BigFieldInit
; We don't start with hold spent.
xor a, a
ldh [hHoldSpent], a
; Leady mode.
ld a, MODE_LEADY
ldh [hMode], a
ld a, LEADY_TIME
ldh [hModeCounter], a
; GBC init
call GBCGameplayInit
; Install the event loop handlers.
ld a, STATE_GAMEPLAY_BIG
ldh [hGameState], a
; And turn the LCD back on before we start.
ld a, LCDCF_ON | LCDCF_BGON | LCDCF_OBJON | LCDCF_BLK01
ldh [rLCDC], a
; Music end
call SFXKill
; Make sure the first game loop starts just like all the future ones.
wait_vblank
wait_vblank_end
ret
; Main gameplay event loop.
GamePlayBigEventLoopHandlerB:
; What mode are we in?
ld hl, .modejumps
ldh a, [hMode]
ld b, 0
ld c, a
add hl, bc
jp hl
.modejumps
jp .leadyMode
jp .goMode
jp .postGoMode
jp .prefetchedPieceMode
jp .spawnPieceMode
jp .pieceInMotionMode
jp .delayMode
jp .gameOverMode
jp .preGameOverMode
jp .pauseMode
; Draw "READY" and wait a bit.
.leadyMode
ldh a, [hModeCounter]
cp a, LEADY_TIME
jr nz, :+
call SFXKill
ld a, SFX_READYGO
call SFXEnqueue
ldh a, [hModeCounter]
: dec a
jr nz, :+
ld a, MODE_GO
ldh [hMode], a
ld a, GO_TIME
: ldh [hModeCounter], a
ld de, sBigLeady
ld hl, wField+(14*10)
ld bc, 10
call UnsafeMemCopy
jp .drawStaticInfo
; Draw "GO" and wait a bit.
.goMode
ldh a, [hModeCounter]
dec a
jr nz, :+
ld a, MODE_POSTGO
ldh [hMode], a
xor a, a
: ldh [hModeCounter], a
ld de, sBigGo
ld hl, wField+(14*10)
ld bc, 10
call UnsafeMemCopy
jp .drawStaticInfo
; Clear the field, fetch the piece, ready for gameplay.
.postGoMode
ld a, MODE_PREFETCHED_PIECE
ldh [hMode], a
call BigFieldClear
call BigToShadowField
ldh a, [hNextPiece]
ldh [hCurrentPiece], a
call GetNextPiece
jp .drawStaticInfo
; Fetch the next piece.
.prefetchedPieceMode
; A piece will spawn in the middle, at the top of the screen, not rotated by default.
ld a, $FF
ldh [hRequestedJingle], a
ld a, PIECE_SPAWN_X_BIG
ldh [hCurrentPieceX], a
ld a, PIECE_SPAWN_Y_BIG
ldh [hCurrentPieceY], a
xor a, a ; ROTATION_STATE_DEF
ldh [hCurrentPieceRotationState], a
ldh [hHoldSpent], a
; Check if IHS is requested.
; Apply the hold if so.
.checkIHS
ldh a, [hSelectState]
cp a, 0
jr z, .loaddefaultjingle
call BigDoHold
jr .postjingle
; Enqueue the jingle.
.loaddefaultjingle
ldh a, [hNextPiece]
ldh [hRequestedJingle], a
; Check if IRS is requested.
; Apply the rotation if so.
.checkIRSA
ld a, [wSwapABState]
cp a, 0
jr z, .lda1
.ldb1
ldh a, [hBState]
cp a, 0
jr z, .checkIRSB
ld a, $FF
ldh [hBState], a
jr .cp1
.lda1
ldh a, [hAState]
cp a, 0
jr z, .checkIRSB
ld a, $FF
ldh [hAState], a
.cp1
ld a, ROTATION_STATE_CCW
ldh [hCurrentPieceRotationState], a
ldh a, [hNextPiece]
ld b, a
ld a, SFX_IRS
or a, b
ldh [hRequestedJingle], a
jr .postjingle
.checkIRSB
ld a, [wSwapABState]
cp a, 0
jr z, .ldb2
.lda2
ldh a, [hAState]
cp a, 0
jr z, .postjingle
ld a, $FF
ldh [hAState], a
jr .cp2
.ldb2
ldh a, [hBState]
cp a, 0
jr z, .postjingle
ld a, $FF
ldh [hBState], a
.cp2
ld a, ROTATION_STATE_CW
ldh [hCurrentPieceRotationState], a
ldh a, [hNextPiece]
ld b, a
ld a, SFX_IRS
or a, b
ldh [hRequestedJingle], a
jr .postjingle
.postjingle
ld a, MODE_SPAWN_PIECE
ldh [hMode], a
; State falls through to the next.
; Spawn the piece.
.spawnPieceMode
call BigTrySpawnPiece
cp a, $FF
jr z, :+
ld a, MODE_PRE_GAME_OVER
ldh [hMode], a
jp .drawStaticInfo
: ld a, MODE_PIECE_IN_MOTION
ldh [hMode], a
; Play the next jingle... maybe!
ldh a, [hHoldSpent]
cp a, $FF
jr z, .pieceInMotionMode
ldh a, [hRequestedJingle]
cp a, $FF
jr z, .pieceInMotionMode
call SFXEnqueue
; This mode lasts for as long as the piece is in motion.
; Field will let us know when it has locked in place.
.pieceInMotionMode
ldh a, [hStartState]
cp a, 1
jr nz, :+
call BigToBackupField
ldh a, [hMode]
ldh [hPrePause], a
ld a, MODE_PAUSED
ldh [hMode], a
jp .drawStaticInfo
: call BigFieldProcess
; Do we hold?
ldh a, [hSelectState]
cp a, 1
jr nz, :+
ldh a, [hHoldSpent]
cp a, $FF
jr z, :+
; Reset position and rotation.
ld a, PIECE_SPAWN_X_BIG
ldh [hCurrentPieceX], a
ld a, PIECE_SPAWN_Y_BIG
ldh [hCurrentPieceY], a
xor a, a ; ROTATION_STATE_DEF
ldh [hCurrentPieceRotationState], a
call BigDoHold
ld a, MODE_SPAWN_PIECE
ldh [hMode], a
; Do we go into delay state?
: ldh a, [hCurrentLockDelayRemaining]
cp a, 0
jr nz, :+
ld a, MODE_DELAY
ldh [hMode], a
; No fall through this time.
: jp .drawStaticInfo
.delayMode
ldh a, [hStartState]
cp a, 1
jr nz, :+
call BigToBackupField
ldh a, [hMode]
ldh [hPrePause], a
ld a, MODE_PAUSED
ldh [hMode], a
jp .drawStaticInfo
: call BigFieldDelay
ldh a, [hRemainingDelay]
cp a, 0
jr nz, :+
ld a, MODE_PREFETCHED_PIECE
ldh [hMode], a
: jp .drawStaticInfo
.preGameOverMode
; Spawn the failed piece.
call BigForceSpawnPiece
; Draw the field in grey.
; Yes. This really unrolls the loop that many times.
ld hl, wField+(4*10)
REPT 60
ld a, [hl]
cp a, TILE_FIELD_EMPTY
jr nz, .notempty1\@
ld a, GAME_OVER_OTHER+1
ld [hl+], a
jr .skip1\@
.notempty1\@
ld a, GAME_OVER_OTHER
ld [hl+], a
.skip1\@
ENDR
DEF off = 0
REPT 10
ld a, [hl]
cp a, TILE_FIELD_EMPTY
jr nz, .notempty2\@
ld a, GAME_OVER_R10+10+off
ld [hl+], a
jr .skip2\@
.notempty2\@
ld a, GAME_OVER_R10+off
ld [hl+], a
.skip2\@
DEF off += 1
ENDR
REPT 10
ld a, [hl]
cp a, TILE_FIELD_EMPTY
jr nz, .notempty3\@
ld a, GAME_OVER_OTHER+1
ld [hl+], a
jr .skip3\@
.notempty3\@
ld a, GAME_OVER_OTHER
ld [hl+], a
.skip3\@
ENDR
DEF off = 0
REPT 10
ld a, [hl]
cp a, TILE_FIELD_EMPTY
jr nz, .notempty4\@
ld a, GAME_OVER_R12+10+off
ld [hl+], a
jr .skip4\@
.notempty4\@
ld a, GAME_OVER_R12+off
ld [hl+], a
.skip4\@
DEF off += 1
ENDR
REPT 10
ld a, [hl]
cp a, TILE_FIELD_EMPTY
jr nz, .notempty5\@
ld a, GAME_OVER_OTHER+1
ld [hl+], a
jr .skip5\@
.notempty5\@
ld a, GAME_OVER_OTHER
ld [hl+], a
.skip5\@
ENDR
DEF off = 0
REPT 10
ld a, [hl]
cp a, TILE_FIELD_EMPTY
jr nz, .notempty6\@
ld a, GAME_OVER_R14+10+off
ld [hl+], a
jr .skip6\@
.notempty6\@
ld a, GAME_OVER_R14+off
ld [hl+], a
.skip6\@
DEF off += 1
ENDR
REPT 90
ld a, [hl]
cp a, TILE_FIELD_EMPTY
jr nz, .notempty7\@
ld a, GAME_OVER_OTHER+1
ld [hl+], a
jr .skip7\@
.notempty7\@
ld a, GAME_OVER_OTHER
ld [hl+], a
.skip7\@
ENDR
ld a, MODE_GAME_OVER
ldh [hMode], a
.gameOverMode
; Retry?
ldh a, [hAState]
cp a, 1
jr nz, :+
call RNGInit
call ScoreInit
call LevelInit
call BigFieldInit
xor a, a
ldh [hHoldSpent], a
ld a, MODE_LEADY
ldh [hMode], a
ld a, LEADY_TIME
ldh [hModeCounter], a
jp .drawStaticInfo
; Quit
: ldh a, [hBState]
cp a, 1
jp nz, .drawStaticInfo
call SwitchToTitle
jp EventLoopPostHandler
.pauseMode
; Quick reset.
ldh a, [hAState]
cp a, 0
jr z, :+
ldh a, [hBState]
cp a, 0
jr z, :+
ldh a, [hSelectState]
cp a, 0
jr z, :+
call SwitchToTitle
jp EventLoopPostHandler
; Unpause
: ldh a, [hStartState]
cp a, 1
jr nz, :+
call BigFromBackupField
ldh a, [hPrePause]
ldh [hMode], a
jr .drawStaticInfo
; Draw PAUSE all over the field.
: ld de, sBigPause
ld hl, wField+(4*10)
ld bc, 20
call UnsafeMemCopy
ld de, sBigPause
ld hl, wField+(6*10)
ld bc, 20
call UnsafeMemCopy
ld de, sBigPause
ld hl, wField+(8*10)
ld bc, 20
call UnsafeMemCopy
ld de, sBigPause
ld hl, wField+(10*10)
ld bc, 20
call UnsafeMemCopy
ld de, sBigPause
ld hl, wField+(12*10)
ld bc, 20
call UnsafeMemCopy
ld de, sBigPause
ld hl, wField+(14*10)
ld bc, 20
call UnsafeMemCopy
ld de, sBigPause
ld hl, wField+(16*10)
ld bc, 20
call UnsafeMemCopy
ld de, sBigPause
ld hl, wField+(18*10)
ld bc, 20
call UnsafeMemCopy
ld de, sBigPause
ld hl, wField+(20*10)
ld bc, 20
call UnsafeMemCopy
ld de, sBigPause
ld hl, wField+(22*10)
ld bc, 20
call UnsafeMemCopy
jr .drawStaticInfo
; Always draw the score, level, next piece, and held piece.
.drawStaticInfo
: ldh a, [hNextPiece]
call ApplyNext
ldh a, [hHeldPiece]
call ApplyHold
ld hl, wSPRScore1
ld de, hScore
call ApplyNumbers
ld hl, wSPRCLevel1
ld de, hCLevel
call ApplyNumbers
ld hl, wSPRNLevel1
ld de, hNLevel
call ApplyNumbers
jp GBCGameplayProcess
; Do the hold action.
BigDoHold:
; Mark hold as spent.
ld a, $FF
ldh [hHoldSpent], a
; Check if IRS is requested.
; Apply the rotation if so.
.checkIRSHA
ld a, [wSwapABState]
cp a, 0
jr z, .lda3
.ldb3
ldh a, [hBState]
cp a, 0
jr z, .checkIRSHB
ld a, $FF
ldh [hBState], a
jr .cp3
.lda3
ldh a, [hAState]
cp a, 0
jr z, .checkIRSHB
ld a, $FF
ldh [hAState], a
.cp3
ld a, ROTATION_STATE_CCW
ldh [hCurrentPieceRotationState], a
call SFXKill
ld a, SFX_IRS | SFX_IHS
call SFXEnqueue
jr .doHoldOperation
.checkIRSHB
ld a, [wSwapABState]
cp a, 0
jr z, .ldb4
.lda4
ldh a, [hAState]
cp a, 0
jr z, .noRotation
ld a, $FF
ldh [hAState], a
jr .cp4
.ldb4
ldh a, [hBState]
cp a, 0
jr z, .noRotation
ld a, $FF
ldh [hBState], a
.cp4
ld a, ROTATION_STATE_CW
ldh [hCurrentPieceRotationState], a
call SFXKill
ld a, SFX_IRS | SFX_IHS
call SFXEnqueue
jr .doHoldOperation
.noRotation
call SFXKill
ld a, SFX_IHS
call SFXEnqueue
xor a, a ; ROTATION_STATE_DEF
ldh [hCurrentPieceRotationState], a
.doHoldOperation
ldh a, [hHeldPiece]
ld b, a
ldh a, [hCurrentPiece]
ldh [hHeldPiece], a
ld a, b
ldh [hCurrentPiece], a
ret
ENDC ENDC

View File

@ -20,15 +20,99 @@ DEF STATE_TITLE_ASM EQU 1
INCLUDE "globals.asm" INCLUDE "globals.asm"
INCLUDE "res/title_data.inc"
SECTION "Title Variables", WRAM0 SECTION "Title Variables", WRAM0
wSelected:: ds 1 wSelected:: ds 1
SECTION "Title Functions", ROM0 SECTION "Title Function Trampolines", ROM0
; Change to title mode. The event loop will call the event loop and vblank handlers for this mode after this returns. ; Trampolines to the banked function.
SwitchToTitle:: SwitchToTitle::
ld b, BANK_TITLE
rst RSTSwitchBank
call SwitchToTitleB
rst RSTRestoreBank
jp EventLoopPostHandler
; Banks and jumps to the actual handler.
TitleEventLoopHandler::
ld b, BANK_TITLE
rst RSTSwitchBank
call TitleEventLoopHandlerB
rst RSTRestoreBank
jp EventLoopPostHandler
; Banks and jumps to the actual handler.
TitleVBlankHandler::
ld b, BANK_TITLE
rst RSTSwitchBank
call TitleVBlankHandlerB
rst RSTRestoreBank
jp EventLoop
DrawOption6:
ld b, BANK_OTHER
rst RSTSwitchBank
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
jp RSTRestoreBank
SECTION "Title Functions Banked", ROMX, BANK[BANK_TITLE]
SwitchToTitleB:
; Turn the screen off if it's on. ; Turn the screen off if it's on.
ldh a, [rLCDC] ldh a, [rLCDC]
and LCDCF_ON and LCDCF_ON
@ -38,9 +122,9 @@ SwitchToTitle::
ldh [rLCDC], a ldh [rLCDC], a
; Load the gameplay tilemap. ; Load the gameplay tilemap.
: ld de, TitleScreenTilemap : ld de, sTitleScreenTileMap
ld hl, $9800 ld hl, $9800
ld bc, TitleScreenTilemapEnd - TitleScreenTilemap ld bc, sTitleScreenTileMapEnd - sTitleScreenTileMap
call UnsafeMemCopy call UnsafeMemCopy
; Title screen easter egg. ; Title screen easter egg.
@ -136,9 +220,8 @@ SwitchToTitle::
wait_vblank_end wait_vblank_end
ret ret
; Handles title screen input. ; Handles title screen input.
TitleEventLoopHandler:: TitleEventLoopHandlerB:
call GBCTitleProcess call GBCTitleProcess
; Start game? ; Start game?
@ -152,8 +235,10 @@ TitleEventLoopHandler::
or a, c or a, c
cp a, 1 cp a, 1
jr nz, .up jr nz, .up
call SwitchToGameplay ldh a, [hSelectState]
jp EventLoopPostHandler cp a, 0
jp z, SwitchToGameplay
jp SwitchToGameplayBig
; Change menu selection? ; Change menu selection?
.up .up
@ -165,10 +250,10 @@ TitleEventLoopHandler::
jr z, :+ jr z, :+
dec a dec a
ld [wSelected], a ld [wSelected], a
jp EventLoopPostHandler ret
: ld a, TITLE_OPTIONS-1 : ld a, TITLE_OPTIONS-1
ld [wSelected], a ld [wSelected], a
jp EventLoopPostHandler ret
.down .down
ldh a, [hDownState] ldh a, [hDownState]
@ -179,10 +264,10 @@ TitleEventLoopHandler::
jr z, :+ jr z, :+
inc a inc a
ld [wSelected], a ld [wSelected], a
jp EventLoopPostHandler ret
: xor a, a : xor a, a
ld [wSelected], a ld [wSelected], a
jp EventLoopPostHandler ret
.left .left
ldh a, [hLeftState] ldh a, [hLeftState]
@ -194,7 +279,8 @@ TitleEventLoopHandler::
and 3 and 3
cp a, 3 cp a, 3
jr nz, .right jr nz, .right
jp DecrementOption call DecrementOption
ret
.right .right
ldh a, [hRightState] ldh a, [hRightState]
@ -206,10 +292,10 @@ TitleEventLoopHandler::
and 3 and 3
cp a, 3 cp a, 3
jr nz, .done jr nz, .done
jp IncrementOption call IncrementOption
.done .done
jp EventLoopPostHandler ret
; Decrements the currently selected option. ; Decrements the currently selected option.
@ -224,11 +310,11 @@ DecrementOption:
dec a dec a
ld [wSwapABState], a ld [wSwapABState], a
ld [rSwapABState], a ld [rSwapABState], a
jp EventLoopPostHandler ret
: ld a, BUTTON_MODE_COUNT-1 : ld a, BUTTON_MODE_COUNT-1
ld [wSwapABState], a ld [wSwapABState], a
ld [rSwapABState], a ld [rSwapABState], a
jp EventLoopPostHandler ret
.opt1 .opt1
cp a, 1 cp a, 1
@ -239,11 +325,11 @@ DecrementOption:
dec a dec a
ld [wRNGModeState], a ld [wRNGModeState], a
ld [rRNGModeState], a ld [rRNGModeState], a
jp EventLoopPostHandler ret
: ld a, RNG_MODE_COUNT-1 : ld a, RNG_MODE_COUNT-1
ld [wRNGModeState], a ld [wRNGModeState], a
ld [rRNGModeState], a ld [rRNGModeState], a
jp EventLoopPostHandler ret
.opt2 .opt2
cp a, 2 cp a, 2
@ -254,11 +340,11 @@ DecrementOption:
dec a dec a
ld [wRotModeState], a ld [wRotModeState], a
ld [rRotModeState], a ld [rRotModeState], a
jp EventLoopPostHandler ret
: ld a, ROT_MODE_COUNT-1 : ld a, ROT_MODE_COUNT-1
ld [wRotModeState], a ld [wRotModeState], a
ld [rRotModeState], a ld [rRotModeState], a
jp EventLoopPostHandler ret
.opt3 .opt3
cp a, 3 cp a, 3
@ -269,11 +355,11 @@ DecrementOption:
dec a dec a
ld [wDropModeState], a ld [wDropModeState], a
ld [rDropModeState], a ld [rDropModeState], a
jp EventLoopPostHandler ret
: ld a, DROP_MODE_COUNT-1 : ld a, DROP_MODE_COUNT-1
ld [wDropModeState], a ld [wDropModeState], a
ld [rDropModeState], a ld [rDropModeState], a
jp EventLoopPostHandler ret
.opt4 .opt4
cp a, 4 cp a, 4
@ -285,12 +371,12 @@ DecrementOption:
ld [wSpeedCurveState], a ld [wSpeedCurveState], a
ld [rSpeedCurveState], a ld [rSpeedCurveState], a
call InitSpeedCurve call InitSpeedCurve
jp EventLoopPostHandler ret
: ld a, SCURVE_COUNT-1 : ld a, SCURVE_COUNT-1
ld [wSpeedCurveState], a ld [wSpeedCurveState], a
ld [rSpeedCurveState], a ld [rSpeedCurveState], a
call InitSpeedCurve call InitSpeedCurve
jp EventLoopPostHandler ret
.opt5 .opt5
cp a, 5 cp a, 5
@ -301,15 +387,14 @@ DecrementOption:
dec a dec a
ld [wAlways20GState], a ld [wAlways20GState], a
ld [rAlways20GState], a ld [rAlways20GState], a
jp EventLoopPostHandler ret
: ld a, HIG_MODE_COUNT-1 : ld a, HIG_MODE_COUNT-1
ld [wAlways20GState], a ld [wAlways20GState], a
ld [rAlways20GState], a ld [rAlways20GState], a
jp EventLoopPostHandler ret
.opt6 .opt6
jr DecrementLevel jr DecrementLevel
jp EventLoopPostHandler
; Decrements start level. ; Decrements start level.
@ -327,7 +412,7 @@ DecrementLevel:
ld a, h ld a, h
ldh [hStartSpeed+1], a ldh [hStartSpeed+1], a
ld [rSelectedStartLevel+1], a ld [rSelectedStartLevel+1], a
jp CheckLevelRange ret
; Increments the selected option. ; Increments the selected option.
@ -342,11 +427,11 @@ IncrementOption:
inc a inc a
ld [wSwapABState], a ld [wSwapABState], a
ld [rSwapABState], a ld [rSwapABState], a
jp EventLoopPostHandler ret
: xor a, a : xor a, a
ld [wSwapABState], a ld [wSwapABState], a
ld [rSwapABState], a ld [rSwapABState], a
jp EventLoopPostHandler ret
.opt1 .opt1
cp a, 1 cp a, 1
@ -357,11 +442,11 @@ IncrementOption:
inc a inc a
ld [wRNGModeState], a ld [wRNGModeState], a
ld [rRNGModeState], a ld [rRNGModeState], a
jp EventLoopPostHandler ret
: xor a, a : xor a, a
ld [wRNGModeState], a ld [wRNGModeState], a
ld [rRNGModeState], a ld [rRNGModeState], a
jp EventLoopPostHandler ret
.opt2 .opt2
cp a, 2 cp a, 2
@ -372,11 +457,11 @@ IncrementOption:
inc a inc a
ld [wRotModeState], a ld [wRotModeState], a
ld [rRotModeState], a ld [rRotModeState], a
jp EventLoopPostHandler ret
: xor a, a : xor a, a
ld [wRotModeState], a ld [wRotModeState], a
ld [rRotModeState], a ld [rRotModeState], a
jp EventLoopPostHandler ret
.opt3 .opt3
cp a, 3 cp a, 3
@ -387,11 +472,11 @@ IncrementOption:
inc a inc a
ld [wDropModeState], a ld [wDropModeState], a
ld [rDropModeState], a ld [rDropModeState], a
jp EventLoopPostHandler ret
: xor a, a : xor a, a
ld [wDropModeState], a ld [wDropModeState], a
ld [rDropModeState], a ld [rDropModeState], a
jp EventLoopPostHandler ret
.opt4 .opt4
cp a, 4 cp a, 4
@ -403,12 +488,12 @@ IncrementOption:
ld [wSpeedCurveState], a ld [wSpeedCurveState], a
ld [rSpeedCurveState], a ld [rSpeedCurveState], a
call InitSpeedCurve call InitSpeedCurve
jp EventLoopPostHandler ret
: xor a, a : xor a, a
ld [wSpeedCurveState], a ld [wSpeedCurveState], a
ld [rSpeedCurveState], a ld [rSpeedCurveState], a
call InitSpeedCurve call InitSpeedCurve
jp EventLoopPostHandler ret
.opt5 .opt5
cp a, 5 cp a, 5
@ -419,15 +504,14 @@ IncrementOption:
inc a inc a
ld [wAlways20GState], a ld [wAlways20GState], a
ld [rAlways20GState], a ld [rAlways20GState], a
jp EventLoopPostHandler ret
: xor a, a : xor a, a
ld [wAlways20GState], a ld [wAlways20GState], a
ld [rAlways20GState], a ld [rAlways20GState], a
jp EventLoopPostHandler ret
.opt6 .opt6
jr IncrementLevel jr IncrementLevel
jp EventLoopPostHandler
; Increments start level. ; Increments start level.
@ -557,11 +641,11 @@ CheckLevelRange:
ldh [hStartSpeed+1], a ldh [hStartSpeed+1], a
.notatstart .notatstart
jp EventLoopPostHandler ret
; Handles the display of the menu. ; Handles the display of the menu.
TitleVBlankHandler:: TitleVBlankHandlerB:
call ToATTR call ToATTR
ld a, TILE_UNSELECTED ld a, TILE_UNSELECTED
@ -707,58 +791,7 @@ TitleVBlankHandler::
; Draw option 6. ; Draw option 6.
.opt6 .opt6
ldh a, [hStartSpeed] jp DrawOption6
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
jp EventLoop
ENDC ENDC