diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 8432d8d64..e45c00ac2 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -28326,6 +28326,17 @@ gBattleAnimStatus_Nightmare:: clearmonbg ANIM_DEF_PARTNER end +gBattleAnimStatus_Frostbite:: + playsewithpan SE_M_ICY_WIND, 0 + loadspritegfx ANIM_TAG_ICE_CRYSTALS + monbg ANIM_DEF_PARTNER + splitbgprio ANIM_TARGET + call IceCrystalEffectShort + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, 5, 7, 0, RGB(0, 20, 31) + waitforvisualfinish + clearmonbg ANIM_DEF_PARTNER + end + gBattleAnimGeneral_StatsChange:: createvisualtask AnimTask_StatsChange, 5 waitforvisualfinish diff --git a/graphics/battle_interface/ball_caught_indicator.png b/graphics/battle_interface/ball_caught_indicator.png new file mode 100644 index 000000000..bdca9c92c Binary files /dev/null and b/graphics/battle_interface/ball_caught_indicator.png differ diff --git a/graphics/battle_interface/ball_display.png b/graphics/battle_interface/ball_display.png new file mode 100644 index 000000000..c095acda4 Binary files /dev/null and b/graphics/battle_interface/ball_display.png differ diff --git a/graphics/battle_interface/expbar.png b/graphics/battle_interface/expbar.png new file mode 100644 index 000000000..773f2c1ad Binary files /dev/null and b/graphics/battle_interface/expbar.png differ diff --git a/graphics/battle_interface/healthbox_doubles_frameend.png b/graphics/battle_interface/healthbox_doubles_frameend.png new file mode 100644 index 000000000..80754d8cb Binary files /dev/null and b/graphics/battle_interface/healthbox_doubles_frameend.png differ diff --git a/graphics/battle_interface/healthbox_doubles_frameend_bar.png b/graphics/battle_interface/healthbox_doubles_frameend_bar.png new file mode 100644 index 000000000..e8a19f138 Binary files /dev/null and b/graphics/battle_interface/healthbox_doubles_frameend_bar.png differ diff --git a/graphics/battle_interface/healthbox_elements.png b/graphics/battle_interface/healthbox_elements.png deleted file mode 100644 index 5e22fb75e..000000000 Binary files a/graphics/battle_interface/healthbox_elements.png and /dev/null differ diff --git a/graphics/battle_interface/hpbar.png b/graphics/battle_interface/hpbar.png new file mode 100644 index 000000000..29f458a8c Binary files /dev/null and b/graphics/battle_interface/hpbar.png differ diff --git a/graphics/battle_interface/hpbar_anim.png b/graphics/battle_interface/hpbar_anim.png new file mode 100644 index 000000000..3ccce44fa Binary files /dev/null and b/graphics/battle_interface/hpbar_anim.png differ diff --git a/graphics/battle_interface/misc.png b/graphics/battle_interface/misc.png new file mode 100644 index 000000000..4beae505e Binary files /dev/null and b/graphics/battle_interface/misc.png differ diff --git a/graphics/battle_interface/misc_frameend.png b/graphics/battle_interface/misc_frameend.png new file mode 100644 index 000000000..d0a3e05ed Binary files /dev/null and b/graphics/battle_interface/misc_frameend.png differ diff --git a/graphics/battle_interface/status.png b/graphics/battle_interface/status.png new file mode 100644 index 000000000..672795cf0 Binary files /dev/null and b/graphics/battle_interface/status.png differ diff --git a/graphics/battle_interface/status2.png b/graphics/battle_interface/status2.png new file mode 100644 index 000000000..8b6d9a5a2 Binary files /dev/null and b/graphics/battle_interface/status2.png differ diff --git a/graphics/battle_interface/status3.png b/graphics/battle_interface/status3.png new file mode 100644 index 000000000..c07e75d1b Binary files /dev/null and b/graphics/battle_interface/status3.png differ diff --git a/graphics/battle_interface/status4.png b/graphics/battle_interface/status4.png new file mode 100644 index 000000000..d17686fc8 Binary files /dev/null and b/graphics/battle_interface/status4.png differ diff --git a/graphics/interface/status_icons.png b/graphics/interface/status_icons.png index 2edfda8f9..cef7119a4 100644 Binary files a/graphics/interface/status_icons.png and b/graphics/interface/status_icons.png differ diff --git a/graphics/summary_screen/status_ailment_icons.png b/graphics/summary_screen/status_ailment_icons.png index 02d9ab338..120ffc35d 100644 Binary files a/graphics/summary_screen/status_ailment_icons.png and b/graphics/summary_screen/status_ailment_icons.png differ diff --git a/include/battle_anim_scripts.h b/include/battle_anim_scripts.h index 8547b277a..34f5ef5d9 100644 --- a/include/battle_anim_scripts.h +++ b/include/battle_anim_scripts.h @@ -948,6 +948,7 @@ extern const u8 gBattleAnimStatus_Paralysis[]; extern const u8 gBattleAnimStatus_Freeze[]; extern const u8 gBattleAnimStatus_Curse[]; extern const u8 gBattleAnimStatus_Nightmare[]; +extern const u8 gBattleAnimStatus_Frostbite[]; // general animations extern const u8 gBattleAnimGeneral_StatsChange[]; diff --git a/include/constants/party_menu.h b/include/constants/party_menu.h index 98bce6c28..e31b7205b 100644 --- a/include/constants/party_menu.h +++ b/include/constants/party_menu.h @@ -9,6 +9,7 @@ #define AILMENT_BRN 5 #define AILMENT_PKRS 6 #define AILMENT_FNT 7 +#define AILMENT_FRB 8 #define PARTY_LAYOUT_SINGLE 0 #define PARTY_LAYOUT_DOUBLE 1 @@ -17,14 +18,14 @@ #define PARTY_LAYOUT_COUNT 4 #define KEEP_PARTY_LAYOUT 0xFF -#define PARTY_MENU_TYPE_FIELD 0 -#define PARTY_MENU_TYPE_IN_BATTLE 1 -#define PARTY_MENU_TYPE_CONTEST 2 -#define PARTY_MENU_TYPE_CHOOSE_SINGLE_MON 3 +#define PARTY_MENU_TYPE_FIELD 0 +#define PARTY_MENU_TYPE_IN_BATTLE 1 +#define PARTY_MENU_TYPE_CONTEST 2 +#define PARTY_MENU_TYPE_CHOOSE_SINGLE_MON 3 #define PARTY_MENU_TYPE_CHOOSE_MULTIPLE_MONS 4 // multi battles, eReader battles, and some battle facilities #define PARTY_MENU_TYPE_MULTI_SHOWCASE 5 -#define PARTY_MENU_TYPE_DAYCARE 6 -#define PARTY_MENU_TYPE_MOVE_RELEARNER 7 +#define PARTY_MENU_TYPE_DAYCARE 6 +#define PARTY_MENU_TYPE_MOVE_RELEARNER 7 #define PARTY_MENU_TYPE_UNION_ROOM_REGISTER 8 // trading board #define PARTY_MENU_TYPE_UNION_ROOM_TRADE 9 // trading board #define PARTY_MENU_TYPE_SPIN_TRADE 10 // Unused beta for Gen IV's Spin Trade @@ -52,7 +53,7 @@ #define PARTY_MSG_CHOOSE_MON 0 #define PARTY_MSG_CHOOSE_MON_OR_CANCEL 1 #define PARTY_MSG_CHOOSE_MON_AND_CONFIRM 2 -#define PARTY_MSG_MOVE_TO_WHERE 3 +#define PARTY_MSG_MOVE_TO_WHERE 3 #define PARTY_MSG_TEACH_WHICH_MON 4 #define PARTY_MSG_USE_ON_WHICH_MON 5 #define PARTY_MSG_GIVE_TO_WHICH_MON 6 diff --git a/include/graphics.h b/include/graphics.h index cae1b6941..194491e24 100644 --- a/include/graphics.h +++ b/include/graphics.h @@ -5446,7 +5446,7 @@ extern const u32 gBattleTextboxTiles[]; extern const u16 gBattleTextboxPalette[]; extern const u32 gBattleTextboxTilemap[]; extern const u32 gBattleInterface_PartySummaryBar_Gfx[]; -extern const u8 gBattleInterface_Gfx[][32]; +extern const u8 gHealthboxElementsGfxTable[][32]; extern const u16 gBattleInterface_Healthbox_Pal[]; extern const u16 gBattleInterface_Healthbar_Pal[]; extern const u16 gCategoryIcons_Pal[]; diff --git a/src/battle_anim.c b/src/battle_anim.c index c97189f5b..6bc6438e5 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -195,6 +195,7 @@ static const u8* const sBattleAnims_StatusConditions[NUM_B_ANIMS_STATUS] = [B_ANIM_STATUS_FRZ] = gBattleAnimStatus_Freeze, [B_ANIM_STATUS_CURSED] = gBattleAnimStatus_Curse, [B_ANIM_STATUS_NIGHTMARE] = gBattleAnimStatus_Nightmare, + [B_ANIM_STATUS_FRB] = gBattleAnimStatus_Frostbite, }; static const u8* const sBattleAnims_General[NUM_B_ANIMS_GENERAL] = diff --git a/src/battle_interface.c b/src/battle_interface.c index 43bea37f2..770a36626 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -22,44 +22,139 @@ #define abs(a) ((a) < 0 ? -(a) : (a)) // These are used as indexes for each "section of tiles" in gBattleInterface_Gfx -#define B_INTERFACE_GFX_TRANSPARENT 0 -#define B_INTERFACE_GFX_HP_BAR_HP_TEXT 1 -#define B_INTERFACE_GFX_HP_BAR_GREEN 3 -#define B_INTERFACE_GFX_EXP_BAR 12 -#define B_INTERFACE_GFX_STATUS_PSN_BATTLER0 21 // BATTLER0: B_POSITION_PLAYER_LEFT -#define B_INTERFACE_GFX_STATUS_PAR_BATTLER0 24 -#define B_INTERFACE_GFX_STATUS_SLP_BATTLER0 27 -#define B_INTERFACE_GFX_STATUS_FRZ_BATTLER0 30 -#define B_INTERFACE_GFX_STATUS_BRN_BATTLER0 33 -// tiles 36 through 38 are unused -#define B_INTERFACE_GFX_STATUS_NONE 39 -// tiles 40 through 42 are unused -#define B_INTERFACE_GFX_SAFARI_HEALTHBOX_0 43 -#define B_INTERFACE_GFX_SAFARI_HEALTHBOX_1 44 -#define B_INTERFACE_GFX_SAFARI_HEALTHBOX_2 45 -// tile 46 is unused -#define B_INTERFACE_GFX_HP_BAR_YELLOW 47 -#define B_INTERFACE_GFX_HP_BAR_RED 56 -#define B_INTERFACE_GFX_HP_BAR_LEFT_BORDER 65 // Used in place of the HP text graphic if the pokemon is statused -#define B_INTERFACE_GFX_BALL_PARTY_SUMMARY 66 -#define B_INTERFACE_GFX_BALL_CAUGHT 70 -#define B_INTERFACE_GFX_STATUS_PSN_BATTLER1 71 // BATTLER1: B_POSITION_OPPONENT_LEFT -#define B_INTERFACE_GFX_STATUS_PAR_BATTLER1 74 -#define B_INTERFACE_GFX_STATUS_SLP_BATTLER1 77 -#define B_INTERFACE_GFX_STATUS_FRZ_BATTLER1 80 -#define B_INTERFACE_GFX_STATUS_BRN_BATTLER1 83 -#define B_INTERFACE_GFX_STATUS_PSN_BATTLER2 86 // BATTLER2: B_POSITION_PLAYER_RIGHT -#define B_INTERFACE_GFX_STATUS_PAR_BATTLER2 89 -#define B_INTERFACE_GFX_STATUS_SLP_BATTLER2 92 -#define B_INTERFACE_GFX_STATUS_FRZ_BATTLER2 95 -#define B_INTERFACE_GFX_STATUS_BRN_BATTLER2 98 -#define B_INTERFACE_GFX_STATUS_PSN_BATTLER3 101 // BATTLER3: B_POSITION_OPPONENT_RIGHT -#define B_INTERFACE_GFX_STATUS_PAR_BATTLER3 104 -#define B_INTERFACE_GFX_STATUS_SLP_BATTLER3 107 -#define B_INTERFACE_GFX_STATUS_FRZ_BATTLER3 110 -#define B_INTERFACE_GFX_STATUS_BRN_BATTLER3 113 -#define B_INTERFACE_GFX_BOTTOM_RIGHT_CORNER_HP_AS_TEXT 116 // Used in the player's -#define B_INTERFACE_GFX_BOTTOM_RIGHT_CORNER_HP_AS_BAR 117 // healthbox in double battles +enum +{ + B_INTERFACE_GFX_TRANSPARENT, + B_INTERFACE_GFX_HP_BAR_HP_TEXT, + B_INTERFACE_GFX_HP_BAR_HP_TEXT_2, + B_INTERFACE_GFX_HP_BAR_GREEN, + B_INTERFACE_GFX_HP_BAR_GREEN_2, + B_INTERFACE_GFX_HP_BAR_GREEN_3, + B_INTERFACE_GFX_HP_BAR_GREEN_4, + B_INTERFACE_GFX_HP_BAR_GREEN_5, + B_INTERFACE_GFX_HP_BAR_GREEN_6, + B_INTERFACE_GFX_HP_BAR_GREEN_7, + B_INTERFACE_GFX_HP_BAR_GREEN_8, + B_INTERFACE_GFX_HP_BAR_GREEN_9, + B_INTERFACE_GFX_EXP_BAR, + B_INTERFACE_GFX_EXP_BAR_2, + B_INTERFACE_GFX_EXP_BAR_3, + B_INTERFACE_GFX_EXP_BAR_4, + B_INTERFACE_GFX_EXP_BAR_5, + B_INTERFACE_GFX_EXP_BAR_6, + B_INTERFACE_GFX_EXP_BAR_7, + B_INTERFACE_GFX_EXP_BAR_8, + B_INTERFACE_GFX_EXP_BAR_9, + B_INTERFACE_GFX_STATUS_PSN_BATTLER0, // BATTLER0: B_POSITION_PLAYER_LEFT + B_INTERFACE_GFX_STATUS_PSN_BATTLER0_2, + B_INTERFACE_GFX_STATUS_PSN_BATTLER0_3, + B_INTERFACE_GFX_STATUS_PAR_BATTLER0, + B_INTERFACE_GFX_STATUS_PAR_BATTLER0_2, + B_INTERFACE_GFX_STATUS_PAR_BATTLER0_3, + B_INTERFACE_GFX_STATUS_SLP_BATTLER0, + B_INTERFACE_GFX_STATUS_SLP_BATTLER0_2, + B_INTERFACE_GFX_STATUS_SLP_BATTLER0_3, + B_INTERFACE_GFX_STATUS_FRZ_BATTLER0, + B_INTERFACE_GFX_STATUS_FRZ_BATTLER0_2, + B_INTERFACE_GFX_STATUS_FRZ_BATTLER0_3, + B_INTERFACE_GFX_STATUS_BRN_BATTLER0, + B_INTERFACE_GFX_STATUS_BRN_BATTLER0_2, + B_INTERFACE_GFX_STATUS_BRN_BATTLER0_3, + B_INTERFACE_GFX_STATUS_FRB_BATTLER0, + B_INTERFACE_GFX_STATUS_FRB_BATTLER0_2, + B_INTERFACE_GFX_STATUS_FRB_BATTLER0_3, + B_INTERFACE_GFX_UNUSED_0, + B_INTERFACE_GFX_UNUSED_1, + B_INTERFACE_GFX_UNUSED_2, + B_INTERFACE_GFX_STATUS_NONE, + B_INTERFACE_GFX_UNUSED_3, + B_INTERFACE_GFX_UNUSED_4, + B_INTERFACE_GFX_UNUSED_5, + B_INTERFACE_GFX_SAFARI_HEALTHBOX_0, + B_INTERFACE_GFX_SAFARI_HEALTHBOX_1, + B_INTERFACE_GFX_SAFARI_HEALTHBOX_2, + B_INTERFACE_GFX_UNUSED_6, + B_INTERFACE_GFX_HP_BAR_YELLOW, + B_INTERFACE_GFX_HP_BAR_YELLOW_2, + B_INTERFACE_GFX_HP_BAR_YELLOW_3, + B_INTERFACE_GFX_HP_BAR_YELLOW_4, + B_INTERFACE_GFX_HP_BAR_YELLOW_5, + B_INTERFACE_GFX_HP_BAR_YELLOW_6, + B_INTERFACE_GFX_HP_BAR_YELLOW_7, + B_INTERFACE_GFX_HP_BAR_YELLOW_8, + B_INTERFACE_GFX_HP_BAR_YELLOW_9, + B_INTERFACE_GFX_HP_BAR_RED, + B_INTERFACE_GFX_HP_BAR_RED_2, + B_INTERFACE_GFX_HP_BAR_RED_3, + B_INTERFACE_GFX_HP_BAR_RED_4, + B_INTERFACE_GFX_HP_BAR_RED_5, + B_INTERFACE_GFX_HP_BAR_RED_6, + B_INTERFACE_GFX_HP_BAR_RED_7, + B_INTERFACE_GFX_HP_BAR_RED_8, + B_INTERFACE_GFX_HP_BAR_RED_9, + B_INTERFACE_GFX_HP_BAR_LEFT_BORDER, // Used in place of the HP text graphic if the pokemon is statused + B_INTERFACE_GFX_BALL_PARTY_SUMMARY, + B_INTERFACE_GFX_BALL_PARTY_SUMMARY_2, + B_INTERFACE_GFX_BALL_PARTY_SUMMARY_3, + B_INTERFACE_GFX_BALL_PARTY_SUMMARY_4, + B_INTERFACE_GFX_BALL_CAUGHT, + B_INTERFACE_GFX_STATUS_PSN_BATTLER1, // BATTLER1: B_POSITION_OPPONENT_LEFT + B_INTERFACE_GFX_STATUS_PSN_BATTLER1_2, + B_INTERFACE_GFX_STATUS_PSN_BATTLER1_3, + B_INTERFACE_GFX_STATUS_PAR_BATTLER1, + B_INTERFACE_GFX_STATUS_PAR_BATTLER1_2, + B_INTERFACE_GFX_STATUS_PAR_BATTLER1_3, + B_INTERFACE_GFX_STATUS_SLP_BATTLER1, + B_INTERFACE_GFX_STATUS_SLP_BATTLER1_2, + B_INTERFACE_GFX_STATUS_SLP_BATTLER1_3, + B_INTERFACE_GFX_STATUS_FRZ_BATTLER1, + B_INTERFACE_GFX_STATUS_FRZ_BATTLER1_2, + B_INTERFACE_GFX_STATUS_FRZ_BATTLER1_3, + B_INTERFACE_GFX_STATUS_BRN_BATTLER1, + B_INTERFACE_GFX_STATUS_BRN_BATTLER1_2, + B_INTERFACE_GFX_STATUS_BRN_BATTLER1_3, + B_INTERFACE_GFX_STATUS_FRB_BATTLER1, + B_INTERFACE_GFX_STATUS_FRB_BATTLER1_2, + B_INTERFACE_GFX_STATUS_FRB_BATTLER1_3, + B_INTERFACE_GFX_STATUS_PSN_BATTLER2, // BATTLER2: B_POSITION_PLAYER_RIGHT + B_INTERFACE_GFX_STATUS_PSN_BATTLER2_2, + B_INTERFACE_GFX_STATUS_PSN_BATTLER2_3, + B_INTERFACE_GFX_STATUS_PAR_BATTLER2, + B_INTERFACE_GFX_STATUS_PAR_BATTLER2_2, + B_INTERFACE_GFX_STATUS_PAR_BATTLER2_3, + B_INTERFACE_GFX_STATUS_SLP_BATTLER2, + B_INTERFACE_GFX_STATUS_SLP_BATTLER2_2, + B_INTERFACE_GFX_STATUS_SLP_BATTLER2_3, + B_INTERFACE_GFX_STATUS_FRZ_BATTLER2, + B_INTERFACE_GFX_STATUS_FRZ_BATTLER2_2, + B_INTERFACE_GFX_STATUS_FRZ_BATTLER2_3, + B_INTERFACE_GFX_STATUS_BRN_BATTLER2, + B_INTERFACE_GFX_STATUS_BRN_BATTLER2_2, + B_INTERFACE_GFX_STATUS_BRN_BATTLER2_3, + B_INTERFACE_GFX_STATUS_FRB_BATTLER2, + B_INTERFACE_GFX_STATUS_FRB_BATTLER2_2, + B_INTERFACE_GFX_STATUS_FRB_BATTLER2_3, + B_INTERFACE_GFX_STATUS_PSN_BATTLER3, // BATTLER3: B_POSITION_OPPONENT_RIGHT + B_INTERFACE_GFX_STATUS_PSN_BATTLER3_2, + B_INTERFACE_GFX_STATUS_PSN_BATTLER3_3, + B_INTERFACE_GFX_STATUS_PAR_BATTLER3, + B_INTERFACE_GFX_STATUS_PAR_BATTLER3_2, + B_INTERFACE_GFX_STATUS_PAR_BATTLER3_3, + B_INTERFACE_GFX_STATUS_SLP_BATTLER3, + B_INTERFACE_GFX_STATUS_SLP_BATTLER3_2, + B_INTERFACE_GFX_STATUS_SLP_BATTLER3_3, + B_INTERFACE_GFX_STATUS_FRZ_BATTLER3, + B_INTERFACE_GFX_STATUS_FRZ_BATTLER3_2, + B_INTERFACE_GFX_STATUS_FRZ_BATTLER3_3, + B_INTERFACE_GFX_STATUS_BRN_BATTLER3, + B_INTERFACE_GFX_STATUS_BRN_BATTLER3_2, + B_INTERFACE_GFX_STATUS_BRN_BATTLER3_3, + B_INTERFACE_GFX_STATUS_FRB_BATTLER3, + B_INTERFACE_GFX_STATUS_FRB_BATTLER3_2, + B_INTERFACE_GFX_STATUS_FRB_BATTLER3_3, + B_INTERFACE_GFX_BOTTOM_RIGHT_CORNER_HP_AS_TEXT, // healthbox in double battles + B_INTERFACE_GFX_BOTTOM_RIGHT_CORNER_HP_AS_BAR, // healthbox in double battles +}; static void SpriteCB_HealthBoxOther(struct Sprite *sprite); @@ -377,7 +472,7 @@ static const struct CompressedSpriteSheet sStatusSummaryBarSpriteSheet = static const struct SpritePalette sPartySummaryBarSpritePals = { - .data = gBattleInterface_Healthbox_Pal, + .data = gBattleInterface_Healthbox_Pal, .tag = TAG_PARTY_SUMMARY_BAR_PAL, }; @@ -389,7 +484,7 @@ static const struct SpritePalette sPartySummaryBallSpritePals = static const struct SpriteSheet sPartySummaryBallSpriteSheets = { - .data = gBattleInterface_Gfx + B_INTERFACE_GFX_BALL_PARTY_SUMMARY, + .data = &gHealthboxElementsGfxTable[B_INTERFACE_GFX_BALL_PARTY_SUMMARY], .size = 4 * TILE_SIZE_4BPP, .tag = TAG_PARTY_SUMMARY_BALL_TILE, }; @@ -578,7 +673,7 @@ u8 CreateSafariPlayerHealthboxSprites(void) static const u8 *GetBattleInterfaceGfxPtr(u8 elementId) { - return gBattleInterface_Gfx[elementId]; + return gHealthboxElementsGfxTable[elementId]; } // Syncs the position of healthbar accordingly with the healthbox. @@ -1191,7 +1286,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - if (partyInfo[i].hp == HP_EMPTY_SLOT) + if (partyInfo[i].hp == HP_EMPTY_SLOT) { gSprites[ballIconSpritesIds[i]].oam.tileNum += 1; gSprites[ballIconSpritesIds[i]].sIsEmptyBall = TRUE; @@ -1203,7 +1298,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, } else { - if (i >= nValidMons) + if (i >= nValidMons) { gSprites[ballIconSpritesIds[i]].oam.tileNum += 1; gSprites[ballIconSpritesIds[i]].sIsEmptyBall = TRUE; @@ -1650,6 +1745,11 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_FRZ_BATTLER0, battlerId)); statusPalId = PAL_STATUS_FRZ; } + else if (status & STATUS1_FROSTBITE) + { + statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_FRB_BATTLER0, battlerId)); + statusPalId = PAL_STATUS_FRZ; + } else if (status & STATUS1_PARALYSIS) { statusGfxPtr = GetBattleInterfaceGfxPtr(GetStatusIconForBattlerId(B_INTERFACE_GFX_STATUS_PAR_BATTLER0, battlerId)); @@ -1679,7 +1779,7 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) FillPalette(sStatusIconColors[statusPalId], pltAdder + OBJ_PLTT_OFFSET, PLTT_SIZEOF(1)); CpuCopy16(&gPlttBufferUnfaded[OBJ_PLTT_OFFSET + pltAdder], (u16 *)OBJ_PLTT + pltAdder, PLTT_SIZEOF(1)); CpuCopy32(statusGfxPtr, (void *)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder) * TILE_SIZE_4BPP), 3 * TILE_SIZE_4BPP); - if (GetBattlerCoordsIndex(battlerId) == TRUE || GetBattlerSide(battlerId) == B_SIDE_OPPONENT) + if (GetBattlerCoordsIndex(battlerId) == BATTLE_COORDS_DOUBLES || !IsOnPlayerSide(battlerId)) { if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) { @@ -1701,11 +1801,11 @@ static u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId) switch (statusElementId) { case B_INTERFACE_GFX_STATUS_PSN_BATTLER0: - if (battlerId == 0) + if (battlerId == B_BATTLER_0) ret = B_INTERFACE_GFX_STATUS_PSN_BATTLER0; - else if (battlerId == 1) + else if (battlerId == B_BATTLER_1) ret = B_INTERFACE_GFX_STATUS_PSN_BATTLER1; - else if (battlerId == 2) + else if (battlerId == B_BATTLER_2) ret = B_INTERFACE_GFX_STATUS_PSN_BATTLER2; else ret = B_INTERFACE_GFX_STATUS_PSN_BATTLER3; @@ -1740,6 +1840,16 @@ static u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId) else ret = B_INTERFACE_GFX_STATUS_FRZ_BATTLER3; break; + case B_INTERFACE_GFX_STATUS_FRB_BATTLER0: + if (battlerId == 0) + ret = B_INTERFACE_GFX_STATUS_FRB_BATTLER0; + else if (battlerId == 1) + ret = B_INTERFACE_GFX_STATUS_FRB_BATTLER1; + else if (battlerId == 2) + ret = B_INTERFACE_GFX_STATUS_FRB_BATTLER2; + else + ret = B_INTERFACE_GFX_STATUS_FRB_BATTLER3; + break; case B_INTERFACE_GFX_STATUS_BRN_BATTLER0: if (battlerId == 0) ret = B_INTERFACE_GFX_STATUS_BRN_BATTLER0; diff --git a/src/data/party_menu.h b/src/data/party_menu.h index fd5c4424f..50aeb6283 100644 --- a/src/data/party_menu.h +++ b/src/data/party_menu.h @@ -37,9 +37,9 @@ enum static const struct PartyMenuBoxInfoRects sPartyBoxInfoRects[] = { - [PARTY_BOX_LEFT_COLUMN] = + [PARTY_BOX_LEFT_COLUMN] = { - BlitBitmapToPartyWindow_LeftColumn, + BlitBitmapToPartyWindow_LeftColumn, { // The below are the x, y, width, and height for each of the following info 24, 11, 40, 13, // Nickname @@ -51,9 +51,9 @@ static const struct PartyMenuBoxInfoRects sPartyBoxInfoRects[] = }, 12, 34, 64, 16 // Description text (e.g. NO USE) }, - [PARTY_BOX_RIGHT_COLUMN] = + [PARTY_BOX_RIGHT_COLUMN] = { - BlitBitmapToPartyWindow_RightColumn, + BlitBitmapToPartyWindow_RightColumn, { // The below are the x, y, width, and height for each of the following info 22, 3, 40, 13, // Nickname @@ -62,14 +62,14 @@ static const struct PartyMenuBoxInfoRects sPartyBoxInfoRects[] = 102, 12, 24, 8, // HP 117, 12, 24, 8, // Max HP 88, 10, 48, 3 // HP bar - }, + }, 77, 4, 64, 16 // Description text }, }; static const u8 sPartyMenuSpriteCoords[PARTY_LAYOUT_COUNT][PARTY_SIZE][4 * 2] = { - [PARTY_LAYOUT_SINGLE] = + [PARTY_LAYOUT_SINGLE] = { // pokemon coords, held item coords, status coords, pokeball coords { 16, 40, 20, 50, 56, 52, 16, 34}, @@ -79,7 +79,7 @@ static const u8 sPartyMenuSpriteCoords[PARTY_LAYOUT_COUNT][PARTY_SIZE][4 * 2] = {104, 90, 108, 100, 144, 99, 102, 97}, {104, 114, 108, 124, 144, 123, 102, 121}, }, - [PARTY_LAYOUT_DOUBLE] = + [PARTY_LAYOUT_DOUBLE] = { { 16, 24, 20, 34, 56, 36, 16, 18}, { 16, 80, 20, 90, 56, 92, 16, 74}, @@ -88,7 +88,7 @@ static const u8 sPartyMenuSpriteCoords[PARTY_LAYOUT_COUNT][PARTY_SIZE][4 * 2] = {104, 82, 108, 92, 144, 91, 102, 89}, {104, 114, 108, 124, 144, 123, 102, 121}, }, - [PARTY_LAYOUT_MULTI] = + [PARTY_LAYOUT_MULTI] = { { 16, 24, 20, 34, 56, 36, 16, 18}, { 16, 80, 20, 90, 56, 92, 16, 74}, @@ -97,7 +97,7 @@ static const u8 sPartyMenuSpriteCoords[PARTY_LAYOUT_COUNT][PARTY_SIZE][4 * 2] = {104, 82, 106, 92, 144, 91, 102, 89}, {104, 106, 106, 116, 144, 115, 102, 113}, }, - [PARTY_LAYOUT_MULTI_SHOWCASE] = + [PARTY_LAYOUT_MULTI_SHOWCASE] = { { 16, 32, 20, 42, 56, 44, 16, 26}, {104, 34, 106, 44, 144, 43, 102, 41}, @@ -938,8 +938,7 @@ static const union AnimCmd sSpriteAnim_StatusFaint[] = ANIMCMD_END }; -static const union AnimCmd sSpriteAnim_Blank[] = -{ +static const union AnimCmd sSpriteAnim_StatusFrostbite[] = { ANIMCMD_FRAME(28, 0), ANIMCMD_END }; @@ -953,7 +952,7 @@ static const union AnimCmd *const sSpriteTemplate_StatusCondition[] = sSpriteAnim_StatusBurn, sSpriteAnim_StatusPokerus, sSpriteAnim_StatusFaint, - sSpriteAnim_Blank, + sSpriteAnim_StatusFrostbite, }; static const struct CompressedSpriteSheet sSpriteSheet_StatusIcons = @@ -977,14 +976,14 @@ const struct SpriteTemplate gSpriteTemplate_StatusIcons = .callback = SpriteCallbackDummy, }; -static const bool8 sMultiBattlePartnersPartyMask[PARTY_SIZE + 2] = +static const bool8 sMultiBattlePartnersPartyMask[PARTY_SIZE + 2] = { - FALSE, - TRUE, - FALSE, - FALSE, - TRUE, - TRUE, + FALSE, + TRUE, + FALSE, + FALSE, + TRUE, + TRUE, FALSE, }; diff --git a/src/graphics.c b/src/graphics.c index 965371394..b8f67ecbb 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -419,7 +419,19 @@ const u32 gUnusedTilemap_BasicFrame[] = INCBIN_U32("graphics/unused/basic_frame. const u16 gBattleInterface_Healthbox_Pal[] = INCBIN_U16("graphics/battle_interface/healthbox.gbapal"); const u16 gBattleInterface_Healthbar_Pal[] = INCBIN_U16("graphics/battle_interface/healthbar.gbapal"); -const u8 gBattleInterface_Gfx[] = INCBIN_U8("graphics/battle_interface/healthbox_elements.4bpp"); +const u8 gHealthboxElementsGfxTable[][32] = INCBIN_U8("graphics/battle_interface/hpbar.4bpp", + "graphics/battle_interface/expbar.4bpp", + "graphics/battle_interface/status.4bpp", + "graphics/battle_interface/misc.4bpp", + "graphics/battle_interface/hpbar_anim.4bpp", + "graphics/battle_interface/misc_frameend.4bpp", + "graphics/battle_interface/ball_display.4bpp", + "graphics/battle_interface/ball_caught_indicator.4bpp", + "graphics/battle_interface/status2.4bpp", // these three duplicate sets of graphics are for the opponent/partner Pokémon + "graphics/battle_interface/status3.4bpp", + "graphics/battle_interface/status4.4bpp", + "graphics/battle_interface/healthbox_doubles_frameend.4bpp", + "graphics/battle_interface/healthbox_doubles_frameend_bar.4bpp"); const u32 gBattleInterfaceGfx_UnusedWindow3[] = INCBIN_U32("graphics/battle_interface/unused_window3.4bpp.lz"); const u32 gBattleInterfaceGfx_UnusedWindow4[] = INCBIN_U32("graphics/battle_interface/unused_window4.4bpp.lz"); diff --git a/src/party_menu.c b/src/party_menu.c index ac11a0d6d..4d7d8ebac 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -1989,6 +1989,8 @@ u8 GetAilmentFromStatus(u32 status) return AILMENT_FRZ; if (status & STATUS1_BURN) return AILMENT_BRN; + if (status & STATUS1_FROSTBITE) + return AILMENT_FRB; return AILMENT_NONE; } diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index a2e23dd4b..64d588d80 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -370,13 +370,13 @@ static const struct OamData sMoveSelectionCursorOamData = .paletteNum = 0 }; -static const union AnimCmd sMoveSelectionCursorOamAnim_Red[] = +static const union AnimCmd sMoveSelectionCursorOamAnim_Red[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sMoveSelectionCursorOamAnim_Blue[] = +static const union AnimCmd sMoveSelectionCursorOamAnim_Blue[] = { ANIMCMD_FRAME(0x20, 20), ANIMCMD_JUMP(0), @@ -403,49 +403,49 @@ static const struct OamData sStatusAilmentIconOamData = { .paletteNum = 0 }; -static const union AnimCmd sStatusAilmentIconAnim_PSN[] = +static const union AnimCmd sStatusAilmentIconAnim_PSN[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sStatusAilmentIconAnim_PRZ[] = +static const union AnimCmd sStatusAilmentIconAnim_PRZ[] = { ANIMCMD_FRAME(4, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sStatusAilmentIconAnim_SLP[] = +static const union AnimCmd sStatusAilmentIconAnim_SLP[] = { ANIMCMD_FRAME(8, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sStatusAilmentIconAnim_FRZ[] = +static const union AnimCmd sStatusAilmentIconAnim_FRZ[] = { ANIMCMD_FRAME(12, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sStatusAilmentIconAnim_BRN[] = +static const union AnimCmd sStatusAilmentIconAnim_BRN[] = { ANIMCMD_FRAME(16, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sStatusAilmentIconAnim_PKRS[] = +static const union AnimCmd sStatusAilmentIconAnim_PKRS[] = { ANIMCMD_FRAME(20, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sStatusAilmentIconAnim_FNT[] = +static const union AnimCmd sStatusAilmentIconAnim_FNT[] = { ANIMCMD_FRAME(24, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sStatusAilmentIconAnim_Blank[] = +static const union AnimCmd sStatusAilmentIconAnim_Blank[] = { ANIMCMD_FRAME(28, 20), ANIMCMD_JUMP(0), @@ -478,73 +478,73 @@ static const struct OamData sHpOrExpBarOamData = { .paletteNum = 0 }; -static const union AnimCmd sHpOrExpAnim_0[] = +static const union AnimCmd sHpOrExpAnim_0[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sHpOrExpAnim_1[] = +static const union AnimCmd sHpOrExpAnim_1[] = { ANIMCMD_FRAME(1, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sHpOrExpAnim_2[] = +static const union AnimCmd sHpOrExpAnim_2[] = { ANIMCMD_FRAME(2, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sHpOrExpAnim_3[] = +static const union AnimCmd sHpOrExpAnim_3[] = { ANIMCMD_FRAME(3, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sHpOrExpAnim_4[] = +static const union AnimCmd sHpOrExpAnim_4[] = { ANIMCMD_FRAME(4, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sHpOrExpAnim_5[] = +static const union AnimCmd sHpOrExpAnim_5[] = { ANIMCMD_FRAME(5, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sHpOrExpAnim_6[] = +static const union AnimCmd sHpOrExpAnim_6[] = { ANIMCMD_FRAME(6, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sHpOrExpAnim_7[] = +static const union AnimCmd sHpOrExpAnim_7[] = { ANIMCMD_FRAME(7, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sHpOrExpAnim_8[] = +static const union AnimCmd sHpOrExpAnim_8[] = { ANIMCMD_FRAME(8, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sHpOrExpAnim_9[] = +static const union AnimCmd sHpOrExpAnim_9[] = { ANIMCMD_FRAME(9, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sHpOrExpAnim_10[] = +static const union AnimCmd sHpOrExpAnim_10[] = { ANIMCMD_FRAME(10, 20), ANIMCMD_JUMP(0), }; -static const union AnimCmd sHpOrExpAnim_11[] = +static const union AnimCmd sHpOrExpAnim_11[] = { ANIMCMD_FRAME(11, 20), ANIMCMD_JUMP(0), @@ -584,7 +584,7 @@ static const struct OamData sPokerusIconObjOamData = { .paletteNum = 0 }; -static const union AnimCmd sPokerusIconObjAnim0[] = +static const union AnimCmd sPokerusIconObjAnim0[] = { ANIMCMD_FRAME(0, 20), ANIMCMD_JUMP(0), @@ -614,7 +614,7 @@ static const struct OamData sStarObjOamData = .paletteNum = 0 }; -static const union AnimCmd sStarObjAnim0[] = +static const union AnimCmd sStarObjAnim0[] = { ANIMCMD_FRAME(1, 20), ANIMCMD_JUMP(0), @@ -633,14 +633,14 @@ static const u32 sBgTilemap_MovesPage[] = INCBIN_U32( "graphics/summary_screen/m static const u8 *const sEggHatchTimeTexts[] = { gText_PokeSum_EggHatch_LongTime, gText_PokeSum_EggHatch_SomeTime, - gText_PokeSum_EggHatch_Soon, + gText_PokeSum_EggHatch_Soon, gText_PokeSum_EggHatch_AlmostReady }; static const u8 *const sEggOriginTexts[] = { - gText_PokeSum_EggOrigin_DayCare, + gText_PokeSum_EggOrigin_DayCare, gText_PokeSum_EggOrigin_Trade, - gText_PokeSum_EggOrigin_TravelingMan, + gText_PokeSum_EggOrigin_TravelingMan, gText_PokeSum_EggOrigin_Trade, gText_PokeSum_EggOrigin_NicePlace, gText_PokeSum_EggOrigin_Spa, @@ -654,7 +654,7 @@ static const u8 sPrintMoveTextColors[][3] = { {0, 5, 6} }; -static const struct BgTemplate sBgTempaltes[] = +static const struct BgTemplate sBgTempaltes[] = { { .bg = 0, @@ -746,7 +746,7 @@ static const struct WindowTemplate sWindowTemplates_Permanent_Bg1[] = } }; -static const struct WindowTemplate sWindowTemplates_Permanent_Bg2[] = +static const struct WindowTemplate sWindowTemplates_Permanent_Bg2[] = { { .bg = 2, @@ -777,7 +777,7 @@ static const struct WindowTemplate sWindowTemplates_Permanent_Bg2[] = }, }; -static const struct WindowTemplate sWindowTemplates_Info[] = +static const struct WindowTemplate sWindowTemplates_Info[] = { [POKESUM_WIN_INFO_3 - 3] = { .bg = 0, @@ -817,7 +817,7 @@ static const struct WindowTemplate sWindowTemplates_Info[] = }, }; -static const struct WindowTemplate sWindowTemplates_Skills[] = +static const struct WindowTemplate sWindowTemplates_Skills[] = { [POKESUM_WIN_SKILLS_3 - 3] = { .bg = 0, @@ -857,7 +857,7 @@ static const struct WindowTemplate sWindowTemplates_Skills[] = }, }; -static const struct WindowTemplate sWindowTemplates_Moves[] = +static const struct WindowTemplate sWindowTemplates_Moves[] = { [POKESUM_WIN_MOVES_3 - 3] = { .bg = 0, @@ -897,7 +897,7 @@ static const struct WindowTemplate sWindowTemplates_Moves[] = }, }; -static const struct WindowTemplate sWindowTemplates_Dummy[] = +static const struct WindowTemplate sWindowTemplates_Dummy[] = { { .bg = 255, @@ -2405,7 +2405,7 @@ static const struct StatData sStatData[] = { .monDataHyperTrained = MON_DATA_HYPER_TRAINED_HP, .pssStat = PSS_STAT_HP, }, - [STAT_ATK] = + [STAT_ATK] = { .monDataStat = MON_DATA_ATK, .monDataStat2 = MON_DATA_ATK2, @@ -2414,7 +2414,7 @@ static const struct StatData sStatData[] = { .monDataHyperTrained = MON_DATA_HYPER_TRAINED_ATK, .pssStat = PSS_STAT_ATK, }, - [STAT_DEF] = + [STAT_DEF] = { .monDataStat = MON_DATA_DEF, .monDataStat2 = MON_DATA_DEF2, @@ -2423,7 +2423,7 @@ static const struct StatData sStatData[] = { .monDataHyperTrained = MON_DATA_HYPER_TRAINED_DEF, .pssStat = PSS_STAT_DEF, }, - [STAT_SPATK] = + [STAT_SPATK] = { .monDataStat = MON_DATA_SPATK, .monDataStat2 = MON_DATA_SPATK2, @@ -2432,7 +2432,7 @@ static const struct StatData sStatData[] = { .monDataHyperTrained = MON_DATA_HYPER_TRAINED_SPATK, .pssStat = PSS_STAT_SPA, }, - [STAT_SPDEF] = + [STAT_SPDEF] = { .monDataStat = MON_DATA_SPDEF, .monDataStat2 = MON_DATA_SPDEF2, @@ -2441,7 +2441,7 @@ static const struct StatData sStatData[] = { .monDataHyperTrained = MON_DATA_HYPER_TRAINED_SPDEF, .pssStat = PSS_STAT_SPD, }, - [STAT_SPEED] = + [STAT_SPEED] = { .monDataStat = MON_DATA_SPEED, .monDataStat2 = MON_DATA_SPEED2, @@ -2453,7 +2453,7 @@ static const struct StatData sStatData[] = { }; static void SetStatXPos(u8 stat, u16 xpos) -{ +{ switch (stat) { case STAT_HP: @@ -2529,7 +2529,7 @@ static void BufferEVString(u8 stat) u16 statValue = GetMonData(&sMonSummaryScreen->currentMon, sStatData[stat].monDataEv); u8 *dst = sMonSummaryScreen->summary.statValueStrBufs[sStatData[stat].pssStat]; u8 tmp[20]; - + ConvertIntToDecimalStringN(dst, statValue, STR_CONV_MODE_LEFT_ALIGN, 3); StringAppend(dst, gText_Slash); ConvertIntToDecimalStringN(tmp, MAX_PER_STAT_EVS, STR_CONV_MODE_LEFT_ALIGN, 3); @@ -3952,6 +3952,9 @@ static u8 StatusToAilment(u32 status) if ((status & STATUS1_BURN) != 0) return AILMENT_BRN; + if ((status & STATUS1_FROSTBITE) != 0) + return AILMENT_FRB; + if (CheckPartyPokerus(&sMonSummaryScreen->currentMon, 0)) return AILMENT_PKRS;