From 1f33436a64b0afd768a8457fcb940f0e20dde959 Mon Sep 17 00:00:00 2001 From: xCrystal Date: Mon, 14 Aug 2023 20:09:23 +0200 Subject: [PATCH] Board menu (#11) [Commit 1] --- constants/menu_constants.asm | 9 ++++ constants/sprite_data_constants.asm | 2 +- engine/board/menu.asm | 74 ++++++++++++++++++++++++++++ engine/gfx/load_board_gfx.asm | 22 +++++++++ engine/gfx/overworld_textbox.asm | 4 +- engine/menus/start_menu.asm | 6 +-- gfx/board/menu.pal | 29 +++++++++++ gfx/board/menu.png | Bin 0 -> 994 bytes gfx/board/menu_bag.png | Bin 0 -> 369 bytes gfx/board/menu_die.png | Bin 0 -> 377 bytes gfx/board/menu_exit.png | Bin 0 -> 273 bytes gfx/board/menu_pokegear.png | Bin 0 -> 374 bytes gfx/board/menu_pokemon.png | Bin 0 -> 361 bytes home/text.asm | 17 +++++++ layout.link | 2 + main.asm | 5 ++ maps/Level1_Map1.asm | 7 ++- ram/wram.asm | 10 +++- 18 files changed, 179 insertions(+), 8 deletions(-) create mode 100755 engine/board/menu.asm create mode 100755 engine/gfx/load_board_gfx.asm create mode 100755 gfx/board/menu.pal create mode 100755 gfx/board/menu.png create mode 100755 gfx/board/menu_bag.png create mode 100755 gfx/board/menu_die.png create mode 100755 gfx/board/menu_exit.png create mode 100755 gfx/board/menu_pokegear.png create mode 100755 gfx/board/menu_pokemon.png diff --git a/constants/menu_constants.asm b/constants/menu_constants.asm index 954a3783a..a037e2861 100644 --- a/constants/menu_constants.asm +++ b/constants/menu_constants.asm @@ -111,3 +111,12 @@ DEF NUM_PARTYMENUACTIONS EQU const_value const NAME_6 ; duplicate of NAME_MON const NAME_7 ; duplicate of NAME_MON 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_POKEGEAR + const BOARDMENUITEM_EXIT +DEF NUM_BOARD_MENU_ITEMS EQU const_value \ No newline at end of file diff --git a/constants/sprite_data_constants.asm b/constants/sprite_data_constants.asm index a7dc809b5..2bab7abf3 100644 --- a/constants/sprite_data_constants.asm +++ b/constants/sprite_data_constants.asm @@ -19,7 +19,7 @@ DEF NUM_SPRITEDATA_FIELDS EQU _RS const PAL_OW_BLUE ; 1 const PAL_OW_GREEN ; 2 const PAL_OW_BROWN ; 3 - const PAL_OW_PINK ; 4 + const PAL_OW_MISC ; 4 const PAL_OW_EMOTE ; 5 const PAL_OW_TREE ; 6 const PAL_OW_ROCK ; 7 diff --git a/engine/board/menu.asm b/engine/board/menu.asm new file mode 100755 index 000000000..81e2e3b8e --- /dev/null +++ b/engine/board/menu.asm @@ -0,0 +1,74 @@ +DEF BOARD_MENU_BG_FIRST_TILE EQU "A" +DEF BOARD_MENU_OAM_FIRST_TILE EQU BOARD_MENU_BG_FIRST_TILE + 18 * 3 + +BoardMenu:: +; returns the selected menu item (BOARDMENUITEM_*) in wScriptVar upon exit + ld a, [wBoardMenuLastCursorPosition] + ld [wBoardMenuCursorPosition], a + farcall LoadBoardMenuGFX + call DrawBoardMenuTiles + call ApplyTilemap + call UpdateSprites +; draw board menu OAM after overworld sprites + call DrawBoardMenuOAM + +.loop + call GetBoardMenuSelection + jr c, .done + ld hl, wBoardMenuCursorPosition + ld a, [wBoardMenuLastCursorPosition] + cp [hl] + jr z, .loop + +; menu item change: refresh board menu OAM and save cursor position + call DrawBoardMenuOAM + ld a, [wBoardMenuCursorPosition] + ld [wBoardMenuLastCursorPosition], a + jr .loop + +.done + ld a, [wBoardMenuCursorPosition] + ld [wScriptVar], a + ret + +DrawBoardMenuTiles: + hlcoord TEXTBOX_INNERX, TEXTBOX_INNERY + ld a, BOARD_MENU_BG_FIRST_TILE + lb bc, 3, 18 + jp FillBoxWithConsecutiveBytes + +DrawBoardMenuOAM: + ld hl, BoardMenuItemPals + ld a, [wBoardMenuLastCursorPosition] + ld bc, PALETTE_SIZE + call AddNTimes + ; set wOBPals2 directly rather than wOBPals1 to avoid calling ApplyPals and overwriting other overworld pals + ld de, wOBPals2 palette PAL_OW_MISC + ld bc, PALETTE_SIZE + ld a, BANK(wOBPals2) + call FarCopyWRAM + + ld hl, .OAM + ld a, [wBoardMenuCursorPosition] + ld bc, 3 * 3 * SPRITEOAMSTRUCT_LENGTH + call AddNTimes +; find the beginning of free space in OAM, and assure there's space for 3 * 3 objects + ldh a, [hUsedSpriteIndex] + cp (NUM_SPRITE_OAM_STRUCTS * SPRITEOAMSTRUCT_LENGTH) - (3 * 3 * SPRITEOAMSTRUCT_LENGTH) + jr nc, .oam_full +; copy the sprite data (3 * 3 objects) of that item to the available space in OAM + ld e, a + ld d, HIGH(wShadowOAM) + ld bc, 3 * 3 * SPRITEOAMSTRUCT_LENGTH + call CopyBytes +.oam_full + ret + +.OAM: + +GetBoardMenuSelection: + scf + ret + +BoardMenuItemPals: +INCLUDE "gfx/board/menu.pal" diff --git a/engine/gfx/load_board_gfx.asm b/engine/gfx/load_board_gfx.asm new file mode 100755 index 000000000..c932a53b3 --- /dev/null +++ b/engine/gfx/load_board_gfx.asm @@ -0,0 +1,22 @@ +LoadBoardMenuGFX:: + ld de, .BoardMenuGFX + ld hl, vTiles1 + lb bc, BANK(.BoardMenuGFX), 18 * 3 + call Get2bppViaHDMA + ld de, .BoardMenuOAMGFX + ld hl, vTiles1 + (18 * 3) * LEN_2BPP_TILE + lb bc, BANK(.BoardMenuOAMGFX), 3 * 3 * NUM_BOARD_MENU_ITEMS + call Get2bppViaHDMA + ret + +.BoardMenuGFX: +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_pokegear.2bpp" +INCBIN "gfx/board/menu_exit.2bpp" + assert_table_length NUM_BOARD_MENU_ITEMS diff --git a/engine/gfx/overworld_textbox.asm b/engine/gfx/overworld_textbox.asm index f513af646..5f27386a2 100755 --- a/engine/gfx/overworld_textbox.asm +++ b/engine/gfx/overworld_textbox.asm @@ -14,8 +14,8 @@ const OW_TEXTBOX_FRAME_RIGHT_2 const OW_TEXTBOX_FRAME_BACKGROUND -OW_TEXTBOX_FRAME_MIN_HEIGHT EQU 4 -OW_TEXTBOX_FRAME_MIN_WIDTH EQU 6 +DEF OW_TEXTBOX_FRAME_MIN_HEIGHT EQU 4 +DEF OW_TEXTBOX_FRAME_MIN_WIDTH EQU 6 _OverworldTextbox:: ; Draw a textbox at de with room for b rows and c columns using the 2bpp overworld frame tiles. diff --git a/engine/menus/start_menu.asm b/engine/menus/start_menu.asm index 6d9ceb60e..30339c5c6 100644 --- a/engine/menus/start_menu.asm +++ b/engine/menus/start_menu.asm @@ -27,7 +27,7 @@ StartMenu:: .GotMenuData: call LoadMenuHeader call .SetUpMenuItems - ld a, [wBattleMenuCursorPosition] + ld a, [wStartMenuLastCursorPosition] ld [wMenuCursorPosition], a call .DrawMenuAccount call DrawVariableLengthMenuBox @@ -43,7 +43,7 @@ StartMenu:: call UpdateSprites call UpdateTimePals call .SetUpMenuItems - ld a, [wBattleMenuCursorPosition] + ld a, [wStartMenuLastCursorPosition] ld [wMenuCursorPosition], a .Select: @@ -51,7 +51,7 @@ StartMenu:: jr c, .Exit call ._DrawMenuAccount ld a, [wMenuCursorPosition] - ld [wBattleMenuCursorPosition], a + ld [wStartMenuLastCursorPosition], a call PlayClickSFX call PlaceHollowCursor call .OpenMenu diff --git a/gfx/board/menu.pal b/gfx/board/menu.pal new file mode 100755 index 000000000..980d2d7dd --- /dev/null +++ b/gfx/board/menu.pal @@ -0,0 +1,29 @@ +; item 1 (BOARDMENUITEM_DIE) + RGB 31, 31, 31 + RGB 10, 10, 31 + RGB 00, 00, 21 + RGB 00, 00, 00 + +; item 2 (BOARDMENUITEM_POKEMON) + RGB 31, 31, 31 + RGB 31, 26, 26 + RGB 30, 00, 00 + RGB 00, 00, 00 + +; item 3 (BOARDMENUITEM_BAG) + RGB 31, 31, 31 + RGB 10, 31, 10 + RGB 00, 21, 10 + RGB 00, 00, 00 + +; item 4 (BOARDMENUITEM_POKEGEAR) + RGB 31, 31, 31 + RGB 21, 21, 09 + RGB 11, 11, 00 + RGB 00, 00, 00 + +; item 5 (BOARDMENUITEM_EXIT) + RGB 31, 31, 31 + RGB 20, 20, 00 + RGB 10, 10, 00 + RGB 00, 00, 00 diff --git a/gfx/board/menu.png b/gfx/board/menu.png new file mode 100755 index 0000000000000000000000000000000000000000..1f6f71c1fe81326739bf6287ccdec19fcbcbc8f4 GIT binary patch literal 994 zcmV<810DQ{P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&19wS8K~!i%?V1a2 z+dvFN-J(~t4{0B=$)tY3l-LjVSEPU*AV^wiIUJHs(lkGw&*$&k#l<8)-{*^qDW<;y zJsywu)gM0Nysyr1S}(?roc1R?hh2I-Up;zx3=a?q#lW@oRfv1P-@nfAdcD5RJM?`f0)sfccr_0oGY5J!d5LE$2+gOts8moHGf+J{1vo=JOl zfXF`!dwPCrF-;yxsHG@YOAB-J?s>OYg+B6RZwgguHd&PlvBN@qU!m{gLkPfk37NL*#f;T+a*-Ln1sT z>*#XLyH0JrM`jQDz=y?i>)|@3W|Dt=M*OVKzal+ABwi{O!?I&|TxWzX(&_Iqu#Ki=azu76j$1Ehk<6vgA-3obB;@pwOq$48Ii)^gavsb(o(YN0dtUY}O2 zPWfGpnfe(B5gI7`+J{BgI%07$Fc=Zmb@uB>Z9Rkbwua}_U;%aW3jF!|$s7|}&1 z4vrJ!M@D^SJjTBHo}S*+UnF8s!6m+Pa3Zed)YeDvLW$N8m6|@I-O_T6+VfFO_t^3$ zT%SEXz3D$`6%=FC)C_3BF3lJ>!w&7!x-;=x)U=ld=;C7NzcMZ^{^oZ305DxoNq1xd QZvX%Q07*qoM6N<$g3Gnf;s5{u literal 0 HcmV?d00001 diff --git a/gfx/board/menu_bag.png b/gfx/board/menu_bag.png new file mode 100755 index 0000000000000000000000000000000000000000..2bc7bce7efd48de31cc229dcb1c05c65ca557705 GIT binary patch literal 369 zcmV-%0gnEOP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&0R~A#K~zXf)t2E7 z!XONUhw&A+ha3;79N|dmTBu9*!!IE)nZ5RC(DW&65AtgBW4INhl-kNBTDU2|;OBYP zS#ummog*R_i&nt__f}O_P=N#=l>l{MZ4K=0``({t3>G0HW(OO%2J)HfoO2yOgc&fq z$O>LEt~0o#Vp%pVMkx&H?1kEbcqfQn_wBLVA~D?{DQX1J7D=9gKL%+MY?B(D}d}~!K1?N8KCspIe3-;d2P4? z!0T-bh*^T&BB;uYqZSapuP;6K3|0c%mq}SS>g5;ByR>FlfyuxBtJtPx#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&0S-w-K~zXfwUi4E zf-n#T!8^hs;gHBvhCG(-$EcGuv{l~hmcY2}41eTtT>nOQ2je&%vp2nsHw6SQ%ksLy zJkPIdOH>qO!GsF-TcVqwRoI%J z>Et5FZg7!^N94iKC4iDB3x=j3dyuU_K@l#vy~!S~IqTSgP>_ZPN2;F+Ne~H_5UfFP zRzy+Y)%#Hiue25}ih@|Z(^EOz1XSzQXObAMwRZ+-2T>w??%@Q}Rpjz5;uS|Ayc0pV zOMpF#yb2%_0U=Hn45CeK+ON_L PbTNactDnm{r-UW|SDl*Loj1#vT795zFbNxjc2J&w?hAxz8)(_u3lxUe0?`yM~uT>iEZs zUz>DJOXht4u&;d1Lq+38(N7LZ5=(CIrUs`wFdqHP7#(1t)at19qV!qs*J*+eW4_pm zTryQUwDHD8hdZB}uXIRctY&%Te6`BeaTRmN3V{zba`xvPE(%suPuO%_#9r&cu1#;f z%l-<6vTw@@NuA&MwcF?DOoyWzKfPKRz#`=0dFlETr7X!+d<33)E!ozc=CbCD z@by)TYiBR8s&t;ucLK6T-sg|Jt literal 0 HcmV?d00001 diff --git a/gfx/board/menu_pokemon.png b/gfx/board/menu_pokemon.png new file mode 100755 index 0000000000000000000000000000000000000000..274bd846dd92790b575f31ced37479b19239f529 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85o30K$!7fntTON@SmrPV~B_M)+vpA%?dm&sW*m}Km>P(sAip42Uq%snDxT2I6 zuVXx-$zxNFTqK&O3I;>`TdAa8U8hZTBZncd;oLZQOXQtNG#dHHlZ}?P&j<{=J*yMJWF+ zwub9wMok6