From c48d2b698ebdd69fcac242641db8ba2f23fdb22f Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Wed, 24 Jul 2024 20:34:30 +0200 Subject: [PATCH] added move description window --- include/battle_interface.h | 1 + include/constants/battle.h | 1 + include/pokemon_summary_screen.h | 5 ++ include/strings.h | 2 + src/battle_bg.c | 9 +++ src/battle_controller_player.c | 94 +++++++++++++++++++++++++++++--- src/battle_gfx_sfx_util.c | 1 + src/battle_interface.c | 6 ++ src/battle_message.c | 14 ++++- src/pokemon_summary_screen.c | 18 ++++-- 10 files changed, 136 insertions(+), 15 deletions(-) diff --git a/include/battle_interface.h b/include/battle_interface.h index a2ed4e212..98714d300 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -139,5 +139,6 @@ void HideTriggerSprites(void); void CreateAbilityPopUp(u8 battlerId, u32 ability, bool32 isDoubleBattle); void DestroyAbilityPopUp(u8 battlerId); void UpdateAbilityPopup(u8 battlerId); +void CategoryIcons_LoadSpritesGfx(void); #endif // GUARD_BATTLE_INTERFACE_H diff --git a/include/constants/battle.h b/include/constants/battle.h index 222c6e0fb..28df5d11e 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -482,6 +482,7 @@ #define B_WIN_VS_OUTCOME_LEFT 22 #define B_WIN_VS_OUTCOME_RIGHT 23 #define B_WIN_OAK_OLD_MAN 24 +#define B_WIN_MOVE_DESCRIPTION 25 #define B_TEXT_FLAG_NPC_CONTEXT_FONT (1 << 6) #define B_TEXT_FLAG_WINDOW_CLEAR (1 << 7) diff --git a/include/pokemon_summary_screen.h b/include/pokemon_summary_screen.h index ad53b8965..20680b592 100644 --- a/include/pokemon_summary_screen.h +++ b/include/pokemon_summary_screen.h @@ -3,6 +3,11 @@ #include "main.h" +extern const u8 gNotDoneYetDescription[]; +extern const struct CompressedSpriteSheet gSpriteSheet_CategoryIcons; +extern const struct SpritePalette gSpritePal_CategoryIcons; +extern const struct SpriteTemplate gSpriteTemplate_CategoryIcons; + void ShowSelectMovePokemonSummaryScreen(struct Pokemon *, u8, u8, MainCallback, u16); u8 GetMoveSlotToReplace(void); void SummaryScreen_SetUnknownTaskId(u8 a0); diff --git a/include/strings.h b/include/strings.h index 3414a359c..3e3cf3f22 100644 --- a/include/strings.h +++ b/include/strings.h @@ -220,12 +220,14 @@ extern const u8 gText_WhatWillPlayerThrow[]; // battle_controller_player extern const u8 gText_BattleSwitchWhich[]; +extern const u8 gText_BattleSwitchWhich5[]; extern const u8 gText_MoveInterfaceDynamicColors[]; extern const u8 gText_MoveInterfacePP[]; extern const u8 gText_MoveInterfaceType[]; extern const u8 gText_LinkStandby[]; extern const u8 gText_BattleMenu[]; extern const u8 gText_WhatWillPkmnDo[]; +extern const u8 gText_NewLine[]; // battle_controller_oak_old_man extern const u8 gText_ForPetesSake[]; diff --git a/src/battle_bg.c b/src/battle_bg.c index 193a477a3..555697f97 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -358,6 +358,15 @@ static const struct WindowTemplate sStandardBattleWindowTemplates[] = { .paletteNum = 7, .baseBlock = 0x090 }, + [B_WIN_MOVE_DESCRIPTION] = { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 47, + .width = 18, + .height = 6, + .paletteNum = 5, + .baseBlock = 0x0350, + }, DUMMY_WIN_TEMPLATE }; diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index e18cddaf6..0e898bd49 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -6,6 +6,7 @@ #include "item_menu.h" #include "link.h" #include "m4a.h" +#include "new_menu_helpers.h" #include "party_menu.h" #include "pokeball.h" #include "strings.h" @@ -20,10 +21,12 @@ #include "battle_script_commands.h" #include "battle_z_move.h" #include "battle_gimmick.h" +#include "pokemon_summary_screen.h" #include "recorded_battle.h" #include "reshow_battle_screen.h" #include "test_runner.h" #include "constants/battle_anim.h" +#include "constants/battle_move_effects.h" #include "constants/battle_partner.h" #include "constants/items.h" #include "constants/moves.h" @@ -68,6 +71,7 @@ static void MoveSelectionDisplayPpNumber(u32 battler); static void MoveSelectionDisplayPpString(void); static void MoveSelectionDisplayMoveType(u32 battler); static void MoveSelectionDisplayMoveNames(u32 battler); +static void MoveSelectionDisplayMoveDescription(u32 battler); static void HandleMoveSwitching(u32 battler); static void WaitForMonSelection(u32 battler); static void CompleteWhenChoseItem(u32 battler); @@ -657,8 +661,8 @@ void HandleInputChooseMove(u32 battler) MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); - // if (gBattleStruct->descriptionSubmenu) - // MoveSelectionDisplayMoveDescription(battler); + if (gBattleStruct->descriptionSubmenu) + MoveSelectionDisplayMoveDescription(battler); TryChangeZTrigger(battler, gMoveSelectionCursor[battler]); } } @@ -673,8 +677,8 @@ void HandleInputChooseMove(u32 battler) MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); - // if (gBattleStruct->descriptionSubmenu) - // MoveSelectionDisplayMoveDescription(battler); + if (gBattleStruct->descriptionSubmenu) + MoveSelectionDisplayMoveDescription(battler); TryChangeZTrigger(battler, gMoveSelectionCursor[battler]); } } @@ -688,8 +692,8 @@ void HandleInputChooseMove(u32 battler) MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); - // if (gBattleStruct->descriptionSubmenu) - // MoveSelectionDisplayMoveDescription(battler); + if (gBattleStruct->descriptionSubmenu) + MoveSelectionDisplayMoveDescription(battler); TryChangeZTrigger(battler, gMoveSelectionCursor[battler]); } } @@ -704,12 +708,12 @@ void HandleInputChooseMove(u32 battler) MoveSelectionCreateCursorAt(gMoveSelectionCursor[battler], 0); MoveSelectionDisplayPpNumber(battler); MoveSelectionDisplayMoveType(battler); - // if (gBattleStruct->descriptionSubmenu) - // MoveSelectionDisplayMoveDescription(battler); + if (gBattleStruct->descriptionSubmenu) + MoveSelectionDisplayMoveDescription(battler); TryChangeZTrigger(battler, gMoveSelectionCursor[battler]); } } - else if (JOY_NEW(SELECT_BUTTON) && !gBattleStruct->zmove.viewing) + else if (JOY_NEW(SELECT_BUTTON) && !gBattleStruct->zmove.viewing && !gBattleStruct->descriptionSubmenu) { if (gNumberOfMovesToChoose > 1 && !(gBattleTypeFlags & BATTLE_TYPE_LINK)) { @@ -725,6 +729,30 @@ void HandleInputChooseMove(u32 battler) gBattlerControllerFuncs[battler] = HandleMoveSwitching; } } + else if (gBattleStruct->descriptionSubmenu) + { + if (JOY_NEW(B_MOVE_DESCRIPTION_BUTTON) || JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) + { + gBattleStruct->descriptionSubmenu = FALSE; + if (gCategoryIconSpriteId != 0xFF) + { + DestroySprite(&gSprites[gCategoryIconSpriteId]); + gCategoryIconSpriteId = 0xFF; + } + + FillWindowPixelBuffer(B_WIN_MOVE_DESCRIPTION, PIXEL_FILL(0)); + ClearStdWindowAndFrame(B_WIN_MOVE_DESCRIPTION, FALSE); + CopyWindowToVram(B_WIN_MOVE_DESCRIPTION, COPYWIN_GFX); + PlaySE(SE_SELECT); + MoveSelectionDisplayPpNumber(battler); + MoveSelectionDisplayMoveType(battler); + } + } + else if (JOY_NEW(B_MOVE_DESCRIPTION_BUTTON) && B_MOVE_DESCRIPTION_BUTTON != B_LAST_USED_BALL_BUTTON) + { + gBattleStruct->descriptionSubmenu = TRUE; + MoveSelectionDisplayMoveDescription(battler); + } else if (JOY_NEW(START_BUTTON)) { if (gBattleStruct->gimmick.usableGimmick[battler] != GIMMICK_NONE) @@ -1556,6 +1584,54 @@ static void MoveSelectionDisplayMoveType(u32 battler) BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MOVE_TYPE); } +static void MoveSelectionDisplayMoveDescription(u32 battler) +{ + struct ChooseMoveStruct *moveInfo = (struct ChooseMoveStruct*)(&gBattleResources->bufferA[battler][4]); + u16 move = moveInfo->moves[gMoveSelectionCursor[battler]]; + u16 pwr = gMovesInfo[move].power; + u16 acc = gMovesInfo[move].accuracy; + u8 cat = gMovesInfo[move].category; + + u8 pwr_num[3], acc_num[3]; + u8 cat_desc[7] = _("CAT: "); + u8 pwr_desc[7] = _("PWR: "); + u8 acc_desc[7] = _("ACC: "); + u8 cat_start[] = _("{CLEAR_TO 0x03}"); + u8 pwr_start[] = _("{CLEAR_TO 0x38}"); + u8 acc_start[] = _("{CLEAR_TO 0x6D}"); + LoadStdWindowFrameGfx(); + DrawStdWindowFrame(B_WIN_MOVE_DESCRIPTION, FALSE); + if (pwr < 2) + StringCopy(pwr_num, gText_BattleSwitchWhich5); + else + ConvertIntToDecimalStringN(pwr_num, pwr, STR_CONV_MODE_LEFT_ALIGN, 3); + if (acc < 2) + StringCopy(acc_num, gText_BattleSwitchWhich5); + else + ConvertIntToDecimalStringN(acc_num, acc, STR_CONV_MODE_LEFT_ALIGN, 3); + StringCopy(gDisplayedStringBattle, cat_start); + StringAppend(gDisplayedStringBattle, cat_desc); + StringAppend(gDisplayedStringBattle, pwr_start); + StringAppend(gDisplayedStringBattle, pwr_desc); + StringAppend(gDisplayedStringBattle, pwr_num); + StringAppend(gDisplayedStringBattle, acc_start); + StringAppend(gDisplayedStringBattle, acc_desc); + StringAppend(gDisplayedStringBattle, acc_num); + StringAppend(gDisplayedStringBattle, gText_NewLine); + if (gMovesInfo[move].effect == EFFECT_PLACEHOLDER) + StringAppend(gDisplayedStringBattle, gNotDoneYetDescription); + else + StringAppend(gDisplayedStringBattle, gMovesInfo[move].description); + BattlePutTextOnWindow(gDisplayedStringBattle, B_WIN_MOVE_DESCRIPTION); + + if (gCategoryIconSpriteId == 0xFF) + gCategoryIconSpriteId = CreateSprite(&gSpriteTemplate_CategoryIcons, 38, 64, 1); + + StartSpriteAnim(&gSprites[gCategoryIconSpriteId], cat); + + CopyWindowToVram(B_WIN_MOVE_DESCRIPTION, COPYWIN_FULL); +} + void MoveSelectionCreateCursorAt(u8 cursorPosition, u8 arg1) { u16 src[2]; diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 7c6af70fa..2881f8572 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -487,6 +487,7 @@ bool8 BattleLoadAllHealthBoxesGfx(u8 state) LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[0]); LoadSpritePalette(&sSpritePalettes_HealthBoxHealthBar[1]); LoadIndicatorSpritesGfx(); + CategoryIcons_LoadSpritesGfx(); } else if (!IsDoubleBattle()) { diff --git a/src/battle_interface.c b/src/battle_interface.c index a2feeaa97..5c6c7ed0e 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -2618,3 +2618,9 @@ static void Task_FreeAbilityPopUpGfx(u8 taskId) DestroyTask(taskId); } } + +void CategoryIcons_LoadSpritesGfx(void) +{ + LoadCompressedSpriteSheet(&gSpriteSheet_CategoryIcons); + LoadSpritePalette(&gSpritePal_CategoryIcons); +} diff --git a/src/battle_message.c b/src/battle_message.c index 8c334968e..89bd1dc25 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -3767,7 +3767,19 @@ static const struct BattleWindowText sTextOnWindowsInfo_Normal[] = { .fgColor = 2, .bgColor = 1, .shadowColor = 3, - } + }, + [B_WIN_MOVE_DESCRIPTION] = { + .fillValue = PIXEL_FILL(0xE), + .fontId = FONT_NARROW, + .x = 0, + .y = 1, + .letterSpacing = 0, + .lineSpacing = 0, + .speed = 0, + .fgColor = TEXT_DYNAMIC_COLOR_4, + .bgColor = TEXT_DYNAMIC_COLOR_5, + .shadowColor = TEXT_DYNAMIC_COLOR_6, + }, }; static const u8 sNpcTextColorToFont[] = diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index eca005b2c..edb2ca546 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -36,6 +36,7 @@ #include "battle_interface.h" #include "mon_markings.h" #include "pokemon_storage_system.h" +#include "constants/battle_move_effects.h" #include "constants/sound.h" // needs conflicting header to match (curIndex is s8 in the function, but has to be defined as u8 here) @@ -3158,11 +3159,18 @@ static void PokeSum_PrintSelectedMoveStats(void) sLevelNickTextColors[0], TEXT_SKIP_DRAW, sMonSummaryScreen->summary.moveAccuracyStrBufs[sMoveSelectionCursorPos]); - AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, - 7, 42, - 0, 0, - sLevelNickTextColors[0], TEXT_SKIP_DRAW, - gMovesInfo[sMonSummaryScreen->moveIds[sMoveSelectionCursorPos]].description); + if (gMovesInfo[sMonSummaryScreen->moveIds[sMoveSelectionCursorPos]].effect != EFFECT_PLACEHOLDER) + AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, + 7, 42, + 0, 0, + sLevelNickTextColors[0], TEXT_SKIP_DRAW, + gMovesInfo[sMonSummaryScreen->moveIds[sMoveSelectionCursorPos]].description); + else + AddTextPrinterParameterized4(sMonSummaryScreen->windowIds[POKESUM_WIN_TRAINER_MEMO], FONT_NORMAL, + 7, 42, + 0, 0, + sLevelNickTextColors[0], TEXT_SKIP_DRAW, + gNotDoneYetDescription); if (B_SHOW_CATEGORY_ICON == TRUE) ShowCategoryIcon(GetBattleMoveCategory(sMonSummaryScreen->moveIds[sMoveSelectionCursorPos]));