pokecrystal-board/engine/options_menu.asm
Remy Oukaour 31cce83e9b Move lots of data tables into individual data/ files
(This is not expected to be their final location, but it makes them easier to relocate when necessary, and easier for users to edit until the whole project's file structure is finalized.)
2017-12-11 14:23:18 -05:00

584 lines
8.3 KiB
NASM
Executable File

_OptionsMenu: ; e41d0
ld hl, hInMenu
ld a, [hl]
push af
ld [hl], $1
call ClearBGPalettes
hlcoord 0, 0
ld b, 16
ld c, 18
call TextBox
hlcoord 2, 2
ld de, StringOptions
call PlaceString
xor a
ld [wJumptableIndex], a
ld c, $6 ; number of items on the menu minus 1 (for cancel)
.print_text_loop ; this next will display the settings of each option when the menu is opened
push bc
xor a
ld [hJoyLast], a
call GetOptionPointer
pop bc
ld hl, wJumptableIndex
inc [hl]
dec c
jr nz, .print_text_loop
call UpdateFrame
xor a
ld [wJumptableIndex], a
inc a
ld [hBGMapMode], a
call WaitBGMap
ld b, SCGB_DIPLOMA
call GetSGBLayout
call SetPalettes
.joypad_loop
call JoyTextDelay
ld a, [hJoyPressed]
and START | B_BUTTON
jr nz, .ExitOptions
call OptionsControl
jr c, .dpad
call GetOptionPointer
jr c, .ExitOptions
.dpad
call Options_UpdateCursorPosition
ld c, 3
call DelayFrames
jr .joypad_loop
.ExitOptions:
ld de, SFX_TRANSACTION
call PlaySFX
call WaitSFX
pop af
ld [hInMenu], a
ret
; e4241
StringOptions: ; e4241
db "TEXT SPEED<LNBRK>"
db " :<LNBRK>"
db "BATTLE SCENE<LNBRK>"
db " :<LNBRK>"
db "BATTLE STYLE<LNBRK>"
db " :<LNBRK>"
db "SOUND<LNBRK>"
db " :<LNBRK>"
db "PRINT<LNBRK>"
db " :<LNBRK>"
db "MENU ACCOUNT<LNBRK>"
db " :<LNBRK>"
db "FRAME<LNBRK>"
db " :TYPE<LNBRK>"
db "CANCEL@"
; e42d6
GetOptionPointer: ; e42d6
ld a, [wJumptableIndex] ; load the cursor position to a
ld e, a ; copy it to de
ld d, 0
ld hl, .Pointers
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl ; jump to the code of the current highlighted item
; e42e5
.Pointers:
dw Options_TextSpeed
dw Options_BattleScene
dw Options_BattleStyle
dw Options_Sound
dw Options_Print
dw Options_MenuAccount
dw Options_Frame
dw Options_Cancel
; e42f5
const_def
const TEXT_SPEED_FAST ; 0
const TEXT_SPEED_MED ; 1
const TEXT_SPEED_SLOW ; 2
Options_TextSpeed: ; e42f5
call GetTextSpeed
ld a, [hJoyPressed]
bit D_LEFT_F, a
jr nz, .LeftPressed
bit D_RIGHT_F, a
jr z, .NonePressed
ld a, c ; right pressed
cp TEXT_SPEED_SLOW
jr c, .Increase
ld c, TEXT_SPEED_FAST +- 1
.Increase:
inc c
ld a, e
jr .Save
.LeftPressed:
ld a, c
and a
jr nz, .Decrease
ld c, TEXT_SPEED_SLOW + 1
.Decrease:
dec c
ld a, d
.Save:
ld b, a
ld a, [Options]
and $f0
or b
ld [Options], a
.NonePressed:
ld b, 0
ld hl, .Strings
add hl, bc
add hl, bc
ld e, [hl]
inc hl
ld d, [hl]
hlcoord 11, 3
call PlaceString
and a
ret
; e4331
.Strings:
; entries correspond to TEXT_SPEED_* constants
dw .Fast
dw .Mid
dw .Slow
.Fast: db "FAST@"
.Mid: db "MID @"
.Slow: db "SLOW@"
; e4346
GetTextSpeed: ; e4346
; converts TEXT_DELAY_* value in a to TEXT_SPEED_* value in c,
; with previous/next TEXT_DELAY_* values in d/e
ld a, [Options]
and $7
cp TEXT_DELAY_SLOW
jr z, .slow
cp TEXT_DELAY_FAST
jr z, .fast
; none of the above
ld c, TEXT_SPEED_MED
lb de, TEXT_DELAY_FAST, TEXT_DELAY_SLOW
ret
.slow
ld c, TEXT_SPEED_SLOW
lb de, TEXT_DELAY_MED, TEXT_DELAY_FAST
ret
.fast
ld c, TEXT_SPEED_FAST
lb de, TEXT_DELAY_SLOW, TEXT_DELAY_MED
ret
; e4365
Options_BattleScene: ; e4365
ld hl, Options
ld a, [hJoyPressed]
bit D_LEFT_F, a
jr nz, .LeftPressed
bit D_RIGHT_F, a
jr z, .NonePressed
bit BATTLE_SCENE, [hl]
jr nz, .ToggleOn
jr .ToggleOff
.LeftPressed:
bit BATTLE_SCENE, [hl]
jr z, .ToggleOff
jr .ToggleOn
.NonePressed:
bit BATTLE_SCENE, [hl]
jr z, .ToggleOn
jr .ToggleOff
.ToggleOn:
res BATTLE_SCENE, [hl]
ld de, .On
jr .Display
.ToggleOff:
set BATTLE_SCENE, [hl]
ld de, .Off
.Display:
hlcoord 11, 5
call PlaceString
and a
ret
; e4398
.On: db "ON @"
.Off: db "OFF@"
; e43a0
Options_BattleStyle: ; e43a0
ld hl, Options
ld a, [hJoyPressed]
bit D_LEFT_F, a
jr nz, .LeftPressed
bit D_RIGHT_F, a
jr z, .NonePressed
bit BATTLE_SHIFT, [hl]
jr nz, .ToggleShift
jr .ToggleSet
.LeftPressed:
bit BATTLE_SHIFT, [hl]
jr z, .ToggleSet
jr .ToggleShift
.NonePressed:
bit BATTLE_SHIFT, [hl]
jr nz, .ToggleSet
.ToggleShift:
res BATTLE_SHIFT, [hl]
ld de, .Shift
jr .Display
.ToggleSet:
set BATTLE_SHIFT, [hl]
ld de, .Set
.Display:
hlcoord 11, 7
call PlaceString
and a
ret
; e43d1
.Shift: db "SHIFT@"
.Set: db "SET @"
; e43dd
Options_Sound: ; e43dd
ld hl, Options
ld a, [hJoyPressed]
bit D_LEFT_F, a
jr nz, .LeftPressed
bit D_RIGHT_F, a
jr z, .NonePressed
bit STEREO, [hl]
jr nz, .SetMono
jr .SetStereo
.LeftPressed:
bit STEREO, [hl]
jr z, .SetStereo
jr .SetMono
.NonePressed:
bit STEREO, [hl]
jr nz, .ToggleStereo
jr .ToggleMono
.SetMono:
res STEREO, [hl]
call RestartMapMusic
.ToggleMono:
ld de, .Mono
jr .Display
.SetStereo:
set STEREO, [hl]
call RestartMapMusic
.ToggleStereo:
ld de, .Stereo
.Display:
hlcoord 11, 9
call PlaceString
and a
ret
; e4416
.Mono: db "MONO @"
.Stereo: db "STEREO@"
; e4424
const_def
const PRINT_LIGHTEST ; 0
const PRINT_LIGHTER ; 1
const PRINT_NORMAL ; 2
const PRINT_DARKER ; 3
const PRINT_DARKEST ; 4
Options_Print: ; e4424
call GetPrinterSetting
ld a, [hJoyPressed]
bit D_LEFT_F, a
jr nz, .LeftPressed
bit D_RIGHT_F, a
jr z, .NonePressed
ld a, c
cp PRINT_DARKEST
jr c, .Increase
ld c, PRINT_LIGHTEST - 1
.Increase:
inc c
ld a, e
jr .Save
.LeftPressed:
ld a, c
and a
jr nz, .Decrease
ld c, PRINT_DARKEST + 1
.Decrease:
dec c
ld a, d
.Save:
ld b, a
ld [GBPrinter], a
.NonePressed:
ld b, $0
ld hl, .Strings
add hl, bc
add hl, bc
ld e, [hl]
inc hl
ld d, [hl]
hlcoord 11, 11
call PlaceString
and a
ret
; e445a
.Strings:
; entries correspond to PRINT_* constants
dw .Lightest
dw .Lighter
dw .Normal
dw .Darker
dw .Darkest
.Lightest: db "LIGHTEST@"
.Lighter: db "LIGHTER @"
.Normal: db "NORMAL @"
.Darker: db "DARKER @"
.Darkest: db "DARKEST @"
; e4491
GetPrinterSetting: ; e4491
; converts GBPRINTER_* value in a to PRINT_* value in c,
; with previous/next GBPRINTER_* values in d/e
ld a, [GBPrinter]
and a
jr z, .IsLightest
cp GBPRINTER_LIGHTER
jr z, .IsLight
cp GBPRINTER_DARKER
jr z, .IsDark
cp GBPRINTER_DARKEST
jr z, .IsDarkest
; none of the above
ld c, PRINT_NORMAL
lb de, GBPRINTER_LIGHTER, GBPRINTER_DARKER
ret
.IsLightest:
ld c, PRINT_LIGHTEST
lb de, GBPRINTER_DARKEST, GBPRINTER_LIGHTER
ret
.IsLight:
ld c, PRINT_LIGHTER
lb de, GBPRINTER_LIGHTEST, GBPRINTER_NORMAL
ret
.IsDark:
ld c, PRINT_DARKER
lb de, GBPRINTER_NORMAL, GBPRINTER_DARKEST
ret
.IsDarkest:
ld c, PRINT_DARKEST
lb de, GBPRINTER_DARKER, GBPRINTER_LIGHTEST
ret
; e44c1
Options_MenuAccount: ; e44c1
ld hl, Options2
ld a, [hJoyPressed]
bit D_LEFT_F, a
jr nz, .LeftPressed
bit D_RIGHT_F, a
jr z, .NonePressed
bit MENU_ACCOUNT, [hl]
jr nz, .ToggleOff
jr .ToggleOn
.LeftPressed:
bit MENU_ACCOUNT, [hl]
jr z, .ToggleOn
jr .ToggleOff
.NonePressed:
bit MENU_ACCOUNT, [hl]
jr nz, .ToggleOn
.ToggleOff:
res MENU_ACCOUNT, [hl]
ld de, .Off
jr .Display
.ToggleOn:
set MENU_ACCOUNT, [hl]
ld de, .On
.Display:
hlcoord 11, 13
call PlaceString
and a
ret
; e44f2
.Off: db "OFF@"
.On: db "ON @"
; e44fa
Options_Frame: ; e44fa
ld hl, TextBoxFrame
ld a, [hJoyPressed]
bit D_LEFT_F, a
jr nz, .LeftPressed
bit D_RIGHT_F, a
jr nz, .RightPressed
and a
ret
.RightPressed:
ld a, [hl]
inc a
jr .Save
.LeftPressed:
ld a, [hl]
dec a
.Save:
and $7
ld [hl], a
UpdateFrame: ; e4512
ld a, [TextBoxFrame]
hlcoord 16, 15 ; where on the screen the number is drawn
add "1"
ld [hl], a
call LoadFontsExtra
and a
ret
; e4520
Options_Cancel: ; e4520
ld a, [hJoyPressed]
and A_BUTTON
jr nz, .Exit
and a
ret
.Exit:
scf
ret
; e452a
OptionsControl: ; e452a
ld hl, wJumptableIndex
ld a, [hJoyLast]
cp D_DOWN
jr z, .DownPressed
cp D_UP
jr z, .UpPressed
and a
ret
.DownPressed:
ld a, [hl] ; load the cursor position to a
cp $7 ; maximum number of items in option menu
jr nz, .CheckFive
ld [hl], $0
scf
ret
.CheckFive: ; I have no idea why this exists...
cp $5
jr nz, .Increase
ld [hl], $5
.Increase:
inc [hl]
scf
ret
.UpPressed:
ld a, [hl]
cp $6
jr nz, .NotSix
ld [hl], $5 ; Another thing where I'm not sure why it exists
scf
ret
.NotSix:
and a
jr nz, .Decrease
ld [hl], $8 ; number of option items +1
.Decrease:
dec [hl]
scf
ret
; e455c
Options_UpdateCursorPosition: ; e455c
hlcoord 1, 1
ld de, SCREEN_WIDTH
ld c, $10
.loop
ld [hl], " "
add hl, de
dec c
jr nz, .loop
hlcoord 1, 2
ld bc, 2 * SCREEN_WIDTH
ld a, [wJumptableIndex]
call AddNTimes
ld [hl], "▶"
ret
; e4579