pokecrystal/engine/options_menu.asm

580 lines
7.9 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_08
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
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 SLOW_TEXT
jr c, .Increase
ld c, FAST_TEXT +- 1
.Increase:
inc c
ld a, e
jr .Save
.LeftPressed:
ld a, c
and a
jr nz, .Decrease
ld c, SLOW_TEXT + 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:
dw .Fast
dw .Mid
dw .Slow
.Fast:
db "FAST@"
.Mid:
db "MID @"
.Slow:
db "SLOW@"
; e4346
GetTextSpeed: ; e4346
ld a, [Options] ; This converts the number of frames, to 0, 1, 2 representing speed
and 7
cp 5 ; 5 frames of delay is slow
jr z, .slow
cp 1 ; 1 frame of delay is fast
jr z, .fast
ld c, MED_TEXT ; set it to mid if not one of the above
lb de, 1, 5
ret
.slow
ld c, SLOW_TEXT
lb de, 3, 1
ret
.fast
ld c, FAST_TEXT
lb de, 5, 3
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
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 4
jr c, .Increase
ld c, -1
.Increase:
inc c
ld a, e
jr .Save
.LeftPressed:
ld a, c
and a
jr nz, .Decrease
ld c, 5
.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:
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
ld a, [GBPrinter] ; converts from the stored printer setting to 0,1,2,3,4
and a
jr z, .IsLightest
cp PRINT_LIGHTER
jr z, .IsLight
cp PRINT_DARKER
jr z, .IsDark
cp PRINT_DARKEST
jr z, .IsDarkest
ld c, 2 ; normal if none of the above
lb de, PRINT_LIGHTER, PRINT_DARKER ; the 2 values next to this setting
ret
.IsLightest:
ld c, 0
lb de, PRINT_DARKEST, PRINT_LIGHTER ; the 2 values next to this setting
ret
.IsLight:
ld c, 1
lb de, PRINT_LIGHTEST, PRINT_NORMAL ; the 2 values next to this setting
ret
.IsDark:
ld c, 3
lb de, PRINT_NORMAL, PRINT_DARKEST ; the 2 values next to this setting
ret
.IsDarkest:
ld c, 4
lb de, PRINT_DARKER, PRINT_LIGHTEST ; the 2 values next to this setting
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