shithub: pokered

ref: 683a62cc1cb7d07b4c88eeec9333c415da8f0bdc
dir: /engine/menu/main_menu.asm/

View raw version
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