Board menu: implement preliminary Party, Bag, Pokegear, and Exit submenus (#11)

This commit is contained in:
xCrystal 2023-09-22 23:12:05 +02:00
parent c11c53e0d7
commit ca919cdf98
19 changed files with 275 additions and 59 deletions

View File

@ -115,8 +115,8 @@ DEF NUM_NAME_TYPES EQU const_value
; Board menu items (see engine/board/menu.asm)
const_def
const BOARDMENUITEM_DIE
const BOARDMENUITEM_POKEMON
const BOARDMENUITEM_BAG
const BOARDMENUITEM_PARTY
const BOARDMENUITEM_PACK
const BOARDMENUITEM_POKEGEAR
const BOARDMENUITEM_EXIT
DEF NUM_BOARD_MENU_ITEMS EQU const_value

View File

@ -322,3 +322,8 @@ DEF NUM_UNOWN_PUZZLES EQU const_value
const MOVETUTOR_FLAMETHROWER ; 1
const MOVETUTOR_THUNDERBOLT ; 2
const MOVETUTOR_ICE_BEAM ; 3
; board events (tracked by hCurBoardEvent)
const_def 1
const BOARDEVENT_DISPLAY_MENU ; 1
DEF NUM_BOARD_EVENTS EQU const_value - 1

View File

@ -9,7 +9,7 @@ BoardMenuOAM:
dbsprite 2, 18, 4, 0, BOARD_MENU_OAM_FIRST_TILE + 6, PAL_OW_MISC
dbsprite 3, 18, 4, 0, BOARD_MENU_OAM_FIRST_TILE + 7, PAL_OW_MISC
dbsprite 4, 18, 4, 0, BOARD_MENU_OAM_FIRST_TILE + 8, PAL_OW_MISC
; BOARDMENUITEM_POKEMON
; BOARDMENUITEM_PARTY
dbsprite 6, 16, 0, 0, BOARD_MENU_OAM_FIRST_TILE + 9, PAL_OW_MISC
dbsprite 7, 16, 0, 0, BOARD_MENU_OAM_FIRST_TILE + 10, PAL_OW_MISC
dbsprite 8, 16, 0, 0, BOARD_MENU_OAM_FIRST_TILE + 11, PAL_OW_MISC
@ -19,7 +19,7 @@ BoardMenuOAM:
dbsprite 6, 18, 0, 0, BOARD_MENU_OAM_FIRST_TILE + 15, PAL_OW_MISC
dbsprite 7, 18, 0, 0, BOARD_MENU_OAM_FIRST_TILE + 16, PAL_OW_MISC
dbsprite 8, 18, 0, 0, BOARD_MENU_OAM_FIRST_TILE + 17, PAL_OW_MISC
; BOARDMENUITEM_BAG
; BOARDMENUITEM_PACK
dbsprite 9, 16, 4, 0, BOARD_MENU_OAM_FIRST_TILE + 18, PAL_OW_MISC
dbsprite 10, 16, 4, 0, BOARD_MENU_OAM_FIRST_TILE + 19, PAL_OW_MISC
dbsprite 11, 16, 4, 0, BOARD_MENU_OAM_FIRST_TILE + 20, PAL_OW_MISC

View File

@ -1,3 +1,70 @@
BoardMenuScript::
opentext
.display_menu
callasm BoardMenu
ifequal BOARDMENUITEM_DIE, .Die
ifequal BOARDMENUITEM_PARTY, .Party
ifequal BOARDMENUITEM_PACK, .Pack
ifequal BOARDMENUITEM_POKEGEAR, .Pokegear
ifequal BOARDMENUITEM_EXIT, .Exit
closetext
end
.Die:
closetext
end
.Party:
callasm BoardMenu_Party
scall .SubmenuCallback
sjump .display_menu
.Pack:
callasm BoardMenu_Pack
scall .SubmenuCallback
sjump .display_menu
.Pokegear:
callasm BoardMenu_Pokegear
scall .SubmenuCallback
sjump .display_menu
.Exit:
writetext .EmptyText
callasm RestoreOverworldFontOverBoardMenuGFX
writetext .ConfirmExitText
yesorno
iftrue .exit
writetext .EmptyText
sjump .display_menu
.exit:
exitoverworld $00
.ConfirmExitText:
text "Abandon level and"
line "return to menu?"
done
.EmptyText:
text ""
done
.SubmenuCallback:
; if submenu has requested a callback through hMenuReturn,
; it has also taken care of queuing it into wQueuedScriptBank/wQueuedScriptAddr.
readmem hMenuReturn
ifequal HMENURETURN_SCRIPT, .CallbackScript
ifequal HMENURETURN_ASM, .CallbackAsm
end
.CallbackScript:
memjump wQueuedScriptBank
.CallbackAsm:
memcallasm wQueuedScriptBank
end
BoardMenu::
; returns the selected menu item (BOARDMENUITEM_*) in wScriptVar upon exit
ld a, [wBoardMenuLastCursorPosition]
@ -56,10 +123,16 @@ ApplyBoardMenuSpritePalette:
ld a, [wBoardMenuCursorPosition]
ld bc, PALETTE_SIZE
call AddNTimes
; set wOBPals2 directly rather than wOBPals1 to avoid calling ApplyPals and overwriting other overworld pals
; write to wOBPals2 directly as well to avoid calling ApplyPals and overwriting other overworld pals
; writing to wOBPals1 is still necessary to make fading animations consistent
ld de, wOBPals1 palette PAL_OW_MISC
ld bc, PALETTE_SIZE
ld a, BANK(wOBPals1)
call FarCopyWRAM
ld hl, wOBPals1 palette PAL_OW_MISC
ld de, wOBPals2 palette PAL_OW_MISC
ld bc, PALETTE_SIZE
ld a, BANK(wOBPals2)
ld a, BANK(wOBPals1)
call FarCopyWRAM
ld a, TRUE
ldh [hCGBPalUpdate], a
@ -107,5 +180,73 @@ GetBoardMenuSelection:
xor a
ret ; nc
BoardMenu_Party:
ld a, [wPartyCount]
and a
ret z
call BoardMenu_OpenSubmenu
farcall Party
jr nc, .quit
.return
; if cancelled or pressed B
call BoardMenu_CloseSubmenu
ret
.quit
; if quitted party menu after using field move
call BoardMenu_CloseSubmenu
ld a, HMENURETURN_SCRIPT
ldh [hMenuReturn], a
ret
BoardMenu_Pack:
call BoardMenu_OpenSubmenu
farcall Pack
call BoardMenu_CloseSubmenu
ld a, [wPackUsedItem]
and a
ret z
ld a, HMENURETURN_SCRIPT
ldh [hMenuReturn], a
ret
BoardMenu_Pokegear:
call BoardMenu_OpenSubmenu
farcall PokeGear
jp BoardMenu_CloseSubmenu
BoardMenu_OpenSubmenu:
xor a
ldh [hMenuReturn], a
ldh [hBGMapMode], a
call LoadStandardMenuHeader
farcall FadeOutPalettesToWhite
call DisableOverworldHUD
ld hl, wTextboxFlags
res TEXT_2BPP_F, [hl]
call LoadStandardFont
call LoadFrame
call ClearSprites
call DisableSpriteUpdates
ret
BoardMenu_CloseSubmenu:
call ClearBGPalettes
ld hl, wTextboxFlags
set TEXT_2BPP_F, [hl]
call EnableOverworldHUD
call ReloadTilesetAndPalettes
call UpdateSprites
call ExitMenu
call ClearTextbox
ld b, CGB_MAPPALS
call GetCGBLayout
call WaitBGMap2
farcall FadeInPalettesFromWhite
call EnableSpriteUpdates
ret
BoardMenuItemPals:
INCLUDE "gfx/board/menu.pal"

View File

@ -1706,10 +1706,6 @@ Script_GetOnBike_Register:
special UpdatePlayerSprite
end
Overworld_DummyFunction: ; unreferenced
nop
ret
Script_GetOffBike:
reloadmappart
special UpdateTimePals

View File

@ -15,8 +15,8 @@ INCBIN "gfx/board/menu.2bpp"
.BoardMenuOAMGFX:
table_width 3 * 3 * LEN_2BPP_TILE, .BoardMenuOAMGFX
INCBIN "gfx/board/menu_die.2bpp"
INCBIN "gfx/board/menu_pokemon.2bpp"
INCBIN "gfx/board/menu_bag.2bpp"
INCBIN "gfx/board/menu_party.2bpp"
INCBIN "gfx/board/menu_pack.2bpp"
INCBIN "gfx/board/menu_pokegear.2bpp"
INCBIN "gfx/board/menu_exit.2bpp"
assert_table_length NUM_BOARD_MENU_ITEMS

View File

@ -1,36 +1,41 @@
_LoadOverworldFontAndFrame::
ld de, .OverworldFontGFX
ld de, OverworldFontGFX
ld hl, vTiles1
lb bc, BANK(.OverworldFontGFX), 64
lb bc, BANK(OverworldFontGFX), 64
call Get2bppViaHDMA
ld de, .OverworldFontGFX + 64 * LEN_2BPP_TILE
ld de, OverworldFontGFX + 64 * LEN_2BPP_TILE
ld hl, vTiles1 tile $40
lb bc, BANK(.OverworldFontGFX), 56
lb bc, BANK(OverworldFontGFX), 48
call Get2bppViaHDMA
ld de, .OverworldFontSpaceGFX
ld de, OverworldFontSpaceGFX
ld hl, vTiles2 tile " "
lb bc, BANK(.OverworldFontSpaceGFX), 1
lb bc, BANK(OverworldFontSpaceGFX), 1
call Get2bppViaHDMA
ld a, [wEnvironment]
maskbits NUM_ENVIRONMENTS
ld bc, OW_TEXTBOX_FRAME_TILES * LEN_2BPP_TILE
ld hl, .OverworldFrames
ld hl, OverworldFrames
call AddNTimes
ld d, h
ld e, l
ld hl, vTiles0 tile OVERWORLD_FRAME_FIRST_TILE ; $f0
lb bc, BANK(.OverworldFrames), OW_TEXTBOX_FRAME_TILES
call Get2bppViaHDMA
ret
lb bc, BANK(OverworldFrames), OW_TEXTBOX_FRAME_TILES
jp Get2bppViaHDMA
.OverworldFontGFX:
RestoreOverworldFontOverBoardMenuGFX::
ld de, OverworldFontGFX
ld hl, vTiles1
lb bc, BANK(OverworldFontGFX), 18 * 3
jp Get2bppViaHDMA
OverworldFontGFX:
INCBIN "gfx/font/overworld.2bpp"
.OverworldFontSpaceGFX:
OverworldFontSpaceGFX:
INCBIN "gfx/font/overworld_space.2bpp"
.OverworldFrames:
table_width OW_TEXTBOX_FRAME_TILES * LEN_2BPP_TILE, .OverworldFrames
OverworldFrames:
table_width OW_TEXTBOX_FRAME_TILES * LEN_2BPP_TILE, OverworldFrames
INCBIN "gfx/frames/ow1.2bpp"
INCBIN "gfx/frames/ow2.2bpp"
INCBIN "gfx/frames/ow3.2bpp"

View File

@ -501,35 +501,8 @@ StartMenu_Pokemon:
jr z, .return
call FadeToMenu
.choosemenu
xor a
ld [wPartyMenuActionText], a ; Choose a POKéMON.
call ClearBGPalettes
.menu
farcall LoadPartyMenuGFX
farcall InitPartyMenuWithCancel
farcall InitPartyMenuGFX
.menunoreload
farcall WritePartyMenuTilemap
farcall PlacePartyMenuText
call WaitBGMap
call SetPalettes ; load regular palettes?
call DelayFrame
farcall PartyMenuSelect
jr c, .return ; if cancelled or pressed B
call PokemonActionSubmenu
cp 3
jr z, .menu
cp 0
jr z, .choosemenu
cp 1
jr z, .menunoreload
cp 2
jr z, .quit
farcall Party
jr nc, .quit
.return
call CloseSubmenu

View File

@ -11,6 +11,9 @@ OverworldLoop::
cp MAPSTATUS_DONE
jr nz, .loop
.done
call DisableOverworldHUD
ld hl, wGameTimerPaused
res GAME_TIMER_PAUSED_F, [hl] ; stop game timer counter
ret
.Jumptable:
@ -105,6 +108,8 @@ StartMap:
call ByteFill
farcall InitCallReceiveDelay
call ClearJoypad
ld a, BOARDEVENT_DISPLAY_MENU
ld [hCurBoardEvent], a
EnterMap:
xor a
ld [wXYComparePointer], a
@ -238,6 +243,9 @@ PlayerEvents:
and a
ret nz
call CheckBoardEvent
jr c, .ok
call CheckTrainerBattle_GetPlayerEvent
jr c, .ok
@ -269,6 +277,28 @@ PlayerEvents:
scf
ret
CheckBoardEvent:
jumptable .Jumptable, hCurBoardEvent
.Jumptable:
table_width 2, .Jumptable
dw .none
dw .menu
assert_table_length NUM_BOARD_EVENTS + 1
.none
xor a
ret
.menu
ld a, BANK(BoardMenuScript)
ld hl, BoardMenuScript
call CallScript
xor a
ld [hCurBoardEvent], a
scf
ret
CheckTrainerBattle_GetPlayerEvent:
call CheckTrainerBattle
jr nc, .nope

View File

@ -234,6 +234,7 @@ ScriptCommandTable:
dw Script_getname ; a7
dw Script_wait ; a8
dw Script_checksave ; a9
dw Script_exitoverworld ; aa
assert_table_length NUM_EVENT_COMMANDS
StartScript:
@ -2329,6 +2330,14 @@ ReturnFromCredits:
call StopScript
ret
Script_exitoverworld:
call GetScriptByte
call Script_endall
ld a, MAPSTATUS_DONE
call LoadMapStatus
call StopScript
ret
Script_wait:
push bc
call GetScriptByte

View File

@ -104,6 +104,37 @@ CancelPokemonAction:
ld a, 1
ret
Party::
.choosemenu
xor a
ld [wPartyMenuActionText], a ; Choose a POKéMON.
call ClearBGPalettes
.menu
farcall LoadPartyMenuGFX
farcall InitPartyMenuWithCancel
farcall InitPartyMenuGFX
.menunoreload
farcall WritePartyMenuTilemap
farcall PlacePartyMenuText
call WaitBGMap
call SetPalettes ; load regular palettes?
call DelayFrame
farcall PartyMenuSelect
ret c ; if cancelled or pressed B
call PokemonActionSubmenu
and 3
cp 3
jr z, .menu
cp 0
jr z, .choosemenu
cp 1
jr z, .menunoreload
and a ; must be 2, which means quit after using field move
ret ; nc
PokemonActionSubmenu:
hlcoord 1, 15
lb bc, 2, 18

View File

@ -4,13 +4,13 @@
RGB 00, 00, 21
RGB 00, 00, 00
; item 2 (BOARDMENUITEM_POKEMON)
; item 2 (BOARDMENUITEM_PARTY)
RGB 31, 31, 31
RGB 31, 26, 26
RGB 30, 00, 00
RGB 00, 00, 00
; item 3 (BOARDMENUITEM_BAG)
; item 3 (BOARDMENUITEM_PACK)
RGB 31, 31, 31
RGB 10, 31, 10
RGB 00, 21, 10

View File

Before

Width:  |  Height:  |  Size: 369 B

After

Width:  |  Height:  |  Size: 369 B

View File

Before

Width:  |  Height:  |  Size: 361 B

After

Width:  |  Height:  |  Size: 361 B

View File

@ -1916,7 +1916,7 @@ ReturnToMapWithSpeechTextbox::
call ClearBGPalettes
call ClearSprites
call ReloadTilesetAndPalettes
call SpeechTextbox1bpp
call SpeechTextbox ; 1bpp or 2bpp according to wTextboxFlags[TEXT_2BPP_F]
ld hl, wVramState
set 0, [hl]
call UpdateSprites
@ -1934,8 +1934,15 @@ ReloadTilesetAndPalettes::
call DisableLCD
call ClearSprites
farcall RefreshSprites
ld a, [wTextboxFlags]
bit TEXT_2BPP_F, a
jr nz, .2bpp
call LoadStandardFont
call LoadFrame
jr .font_done
.2bpp
call LoadOverworldFontAndFrame
.font_done
ldh a, [hROMBank]
push af
ld a, [wMapGroup]

View File

@ -165,6 +165,13 @@ Textbox2bpp::
pop bc
jp TextboxAttributes2bpp
SpeechTextbox:
; Standard 1bpp or 2bpp textbox according to wTextboxFlags[TEXT_2BPP_F]
ld a, [wTextboxFlags]
bit TEXT_2BPP_F, a
jr z, SpeechTextbox1bpp
jr SpeechTextbox2bpp
RadioTerminator::
ld hl, .stop
ret
@ -172,7 +179,7 @@ RadioTerminator::
.stop:
text_end
ClearTextbox:
ClearTextbox::
hlcoord TEXTBOX_INNERX, TEXTBOX_INNERY
lb bc, TEXTBOX_INNERH - 1, TEXTBOX_INNERW
jp ClearBox

View File

@ -11,7 +11,11 @@ ENDM
; Design patterns
MACRO jumptable
if STRIN("\2", "h") == 1
ldh a, [\2]
else
ld a, [\2]
endc
ld e, a
ld d, 0
ld hl, \1

View File

@ -1065,4 +1065,10 @@ MACRO checksave
db checksave_command
ENDM
const exitoverworld_command ; $aa
MACRO exitoverworld
db exitoverworld_command
db \1 ; exit reason
ENDM
DEF NUM_EVENT_COMMANDS EQU const_value

View File

@ -152,3 +152,5 @@ hWindowHUDLY::
; Window HUD is enabled when non-0.
; Its value indicates the last scanline that the window spans from the top.
db
hCurBoardEvent:: db