pokeyellow/engine/menus/options.asm

444 lines
6.3 KiB
NASM

DisplayOptionMenu_:
call InitOptionsMenu
.optionMenuLoop
call JoypadLowSensitivity
ldh a, [hJoy5]
and START | B_BUTTON
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
OptionsMenu_TextSpeed:
call GetTextSpeed
ldh a, [hJoy5]
bit 4, a ; right
jr nz, .pressedRight
bit 5, a
jr nz, .pressedLeft
jr .nonePressed
.pressedRight
ld a, c
cp $2
jr c, .increase
ld c, $ff
.increase
inc c
ld a, e
jr .save
.pressedLeft
ld a, c
and a
jr nz, .decrease
ld c, $3
.decrease
dec c
ld a, d
.save
ld b, a
ld a, [wOptions]
and $f0
or b
ld [wOptions], a
.nonePressed
ld b, $0
ld hl, TextSpeedStringsPointerTable
add hl, bc
add hl, bc
ld e, [hl]
inc hl
ld d, [hl]
hlcoord 14, 2
call PlaceString
and a
ret
TextSpeedStringsPointerTable:
dw FastText
dw MidText
dw SlowText
FastText:
db "FAST@"
MidText:
db "MID @"
SlowText:
db "SLOW@"
GetTextSpeed:
ld a, [wOptions]
and $f
cp $5
jr z, .slowTextOption
cp $1
jr z, .fastTextOption
; mid text option
ld c, $1
lb de, 1, 5
ret
.slowTextOption
ld c, $2
lb de, 3, 1
ret
.fastTextOption
ld c, $0
lb de, 5, 3
ret
OptionsMenu_BattleAnimations:
ldh a, [hJoy5]
and D_RIGHT | D_LEFT
jr nz, .asm_41d33
ld a, [wOptions]
and $80 ; mask other bits
jr .asm_41d3b
.asm_41d33
ld a, [wOptions]
xor $80
ld [wOptions], a
.asm_41d3b
ld bc, $0
sla a
rl c
ld hl, AnimationOptionStringsPointerTable
add hl, bc
add hl, bc
ld e, [hl]
inc hl
ld d, [hl]
hlcoord 14, 4
call PlaceString
and a
ret
AnimationOptionStringsPointerTable:
dw AnimationOnText
dw AnimationOffText
AnimationOnText:
db "ON @"
AnimationOffText:
db "OFF@"
OptionsMenu_BattleStyle:
ldh a, [hJoy5]
and D_LEFT | D_RIGHT
jr nz, .asm_41d6b
ld a, [wOptions]
and $40 ; mask other bits
jr .asm_41d73
.asm_41d6b
ld a, [wOptions]
xor $40
ld [wOptions], a
.asm_41d73
ld bc, $0
sla a
sla a
rl c
ld hl, BattleStyleOptionStringsPointerTable
add hl, bc
add hl, bc
ld e, [hl]
inc hl
ld d, [hl]
hlcoord 14, 6
call PlaceString
and a
ret
BattleStyleOptionStringsPointerTable:
dw BattleStyleShiftText
dw BattleStyleSetText
BattleStyleShiftText:
db "SHIFT@"
BattleStyleSetText:
db "SET @"
OptionsMenu_SpeakerSettings:
ld a, [wOptions]
and $30
swap a
ld c, a
ldh a, [hJoy5]
bit 4, a
jr nz, .pressedRight
bit 5, a
jr nz, .pressedLeft
jr .asm_41dca
.pressedRight
ld a, c
inc a
and $3
jr .asm_41dba
.pressedLeft
ld a, c
dec a
and $3
.asm_41dba
ld c, a
swap a
ld b, a
xor a
ldh [rNR51], a
ld a, [wOptions]
and $cf
or b
ld [wOptions], a
.asm_41dca
ld b, $0
ld hl, SpeakerOptionStringsPointerTable
add hl, bc
add hl, bc
ld e, [hl]
inc hl
ld d, [hl]
hlcoord 8, 8
call PlaceString
and a
ret
SpeakerOptionStringsPointerTable:
dw MonoSoundText
dw Earphone1SoundText
dw Earphone2SoundText
dw Earphone3SoundText
MonoSoundText:
db "MONO @"
Earphone1SoundText:
db "EARPHONE1@"
Earphone2SoundText:
db "EARPHONE2@"
Earphone3SoundText:
db "EARPHONE3@"
OptionsMenu_GBPrinterBrightness:
call Func_41e7b
ldh a, [hJoy5]
bit 4, a
jr nz, .pressedRight
bit 5, a
jr nz, .pressedLeft
jr .asm_41e32
.pressedRight
ld a, c
cp $4
jr c, .asm_41e22
ld c, $ff
.asm_41e22
inc c
ld a, e
jr .asm_41e2e
.pressedLeft
ld a, c
and a
jr nz, .asm_41e2c
ld c, $5
.asm_41e2c
dec c
ld a, d
.asm_41e2e
ld b, a
ld [wPrinterSettings], a
.asm_41e32
ld b, $0
ld hl, GBPrinterOptionStringsPointerTable
add hl, bc
add hl, bc
ld e, [hl]
inc hl
ld d, [hl]
hlcoord 8, 10
call PlaceString
and a
ret
GBPrinterOptionStringsPointerTable:
dw LightestPrintText
dw LighterPrintText
dw NormalPrintText
dw DarkerPrintText
dw DarkestPrintText
LightestPrintText:
db "LIGHTEST@"
LighterPrintText:
db "LIGHTER @"
NormalPrintText:
db "NORMAL @"
DarkerPrintText:
db "DARKER @"
DarkestPrintText:
db "DARKEST @"
Func_41e7b:
ld a, [wPrinterSettings]
and a
jr z, .asm_41e93
cp $20
jr z, .asm_41e99
cp $60
jr z, .asm_41e9f
cp $7f
jr z, .asm_41ea5
ld c, $2
lb de, $20, $60
ret
.asm_41e93
ld c, $0
lb de, $7f, $20
ret
.asm_41e99
ld c, $1
lb de, $0, $40
ret
.asm_41e9f
ld c, $3
lb de, $40, $7f
ret
.asm_41ea5
ld c, $4
lb de, $60, $0
ret
OptionsMenu_Dummy:
and a
ret
OptionsMenu_Cancel:
ldh a, [hJoy5]
and A_BUTTON
jr nz, .pressedCancel
and a
ret
.pressedCancel
scf
ret
OptionsControl:
ld hl, wOptionsCursorLocation
ldh a, [hJoy5]
cp D_DOWN
jr z, .pressedDown
cp D_UP
jr z, .pressedUp
and a
ret
.pressedDown
ld a, [hl]
cp $7
jr nz, .doNotWrapAround
ld [hl], $0
scf
ret
.doNotWrapAround
cp $4
jr c, .regularIncrement
ld [hl], $6
.regularIncrement
inc [hl]
scf
ret
.pressedUp
ld a, [hl]
cp $7
jr nz, .doNotMoveCursorToPrintOption
ld [hl], $4
scf
ret
.doNotMoveCursorToPrintOption
and a
jr nz, .regularDecrement
ld [hl], $8
.regularDecrement
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@"