mirror of
https://github.com/pret/pokeyellow.git
synced 2026-04-25 07:58:09 -05:00
484 lines
7.9 KiB
NASM
484 lines
7.9 KiB
NASM
; OptionMenuJumpTable indexes
|
||
const_def
|
||
const OPT_TEXT_SPEED ; 0
|
||
const OPT_BATTLE_ANIMS ; 1
|
||
const OPT_BATTLE_STYLE ; 2
|
||
const OPT_SOUND ; 3
|
||
const OPT_PRINTER ; 4
|
||
const_skip 2
|
||
const OPT_CANCEL ; 7
|
||
DEF NUM_OPTIONS EQU const_value ; 8
|
||
|
||
DisplayOptionMenu_:
|
||
call InitOptionsMenu
|
||
.optionMenuLoop
|
||
call JoypadLowSensitivity
|
||
ldh a, [hJoy5]
|
||
and PAD_START | PAD_B
|
||
jr nz, .exitOptionMenu
|
||
call OptionsControl
|
||
jr c, .dpadDelay
|
||
call GetOptionPointer
|
||
jr c, .exitOptionMenu
|
||
.dpadDelay
|
||
call OptionsMenu_UpdateCursorPosition
|
||
call DelayFrame
|
||
call DelayFrame
|
||
call DelayFrame
|
||
jr .optionMenuLoop
|
||
.exitOptionMenu
|
||
ret
|
||
|
||
GetOptionPointer:
|
||
ld a, [wOptionsCursorLocation]
|
||
ld e, a
|
||
ld d, 0
|
||
ld hl, OptionMenuJumpTable
|
||
add hl, de
|
||
add hl, de
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a
|
||
jp hl ; jump to the function for the current highlighted option
|
||
|
||
OptionMenuJumpTable:
|
||
dw OptionsMenu_TextSpeed
|
||
dw OptionsMenu_BattleAnimations
|
||
dw OptionsMenu_BattleStyle
|
||
dw OptionsMenu_SpeakerSettings
|
||
dw OptionsMenu_GBPrinterBrightness
|
||
dw OptionsMenu_Dummy
|
||
dw OptionsMenu_Dummy
|
||
dw OptionsMenu_Cancel
|
||
|
||
const_def
|
||
const OPT_TEXT_SPEED_FAST ; 0
|
||
const OPT_TEXT_SPEED_MID ; 1
|
||
const OPT_TEXT_SPEED_SLOW ; 2
|
||
DEF NUM_TEXT_SPEED_OPTS EQU const_value ; 3
|
||
|
||
OptionsMenu_TextSpeed:
|
||
call GetTextSpeed
|
||
ldh a, [hJoy5]
|
||
bit B_PAD_RIGHT, a
|
||
jr nz, .pressedRight
|
||
bit B_PAD_LEFT, a
|
||
jr nz, .pressedLeft
|
||
jr .nonePressed
|
||
|
||
.pressedRight
|
||
ld a, c
|
||
cp NUM_TEXT_SPEED_OPTS - 1
|
||
jr c, .increase
|
||
ld c, -1
|
||
.increase
|
||
inc c
|
||
ld a, e
|
||
jr .save
|
||
|
||
.pressedLeft
|
||
ld a, c
|
||
and a
|
||
jr nz, .decrease
|
||
ld c, NUM_TEXT_SPEED_OPTS
|
||
.decrease
|
||
dec c
|
||
ld a, d
|
||
|
||
.save
|
||
ld b, a
|
||
ld a, [wOptions]
|
||
and ~TEXT_DELAY_MASK
|
||
or b
|
||
ld [wOptions], a
|
||
|
||
.nonePressed
|
||
ld b, 0
|
||
ld hl, .Strings
|
||
add hl, bc
|
||
add hl, bc
|
||
ld e, [hl]
|
||
inc hl
|
||
ld d, [hl]
|
||
hlcoord 14, 2
|
||
call PlaceString
|
||
and a ; clear carry flag
|
||
ret
|
||
|
||
.Strings:
|
||
; entries correspond to OPT_TEXT_SPEED_* constants
|
||
dw .Fast
|
||
dw .Mid
|
||
dw .Slow
|
||
|
||
.Fast: db "FAST@"
|
||
.Mid: db "MID @"
|
||
.Slow: db "SLOW@"
|
||
|
||
; Loads the value of the current selection in c
|
||
; Loads the text delay value of the options
|
||
; to the left in d and to the right in e
|
||
GetTextSpeed:
|
||
ld a, [wOptions]
|
||
and TEXT_DELAY_MASK
|
||
cp TEXT_DELAY_SLOW
|
||
jr z, .slowTextOption
|
||
cp TEXT_DELAY_FAST
|
||
jr z, .fastTextOption
|
||
ld c, OPT_TEXT_SPEED_MID
|
||
lb de, TEXT_DELAY_FAST, TEXT_DELAY_SLOW
|
||
ret
|
||
|
||
.slowTextOption
|
||
ld c, OPT_TEXT_SPEED_SLOW
|
||
lb de, TEXT_DELAY_MEDIUM, TEXT_DELAY_FAST
|
||
ret
|
||
|
||
.fastTextOption
|
||
ld c, OPT_TEXT_SPEED_FAST
|
||
lb de, TEXT_DELAY_SLOW, TEXT_DELAY_MEDIUM
|
||
ret
|
||
|
||
OptionsMenu_BattleAnimations:
|
||
ldh a, [hJoy5]
|
||
and PAD_LEFT | PAD_RIGHT
|
||
jr nz, .buttonPressed
|
||
ld a, [wOptions]
|
||
and 1 << BIT_BATTLE_ANIMATION
|
||
jr .nothingPressed
|
||
|
||
.buttonPressed
|
||
ld a, [wOptions]
|
||
xor 1 << BIT_BATTLE_ANIMATION
|
||
ld [wOptions], a
|
||
|
||
.nothingPressed
|
||
ld bc, 0
|
||
sla a
|
||
rl c
|
||
ld hl, .Strings
|
||
add hl, bc
|
||
add hl, bc
|
||
ld e, [hl]
|
||
inc hl
|
||
ld d, [hl]
|
||
hlcoord 14, 4
|
||
call PlaceString
|
||
and a ; clear carry flag
|
||
ret
|
||
|
||
.Strings:
|
||
dw .On
|
||
dw .Off
|
||
|
||
.On: db "ON @"
|
||
.Off: db "OFF@"
|
||
|
||
OptionsMenu_BattleStyle:
|
||
ldh a, [hJoy5]
|
||
and PAD_LEFT | PAD_RIGHT
|
||
jr nz, .buttonPressed
|
||
ld a, [wOptions]
|
||
and 1 << BIT_BATTLE_SHIFT
|
||
jr .nothingPressed
|
||
|
||
.buttonPressed
|
||
ld a, [wOptions]
|
||
xor 1 << BIT_BATTLE_SHIFT
|
||
ld [wOptions], a
|
||
|
||
.nothingPressed
|
||
ld bc, 0
|
||
sla a
|
||
sla a
|
||
rl c
|
||
ld hl, .Strings
|
||
add hl, bc
|
||
add hl, bc
|
||
ld e, [hl]
|
||
inc hl
|
||
ld d, [hl]
|
||
hlcoord 14, 6
|
||
call PlaceString
|
||
and a ; clear carry flag
|
||
ret
|
||
|
||
.Strings:
|
||
dw .Shift
|
||
dw .Set
|
||
|
||
.Shift: db "SHIFT@"
|
||
.Set: db "SET @"
|
||
|
||
OptionsMenu_SpeakerSettings:
|
||
ld a, [wOptions]
|
||
and SOUND_MASK
|
||
swap a ; move sound option bits (4–5) into bits 0–1
|
||
ld c, a
|
||
ldh a, [hJoy5]
|
||
bit B_PAD_RIGHT, a
|
||
jr nz, .pressedRight
|
||
bit B_PAD_LEFT, a
|
||
jr nz, .pressedLeft
|
||
jr .nothingPressed
|
||
|
||
.pressedRight
|
||
ld a, c
|
||
inc a
|
||
and SOUND_MASK >> 4
|
||
jr .save
|
||
|
||
.pressedLeft
|
||
ld a, c
|
||
dec a
|
||
and SOUND_MASK >> 4
|
||
|
||
.save
|
||
ld c, a
|
||
swap a
|
||
ld b, a
|
||
xor a
|
||
ldh [rAUDTERM], a
|
||
ld a, [wOptions]
|
||
and ~SOUND_MASK
|
||
or b
|
||
ld [wOptions], a
|
||
|
||
.nothingPressed
|
||
ld b, 0
|
||
ld hl, .Strings
|
||
add hl, bc
|
||
add hl, bc
|
||
ld e, [hl]
|
||
inc hl
|
||
ld d, [hl]
|
||
hlcoord 8, 8
|
||
call PlaceString
|
||
and a ; clear carry flag
|
||
ret
|
||
|
||
.Strings:
|
||
dw .Mono
|
||
dw .Earphone1
|
||
dw .Earphone2
|
||
dw .Earphone3
|
||
|
||
.Mono: db "MONO @"
|
||
.Earphone1: db "EARPHONE1@"
|
||
.Earphone2: db "EARPHONE2@"
|
||
.Earphone3: db "EARPHONE3@"
|
||
|
||
const_def
|
||
const OPT_PRINTER_LIGHTEST ; 0
|
||
const OPT_PRINTER_LIGHTER ; 1
|
||
const OPT_PRINTER_NORMAL ; 2
|
||
const OPT_PRINTER_DARKER ; 3
|
||
const OPT_PRINTER_DARKEST ; 4
|
||
DEF NUM_PRINTER_OPTS EQU const_value ; 5
|
||
|
||
OptionsMenu_GBPrinterBrightness:
|
||
call GetGBPrinterBrightness
|
||
ldh a, [hJoy5]
|
||
bit B_PAD_RIGHT, a
|
||
jr nz, .pressedRight
|
||
bit B_PAD_LEFT, a
|
||
jr nz, .pressedLeft
|
||
jr .nothingPressed
|
||
|
||
.pressedRight
|
||
ld a, c
|
||
cp NUM_PRINTER_OPTS - 1
|
||
jr c, .increase
|
||
ld c, -1
|
||
.increase
|
||
inc c
|
||
ld a, e
|
||
jr .save
|
||
|
||
.pressedLeft
|
||
ld a, c
|
||
and a
|
||
jr nz, .decrease
|
||
ld c, NUM_PRINTER_OPTS
|
||
.decrease
|
||
dec c
|
||
ld a, d
|
||
|
||
.save
|
||
ld b, a
|
||
ld [wPrinterSettings], a
|
||
|
||
.nothingPressed
|
||
ld b, 0
|
||
ld hl, .Strings
|
||
add hl, bc
|
||
add hl, bc
|
||
ld e, [hl]
|
||
inc hl
|
||
ld d, [hl]
|
||
hlcoord 8, 10
|
||
call PlaceString
|
||
and a ; clear carry flag
|
||
ret
|
||
|
||
.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 @"
|
||
|
||
; Loads the value of the current selection in c
|
||
; Loads the brightness value of the options
|
||
; to the left in d and to the right in e
|
||
GetGBPrinterBrightness:
|
||
ld a, [wPrinterSettings]
|
||
and a ; cp PRINTER_BRIGHTNESS_LIGHTEST
|
||
jr z, .setLightest
|
||
cp PRINTER_BRIGHTNESS_LIGHTER
|
||
jr z, .setLighter
|
||
cp PRINTER_BRIGHTNESS_DARKER
|
||
jr z, .setDarker
|
||
cp PRINTER_BRIGHTNESS_DARKEST
|
||
jr z, .setDarkest
|
||
ld c, OPT_PRINTER_NORMAL
|
||
lb de, PRINTER_BRIGHTNESS_LIGHTER, PRINTER_BRIGHTNESS_DARKER
|
||
ret
|
||
|
||
.setLightest
|
||
ld c, OPT_PRINTER_LIGHTEST
|
||
lb de, PRINTER_BRIGHTNESS_DARKEST, PRINTER_BRIGHTNESS_LIGHTER
|
||
ret
|
||
|
||
.setLighter
|
||
ld c, OPT_PRINTER_LIGHTER
|
||
lb de, PRINTER_BRIGHTNESS_LIGHTEST, PRINTER_BRIGHTNESS_NORMAL
|
||
ret
|
||
|
||
.setDarker
|
||
ld c, OPT_PRINTER_DARKER
|
||
lb de, PRINTER_BRIGHTNESS_NORMAL, PRINTER_BRIGHTNESS_DARKEST
|
||
ret
|
||
|
||
.setDarkest
|
||
ld c, OPT_PRINTER_DARKEST
|
||
lb de, PRINTER_BRIGHTNESS_DARKER, PRINTER_BRIGHTNESS_LIGHTEST
|
||
ret
|
||
|
||
OptionsMenu_Dummy:
|
||
and a ; clear carry flag
|
||
ret
|
||
|
||
OptionsMenu_Cancel:
|
||
ldh a, [hJoy5]
|
||
and PAD_A
|
||
jr nz, .pressedCancel
|
||
and a ; clear carry flag
|
||
ret
|
||
|
||
.pressedCancel
|
||
scf
|
||
ret
|
||
|
||
OptionsControl:
|
||
ld hl, wOptionsCursorLocation
|
||
ldh a, [hJoy5]
|
||
cp PAD_DOWN
|
||
jr z, .pressedDown
|
||
cp PAD_UP
|
||
jr z, .pressedUp
|
||
and a ; clear carry flag
|
||
ret
|
||
|
||
.pressedDown
|
||
ld a, [hl]
|
||
cp NUM_OPTIONS - 1
|
||
jr nz, .doNotWrap
|
||
ld [hl], 0
|
||
scf
|
||
ret
|
||
.doNotWrap
|
||
cp OPT_PRINTER ; skip the next two dummy options
|
||
jr c, .increase
|
||
ld [hl], OPT_CANCEL - 1 ; Cancel is after Print
|
||
.increase
|
||
inc [hl]
|
||
scf
|
||
ret
|
||
|
||
.pressedUp
|
||
ld a, [hl]
|
||
cp OPT_CANCEL ; skip the previous two dummy options
|
||
jr nz, .doNotSkip
|
||
ld [hl], OPT_PRINTER ; Print is before Cancel
|
||
scf
|
||
ret
|
||
.doNotSkip
|
||
and a
|
||
jr nz, .decrease
|
||
ld [hl], NUM_OPTIONS
|
||
.decrease
|
||
dec [hl]
|
||
scf
|
||
ret
|
||
|
||
OptionsMenu_UpdateCursorPosition:
|
||
hlcoord 1, 1
|
||
ld de, SCREEN_WIDTH
|
||
ld c, 16
|
||
.loop
|
||
ld [hl], ' '
|
||
add hl, de
|
||
dec c
|
||
jr nz, .loop
|
||
hlcoord 1, 2
|
||
ld bc, SCREEN_WIDTH * 2
|
||
ld a, [wOptionsCursorLocation]
|
||
call AddNTimes
|
||
ld [hl], '▶'
|
||
ret
|
||
|
||
InitOptionsMenu:
|
||
hlcoord 0, 0
|
||
lb bc, SCREEN_HEIGHT - 2, SCREEN_WIDTH - 2
|
||
call TextBoxBorder
|
||
hlcoord 2, 2
|
||
ld de, AllOptionsText
|
||
call PlaceString
|
||
hlcoord 2, 16
|
||
ld de, OptionMenuCancelText
|
||
call PlaceString
|
||
xor a
|
||
ld [wOptionsCursorLocation], a
|
||
ld c, 5 ; the number of options to loop through
|
||
.loop
|
||
push bc
|
||
call GetOptionPointer ; updates the next option
|
||
pop bc
|
||
ld hl, wOptionsCursorLocation
|
||
inc [hl] ; moves the cursor for the highlighted option
|
||
dec c
|
||
jr nz, .loop
|
||
xor a
|
||
ld [wOptionsCursorLocation], a
|
||
inc a
|
||
ldh [hAutoBGTransferEnabled], a
|
||
call Delay3
|
||
ret
|
||
|
||
AllOptionsText:
|
||
db "TEXT SPEED :"
|
||
next "ANIMATION :"
|
||
next "BATTLESTYLE:"
|
||
next "SOUND:"
|
||
next "PRINT:@"
|
||
|
||
OptionMenuCancelText:
|
||
db "CANCEL@"
|