diff options
Diffstat (limited to 'engine/menu/main_menu.asm')
-rwxr-xr-x | engine/menu/main_menu.asm | 726 |
1 files changed, 726 insertions, 0 deletions
diff --git a/engine/menu/main_menu.asm b/engine/menu/main_menu.asm new file mode 100755 index 00000000..7e34feca --- /dev/null +++ b/engine/menu/main_menu.asm @@ -0,0 +1,726 @@ +MainMenu: ; 5af2 (1:5af2) +; Check save file + call Func_5bff + xor a + ld [$D08A],a + inc a + ld [$D088],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 [$D12B],a + ld hl,$CC2B + ld [hli],a + ld [hli],a + ld [hli],a + ld [hl],a + ld [$D07C],a + ld hl,$D72E + res 6,[hl] + call ClearScreen + call GoPAL_SET_CF1C + call LoadTextBoxTilePatterns + call LoadFontTilePatterns + ld hl,$D730 + set 6,[hl] + ld a,[$D088] + 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,$D730 + res 6,[hl] + call UpdateSprites ; OAM? + xor a + ld [$CC26],a + ld [$CC2A],a + ld [$CC34],a + inc a + ld [$CC25],a + inc a + ld [$CC24],a + ld a,$B + ld [$CC29],a + ld a,[$D088] + ld [$CC28],a + call HandleMenuInput + bit 1,a + jp nz,LoadTitlescreenGraphics ; load title screen (gfx and arrangement) + ld c,20 + call DelayFrames + ld a,[$CC26] + ld b,a + ld a,[$D088] + 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 [$D08A],a + jp .next0 +.next4 + call ContinueGame + ld hl,$D126 + set 5,[hl] +.next6 + xor a + ld [H_NEWLYPRESSEDBUTTONS],a + ld [H_NEWLYRELEASEDBUTTONS],a + ld [H_CURRENTPRESSEDBUTTONS],a + call GetJoypadState + ld a,[H_CURRENTPRESSEDBUTTONS] + bit 0,a + jr nz,.next5 + bit 1,a + jp nz,.next0 + jr .next6 +.next5 + call GBPalWhiteOutWithDelay3 + call ClearScreen + ld a,4 + ld [$D52A],a + ld c,10 + call DelayFrames + ld a,[$D5A2] + and a + jp z,Func_5d5f + ld a,[W_CURMAP] ; map ID + cp a,HALL_OF_FAME + jp nz,Func_5d5f + xor a + ld [$D71A],a + ld hl,$D732 + set 2,[hl] + call Func_62ce + jp Func_5d5f +Func_5bff: ; 5bff (1:5bff) + ld a,1 + ld [$D358],a + ld a,3 + ld [$D355],a + ret + +LinkMenu: ; 5c0a (1:5c0a) + xor a + ld [$d358], a + ld hl, $d72e + set 6, [hl] + ld hl, TextTerminator_6b20 ; $6b20 + call PrintText + call SaveScreenTilesToBuffer1 + ld hl, WhereWouldYouLikeText + call PrintText + FuncCoord 5, 5 ; $c409 + ld hl, Coord + ld b, $6 + ld c, $d + call TextBoxBorder + call UpdateSprites + FuncCoord 7, 7 ; $c433 + ld hl, Coord + ld de, TradeCenterText + call PlaceString + xor a + ld [$cd37], a + ld [$d72d], a + ld hl, wTopMenuItemY ; $cc24 + 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] ; $cc26 + add b + add $d0 + ld [$cc42], a + ld [$cc43], a +.asm_5c66 + call Func_2247 + ld a, [$cc3d] + ld b, a + and $f0 + cp $d0 + jr z, .asm_5c7d + ld a, [$cc3e] + ld b, a + and $f0 + cp $d0 + jr nz, .asm_5c66 +.asm_5c7d + ld a, b + and $c + jr nz, .asm_5c8b + ld a, [$cc42] + and $c + jr z, .asm_5c52 + jr .asm_5ca1 +.asm_5c8b + ld a, [$cc42] + and $c + jr z, .asm_5c98 + ld a, [$ffaa] + cp $2 + jr z, .asm_5ca1 +.asm_5c98 + ld a, b + ld [$cc42], a + and $3 + ld [wCurrentMenuItem], a ; $cc26 +.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, [$cc42] + and $8 + jr nz, .asm_5ccc + ld a, [wCurrentMenuItem] ; $cc26 + 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 ; $c432 + ld [Coord], a + ld a, c + FuncCoord 6, 9 ; $c45a + ld [Coord], a + ld a, d + FuncCoord 6, 11 ; $c482 + ld [Coord], a + ld c, $28 + call DelayFrames + call LoadScreenTilesFromBuffer1 + ld a, [$cc42] + and $8 + jr nz, .asm_5d2d + ld a, [wCurrentMenuItem] ; $cc26 + cp $2 + jr z, .asm_5d2d + xor a + ld [$d700], a + ld a, [wCurrentMenuItem] ; $cc26 + and a + ld a, TRADE_CENTER + jr nz, .asm_5cfc + ld a, BATTLE_CENTER +.asm_5cfc + ld [$d72d], a + ld hl, PleaseWaitText + call PrintText + ld c, $32 + call DelayFrames + ld hl, $d732 + res 1, [hl] + ld a, [W_ANIMATIONID] ; $d07c + ld [$d71a], a + call Func_62ce + ld c, $14 + call DelayFrames + xor a + ld [wMenuJoypadPollCount], a ; $cc34 + ld [$cc42], a + inc a + ld [W_ISLINKBATTLE], a ; $d12b + ld [$cc47], a + jr Func_5d5f +.asm_5d2d + xor a + ld [wMenuJoypadPollCount], a ; $cc34 + call Delay3 + call Func_72d7 + ld hl, LinkCanceledText + call PrintText + ld hl, $d72e + 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, $d732 + res 1, [hl] + call OakSpeech + ld c, $14 + call DelayFrames + +Func_5d5f: ; 5d5f (1:5d5f) + xor a + ld [H_NEWLYPRESSEDBUTTONS], a + ld [H_CURRENTPRESSEDBUTTONS], a + ld [$ffb5], a + ld [$d72d], a + ld hl, $d732 + set 0, [hl] + call ResetPlayerSpriteData + ld c, $14 + call DelayFrames + ld a, [$cc47] + 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 ; $c430 + ld hl, Coord + ld b, $8 + ld c, $e + call TextBoxBorder + FuncCoord 5, 9 ; $c459 + ld hl, Coord + ld de, SaveScreenInfoText + call PlaceString + FuncCoord 12, 9 ; $c460 + ld hl, Coord + ld de, W_PLAYERNAME ; $d158 + call PlaceString + FuncCoord 17, 11 ; $c48d + ld hl, Coord + call Func_5e2f + FuncCoord 16, 13 ; $c4b4 + ld hl, Coord + call Func_5e42 + FuncCoord 13, 15 ; $c4d9 + 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, $c3a4 + ld b, $8 + ld c, $e + call TextBoxBorder + call LoadTextBoxTilePatterns + call UpdateSprites + ld hl, $c3cd + ld de, SaveScreenInfoText + call PlaceString + ld hl, $c3d4 + ld de, W_PLAYERNAME + call PlaceString + ld hl, $c401 + call Func_5e2f + ld hl, $c428 + call Func_5e42 + ld hl, $c44d + 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, $d11e + ld bc, $102 + jp PrintNumber + +Func_5e42: ; 5e42 (1:5e42) + push hl + ld hl, wPokedexOwned ; $d2f7 + ld b, wPokedexOwnedEnd - wPokedexOwned + call CountSetBits + pop hl + ld de, $d11e + ld bc, $103 + jp PrintNumber + +Func_5e55: ; 5e55 (1:5e55) + ld de, $da41 + ld bc, $103 + call PrintNumber + ld [hl], $6d + inc hl + ld de, $da43 + 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 [$d358],a + ld [$cd40],a + ld a,3 ; text speed cursor Y coordinate + ld [wTopMenuItemY],a + call SetCursorPositionsFromOptions + ld a,[$cd3d] ; 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 GetJoypadStateLowSensitivity + 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,$cd3d + 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,$cd3d + 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,[$cd3e] ; battle animation cursor X coordinate + xor a,$0b ; toggle between 1 and 10 + ld [$cd3e],a + jp .eraseOldMenuCursor +.cursorInBattleStyle + ld a,[$cd3f] ; battle style cursor X coordinate + xor a,$0b ; toggle between 1 and 10 + ld [$cd3f],a + jp .eraseOldMenuCursor +.pressedLeftInTextSpeed + ld a,[$cd3d] ; 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,[$cd3d] ; 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 [$cd3d],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,[$cd3d] ; 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,[$cd3e] ; battle animation cursor X coordinate + dec a + jr z,.battleAnimationOn +.battleAnimationOff + set 7,d + jr .checkBattleStyle +.battleAnimationOn + res 7,d +.checkBattleStyle + ld a,[$cd3f] ; 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 [$cd3d],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 [$cd3e],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 [$cd3f],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 |