kep-hack/engine/menu/main_menu.asm
yenatch 40c17c906b Remove most static wram addresses. Use labels instead.
For unknown addresses, use "w<address>".

Label overleads are still an issue.
2014-05-26 22:04:39 -07:00

727 lines
13 KiB
NASM
Executable file

MainMenu: ; 5af2 (1:5af2)
; Check save file
call Func_5bff
xor a
ld [wd08a],a
inc a
ld [wd088],a
call Func_609e
jr nc,.next0
; Predef 52 loads the save from SRAM to RAM
ld a,$52
call Predef
.next0
ld c,20
call DelayFrames
xor a
ld [W_ISLINKBATTLE],a
ld hl,wcc2b
ld [hli],a
ld [hli],a
ld [hli],a
ld [hl],a
ld [W_ANIMATIONID],a
ld hl,wd72e
res 6,[hl]
call ClearScreen
call GoPAL_SET_CF1C
call LoadTextBoxTilePatterns
call LoadFontTilePatterns
ld hl,wd730
set 6,[hl]
ld a,[wd088]
cp a,1
jr z,.next1
FuncCoord 0,0
ld hl,Coord
ld b,6
ld c,13
call TextBoxBorder
FuncCoord 2,2
ld hl,Coord
ld de,ContinueText
call PlaceString
jr .next2
.next1
FuncCoord 0,0
ld hl,Coord
ld b,4
ld c,13
call TextBoxBorder
FuncCoord 2,2
ld hl,Coord
ld de,NewGameText
call PlaceString
.next2
ld hl,wd730
res 6,[hl]
call UpdateSprites ; OAM?
xor a
ld [wCurrentMenuItem],a
ld [wLastMenuItem],a
ld [wMenuJoypadPollCount],a
inc a
ld [wTopMenuItemX],a
inc a
ld [wTopMenuItemY],a
ld a,$B
ld [wMenuWatchedKeys],a
ld a,[wd088]
ld [wMaxMenuItem],a
call HandleMenuInput
bit 1,a
jp nz,LoadTitlescreenGraphics ; load title screen (gfx and arrangement)
ld c,20
call DelayFrames
ld a,[wCurrentMenuItem]
ld b,a
ld a,[wd088]
cp a,2
jp z,.next3
inc b ; adjust MenuArrow_Counter
.next3
ld a,b
and a
jr z,.next4 ; if press_A on Continue
cp a,1
jp z,Func_5d52 ; if press_A on NewGame
call DisplayOptionMenu ; if press_a on Options
ld a,1
ld [wd08a],a
jp .next0
.next4
call ContinueGame
ld hl,wd126
set 5,[hl]
.next6
xor a
ld [hJoyPressed],a
ld [hJoyReleased],a
ld [hJoyHeld],a
call Joypad
ld a,[hJoyHeld]
bit 0,a
jr nz,.next5
bit 1,a
jp nz,.next0
jr .next6
.next5
call GBPalWhiteOutWithDelay3
call ClearScreen
ld a,4
ld [wd52a],a
ld c,10
call DelayFrames
ld a,[wd5a2]
and a
jp z,Func_5d5f
ld a,[W_CURMAP] ; map ID
cp a,HALL_OF_FAME
jp nz,Func_5d5f
xor a
ld [wd71a],a
ld hl,wd732
set 2,[hl]
call Func_62ce
jp Func_5d5f
Func_5bff: ; 5bff (1:5bff)
ld a,1
ld [wd358],a
ld a,3
ld [W_OPTIONS],a
ret
LinkMenu: ; 5c0a (1:5c0a)
xor a
ld [wd358], a
ld hl, wd72e
set 6, [hl]
ld hl, TextTerminator_6b20 ; $6b20
call PrintText
call SaveScreenTilesToBuffer1
ld hl, WhereWouldYouLikeText
call PrintText
FuncCoord 5, 5
ld hl, Coord
ld b, $6
ld c, $d
call TextBoxBorder
call UpdateSprites
FuncCoord 7, 7
ld hl, Coord
ld de, TradeCenterText
call PlaceString
xor a
ld [wcd37], a
ld [wd72d], a
ld hl, wTopMenuItemY ; wTopMenuItemY
ld a, $7
ld [hli], a
ld a, $6
ld [hli], a
xor a
ld [hli], a
inc hl
ld a, $2
ld [hli], a
inc a
ld [hli], a
xor a
ld [hl], a
.asm_5c52
call HandleMenuInput
and $3
add a
add a
ld b, a
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
add b
add $d0
ld [wcc42], a
ld [wcc43], a
.asm_5c66
call Func_2247
ld a, [wcc3d]
ld b, a
and $f0
cp $d0
jr z, .asm_5c7d
ld a, [wcc3e]
ld b, a
and $f0
cp $d0
jr nz, .asm_5c66
.asm_5c7d
ld a, b
and $c
jr nz, .asm_5c8b
ld a, [wcc42]
and $c
jr z, .asm_5c52
jr .asm_5ca1
.asm_5c8b
ld a, [wcc42]
and $c
jr z, .asm_5c98
ld a, [$ffaa]
cp $2
jr z, .asm_5ca1
.asm_5c98
ld a, b
ld [wcc42], a
and $3
ld [wCurrentMenuItem], a ; wCurrentMenuItem
.asm_5ca1
ld a, [$ffaa]
cp $2
jr nz, .asm_5cb1
call DelayFrame
call DelayFrame
ld a, $81
ld [$ff02], a
.asm_5cb1
ld b, $7f
ld c, $7f
ld d, $ec
ld a, [wcc42]
and $8
jr nz, .asm_5ccc
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
cp $2
jr z, .asm_5ccc
ld c, d
ld d, b
dec a
jr z, .asm_5ccc
ld b, c
ld c, d
.asm_5ccc
ld a, b
FuncCoord 6, 7
ld [Coord], a
ld a, c
FuncCoord 6, 9
ld [Coord], a
ld a, d
FuncCoord 6, 11
ld [Coord], a
ld c, $28
call DelayFrames
call LoadScreenTilesFromBuffer1
ld a, [wcc42]
and $8
jr nz, .asm_5d2d
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
cp $2
jr z, .asm_5d2d
xor a
ld [wd700], a
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
and a
ld a, TRADE_CENTER
jr nz, .asm_5cfc
ld a, BATTLE_CENTER
.asm_5cfc
ld [wd72d], a
ld hl, PleaseWaitText
call PrintText
ld c, $32
call DelayFrames
ld hl, wd732
res 1, [hl]
ld a, [W_ANIMATIONID] ; W_ANIMATIONID
ld [wd71a], a
call Func_62ce
ld c, $14
call DelayFrames
xor a
ld [wMenuJoypadPollCount], a ; wMenuJoypadPollCount
ld [wcc42], a
inc a
ld [W_ISLINKBATTLE], a ; W_ISLINKBATTLE
ld [wcc47], a
jr Func_5d5f
.asm_5d2d
xor a
ld [wMenuJoypadPollCount], a ; wMenuJoypadPollCount
call Delay3
call Func_72d7
ld hl, LinkCanceledText
call PrintText
ld hl, wd72e
res 6, [hl]
ret
WhereWouldYouLikeText: ; 5d43 (1:5d43)
TX_FAR _WhereWouldYouLikeText
db "@"
PleaseWaitText: ; 5d48 (1:5d48)
TX_FAR _PleaseWaitText
db "@"
LinkCanceledText: ; 5d4d (1:5d4d)
TX_FAR _LinkCanceledText
db "@"
Func_5d52: ; 5d52 (1:5d52)
ld hl, wd732
res 1, [hl]
call OakSpeech
ld c, $14
call DelayFrames
Func_5d5f: ; 5d5f (1:5d5f)
xor a
ld [hJoyPressed], a
ld [hJoyHeld], a
ld [$ffb5], a
ld [wd72d], a
ld hl, wd732
set 0, [hl]
call ResetPlayerSpriteData
ld c, $14
call DelayFrames
ld a, [wcc47]
and a
ret nz
jp EnterMap
ContinueText: ; 5d7e (1:5d7e)
db "CONTINUE", $4e
NewGameText: ; 5d87 (1:5d87)
db "NEW GAME", $4e
db "OPTION@"
TradeCenterText: ; 5d97 (1:5d97)
db "TRADE CENTER", $4e
db "COLOSSEUM", $4e
db "CANCEL@"
ContinueGame: ; 5db5 (1:5db5)
xor a
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
FuncCoord 4, 7
ld hl, Coord
ld b, $8
ld c, $e
call TextBoxBorder
FuncCoord 5, 9
ld hl, Coord
ld de, SaveScreenInfoText
call PlaceString
FuncCoord 12, 9
ld hl, Coord
ld de, W_PLAYERNAME ; wd158
call PlaceString
FuncCoord 17, 11
ld hl, Coord
call Func_5e2f
FuncCoord 16, 13
ld hl, Coord
call Func_5e42
FuncCoord 13, 15
ld hl, Coord
call Func_5e55
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
ld c, $1e
jp DelayFrames
PrintSaveScreenText: ; 5def (1:5def)
xor a
ld [H_AUTOBGTRANSFERENABLED], a
ld hl, wTileMap + $4
ld b, $8
ld c, $e
call TextBoxBorder
call LoadTextBoxTilePatterns
call UpdateSprites
ld hl, wTileMap + $2d
ld de, SaveScreenInfoText
call PlaceString
ld hl, wTileMap + $34
ld de, W_PLAYERNAME
call PlaceString
ld hl, wTileMap + $61
call Func_5e2f
ld hl, wTileMap + $88
call Func_5e42
ld hl, wTileMap + $ad
call Func_5e55
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a
ld c, $1e
jp DelayFrames
Func_5e2f: ; 5e2f (1:5e2f)
push hl
ld hl, W_OBTAINEDBADGES
ld b, $1
call CountSetBits
pop hl
ld de, wd11e
ld bc, $102
jp PrintNumber
Func_5e42: ; 5e42 (1:5e42)
push hl
ld hl, wPokedexOwned ; wPokedexOwned
ld b, wPokedexOwnedEnd - wPokedexOwned
call CountSetBits
pop hl
ld de, wd11e
ld bc, $103
jp PrintNumber
Func_5e55: ; 5e55 (1:5e55)
ld de, W_PLAYTIMEHOURS + 1
ld bc, $103
call PrintNumber
ld [hl], $6d
inc hl
ld de, W_PLAYTIMEMINUTES + 1
ld bc, $8102
jp PrintNumber
SaveScreenInfoText: ; 5e6a (1:5e6a)
db "PLAYER"
next "BADGES "
next "#DEX "
next "TIME@"
DisplayOptionMenu: ; 5e8a (1:5e8a)
FuncCoord 0,0
ld hl,Coord
ld b,3
ld c,18
call TextBoxBorder
FuncCoord 0,5
ld hl,Coord
ld b,3
ld c,18
call TextBoxBorder
FuncCoord 0,10
ld hl,Coord
ld b,3
ld c,18
call TextBoxBorder
FuncCoord 1,1
ld hl,Coord
ld de,TextSpeedOptionText
call PlaceString
FuncCoord 1,6
ld hl,Coord
ld de,BattleAnimationOptionText
call PlaceString
FuncCoord 1,11
ld hl,Coord
ld de,BattleStyleOptionText
call PlaceString
FuncCoord 2,16
ld hl,Coord
ld de,OptionMenuCancelText
call PlaceString
xor a
ld [wCurrentMenuItem],a
ld [wLastMenuItem],a
inc a
ld [wd358],a
ld [wTrainerScreenY],a
ld a,3 ; text speed cursor Y coordinate
ld [wTopMenuItemY],a
call SetCursorPositionsFromOptions
ld a,[wWhichTrade] ; text speed cursor X coordinate
ld [wTopMenuItemX],a
ld a,$01
ld [H_AUTOBGTRANSFERENABLED],a ; enable auto background transfer
call Delay3
.loop
call PlaceMenuCursor
call SetOptionsFromCursorPositions
.getJoypadStateLoop
call JoypadLowSensitivity
ld a,[$ffb5]
ld b,a
and a,%11111011 ; any key besides select pressed?
jr z,.getJoypadStateLoop
bit 1,b ; B button pressed?
jr nz,.exitMenu
bit 3,b ; Start button pressed?
jr nz,.exitMenu
bit 0,b ; A button pressed?
jr z,.checkDirectionKeys
ld a,[wTopMenuItemY]
cp a,16 ; is the cursor on Cancel?
jr nz,.loop
.exitMenu
ld a,(SFX_02_40 - SFX_Headers_02) / 3
call PlaySound ; play sound
ret
.eraseOldMenuCursor
ld [wTopMenuItemX],a
call EraseMenuCursor
jp .loop
.checkDirectionKeys
ld a,[wTopMenuItemY]
bit 7,b ; Down pressed?
jr nz,.downPressed
bit 6,b ; Up pressed?
jr nz,.upPressed
cp a,8 ; cursor in Battle Animation section?
jr z,.cursorInBattleAnimation
cp a,13 ; cursor in Battle Style section?
jr z,.cursorInBattleStyle
cp a,16 ; cursor on Cancel?
jr z,.loop
.cursorInTextSpeed
bit 5,b ; Left pressed?
jp nz,.pressedLeftInTextSpeed
jp .pressedRightInTextSpeed
.downPressed
cp a,16
ld b,-13
ld hl,wWhichTrade
jr z,.updateMenuVariables
ld b,5
cp a,3
inc hl
jr z,.updateMenuVariables
cp a,8
inc hl
jr z,.updateMenuVariables
ld b,3
inc hl
jr .updateMenuVariables
.upPressed
cp a,8
ld b,-5
ld hl,wWhichTrade
jr z,.updateMenuVariables
cp a,13
inc hl
jr z,.updateMenuVariables
cp a,16
ld b,-3
inc hl
jr z,.updateMenuVariables
ld b,13
inc hl
.updateMenuVariables
add b
ld [wTopMenuItemY],a
ld a,[hl]
ld [wTopMenuItemX],a
call PlaceUnfilledArrowMenuCursor
jp .loop
.cursorInBattleAnimation
ld a,[wTrainerEngageDistance] ; battle animation cursor X coordinate
xor a,$0b ; toggle between 1 and 10
ld [wTrainerEngageDistance],a
jp .eraseOldMenuCursor
.cursorInBattleStyle
ld a,[wTrainerFacingDirection] ; battle style cursor X coordinate
xor a,$0b ; toggle between 1 and 10
ld [wTrainerFacingDirection],a
jp .eraseOldMenuCursor
.pressedLeftInTextSpeed
ld a,[wWhichTrade] ; text speed cursor X coordinate
cp a,1
jr z,.updateTextSpeedXCoord
cp a,7
jr nz,.fromSlowToMedium
sub a,6
jr .updateTextSpeedXCoord
.fromSlowToMedium
sub a,7
jr .updateTextSpeedXCoord
.pressedRightInTextSpeed
ld a,[wWhichTrade] ; text speed cursor X coordinate
cp a,14
jr z,.updateTextSpeedXCoord
cp a,7
jr nz,.fromFastToMedium
add a,7
jr .updateTextSpeedXCoord
.fromFastToMedium
add a,6
.updateTextSpeedXCoord
ld [wWhichTrade],a ; text speed cursor X coordinate
jp .eraseOldMenuCursor
TextSpeedOptionText: ; 5fc0 (1:5fc0)
db "TEXT SPEED"
next " FAST MEDIUM SLOW@"
BattleAnimationOptionText: ; 5fde (1:5fde)
db "BATTLE ANIMATION"
next " ON OFF@"
BattleStyleOptionText: ; 5ffd (1:5ffd)
db "BATTLE STYLE"
next " SHIFT SET@"
OptionMenuCancelText: ; 6018 (1:6018)
db "CANCEL@"
; sets the options variable according to the current placement of the menu cursors in the options menu
SetOptionsFromCursorPositions: ; 601f (1:601f)
ld hl,TextSpeedOptionData
ld a,[wWhichTrade] ; text speed cursor X coordinate
ld c,a
.loop
ld a,[hli]
cp c
jr z,.textSpeedMatchFound
inc hl
jr .loop
.textSpeedMatchFound
ld a,[hl]
ld d,a
ld a,[wTrainerEngageDistance] ; battle animation cursor X coordinate
dec a
jr z,.battleAnimationOn
.battleAnimationOff
set 7,d
jr .checkBattleStyle
.battleAnimationOn
res 7,d
.checkBattleStyle
ld a,[wTrainerFacingDirection] ; battle style cursor X coordinate
dec a
jr z,.battleStyleShift
.battleStyleSet
set 6,d
jr .storeOptions
.battleStyleShift
res 6,d
.storeOptions
ld a,d
ld [W_OPTIONS],a
ret
; reads the options variable and places menu cursors in the correct positions within the options menu
SetCursorPositionsFromOptions: ; 604c (1:604c)
ld hl,TextSpeedOptionData + 1
ld a,[W_OPTIONS]
ld c,a
and a,$3f
push bc
ld de,2
call IsInArray
pop bc
dec hl
ld a,[hl]
ld [wWhichTrade],a ; text speed cursor X coordinate
FuncCoord 0,3
ld hl,Coord
call .placeUnfilledRightArrow
sla c
ld a,1 ; On
jr nc,.storeBattleAnimationCursorX
ld a,10 ; Off
.storeBattleAnimationCursorX
ld [wTrainerEngageDistance],a ; battle animation cursor X coordinate
FuncCoord 0,8
ld hl,Coord
call .placeUnfilledRightArrow
sla c
ld a,1
jr nc,.storeBattleStyleCursorX
ld a,10
.storeBattleStyleCursorX
ld [wTrainerFacingDirection],a ; battle style cursor X coordinate
FuncCoord 0,13
ld hl,Coord
call .placeUnfilledRightArrow
; cursor in front of Cancel
FuncCoord 0,16
ld hl,Coord
ld a,1
.placeUnfilledRightArrow
ld e,a
ld d,0
add hl,de
ld [hl],$ec ; unfilled right arrow menu cursor
ret
; table that indicates how the 3 text speed options affect frame delays
; Format:
; 00: X coordinate of menu cursor
; 01: delay after printing a letter (in frames)
TextSpeedOptionData: ; 6096 (1:6096)
db 14,5 ; Slow
db 7,3 ; Medium
db 1,1 ; Fast
db 7 ; default X coordinate (Medium)
db $ff ; terminator
Func_609e: ; 609e (1:609e)
ld a, $a
ld [$0], a
ld a, $1
ld [$6000], a
ld [$4000], a
ld b, $b
ld hl, $a598
.asm_60b0
ld a, [hli]
cp $50
jr z, .asm_60c1
dec b
jr nz, .asm_60b0
xor a
ld [$0], a
ld [$6000], a
and a
ret
.asm_60c1
xor a
ld [$0], a
ld [$6000], a
scf
ret