pokecrystal/engine/menus/options_menu.asm

560 lines
8.5 KiB
NASM
Raw Normal View History

2020-04-17 14:52:59 +00:00
; GetOptionPointer.Pointers indexes
const_def
const OPT_TEXT_SPEED ; 0
const OPT_BATTLE_SCENE ; 1
const OPT_BATTLE_STYLE ; 2
const OPT_SOUND ; 3
const OPT_PRINT ; 4
const OPT_MENU_ACCOUNT ; 5
const OPT_FRAME ; 6
const OPT_CANCEL ; 7
NUM_OPTIONS EQU const_value ; 8
2020-06-18 14:11:12 +00:00
_Option:
2015-11-16 21:01:45 +00:00
ld hl, hInMenu
ld a, [hl]
push af
2020-04-17 14:52:59 +00:00
ld [hl], TRUE
2015-11-16 21:01:45 +00:00
call ClearBGPalettes
hlcoord 0, 0
2020-04-17 14:52:59 +00:00
ld b, SCREEN_HEIGHT - 2
ld c, SCREEN_WIDTH - 2
2019-04-08 12:15:10 +00:00
call Textbox
2015-11-16 21:01:45 +00:00
hlcoord 2, 2
ld de, StringOptions
call PlaceString
xor a
ld [wJumptableIndex], a
2020-04-17 14:52:59 +00:00
; display the settings of each option when the menu is opened
ld c, NUM_OPTIONS - 2 ; omit frame type, the last option
.print_text_loop
2015-11-16 21:01:45 +00:00
push bc
xor a
ldh [hJoyLast], a
2015-11-16 21:01:45 +00:00
call GetOptionPointer
pop bc
ld hl, wJumptableIndex
inc [hl]
dec c
jr nz, .print_text_loop
2020-04-17 14:52:59 +00:00
call UpdateFrame ; display the frame type
2015-11-16 21:01:45 +00:00
xor a
ld [wJumptableIndex], a
inc a
ldh [hBGMapMode], a
2015-11-16 21:01:45 +00:00
call WaitBGMap
2016-06-06 22:23:00 +00:00
ld b, SCGB_DIPLOMA
2015-11-16 21:01:45 +00:00
call GetSGBLayout
call SetPalettes
.joypad_loop
call JoyTextDelay
ldh a, [hJoyPressed]
2015-11-16 21:01:45 +00:00
and START | B_BUTTON
jr nz, .ExitOptions
call OptionsControl
jr c, .dpad
call GetOptionPointer
jr c, .ExitOptions
.dpad
2015-12-02 22:59:05 +00:00
call Options_UpdateCursorPosition
2015-11-16 21:01:45 +00:00
ld c, 3
call DelayFrames
jr .joypad_loop
.ExitOptions:
2015-11-16 21:01:45 +00:00
ld de, SFX_TRANSACTION
call PlaySFX
call WaitSFX
pop af
ldh [hInMenu], a
2015-11-16 21:01:45 +00:00
ret
2018-06-24 14:09:41 +00:00
StringOptions:
db "TEXT SPEED<LF>"
db " :<LF>"
db "BATTLE SCENE<LF>"
db " :<LF>"
db "BATTLE STYLE<LF>"
db " :<LF>"
db "SOUND<LF>"
db " :<LF>"
db "PRINT<LF>"
db " :<LF>"
db "MENU ACCOUNT<LF>"
db " :<LF>"
db "FRAME<LF>"
db " :TYPE<LF>"
2015-11-16 21:01:45 +00:00
db "CANCEL@"
2018-06-24 14:09:41 +00:00
GetOptionPointer:
jumptable .Pointers, wJumptableIndex
2015-11-16 21:01:45 +00:00
.Pointers:
2020-04-17 14:52:59 +00:00
; entries correspond to OPT_* constants
2015-11-16 21:01:45 +00:00
dw Options_TextSpeed
dw Options_BattleScene
dw Options_BattleStyle
dw Options_Sound
dw Options_Print
dw Options_MenuAccount
dw Options_Frame
dw Options_Cancel
const_def
const OPT_TEXT_SPEED_FAST ; 0
const OPT_TEXT_SPEED_MED ; 1
const OPT_TEXT_SPEED_SLOW ; 2
2018-06-24 14:09:41 +00:00
Options_TextSpeed:
2015-11-16 21:01:45 +00:00
call GetTextSpeed
ldh a, [hJoyPressed]
2015-11-16 21:01:45 +00:00
bit D_LEFT_F, a
jr nz, .LeftPressed
bit D_RIGHT_F, a
jr z, .NonePressed
ld a, c ; right pressed
cp OPT_TEXT_SPEED_SLOW
2015-11-16 21:01:45 +00:00
jr c, .Increase
ld c, OPT_TEXT_SPEED_FAST - 1
2015-11-16 21:01:45 +00:00
.Increase:
2015-11-16 21:01:45 +00:00
inc c
ld a, e
jr .Save
.LeftPressed:
2015-11-16 21:01:45 +00:00
ld a, c
and a
jr nz, .Decrease
ld c, OPT_TEXT_SPEED_SLOW + 1
2015-11-16 21:01:45 +00:00
.Decrease:
2015-11-16 21:01:45 +00:00
dec c
ld a, d
.Save:
2015-11-16 21:01:45 +00:00
ld b, a
2018-01-23 22:39:09 +00:00
ld a, [wOptions]
2015-11-16 21:01:45 +00:00
and $f0
or b
2018-01-23 22:39:09 +00:00
ld [wOptions], a
2015-11-16 21:01:45 +00:00
.NonePressed:
2015-11-16 21:01:45 +00:00
ld b, 0
ld hl, .Strings
add hl, bc
add hl, bc
2015-11-16 21:01:45 +00:00
ld e, [hl]
inc hl
ld d, [hl]
hlcoord 11, 3
call PlaceString
and a
ret
.Strings:
; entries correspond to OPT_TEXT_SPEED_* constants
2015-11-16 21:01:45 +00:00
dw .Fast
dw .Mid
dw .Slow
.Fast: db "FAST@"
.Mid: db "MID @"
.Slow: db "SLOW@"
2015-11-16 21:01:45 +00:00
2018-06-24 14:09:41 +00:00
GetTextSpeed:
; converts TEXT_DELAY_* value in a to OPT_TEXT_SPEED_* value in c,
; with previous/next TEXT_DELAY_* values in d/e
2018-01-23 22:39:09 +00:00
ld a, [wOptions]
2018-07-10 21:18:23 +00:00
and TEXT_DELAY_MASK
cp TEXT_DELAY_SLOW
2015-11-16 21:01:45 +00:00
jr z, .slow
cp TEXT_DELAY_FAST
2015-11-16 21:01:45 +00:00
jr z, .fast
; none of the above
ld c, OPT_TEXT_SPEED_MED
lb de, TEXT_DELAY_FAST, TEXT_DELAY_SLOW
2015-11-16 21:01:45 +00:00
ret
.slow
ld c, OPT_TEXT_SPEED_SLOW
lb de, TEXT_DELAY_MED, TEXT_DELAY_FAST
2015-11-16 21:01:45 +00:00
ret
.fast
ld c, OPT_TEXT_SPEED_FAST
lb de, TEXT_DELAY_SLOW, TEXT_DELAY_MED
2015-11-16 21:01:45 +00:00
ret
2018-06-24 14:09:41 +00:00
Options_BattleScene:
2018-01-23 22:39:09 +00:00
ld hl, wOptions
ldh a, [hJoyPressed]
2015-11-16 21:01:45 +00:00
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:
2015-11-16 21:01:45 +00:00
bit BATTLE_SCENE, [hl]
jr z, .ToggleOff
jr .ToggleOn
.NonePressed:
2015-11-16 21:01:45 +00:00
bit BATTLE_SCENE, [hl]
jr z, .ToggleOn
jr .ToggleOff
.ToggleOn:
2015-11-16 21:01:45 +00:00
res BATTLE_SCENE, [hl]
ld de, .On
jr .Display
.ToggleOff:
2015-11-16 21:01:45 +00:00
set BATTLE_SCENE, [hl]
ld de, .Off
.Display:
2015-11-16 21:01:45 +00:00
hlcoord 11, 5
call PlaceString
and a
ret
.On: db "ON @"
.Off: db "OFF@"
2015-11-16 21:01:45 +00:00
2018-06-24 14:09:41 +00:00
Options_BattleStyle:
2018-01-23 22:39:09 +00:00
ld hl, wOptions
ldh a, [hJoyPressed]
2015-11-16 21:01:45 +00:00
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:
2015-11-16 21:01:45 +00:00
bit BATTLE_SHIFT, [hl]
jr z, .ToggleSet
jr .ToggleShift
.NonePressed:
2015-11-16 21:01:45 +00:00
bit BATTLE_SHIFT, [hl]
jr nz, .ToggleSet
.ToggleShift:
2015-11-16 21:01:45 +00:00
res BATTLE_SHIFT, [hl]
ld de, .Shift
jr .Display
.ToggleSet:
2015-11-16 21:01:45 +00:00
set BATTLE_SHIFT, [hl]
ld de, .Set
.Display:
2015-11-16 21:01:45 +00:00
hlcoord 11, 7
call PlaceString
and a
ret
.Shift: db "SHIFT@"
.Set: db "SET @"
2015-11-16 21:01:45 +00:00
2018-06-24 14:09:41 +00:00
Options_Sound:
2018-01-23 22:39:09 +00:00
ld hl, wOptions
ldh a, [hJoyPressed]
2015-11-16 21:01:45 +00:00
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:
2015-11-16 21:01:45 +00:00
bit STEREO, [hl]
jr z, .SetStereo
jr .SetMono
.NonePressed:
2015-11-16 21:01:45 +00:00
bit STEREO, [hl]
jr nz, .ToggleStereo
jr .ToggleMono
.SetMono:
2015-11-16 21:01:45 +00:00
res STEREO, [hl]
call RestartMapMusic
.ToggleMono:
2015-11-16 21:01:45 +00:00
ld de, .Mono
jr .Display
.SetStereo:
2015-11-16 21:01:45 +00:00
set STEREO, [hl]
call RestartMapMusic
.ToggleStereo:
2015-11-16 21:01:45 +00:00
ld de, .Stereo
.Display:
2015-11-16 21:01:45 +00:00
hlcoord 11, 9
call PlaceString
and a
ret
.Mono: db "MONO @"
.Stereo: db "STEREO@"
2015-11-16 21:01:45 +00:00
const_def
const OPT_PRINT_LIGHTEST ; 0
const OPT_PRINT_LIGHTER ; 1
const OPT_PRINT_NORMAL ; 2
const OPT_PRINT_DARKER ; 3
const OPT_PRINT_DARKEST ; 4
2018-06-24 14:09:41 +00:00
Options_Print:
2015-11-16 21:01:45 +00:00
call GetPrinterSetting
ldh a, [hJoyPressed]
2015-11-16 21:01:45 +00:00
bit D_LEFT_F, a
jr nz, .LeftPressed
bit D_RIGHT_F, a
jr z, .NonePressed
ld a, c
cp OPT_PRINT_DARKEST
2015-11-16 21:01:45 +00:00
jr c, .Increase
ld c, OPT_PRINT_LIGHTEST - 1
2015-11-16 21:01:45 +00:00
.Increase:
2015-11-16 21:01:45 +00:00
inc c
ld a, e
jr .Save
.LeftPressed:
2015-11-16 21:01:45 +00:00
ld a, c
and a
jr nz, .Decrease
ld c, OPT_PRINT_DARKEST + 1
2015-11-16 21:01:45 +00:00
.Decrease:
2015-11-16 21:01:45 +00:00
dec c
ld a, d
.Save:
2015-11-16 21:01:45 +00:00
ld b, a
2019-05-11 17:01:59 +00:00
ld [wGBPrinterBrightness], a
2015-11-16 21:01:45 +00:00
.NonePressed:
2020-04-17 14:52:59 +00:00
ld b, 0
2015-11-16 21:01:45 +00:00
ld hl, .Strings
add hl, bc
add hl, bc
2015-11-16 21:01:45 +00:00
ld e, [hl]
inc hl
ld d, [hl]
hlcoord 11, 11
call PlaceString
and a
ret
.Strings:
; entries correspond to OPT_PRINT_* constants
2015-11-16 21:01:45 +00:00
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 @"
2015-11-16 21:01:45 +00:00
2018-06-24 14:09:41 +00:00
GetPrinterSetting:
; converts GBPRINTER_* value in a to OPT_PRINT_* value in c,
; with previous/next GBPRINTER_* values in d/e
2019-05-11 17:01:59 +00:00
ld a, [wGBPrinterBrightness]
2015-11-16 21:01:45 +00:00
and a
jr z, .IsLightest
cp GBPRINTER_LIGHTER
2015-11-16 21:01:45 +00:00
jr z, .IsLight
cp GBPRINTER_DARKER
2015-11-16 21:01:45 +00:00
jr z, .IsDark
cp GBPRINTER_DARKEST
2015-11-16 21:01:45 +00:00
jr z, .IsDarkest
; none of the above
ld c, OPT_PRINT_NORMAL
lb de, GBPRINTER_LIGHTER, GBPRINTER_DARKER
2015-11-16 21:01:45 +00:00
ret
.IsLightest:
ld c, OPT_PRINT_LIGHTEST
lb de, GBPRINTER_DARKEST, GBPRINTER_LIGHTER
2015-11-16 21:01:45 +00:00
ret
.IsLight:
ld c, OPT_PRINT_LIGHTER
lb de, GBPRINTER_LIGHTEST, GBPRINTER_NORMAL
2015-11-16 21:01:45 +00:00
ret
.IsDark:
ld c, OPT_PRINT_DARKER
lb de, GBPRINTER_NORMAL, GBPRINTER_DARKEST
2015-11-16 21:01:45 +00:00
ret
.IsDarkest:
ld c, OPT_PRINT_DARKEST
lb de, GBPRINTER_DARKER, GBPRINTER_LIGHTEST
2015-11-16 21:01:45 +00:00
ret
2018-06-24 14:09:41 +00:00
Options_MenuAccount:
2018-01-23 22:39:09 +00:00
ld hl, wOptions2
ldh a, [hJoyPressed]
2015-11-16 21:01:45 +00:00
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:
2015-11-16 21:01:45 +00:00
bit MENU_ACCOUNT, [hl]
jr z, .ToggleOn
jr .ToggleOff
.NonePressed:
2015-11-16 21:01:45 +00:00
bit MENU_ACCOUNT, [hl]
jr nz, .ToggleOn
.ToggleOff:
2015-11-16 21:01:45 +00:00
res MENU_ACCOUNT, [hl]
ld de, .Off
jr .Display
.ToggleOn:
2015-11-16 21:01:45 +00:00
set MENU_ACCOUNT, [hl]
ld de, .On
.Display:
2015-11-16 21:01:45 +00:00
hlcoord 11, 13
call PlaceString
and a
ret
.Off: db "OFF@"
.On: db "ON @"
2015-11-16 21:01:45 +00:00
2018-06-24 14:09:41 +00:00
Options_Frame:
2019-04-08 12:15:10 +00:00
ld hl, wTextboxFrame
ldh a, [hJoyPressed]
2015-11-16 21:01:45 +00:00
bit D_LEFT_F, a
jr nz, .LeftPressed
bit D_RIGHT_F, a
jr nz, .RightPressed
and a
ret
.RightPressed:
2015-11-16 21:01:45 +00:00
ld a, [hl]
inc a
jr .Save
.LeftPressed:
2015-11-16 21:01:45 +00:00
ld a, [hl]
dec a
.Save:
2018-07-10 21:18:23 +00:00
maskbits NUM_FRAMES
2015-11-16 21:01:45 +00:00
ld [hl], a
2018-06-24 14:09:41 +00:00
UpdateFrame:
2019-04-08 12:15:10 +00:00
ld a, [wTextboxFrame]
2015-11-16 21:01:45 +00:00
hlcoord 16, 15 ; where on the screen the number is drawn
add "1"
ld [hl], a
call LoadFontsExtra
and a
ret
2018-06-24 14:09:41 +00:00
Options_Cancel:
ldh a, [hJoyPressed]
2015-11-16 21:01:45 +00:00
and A_BUTTON
jr nz, .Exit
and a
ret
.Exit:
2015-11-16 21:01:45 +00:00
scf
ret
2018-06-24 14:09:41 +00:00
OptionsControl:
2015-11-16 21:01:45 +00:00
ld hl, wJumptableIndex
ldh a, [hJoyLast]
2015-11-16 21:01:45 +00:00
cp D_DOWN
jr z, .DownPressed
cp D_UP
jr z, .UpPressed
and a
ret
.DownPressed:
2020-04-17 14:52:59 +00:00
ld a, [hl]
cp OPT_CANCEL ; maximum option index
jr nz, .CheckMenuAccount
ld [hl], OPT_TEXT_SPEED ; first option
2015-11-16 21:01:45 +00:00
scf
ret
2020-04-17 14:52:59 +00:00
.CheckMenuAccount: ; I have no idea why this exists...
cp OPT_MENU_ACCOUNT
2015-11-16 21:01:45 +00:00
jr nz, .Increase
2020-04-17 14:52:59 +00:00
ld [hl], OPT_MENU_ACCOUNT
2015-11-16 21:01:45 +00:00
.Increase:
2015-11-16 21:01:45 +00:00
inc [hl]
scf
ret
.UpPressed:
2015-11-16 21:01:45 +00:00
ld a, [hl]
2020-04-17 14:52:59 +00:00
; Another thing where I'm not sure why it exists
cp OPT_FRAME
jr nz, .NotFrame
ld [hl], OPT_MENU_ACCOUNT
2015-11-16 21:01:45 +00:00
scf
ret
2020-04-17 14:52:59 +00:00
.NotFrame:
and a ; OPT_TEXT_SPEED, minimum option index
2015-11-16 21:01:45 +00:00
jr nz, .Decrease
2020-04-17 14:52:59 +00:00
ld [hl], NUM_OPTIONS ; decrements to OPT_CANCEL, maximum option index
2015-11-16 21:01:45 +00:00
.Decrease:
2015-11-16 21:01:45 +00:00
dec [hl]
scf
ret
2015-12-02 22:59:05 +00:00
2018-06-24 14:09:41 +00:00
Options_UpdateCursorPosition:
2015-12-02 22:59:05 +00:00
hlcoord 1, 1
ld de, SCREEN_WIDTH
2020-04-17 14:52:59 +00:00
ld c, SCREEN_HEIGHT - 2
2015-12-02 22:59:05 +00:00
.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