Fixes ate type being ignored after checking summary screen (#6888)

This commit is contained in:
Alex 2025-05-22 14:07:36 +02:00 committed by GitHub
parent 8ad1f329c9
commit 8ec998abff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 60 additions and 51 deletions

View File

@ -80,7 +80,7 @@ s32 GetWhichBattlerFaster(u32 battler1, u32 battler2, bool32 ignoreChosenMoves);
void RunBattleScriptCommands_PopCallbacksStack(void);
void RunBattleScriptCommands(void);
void SpecialStatusesClear(void);
u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost);
u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState monInBattle);
void SetTypeBeforeUsingMove(u32 move, u32 battlerAtk);
bool32 IsWildMonSmart(void);
u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer *trainer, bool32 firstTrainer, u32 battleTypeFlags);

View File

@ -622,4 +622,10 @@ enum SlideMsgStates
RESTORE_BATTLER_SLIDE_CONTROL,
};
enum MonState
{
MON_IN_BATTLE,
MON_OUTSIDE_BATTLE,
};
#endif // GUARD_CONSTANTS_BATTLE_H

View File

@ -6,6 +6,7 @@
#include "constants/regions.h"
#include "constants/region_map_sections.h"
#include "constants/map_groups.h"
#include "constants/battle.h"
#include "contest_effect.h"
#define GET_BASE_SPECIES_ID(speciesId) (GetFormSpeciesId(speciesId, 0))
@ -805,7 +806,7 @@ void HealPokemon(struct Pokemon *mon);
void HealBoxPokemon(struct BoxPokemon *boxMon);
void UpdateDaysPassedSinceFormChange(u16 days);
void TrySetDayLimitToFormChange(struct Pokemon *mon);
u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler);
u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state);
uq4_12_t GetDynamaxLevelHPMultiplier(u32 dynamaxLevel, bool32 inverseMultiplier);
u32 GetRegionalFormByRegion(u32 species, u32 region);
bool32 IsSpeciesForeignRegionalForm(u32 species, u32 currentRegion);

View File

@ -1714,7 +1714,6 @@ static void MoveSelectionDisplayMoveType(u32 battler)
}
else if (effect == EFFECT_IVY_CUDGEL)
{
if (speciesId == SPECIES_OGERPON_WELLSPRING || speciesId == SPECIES_OGERPON_WELLSPRING_TERA
|| speciesId == SPECIES_OGERPON_HEARTHFLAME || speciesId == SPECIES_OGERPON_HEARTHFLAME_TERA
|| speciesId == SPECIES_OGERPON_CORNERSTONE || speciesId == SPECIES_OGERPON_CORNERSTONE_TERA)
@ -1734,7 +1733,7 @@ static void MoveSelectionDisplayMoveType(u32 battler)
else if (P_SHOW_DYNAMIC_TYPES) // Non-vanilla changes to battle UI showing dynamic types
{
struct Pokemon *mon = &gPlayerParty[gBattlerPartyIndexes[battler]];
type = CheckDynamicMoveType(mon, move, battler);
type = CheckDynamicMoveType(mon, move, battler, MON_IN_BATTLE);
}
end = StringCopy(txtPtr, gTypesInfo[type].name);

View File

@ -5771,19 +5771,19 @@ void RunBattleScriptCommands(void)
gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]]();
}
bool32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility)
u32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility)
{
u32 ateType;
u32 ateType = TYPE_NONE;
switch (GetMoveEffect(move))
{
case EFFECT_TERA_BLAST:
if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA)
return FALSE;
return ateType;
break;
case EFFECT_TERA_STARSTORM:
if (gBattleMons[battlerAtk].species == SPECIES_TERAPAGOS_STELLAR)
return FALSE;
return ateType;
break;
case EFFECT_HIDDEN_POWER:
case EFFECT_WEATHER_BALL:
@ -5791,10 +5791,9 @@ bool32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility)
case EFFECT_CHANGE_TYPE_ON_ITEM:
case EFFECT_REVELATION_DANCE:
case EFFECT_TERRAIN_PULSE:
return FALSE;
return ateType;
}
ateType = TYPE_NONE;
switch (attackerAbility)
{
case ABILITY_PIXILATE:
@ -5814,28 +5813,21 @@ bool32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility)
break;
}
if (ateType != TYPE_NONE && GetActiveGimmick(battlerAtk) != GIMMICK_Z_MOVE)
{
gBattleStruct->dynamicMoveType = ateType | F_DYNAMIC_TYPE_SET;
return TRUE;
}
return FALSE;
return ateType;
}
// Returns TYPE_NONE if type doesn't change.
// NULL can be passed to ateBoost to avoid applying ate-ability boosts when opening the summary screen in-battle.
u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost)
u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state)
{
u32 moveType = GetMoveType(move);
u32 moveEffect = GetMoveEffect(move);
u32 species, heldItem, holdEffect, ability, type1, type2, type3;
bool32 monInBattle = gMain.inBattle && gPartyMenu.menuType != PARTY_MENU_TYPE_IN_BATTLE;
enum Gimmick gimmick = GetActiveGimmick(battler);
if (move == MOVE_STRUGGLE)
return TYPE_NORMAL;
if (monInBattle)
if (state == MON_IN_BATTLE)
{
species = gBattleMons[battler].species;
heldItem = gBattleMons[battler].item;
@ -5859,7 +5851,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost)
switch (moveEffect)
{
case EFFECT_WEATHER_BALL:
if (monInBattle)
if (state == MON_IN_BATTLE)
{
if (HasWeatherEffect())
{
@ -5900,7 +5892,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost)
case EFFECT_HIDDEN_POWER:
{
u32 typeBits = 0;
if (monInBattle)
if (state == MON_IN_BATTLE)
{
typeBits = ((gBattleMons[battler].hpIV & 1) << 0)
| ((gBattleMons[battler].attackIV & 1) << 1)
@ -5935,10 +5927,10 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost)
return ItemId_GetSecondaryId(heldItem);
break;
case EFFECT_REVELATION_DANCE:
if (GetActiveGimmick(battler) != GIMMICK_Z_MOVE)
if (gimmick != GIMMICK_Z_MOVE)
{
u32 teraType;
if (GetActiveGimmick(battler) == GIMMICK_TERA && ((teraType = GetMonData(mon, MON_DATA_TERA_TYPE)) != TYPE_STELLAR))
if (gimmick == GIMMICK_TERA && ((teraType = GetMonData(mon, MON_DATA_TERA_TYPE)) != TYPE_STELLAR))
return teraType;
else if (type1 != TYPE_MYSTERY && !(gDisableStructs[battler].roostActive && type1 == TYPE_FLYING))
return type1;
@ -5979,7 +5971,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost)
else
return moveType;
case EFFECT_TERRAIN_PULSE:
if (monInBattle)
if (state == MON_IN_BATTLE)
{
if (IsBattlerTerrainAffected(battler, STATUS_FIELD_TERRAIN_ANY))
{
@ -6013,7 +6005,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost)
}
break;
case EFFECT_TERA_BLAST:
if (GetActiveGimmick(battler) == GIMMICK_TERA)
if (gimmick == GIMMICK_TERA)
return GetMonData(mon, MON_DATA_TERA_TYPE);
break;
case EFFECT_TERA_STARSTORM:
@ -6031,20 +6023,23 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost)
return TYPE_DARK;
}
else if (moveType == TYPE_NORMAL
&& ((!gMain.inBattle || TrySetAteType(move, battler, ability))
&& GetActiveGimmick(battler) != GIMMICK_DYNAMAX))
&& ability != ABILITY_NORMALIZE
&& gimmick != GIMMICK_DYNAMAX
&& gimmick != GIMMICK_Z_MOVE)
{
if (gMain.inBattle && ateBoost != NULL)
*ateBoost = TRUE;
u32 ateType = TrySetAteType(move, battler, ability);
if (ateType != TYPE_NONE && state == MON_IN_BATTLE)
gBattleStruct->ateBoost[battler] = TRUE;
return ateType;
}
else if (moveType != TYPE_NORMAL
&& moveEffect != EFFECT_HIDDEN_POWER
&& moveEffect != EFFECT_WEATHER_BALL
&& ability == ABILITY_NORMALIZE
&& GetActiveGimmick(battler) != GIMMICK_Z_MOVE)
&& gimmick != GIMMICK_Z_MOVE)
{
if (gMain.inBattle && ateBoost != NULL && GetActiveGimmick(battler) != GIMMICK_DYNAMAX)
*ateBoost = TRUE;
if (state == MON_IN_BATTLE && gimmick != GIMMICK_DYNAMAX)
gBattleStruct->ateBoost[battler] = TRUE;
return TYPE_NORMAL;
}
@ -6064,7 +6059,8 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler)
moveType = GetDynamicMoveType(&GetBattlerParty(battler)[gBattlerPartyIndexes[battler]],
move,
battler,
&gBattleStruct->ateBoost[battler]);
MON_IN_BATTLE);
if (moveType != TYPE_NONE)
gBattleStruct->dynamicMoveType = moveType | F_DYNAMIC_TYPE_SET;

View File

@ -1170,7 +1170,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV,
isShiny = GET_SHINY_VALUE(value, personality) < SHINY_ODDS;
}
}
if (hasFixedPersonality)
personality = fixedPersonality;
@ -7005,9 +7005,9 @@ void UpdateDaysPassedSinceFormChange(u16 days)
}
}
u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler)
u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state)
{
u32 moveType = GetDynamicMoveType(mon, move, battler, NULL);
u32 moveType = GetDynamicMoveType(mon, move, battler, state);
if (moveType != TYPE_NONE)
return moveType;
return GetMoveType(move);

View File

@ -1720,7 +1720,7 @@ static void Task_HandleInput(u8 taskId)
PlaySE(SE_SELECT);
BeginCloseSummaryScreen(taskId);
}
else if (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES
else if (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES
|| sMonSummaryScreen->currPageIndex == PSS_PAGE_CONTEST_MOVES)
{
PlaySE(SE_SELECT);
@ -1773,7 +1773,7 @@ static u8 IncrementSkillsStatsMode(u8 mode)
sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_EVS;
return SUMMARY_SKILLS_MODE_EVS;
}
else
else
{
sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_IVS;
return SUMMARY_SKILLS_MODE_IVS;
@ -1956,7 +1956,7 @@ static void Task_ChangeSummaryMon(u8 taskId)
if (P_SUMMARY_SCREEN_RENAME && sMonSummaryScreen->currPageIndex == PSS_PAGE_INFO)
ShowUtilityPrompt(SUMMARY_MODE_NORMAL);
if (ShouldShowIvEvPrompt() && sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS)
{
{
sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_STATS;
ChangeStatLabel(SUMMARY_SKILLS_MODE_STATS);
}
@ -2108,7 +2108,7 @@ static void ChangePage(u8 taskId, s8 delta)
CreateTextPrinterTask(sMonSummaryScreen->currPageIndex);
HidePageSpecificSprites();
if (sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS
if (sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS
|| (sMonSummaryScreen->currPageIndex + delta) == PSS_PAGE_SKILLS)
{
struct Pokemon *mon = &sMonSummaryScreen->currentMon;
@ -2244,7 +2244,7 @@ static void SwitchToMoveSelection(u8 taskId)
{
if (ShouldShowMoveRelearner())
ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN);
ShowUtilityPrompt(SUMMARY_MODE_SELECT_MOVE);
}
else
@ -3774,10 +3774,10 @@ static void BufferStat(u8 *dst, u8 statIndex, u32 stat, u32 strId, u32 n)
else
txtPtr = StringCopy(dst, sTextNatureNeutral);
if (!P_SUMMARY_SCREEN_IV_EV_VALUES
if (!P_SUMMARY_SCREEN_IV_EV_VALUES
&& sMonSummaryScreen->skillsPageMode == SUMMARY_SKILLS_MODE_IVS)
StringAppend(dst, GetLetterGrade(stat));
else
else
ConvertIntToDecimalStringN(txtPtr, stat, STR_CONV_MODE_RIGHT_ALIGN, n);
DynamicPlaceholderTextUtil_SetPlaceholderPtr(strId, dst);
@ -3791,7 +3791,7 @@ static const u8 *GetLetterGrade(u32 stat)
static const u8 gText_GradeB[] = _("B");
static const u8 gText_GradeA[] = _("A");
static const u8 gText_GradeS[] = _("S");
if (stat > 0 && stat <= 15)
return gText_GradeD;
else if (stat > 15 && stat <= 25)
@ -3833,7 +3833,7 @@ static void BufferLeftColumnIvEvStats(void)
u8 *hpIvEvString = Alloc(20);
u8 *attackIvEvString = Alloc(20);
u8 *defenseIvEvString = Alloc(20);
DynamicPlaceholderTextUtil_Reset();
BufferStat(hpIvEvString, STAT_HP, sMonSummaryScreen->summary.currentHP, 0, 7);
@ -3850,7 +3850,7 @@ static void BufferLeftColumnIvEvStats(void)
static void PrintLeftColumnStats(void)
{
int x;
if (sMonSummaryScreen->skillsPageMode == SUMMARY_SKILLS_MODE_IVS && !P_SUMMARY_SCREEN_IV_EV_VALUES)
x = GetStringRightAlignXOffset(FONT_NORMAL, gStringVar4, 46);
else
@ -3873,7 +3873,7 @@ static void BufferRightColumnStats(void)
static void PrintRightColumnStats(void)
{
int x;
if (sMonSummaryScreen->skillsPageMode == SUMMARY_SKILLS_MODE_IVS && !P_SUMMARY_SCREEN_IV_EV_VALUES)
x = GetStringRightAlignXOffset(FONT_NORMAL, gStringVar4, 20);
else
@ -4306,7 +4306,11 @@ static void SetMoveTypeIcons(void)
{
type = GetMoveType(summary->moves[i]);
if (P_SHOW_DYNAMIC_TYPES)
type = CheckDynamicMoveType(mon, summary->moves[i], 0);
{
enum MonState state = gMain.inBattle ? MON_IN_BATTLE : MON_OUTSIDE_BATTLE;
type = CheckDynamicMoveType(mon, sMonSummaryScreen->newMove, 0, state); // Bug: in battle, this only shows the dynamic type of battler in position 0
}
SetTypeSpritePosAndPal(type, 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE);
}
else
@ -4335,7 +4339,10 @@ static void SetNewMoveTypeIcon(void)
struct Pokemon *mon = &sMonSummaryScreen->currentMon;
if (P_SHOW_DYNAMIC_TYPES)
type = CheckDynamicMoveType(mon, sMonSummaryScreen->newMove, 0);
{
enum MonState state = gMain.inBattle ? MON_IN_BATTLE : MON_OUTSIDE_BATTLE;
type = CheckDynamicMoveType(mon, sMonSummaryScreen->newMove, 0, state); // Bug: in battle, this only shows the dynamic type of battler in position 0
}
if (sMonSummaryScreen->newMove == MOVE_NONE)
{