pokered/engine/menu/main_menu.asm

700 lines
12 KiB
NASM
Raw Normal View History

2014-05-22 22:13:20 +00:00
MainMenu: ; 5af2 (1:5af2)
; Check save file
call Func_5bff
xor a
ld [wd08a],a
2014-05-22 22:13:20 +00:00
inc a
ld [wd088],a
2014-05-22 22:13:20 +00:00
call Func_609e
jr nc,.next0
; Predef 52 loads the save from SRAM to RAM
predef LoadSAV
2014-05-22 22:13:20 +00:00
.next0
ld c,20
call DelayFrames
xor a
ld [W_ISLINKBATTLE],a
ld hl,wcc2b
2014-05-22 22:13:20 +00:00
ld [hli],a
ld [hli],a
ld [hli],a
ld [hl],a
ld [W_ANIMATIONID],a
ld hl,wd72e
2014-05-22 22:13:20 +00:00
res 6,[hl]
call ClearScreen
call GoPAL_SET_CF1C
call LoadTextBoxTilePatterns
call LoadFontTilePatterns
ld hl,wd730
2014-05-22 22:13:20 +00:00
set 6,[hl]
ld a,[wd088]
2014-05-22 22:13:20 +00:00
cp a,1
jr z,.next1
hlCoord 0, 0
2014-05-22 22:13:20 +00:00
ld b,6
ld c,13
call TextBoxBorder
hlCoord 2, 2
2014-05-22 22:13:20 +00:00
ld de,ContinueText
call PlaceString
jr .next2
.next1
hlCoord 0, 0
2014-05-22 22:13:20 +00:00
ld b,4
ld c,13
call TextBoxBorder
hlCoord 2, 2
2014-05-22 22:13:20 +00:00
ld de,NewGameText
call PlaceString
.next2
ld hl,wd730
2014-05-22 22:13:20 +00:00
res 6,[hl]
call UpdateSprites ; OAM?
xor a
ld [wCurrentMenuItem],a
ld [wLastMenuItem],a
ld [wMenuJoypadPollCount],a
2014-05-22 22:13:20 +00:00
inc a
ld [wTopMenuItemX],a
2014-05-22 22:13:20 +00:00
inc a
ld [wTopMenuItemY],a
2014-05-22 22:13:20 +00:00
ld a,$B
ld [wMenuWatchedKeys],a
ld a,[wd088]
ld [wMaxMenuItem],a
2014-05-22 22:13:20 +00:00
call HandleMenuInput
bit 1,a
jp nz,LoadTitlescreenGraphics ; load title screen (gfx and arrangement)
ld c,20
call DelayFrames
ld a,[wCurrentMenuItem]
2014-05-22 22:13:20 +00:00
ld b,a
ld a,[wd088]
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
jp .next0
.next4
call ContinueGame
ld hl,wd126
2014-05-22 22:13:20 +00:00
set 5,[hl]
.next6
xor a
2014-05-25 17:51:53 +00:00
ld [hJoyPressed],a
ld [hJoyReleased],a
ld [hJoyHeld],a
2014-05-25 18:21:48 +00:00
call Joypad
2014-05-25 17:51:53 +00:00
ld a,[hJoyHeld]
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
ld c,10
call DelayFrames
ld a,[wd5a2]
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
set 2,[hl]
call Func_62ce
jp Func_5d5f
Func_5bff: ; 5bff (1:5bff)
ld a,1
ld [wd358],a
2014-05-22 22:13:20 +00:00
ld a,3
ld [W_OPTIONS],a
2014-05-22 22:13:20 +00:00
ret
LinkMenu: ; 5c0a (1:5c0a)
xor a
ld [wd358], a
ld hl, wd72e
2014-05-22 22:13:20 +00:00
set 6, [hl]
ld hl, TextTerminator_6b20 ; $6b20
call PrintText
call SaveScreenTilesToBuffer1
ld hl, WhereWouldYouLikeText
call PrintText
hlCoord 5, 5
2014-05-22 22:13:20 +00:00
ld b, $6
ld c, $d
call TextBoxBorder
call UpdateSprites
hlCoord 7, 7
2014-05-22 22:13:20 +00:00
ld de, TradeCenterText
call PlaceString
xor a
ld [wcd37], a
ld [wd72d], a
ld hl, wTopMenuItemY ; wTopMenuItemY
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
add b
add $d0
ld [wcc42], a
ld [wcc43], a
2014-05-22 22:13:20 +00:00
.asm_5c66
call Func_2247
ld a, [wcc3d]
2014-05-22 22:13:20 +00:00
ld b, a
and $f0
cp $d0
jr z, .asm_5c7d
ld a, [wcc3e]
2014-05-22 22:13:20 +00:00
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]
2014-05-22 22:13:20 +00:00
and $c
jr z, .asm_5c52
jr .asm_5ca1
.asm_5c8b
ld a, [wcc42]
2014-05-22 22:13:20 +00:00
and $c
jr z, .asm_5c98
ld a, [$ffaa]
cp $2
jr z, .asm_5ca1
.asm_5c98
ld a, b
ld [wcc42], a
2014-05-22 22:13:20 +00:00
and $3
ld [wCurrentMenuItem], a ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
.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]
2014-05-22 22:13:20 +00:00
and $8
jr nz, .asm_5ccc
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
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
Coorda 6, 7
2014-05-22 22:13:20 +00:00
ld a, c
Coorda 6, 9
2014-05-22 22:13:20 +00:00
ld a, d
Coorda 6, 11
2014-05-22 22:13:20 +00:00
ld c, $28
call DelayFrames
call LoadScreenTilesFromBuffer1
ld a, [wcc42]
2014-05-22 22:13:20 +00:00
and $8
jr nz, .asm_5d2d
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
cp $2
jr z, .asm_5d2d
xor a
ld [wd700], a
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
and a
ld a, TRADE_CENTER
jr nz, .asm_5cfc
ld a, BATTLE_CENTER
.asm_5cfc
ld [wd72d], a
2014-05-22 22:13:20 +00:00
ld hl, PleaseWaitText
call PrintText
ld c, $32
call DelayFrames
ld hl, wd732
2014-05-22 22:13:20 +00:00
res 1, [hl]
ld a, [W_ANIMATIONID] ; W_ANIMATIONID
ld [wd71a], a
2014-05-22 22:13:20 +00:00
call Func_62ce
ld c, $14
call DelayFrames
xor a
ld [wMenuJoypadPollCount], a ; wMenuJoypadPollCount
ld [wcc42], a
2014-05-22 22:13:20 +00:00
inc a
ld [W_ISLINKBATTLE], a ; W_ISLINKBATTLE
ld [wcc47], a
2014-05-22 22:13:20 +00:00
jr Func_5d5f
.asm_5d2d
xor a
ld [wMenuJoypadPollCount], a ; wMenuJoypadPollCount
2014-05-22 22:13:20 +00:00
call Delay3
call Func_72d7
ld hl, LinkCanceledText
call PrintText
ld hl, wd72e
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
res 1, [hl]
call OakSpeech
ld c, $14
call DelayFrames
Func_5d5f: ; 5d5f (1:5d5f)
xor a
2014-05-25 17:51:53 +00:00
ld [hJoyPressed], a
ld [hJoyHeld], a
ld [hJoy5], a
ld [wd72d], a
ld hl, wd732
2014-05-22 22:13:20 +00:00
set 0, [hl]
call ResetPlayerSpriteData
ld c, $14
call DelayFrames
ld a, [wcc47]
2014-05-22 22:13:20 +00:00
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
hlCoord 4, 7
2014-05-22 22:13:20 +00:00
ld b, $8
ld c, $e
call TextBoxBorder
hlCoord 5, 9
2014-05-22 22:13:20 +00:00
ld de, SaveScreenInfoText
call PlaceString
hlCoord 12, 9
ld de, wPlayerName ; wd158
2014-05-22 22:13:20 +00:00
call PlaceString
hlCoord 17, 11
2014-05-22 22:13:20 +00:00
call Func_5e2f
hlCoord 16, 13
2014-05-22 22:13:20 +00:00
call Func_5e42
hlCoord 13, 15
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
ld b, $8
ld c, $e
call TextBoxBorder
call LoadTextBoxTilePatterns
call UpdateSprites
ld hl, wTileMap + $2d
2014-05-22 22:13:20 +00:00
ld de, SaveScreenInfoText
call PlaceString
ld hl, wTileMap + $34
ld de, wPlayerName
2014-05-22 22:13:20 +00:00
call PlaceString
ld hl, wTileMap + $61
2014-05-22 22:13:20 +00:00
call Func_5e2f
ld hl, wTileMap + $88
2014-05-22 22:13:20 +00:00
call Func_5e42
ld hl, wTileMap + $ad
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
ld bc, $102
jp PrintNumber
Func_5e42: ; 5e42 (1:5e42)
push hl
ld hl, wPokedexOwned ; wPokedexOwned
2014-05-22 22:13:20 +00:00
ld b, wPokedexOwnedEnd - wPokedexOwned
call CountSetBits
pop hl
ld de, wd11e
2014-05-22 22:13:20 +00:00
ld bc, $103
jp PrintNumber
Func_5e55: ; 5e55 (1:5e55)
ld de, W_PLAYTIMEHOURS + 1
2014-05-22 22:13:20 +00:00
ld bc, $103
call PrintNumber
ld [hl], $6d
inc hl
ld de, W_PLAYTIMEMINUTES + 1
2014-05-22 22:13:20 +00:00
ld bc, $8102
jp PrintNumber
SaveScreenInfoText: ; 5e6a (1:5e6a)
db "PLAYER"
next "BADGES "
next "#DEX "
next "TIME@"
DisplayOptionMenu: ; 5e8a (1:5e8a)
hlCoord 0, 0
2014-05-22 22:13:20 +00:00
ld b,3
ld c,18
call TextBoxBorder
hlCoord 0, 5
2014-05-22 22:13:20 +00:00
ld b,3
ld c,18
call TextBoxBorder
hlCoord 0, 10
2014-05-22 22:13:20 +00:00
ld b,3
ld c,18
call TextBoxBorder
hlCoord 1, 1
2014-05-22 22:13:20 +00:00
ld de,TextSpeedOptionText
call PlaceString
hlCoord 1, 6
2014-05-22 22:13:20 +00:00
ld de,BattleAnimationOptionText
call PlaceString
hlCoord 1, 11
2014-05-22 22:13:20 +00:00
ld de,BattleStyleOptionText
call PlaceString
hlCoord 2, 16
2014-05-22 22:13:20 +00:00
ld de,OptionMenuCancelText
call PlaceString
xor a
ld [wCurrentMenuItem],a
ld [wLastMenuItem],a
inc a
ld [wd358],a
ld [wTrainerScreenY],a
2014-05-22 22:13:20 +00:00
ld a,3 ; text speed cursor Y coordinate
ld [wTopMenuItemY],a
call SetCursorPositionsFromOptions
ld a,[wWhichTrade] ; text speed cursor X coordinate
2014-05-22 22:13:20 +00:00
ld [wTopMenuItemX],a
ld a,$01
ld [H_AUTOBGTRANSFERENABLED],a ; enable auto background transfer
call Delay3
.loop
call PlaceMenuCursor
call SetOptionsFromCursorPositions
.getJoypadStateLoop
2014-05-25 18:21:48 +00:00
call JoypadLowSensitivity
ld a,[hJoy5]
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
xor a,$0b ; toggle between 1 and 10
ld [wTrainerEngageDistance],a
2014-05-22 22:13:20 +00:00
jp .eraseOldMenuCursor
.cursorInBattleStyle
ld a,[wTrainerFacingDirection] ; battle style cursor X coordinate
2014-05-22 22:13:20 +00:00
xor a,$0b ; toggle between 1 and 10
ld [wTrainerFacingDirection],a
2014-05-22 22:13:20 +00:00
jp .eraseOldMenuCursor
.pressedLeftInTextSpeed
ld a,[wWhichTrade] ; text speed cursor X coordinate
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
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
2014-05-22 22:13:20 +00:00
dec a
jr z,.battleAnimationOn
.battleAnimationOff
set 7,d
jr .checkBattleStyle
.battleAnimationOn
res 7,d
.checkBattleStyle
ld a,[wTrainerFacingDirection] ; battle style cursor X coordinate
2014-05-22 22:13:20 +00:00
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
hlCoord 0, 3
2014-05-22 22:13:20 +00:00
call .placeUnfilledRightArrow
sla c
ld a,1 ; On
jr nc,.storeBattleAnimationCursorX
ld a,10 ; Off
.storeBattleAnimationCursorX
ld [wTrainerEngageDistance],a ; battle animation cursor X coordinate
hlCoord 0, 8
2014-05-22 22:13:20 +00:00
call .placeUnfilledRightArrow
sla c
ld a,1
jr nc,.storeBattleStyleCursorX
ld a,10
.storeBattleStyleCursorX
ld [wTrainerFacingDirection],a ; battle style cursor X coordinate
hlCoord 0, 13
2014-05-22 22:13:20 +00:00
call .placeUnfilledRightArrow
; cursor in front of Cancel
hlCoord 0, 16
2014-05-22 22:13:20 +00:00
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