diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 4883077a930..fcbd6fcbbd9 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -246,65 +246,62 @@ #define EVOLUTIONS_END 0xFFFF // Not an actual evolution, used to mark the end of an evolution array. +enum EvolutionConditions { + // Gen 2 + IF_GENDER, // The Pokémon is of specific gender. + IF_TIME, // It is currently the specific time of day. + IF_NOT_TIME, // It is NOT currently the specific time of day. + IF_MIN_FRIENDSHIP, // The Pokémon has the defined amount of Friendship. + IF_ATK_GT_DEF, // The Pokémon's Attack is greater than its Defense stat. + IF_ATK_EQ_DEF, // The Pokémon's Attack is equal to its Defense stat. + IF_ATK_LT_DEF, // The Pokémon's Attack is lower than its Defense stat. + IF_HOLD_ITEM, // The Pokémon is holding a specific item. + // Gen 3 + IF_PID_UPPER_MODULO_10_GT, // The Pokémon's upper personality value's modulo by 10 is greater than the defined value. + IF_PID_UPPER_MODULO_10_LE, // The Pokémon's upper personality value's modulo by 10 is lower or equal than the defined value. + IF_MIN_BEAUTY, // The Pokémon has the defined amount of Beauty. + // Gen 4 + IF_SPECIES_IN_PARTY, // The party contains a Pokémon of the specified species. + IF_IN_MAP, // The player is currently in the specific map. + IF_IN_MAPSEC, // The player is currently in the specific map sector. + IF_KNOWS_MOVE, // The Pokémon knows specific move. + // Gen 5 + IF_TRADE_PARTNER_SPECIES, // The Pokémon is traded for a specific species. + // Gen 6 + IF_TYPE_IN_PARTY, // The party contains a Pokémon of the specified type. + IF_WEATHER, // It is currently the specific weather in the current map. + IF_KNOWS_MOVE_TYPE, // The Pokémon knows a move with a specific type. + // Gen 8 + IF_NATURE, // The Pokémon has a specific nature. + IF_AMPED_NATURE, // The Pokémon has one of the following natures: Hardy, Brave, Adamant, Naughty, Docile, Impish, Lax, Hasty, Jolly, Naive, Rash, Sassy, or Quirky. + IF_LOW_KEY_NATURE, // The Pokémon has one of the following natures: Lonely, Bold, Relaxed, Timid, Serious, Modest, Mild, Quiet, Bashful, Calm, Gentle, or Careful. + IF_RECOIL_DAMAGE_GE, // The Pokémon suffered at least certain amount of non-fainting recoil damage. + IF_CURRENT_DAMAGE_GE, // The Pokémon has the specified difference of HP from its Max HP. + IF_CRITICAL_HITS_GE, // The Pokémon performed the specified number of critical hits in one battle at least. + IF_USED_MOVE_X_TIMES, // The Pokémon has used a move for at least X amount of times. + // Gen 9 + IF_DEFEAT_X_WITH_ITEMS, // The Pokémon defeated X amount of Pokémon of the specified species that are holding the specified item. + IF_PID_MODULO_100_GT, // The Pokémon's personality value's modulo by 100 is greater than the defined value. + IF_PID_MODULO_100_EQ, // The Pokémon's personality value's modulo by 100 is equal than the defined value. + IF_PID_MODULO_100_LT, // The Pokémon's personality value's modulo by 100 is lower than the defined value. + IF_MIN_OVERWORLD_STEPS, // The Player has taken a specific amount of steps in the overworld with the Pokémon following them or in the first slot of the party. + IF_BAG_ITEM_COUNT, // The Player has the specific amount of an item in the bag. It then removes those items. + CONDITIONS_END +}; + enum EvolutionMethods { - EVO_NONE, // Not an actual evolution, used to generate offspring that can't evolve into the specified species, like regional forms. - EVO_FRIENDSHIP, // Pokémon levels up with friendship ≥ 220 - EVO_FRIENDSHIP_DAY, // Pokémon levels up during the day with friendship ≥ 220 - EVO_FRIENDSHIP_NIGHT, // Pokémon levels up at night with friendship ≥ 220 - EVO_LEVEL, // Pokémon reaches the specified level - EVO_TRADE, // Pokémon is traded - EVO_TRADE_ITEM, // Pokémon is traded while it's holding the specified item - EVO_ITEM, // specified item is used on Pokémon - EVO_LEVEL_ATK_GT_DEF, // Pokémon reaches the specified level with attack > defense - EVO_LEVEL_ATK_EQ_DEF, // Pokémon reaches the specified level with attack = defense - EVO_LEVEL_ATK_LT_DEF, // Pokémon reaches the specified level with attack < defense - EVO_LEVEL_SILCOON, // Pokémon reaches the specified level with a Silcoon personality value - EVO_LEVEL_CASCOON, // Pokémon reaches the specified level with a Cascoon personality value - EVO_LEVEL_NINJASK, // Pokémon reaches the specified level (special value for Ninjask) - EVO_LEVEL_SHEDINJA, // Pokémon reaches the specified level (special value for Shedinja) - EVO_BEAUTY, // Pokémon levels up with beauty ≥ specified value - EVO_LEVEL_FEMALE, // Pokémon reaches the specified level, is female - EVO_LEVEL_MALE, // Pokémon reaches the specified level, is male - EVO_LEVEL_NIGHT, // Pokémon reaches the specified level, is night - EVO_LEVEL_DAY, // Pokémon reaches the specified level, is day - EVO_LEVEL_DUSK, // Pokémon reaches the specified level, is dusk (5-6 P.M) - EVO_ITEM_HOLD_DAY, // Pokémon levels up, holds specified item at day - EVO_ITEM_HOLD_NIGHT, // Pokémon levels up, holds specified item at night - EVO_MOVE, // Pokémon levels up, knows specified move - EVO_FRIENDSHIP_MOVE_TYPE, // Pokémon levels up with friendship ≥ 220, knows move with specified type - EVO_MAPSEC, // Pokémon levels up on specified mapsec - EVO_ITEM_MALE, // specified item is used on a male Pokémon - EVO_ITEM_FEMALE, // specified item is used on a female Pokémon - EVO_LEVEL_RAIN, // Pokémon reaches the specified level during rain in the overworld - EVO_SPECIFIC_MON_IN_PARTY, // Pokémon levels up with a specified Pokémon in party - EVO_LEVEL_DARK_TYPE_MON_IN_PARTY, // Pokémon reaches the specified level with a Dark Type Pokémon in party - EVO_TRADE_SPECIFIC_MON, // Pokémon is traded for a specified Pokémon - EVO_SPECIFIC_MAP, // Pokémon levels up on specified map - EVO_LEVEL_NATURE_AMPED, // Pokémon reaches the specified level, it has a Hardy, Brave, Adamant, Naughty, Docile, Impish, Lax, Hasty, Jolly, Naive, Rash, Sassy, or Quirky nature. - EVO_LEVEL_NATURE_LOW_KEY, // Pokémon reaches the specified level, it has a Lonely, Bold, Relaxed, Timid, Serious, Modest, Mild, Quiet, Bashful, Calm, Gentle, or Careful nature. - EVO_CRITICAL_HITS, // Pokémon performs specified number of critical hits in one battle - EVO_SCRIPT_TRIGGER_DMG, // Pokémon has specified HP below max, then player interacts trigger - EVO_DARK_SCROLL, // interacts with Scroll of Darkness - EVO_WATER_SCROLL, // interacts with Scroll of Waters - EVO_ITEM_NIGHT, // specified item is used on Pokémon, is night - EVO_ITEM_DAY, // specified item is used on Pokémon, is day - EVO_ITEM_HOLD, // Pokémon levels up, holds specified item - EVO_LEVEL_FOG, // Pokémon reaches the specified level during fog in the overworld - EVO_MOVE_TWO_SEGMENT, // Pokémon levels up, knows specified move, has a personality value with a modulus of 0 - EVO_MOVE_THREE_SEGMENT, // Pokémon levels up, knows specified move, has a personality value with a modulus of 1-99 - EVO_LEVEL_FAMILY_OF_THREE, // Pokémon reaches the specified level in battle with a personality value with a modulus of 0 - EVO_LEVEL_FAMILY_OF_FOUR, // Pokémon reaches the specified level in battle with a personality value with a modulus of 1-99 - EVO_USE_MOVE_TWENTY_TIMES, // Pokémon levels up after having used a move for at least 20 times - EVO_RECOIL_DAMAGE_MALE, // Pokémon levels up after having suffered specified amount of non-fainting recoil damage as a male - EVO_RECOIL_DAMAGE_FEMALE, // Pokémon levels up after having suffered specified amount of non-fainting recoil damage as a female - EVO_ITEM_COUNT_999, // Pokémon levels up after trainer has collected 999 of a specific item - EVO_DEFEAT_THREE_WITH_ITEM, // Pokémon levels up after having defeat 3 Pokémon of the same species holding the specified item - EVO_OVERWORLD_STEPS, // Pokémon levels up after having taken a specific amount of steps in the overworld + EVO_NONE, // Not an actual evolution, used to generate offspring that can't evolve into the specified species, like regional forms. + EVO_LEVEL, // Pokémon reaches the specified level + EVO_TRADE, // Pokémon is traded + EVO_ITEM, // specified item is used on Pokémon + EVO_SPLIT_FROM_EVO, // A clone is generated and evolved when another evolution happens + EVO_SCRIPT_TRIGGER, // Player interacts with an overworld trigger + EVO_LEVEL_BATTLE_ONLY, // Pokémon reaches the specified level, in battle only + EVO_BATTLE_END, // Battle ends, doesn't need to level up }; enum EvolutionMode { EVO_MODE_NORMAL, - EVO_MODE_CANT_STOP, EVO_MODE_TRADE, EVO_MODE_ITEM_USE, EVO_MODE_ITEM_CHECK, // If an Everstone is being held, still want to show that the stone *could* be used on that Pokémon to evolve diff --git a/include/pokemon.h b/include/pokemon.h index 2d19ba6ad23..f8717ab0c73 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -343,11 +343,20 @@ struct BattlePokemon /*0x5A*/ bool8 isShiny; }; +struct EvolutionParam +{ + u16 condition; + u16 arg1; + u16 arg2; + u16 arg3; +}; + struct Evolution { u16 method; u16 param; u16 targetSpecies; + const struct EvolutionParam *params; }; struct SpeciesInfo /*0xC4*/ @@ -722,7 +731,8 @@ u8 *UseStatIncreaseItem(u16 itemId); u8 GetNature(struct Pokemon *mon); u8 GetNatureFromPersonality(u32 personality); u32 GetGMaxTargetSpecies(u32 species); -u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner); +bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, struct Pokemon *tradePartner, u32 partyId, bool32 *canStopEvo); +u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner, bool32 *canStopEvo); bool8 IsMonPastEvolutionLevel(struct Pokemon *mon); u16 NationalPokedexNumToSpecies(u16 nationalNum); u16 NationalToHoennOrder(u16 nationalNum); diff --git a/src/battle_main.c b/src/battle_main.c index 0f778018552..59ef0ea8001 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5736,27 +5736,21 @@ static void TryEvolvePokemon(void) { if (!(sTriedEvolving & (1u << i))) { - u16 species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_BATTLE_SPECIAL, i, NULL); - bool32 evoModeNormal = TRUE; + bool32 canStopEvo = TRUE; + u32 species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_BATTLE_SPECIAL, i, NULL, &canStopEvo); sTriedEvolving |= 1u << i; if (species == SPECIES_NONE && (gLeveledUpInBattle & (1u << i))) { gLeveledUpInBattle &= ~(1u << i); - species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_BATTLE_ONLY, gLeveledUpInBattle, NULL); - } - - if (species == SPECIES_NONE) - { - species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_CANT_STOP, ITEM_NONE, NULL); - evoModeNormal = FALSE; + species = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_BATTLE_ONLY, gLeveledUpInBattle, NULL, &canStopEvo); } if (species != SPECIES_NONE) { FreeAllWindowBuffers(); gBattleMainFunc = WaitForEvoSceneToFinish; - EvolutionScene(&gPlayerParty[i], species, evoModeNormal, i); + EvolutionScene(&gPlayerParty[i], species, canStopEvo, i); return; } } diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index a184c9160f1..fd01a7d217c 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -1362,9 +1362,7 @@ static bool32 CheckBattlePyramidEvoRequirement(u16 species, const u16 *evoItems, for (j = 0; evolutions[j].method != EVOLUTIONS_END; j++) { if (evolutions[j].targetSpecies == species - && (evolutions[j].method == EVO_ITEM - || evolutions[j].method == EVO_ITEM_MALE - || evolutions[j].method == EVO_ITEM_FEMALE)) + && (evolutions[j].method == EVO_ITEM)) { if (nItems == 0) { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index bb4a63d2270..eedf13b5df5 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -336,7 +336,7 @@ static void RemoveAllTerrains(void); static bool8 CanAbilityPreventStatLoss(u16 abilityDef); static bool8 CanBurnHitThaw(u16 move); static u32 GetNextTarget(u32 moveTarget, bool32 excludeCurrent); -static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount, u16 usedMove); +static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove); static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u8 *failInstr, u16 move); static void Cmd_attackcanceler(void); @@ -2014,7 +2014,7 @@ static void Cmd_critcalc(void) } } - // Counter for EVO_CRITICAL_HITS. + // Counter for IF_CRITICAL_HITS_GE evolution condition. if (gSpecialStatuses[battlerDef].criticalHit && GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER && !(gBattleTypeFlags & BATTLE_TYPE_MULTI && GetBattlerPosition(gBattlerAttacker) == B_POSITION_PLAYER_LEFT)) gPartyCriticalHits[partySlot]++; @@ -6951,7 +6951,7 @@ static void Cmd_moveend(void) case MOVEEND_SET_EVOLUTION_TRACKER: // If the Pokémon needs to keep track of move usage for its evolutions, do it if (originallyUsedMove != MOVE_NONE) - TryUpdateEvolutionTracker(EVO_USE_MOVE_TWENTY_TIMES, 1, originallyUsedMove); + TryUpdateEvolutionTracker(IF_USED_MOVE_X_TIMES, 1, originallyUsedMove); gBattleScripting.moveendState++; break; case MOVEEND_CLEAR_BITS: // Clear/Set bits for things like using a move for all targets and all hits. @@ -17393,9 +17393,9 @@ void BS_RunStatChangeItems(void) ItemBattleEffects(ITEMEFFECT_STATS_CHANGED, GetBattlerForBattleScript(cmd->battler), FALSE); } -static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount, u16 usedMove) +static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 usedMove) { - u32 i; + u32 i, j; if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER && !(gBattleTypeFlags & (BATTLE_TYPE_LINK @@ -17412,31 +17412,35 @@ static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount, u16 use { if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) continue; + if (evolutions[i].params == NULL) + continue; - if (evolutions[i].method == evolutionMethod) + for (j = 0; evolutions[i].params[j].condition != CONDITIONS_END; j++) { - // We only have 10 bits to use - u16 val = min(1023, GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER) + upAmount); - // Reset progress if you faint for the recoil method. - switch (evolutionMethod) + if (evolutions[i].params[j].condition == evolutionCondition) { - case EVO_USE_MOVE_TWENTY_TIMES: - if (evolutions[i].param == usedMove) - SetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER, &val); - break; - case EVO_RECOIL_DAMAGE_MALE: - case EVO_RECOIL_DAMAGE_FEMALE: - if (gBattleMons[gBattlerAttacker].hp == 0) - val = 0; - SetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER, &val); - break; - case EVO_DEFEAT_THREE_WITH_ITEM: - if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES) == GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_SPECIES) - && GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_HELD_ITEM) == evolutions[i].param) + // We only have 10 bits to use + u16 val = min(1023, GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER) + upAmount); + // Reset progress if you faint for the recoil method. + switch (evolutionCondition) + { + case IF_USED_MOVE_X_TIMES: + if (evolutions[i].params[j].arg1 == usedMove) + SetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER, &val); + break; + case IF_RECOIL_DAMAGE_GE: + if (gBattleMons[gBattlerAttacker].hp == 0) + val = 0; SetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER, &val); - break; + break; + case IF_DEFEAT_X_WITH_ITEMS: + if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_SPECIES) == evolutions[i].params[j].arg1 + && GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_HELD_ITEM) == evolutions[i].params[j].arg2) + SetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER, &val); + break; + } + return; } - return; } } } @@ -17445,25 +17449,14 @@ static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount, u16 use void BS_TryUpdateRecoilTracker(void) { NATIVE_ARGS(); - u8 gender = GetMonGender(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]]); - - switch(gender) - { - case MON_MALE: - TryUpdateEvolutionTracker(EVO_RECOIL_DAMAGE_MALE, gBattleStruct->moveDamage[gBattlerAttacker], MOVE_NONE); - break; - case MON_FEMALE: - TryUpdateEvolutionTracker(EVO_RECOIL_DAMAGE_FEMALE, gBattleStruct->moveDamage[gBattlerAttacker], MOVE_NONE); - break; - } - + TryUpdateEvolutionTracker(IF_RECOIL_DAMAGE_GE, gBattleStruct->moveDamage[gBattlerAttacker], MOVE_NONE); gBattlescriptCurrInstr = cmd->nextInstr; } void BS_TryUpdateLeadersCrestTracker(void) { NATIVE_ARGS(); - TryUpdateEvolutionTracker(EVO_DEFEAT_THREE_WITH_ITEM, 1, MOVE_NONE); + TryUpdateEvolutionTracker(IF_DEFEAT_X_WITH_ITEMS, 1, MOVE_NONE); gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index 9c2fc2450a0..08188fe794b 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -5,6 +5,7 @@ // Macros for ease of use. #define EVOLUTION(...) (const struct Evolution[]) { __VA_ARGS__, { EVOLUTIONS_END }, } +#define CONDITIONS(...) ((const struct EvolutionParam[]) { __VA_ARGS__, {CONDITIONS_END} }) #define ANIM_FRAMES(...) (const union AnimCmd *const[]) { sAnim_GeneralFrame0, (const union AnimCmd[]) { __VA_ARGS__ ANIMCMD_END, }, } diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index f419eaff6c1..d1de884aac1 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -2191,7 +2191,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sRattataAlolaTeachableLearnset, .eggMoveLearnset = sRattataAlolaEggMoveLearnset, .formSpeciesIdTable = sRattataFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL_NIGHT, 20, SPECIES_RATICATE_ALOLA}, + .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_RATICATE_ALOLA, CONDITIONS({IF_TIME, TIME_NIGHT})}, {EVO_NONE, 0, SPECIES_RATICATE_ALOLA_TOTEM}), }, @@ -2680,7 +2680,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sPichuTeachableLearnset, .eggMoveLearnset = sPichuEggMoveLearnset, .formSpeciesIdTable = sPichuFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_PIKACHU}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_PIKACHU, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, [SPECIES_PICHU_SPIKY_EARED] = @@ -4709,7 +4709,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sCleffaLevelUpLearnset, .teachableLearnset = sCleffaTeachableLearnset, .eggMoveLearnset = sCleffaEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_CLEFAIRY}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_CLEFAIRY, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, #endif //P_GEN_2_CROSS_EVOS @@ -5227,7 +5227,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sIgglybuffLevelUpLearnset, .teachableLearnset = sIgglybuffTeachableLearnset, .eggMoveLearnset = sIgglybuffEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_JIGGLYPUFF}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_JIGGLYPUFF, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, #endif //P_GEN_2_CROSS_EVOS @@ -5576,7 +5576,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sGolbatLevelUpLearnset, .teachableLearnset = sGolbatTeachableLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_CROBAT}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_CROBAT, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, #if P_GEN_2_CROSS_EVOS @@ -6853,7 +6853,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sMeowthAlolaTeachableLearnset, .eggMoveLearnset = sMeowthAlolaEggMoveLearnset, .formSpeciesIdTable = sMeowthFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_PERSIAN_ALOLA}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_PERSIAN_ALOLA, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, [SPECIES_PERSIAN_ALOLA] = @@ -7401,7 +7401,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sPrimeapeLevelUpLearnset, .teachableLearnset = sPrimeapeTeachableLearnset, - .evolutions = EVOLUTION({EVO_USE_MOVE_TWENTY_TIMES, MOVE_RAGE_FIST, SPECIES_ANNIHILAPE}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_ANNIHILAPE, CONDITIONS({IF_USED_MOVE_X_TIMES, MOVE_RAGE_FIST, 20})}), }, #if P_GEN_9_CROSS_EVOS @@ -7882,7 +7882,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sPoliwhirlLevelUpLearnset, .teachableLearnset = sPoliwhirlTeachableLearnset, .evolutions = EVOLUTION({EVO_ITEM, ITEM_WATER_STONE, SPECIES_POLIWRATH}, - {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED}, + {EVO_TRADE, 0, SPECIES_POLITOED, CONDITIONS({IF_HOLD_ITEM, ITEM_KINGS_ROCK})}, {EVO_ITEM, ITEM_KINGS_ROCK, SPECIES_POLITOED}), }, @@ -9812,7 +9812,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .eggMoveLearnset = sSlowpokeEggMoveLearnset, .formSpeciesIdTable = sSlowpokeFormSpeciesIdTable, .evolutions = EVOLUTION({EVO_LEVEL, 37, SPECIES_SLOWBRO}, - {EVO_TRADE_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING}, + {EVO_TRADE, 0, SPECIES_SLOWKING, CONDITIONS({IF_HOLD_ITEM, ITEM_KINGS_ROCK})}, {EVO_ITEM, ITEM_KINGS_ROCK, SPECIES_SLOWKING}), }, @@ -10356,7 +10356,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sMagnetonLevelUpLearnset, .teachableLearnset = sMagnetonTeachableLearnset, - .evolutions = EVOLUTION({EVO_MAPSEC, MAPSEC_NEW_MAUVILLE, SPECIES_MAGNEZONE}, + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MAGNEZONE, CONDITIONS({IF_IN_MAPSEC, MAPSEC_NEW_MAUVILLE})}, {EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_MAGNEZONE}), }, @@ -10593,7 +10593,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .teachableLearnset = sFarfetchdGalarTeachableLearnset, .eggMoveLearnset = sFarfetchdGalarEggMoveLearnset, .formSpeciesIdTable = sFarfetchdFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_CRITICAL_HITS, 3, SPECIES_SIRFETCHD}), + .evolutions = EVOLUTION({EVO_BATTLE_END, 0, SPECIES_SIRFETCHD, CONDITIONS({IF_CRITICAL_HITS_GE, 3})}), }, [SPECIES_SIRFETCHD] = @@ -11823,7 +11823,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sOnixLevelUpLearnset, .teachableLearnset = sOnixTeachableLearnset, .eggMoveLearnset = sOnixEggMoveLearnset, - .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_STEELIX}, + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_STEELIX, CONDITIONS({IF_HOLD_ITEM, ITEM_METAL_COAT})}, {EVO_ITEM, ITEM_METAL_COAT, SPECIES_STEELIX}), }, @@ -13186,9 +13186,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sTyrogueLevelUpLearnset, .teachableLearnset = sTyrogueTeachableLearnset, .eggMoveLearnset = sTyrogueEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_ATK_LT_DEF, 20, SPECIES_HITMONCHAN}, - {EVO_LEVEL_ATK_GT_DEF, 20, SPECIES_HITMONLEE}, - {EVO_LEVEL_ATK_EQ_DEF, 20, SPECIES_HITMONTOP}), + .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_HITMONCHAN, CONDITIONS({IF_ATK_LT_DEF})}, + {EVO_LEVEL, 20, SPECIES_HITMONLEE, CONDITIONS({IF_ATK_GT_DEF})}, + {EVO_LEVEL, 20, SPECIES_HITMONTOP, CONDITIONS({IF_ATK_EQ_DEF})}), }, #endif //P_GEN_2_CROSS_EVOS @@ -13481,7 +13481,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sLickitungLevelUpLearnset, .teachableLearnset = sLickitungTeachableLearnset, .eggMoveLearnset = sLickitungEggMoveLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_ROLLOUT, SPECIES_LICKILICKY}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_LICKILICKY, CONDITIONS({IF_KNOWS_MOVE, MOVE_ROLLOUT})}), }, #if P_GEN_4_CROSS_EVOS @@ -13944,7 +13944,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sRhydonLevelUpLearnset, .teachableLearnset = sRhydonTeachableLearnset, - .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_PROTECTOR, SPECIES_RHYPERIOR}, + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_RHYPERIOR, CONDITIONS({IF_HOLD_ITEM, ITEM_PROTECTOR})}, {EVO_ITEM, ITEM_PROTECTOR, SPECIES_RHYPERIOR}), }, @@ -14106,8 +14106,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sHappinyLevelUpLearnset, .teachableLearnset = sHappinyTeachableLearnset, .eggMoveLearnset = sHappinyEggMoveLearnset, - .evolutions = EVOLUTION({EVO_ITEM_HOLD_DAY, ITEM_OVAL_STONE, SPECIES_CHANSEY}, - {EVO_ITEM_DAY, ITEM_OVAL_STONE, SPECIES_CHANSEY}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_CHANSEY, CONDITIONS({IF_NOT_TIME, TIME_NIGHT},{IF_HOLD_ITEM, ITEM_OVAL_STONE})}, + {EVO_ITEM, ITEM_OVAL_STONE, SPECIES_CHANSEY, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}), }, #endif //P_GEN_4_CROSS_EVOS @@ -14177,7 +14177,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sChanseyLevelUpLearnset, .teachableLearnset = sChanseyTeachableLearnset, .eggMoveLearnset = sChanseyEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_BLISSEY}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_BLISSEY, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, #if P_GEN_2_CROSS_EVOS @@ -14320,7 +14320,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sTangelaLevelUpLearnset, .teachableLearnset = sTangelaTeachableLearnset, .eggMoveLearnset = sTangelaEggMoveLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_ANCIENT_POWER, SPECIES_TANGROWTH}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_TANGROWTH, CONDITIONS({IF_KNOWS_MOVE, MOVE_ANCIENT_POWER})}), }, #if P_GEN_4_CROSS_EVOS @@ -14686,7 +14686,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sSeadraLevelUpLearnset, .teachableLearnset = sSeadraTeachableLearnset, - .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_DRAGON_SCALE, SPECIES_KINGDRA}, + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_KINGDRA, CONDITIONS({IF_HOLD_ITEM, ITEM_DRAGON_SCALE})}, {EVO_ITEM, ITEM_DRAGON_SCALE, SPECIES_KINGDRA}), }, @@ -15168,7 +15168,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sMimeJrLevelUpLearnset, .teachableLearnset = sMimeJrTeachableLearnset, .eggMoveLearnset = sMimeJrEggMoveLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_MIMIC, SPECIES_MR_MIME}, + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MR_MIME, CONDITIONS({IF_KNOWS_MOVE, MOVE_MIMIC})}, {EVO_NONE, 0, SPECIES_MR_MIME_GALAR}), }, #endif //P_GEN_4_CROSS_EVOS @@ -15465,7 +15465,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sScytherLevelUpLearnset, .teachableLearnset = sScytherTeachableLearnset, .eggMoveLearnset = sScytherEggMoveLearnset, - .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR}, + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_SCIZOR, CONDITIONS({IF_HOLD_ITEM, ITEM_METAL_COAT})}, {EVO_ITEM, ITEM_BLACK_AUGURITE, SPECIES_KLEAVOR}, {EVO_ITEM, ITEM_METAL_COAT, SPECIES_SCIZOR}), }, @@ -15967,7 +15967,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sElectabuzzLevelUpLearnset, .teachableLearnset = sElectabuzzTeachableLearnset, - .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_ELECTIRIZER, SPECIES_ELECTIVIRE}, + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_ELECTIVIRE, CONDITIONS({IF_HOLD_ITEM, ITEM_ELECTIRIZER})}, {EVO_ITEM, ITEM_ELECTIRIZER, SPECIES_ELECTIVIRE}), }, @@ -16185,7 +16185,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sMagmarLevelUpLearnset, .teachableLearnset = sMagmarTeachableLearnset, - .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_MAGMARIZER, SPECIES_MAGMORTAR}, + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_MAGMORTAR, CONDITIONS({IF_HOLD_ITEM, ITEM_MAGMARIZER})}, {EVO_ITEM, ITEM_MAGMARIZER, SPECIES_MAGMORTAR}), }, @@ -17192,13 +17192,13 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .evolutions = EVOLUTION({EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_JOLTEON}, {EVO_ITEM, ITEM_WATER_STONE, SPECIES_VAPOREON}, {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON}, - {EVO_FRIENDSHIP_DAY, 0, SPECIES_ESPEON}, - {EVO_FRIENDSHIP_NIGHT, 0, SPECIES_UMBREON}, - {EVO_SPECIFIC_MAP, MAP_PETALBURG_WOODS, SPECIES_LEAFEON}, + {EVO_LEVEL, 0, SPECIES_SYLVEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_KNOWS_MOVE_TYPE, TYPE_FAIRY})}, + {EVO_LEVEL, 0, SPECIES_ESPEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_NOT_TIME, TIME_NIGHT})}, + {EVO_LEVEL, 0, SPECIES_UMBREON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD}, {IF_TIME, TIME_NIGHT})}, + {EVO_LEVEL, 0, SPECIES_LEAFEON, CONDITIONS({IF_IN_MAP, MAP_PETALBURG_WOODS})}, {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_LEAFEON}, - {EVO_SPECIFIC_MAP, MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM, SPECIES_GLACEON}, - {EVO_ITEM, ITEM_ICE_STONE, SPECIES_GLACEON}, - {EVO_FRIENDSHIP_MOVE_TYPE, TYPE_FAIRY, SPECIES_SYLVEON}), + {EVO_LEVEL, 0, SPECIES_GLACEON, CONDITIONS({IF_IN_MAP, MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM})}, + {EVO_ITEM, ITEM_ICE_STONE, SPECIES_GLACEON}), }, #if P_GIGANTAMAX_FORMS @@ -17937,7 +17937,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sPorygonLevelUpLearnset, .teachableLearnset = sPorygonTeachableLearnset, - .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_UPGRADE, SPECIES_PORYGON2}, + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_PORYGON2, CONDITIONS({IF_HOLD_ITEM, ITEM_UPGRADE})}, {EVO_ITEM, ITEM_UPGRADE, SPECIES_PORYGON2}), }, @@ -18013,7 +18013,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sPorygon2LevelUpLearnset, .teachableLearnset = sPorygon2TeachableLearnset, - .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_DUBIOUS_DISC, SPECIES_PORYGON_Z}, + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_PORYGON_Z, CONDITIONS({IF_HOLD_ITEM, ITEM_DUBIOUS_DISC})}, {EVO_ITEM, ITEM_DUBIOUS_DISC, SPECIES_PORYGON_Z}), }, @@ -18598,7 +18598,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sMunchlaxLevelUpLearnset, .teachableLearnset = sMunchlaxTeachableLearnset, .eggMoveLearnset = sMunchlaxEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_SNORLAX}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_SNORLAX, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, #endif //P_GEN_4_CROSS_EVOS diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index 4e8804dacf6..d3b31faa761 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -1530,7 +1530,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sTogepiLevelUpLearnset, .teachableLearnset = sTogepiTeachableLearnset, .eggMoveLearnset = sTogepiEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_TOGETIC}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_TOGETIC, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, [SPECIES_TOGETIC] = @@ -2192,7 +2192,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sAzurillLevelUpLearnset, .teachableLearnset = sAzurillTeachableLearnset, .eggMoveLearnset = sAzurillEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_MARILL}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MARILL, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, #endif //P_GEN_3_CROSS_EVOS @@ -2418,7 +2418,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sBonslyLevelUpLearnset, .teachableLearnset = sBonslyTeachableLearnset, .eggMoveLearnset = sBonslyEggMoveLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_MIMIC, SPECIES_SUDOWOODO}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_SUDOWOODO, CONDITIONS({IF_KNOWS_MOVE, MOVE_MIMIC})}), }, #endif //P_GEN_4_CROSS_EVOS @@ -2819,7 +2819,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sAipomLevelUpLearnset, .teachableLearnset = sAipomTeachableLearnset, .eggMoveLearnset = sAipomEggMoveLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_DOUBLE_HIT, SPECIES_AMBIPOM}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_AMBIPOM, CONDITIONS({IF_KNOWS_MOVE, MOVE_DOUBLE_HIT})}), }, #if P_GEN_4_CROSS_EVOS @@ -3138,7 +3138,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sYanmaLevelUpLearnset, .teachableLearnset = sYanmaTeachableLearnset, .eggMoveLearnset = sYanmaEggMoveLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_ANCIENT_POWER, SPECIES_YANMEGA}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_YANMEGA, CONDITIONS({IF_KNOWS_MOVE, MOVE_ANCIENT_POWER})}), }, #if P_GEN_4_CROSS_EVOS @@ -4173,7 +4173,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sGirafarigLevelUpLearnset, .teachableLearnset = sGirafarigTeachableLearnset, .eggMoveLearnset = sGirafarigEggMoveLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_TWIN_BEAM, SPECIES_FARIGIRAF}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_FARIGIRAF, CONDITIONS({IF_KNOWS_MOVE, MOVE_TWIN_BEAM})}), }, #if P_GEN_9_CROSS_EVOS @@ -4457,8 +4457,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sDunsparceLevelUpLearnset, .teachableLearnset = sDunsparceTeachableLearnset, .eggMoveLearnset = sDunsparceEggMoveLearnset, - .evolutions = EVOLUTION({EVO_MOVE_TWO_SEGMENT, MOVE_HYPER_DRILL, SPECIES_DUDUNSPARCE_TWO_SEGMENT}, - {EVO_MOVE_THREE_SEGMENT, MOVE_HYPER_DRILL, SPECIES_DUDUNSPARCE_THREE_SEGMENT}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_DUDUNSPARCE_TWO_SEGMENT, CONDITIONS({IF_KNOWS_MOVE, MOVE_HYPER_DRILL}, {IF_PID_MODULO_100_GT, 0})}, + {EVO_LEVEL, 0, SPECIES_DUDUNSPARCE_THREE_SEGMENT, CONDITIONS({IF_KNOWS_MOVE, MOVE_HYPER_DRILL}, {IF_PID_MODULO_100_EQ, 0})}), }, #if P_GEN_9_CROSS_EVOS @@ -4669,8 +4669,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sGligarLevelUpLearnset, .teachableLearnset = sGligarTeachableLearnset, .eggMoveLearnset = sGligarEggMoveLearnset, - .evolutions = EVOLUTION({EVO_ITEM_HOLD_NIGHT, ITEM_RAZOR_FANG, SPECIES_GLISCOR}, - {EVO_ITEM_NIGHT, ITEM_RAZOR_FANG, SPECIES_GLISCOR}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_GLISCOR, CONDITIONS({IF_TIME, TIME_NIGHT},{IF_HOLD_ITEM, ITEM_RAZOR_FANG})}, + {EVO_ITEM, ITEM_RAZOR_FANG, SPECIES_GLISCOR, CONDITIONS({IF_TIME, TIME_NIGHT})}), }, #if P_GEN_4_CROSS_EVOS @@ -5039,7 +5039,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sQwilfishHisuiLevelUpLearnset, .teachableLearnset = sQwilfishHisuiTeachableLearnset, .formSpeciesIdTable = sQwilfishFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_BARB_BARRAGE, SPECIES_OVERQWIL}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_OVERQWIL, CONDITIONS({IF_KNOWS_MOVE, MOVE_BARB_BARRAGE})}), }, [SPECIES_OVERQWIL] = @@ -5412,8 +5412,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .teachableLearnset = sSneaselTeachableLearnset, .eggMoveLearnset = sSneaselEggMoveLearnset, .formSpeciesIdTable = sSneaselFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_ITEM_HOLD_NIGHT, ITEM_RAZOR_CLAW, SPECIES_WEAVILE}, - {EVO_ITEM_NIGHT, ITEM_RAZOR_CLAW, SPECIES_WEAVILE}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_WEAVILE, CONDITIONS({IF_TIME, TIME_NIGHT},{IF_HOLD_ITEM, ITEM_RAZOR_CLAW})}, + {EVO_ITEM, ITEM_RAZOR_CLAW, SPECIES_WEAVILE, CONDITIONS({IF_TIME, TIME_NIGHT})}), }, #if P_GEN_4_CROSS_EVOS @@ -5576,8 +5576,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sSneaselHisuiLevelUpLearnset, .teachableLearnset = sSneaselHisuiTeachableLearnset, .formSpeciesIdTable = sSneaselFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_ITEM_HOLD_DAY, ITEM_RAZOR_CLAW, SPECIES_SNEASLER}, - {EVO_ITEM_DAY, ITEM_RAZOR_CLAW, SPECIES_SNEASLER}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_SNEASLER, CONDITIONS({IF_NOT_TIME, TIME_NIGHT},{IF_HOLD_ITEM, ITEM_RAZOR_CLAW})}, + {EVO_ITEM, ITEM_RAZOR_CLAW, SPECIES_SNEASLER, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}), }, [SPECIES_SNEASLER] = @@ -5798,7 +5798,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = ) .levelUpLearnset = sUrsaringLevelUpLearnset, .teachableLearnset = sUrsaringTeachableLearnset, - .evolutions = EVOLUTION({EVO_ITEM_NIGHT, ITEM_PEAT_BLOCK, SPECIES_URSALUNA}, + .evolutions = EVOLUTION({EVO_ITEM, ITEM_PEAT_BLOCK, SPECIES_URSALUNA, CONDITIONS({IF_TIME, TIME_NIGHT})}, {EVO_NONE, 0, SPECIES_URSALUNA_BLOODMOON}), }, @@ -6225,7 +6225,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = ) .levelUpLearnset = sPiloswineLevelUpLearnset, .teachableLearnset = sPiloswineTeachableLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_ANCIENT_POWER, SPECIES_MAMOSWINE}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MAMOSWINE, CONDITIONS({IF_KNOWS_MOVE, MOVE_ANCIENT_POWER})}), }, #if P_GEN_4_CROSS_EVOS @@ -6824,7 +6824,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sMantykeLevelUpLearnset, .teachableLearnset = sMantykeTeachableLearnset, .eggMoveLearnset = sMantykeEggMoveLearnset, - .evolutions = EVOLUTION({EVO_SPECIFIC_MON_IN_PARTY, SPECIES_REMORAID, SPECIES_MANTINE}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MANTINE, CONDITIONS({IF_SPECIES_IN_PARTY, SPECIES_REMORAID})}), }, #endif //P_GEN_4_CROSS_EVOS @@ -7402,7 +7402,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sStantlerLevelUpLearnset, .teachableLearnset = sStantlerTeachableLearnset, .eggMoveLearnset = sStantlerEggMoveLearnset, - .evolutions = EVOLUTION({EVO_USE_MOVE_TWENTY_TIMES, MOVE_PSYSHIELD_BASH, SPECIES_WYRDEER}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_WYRDEER, CONDITIONS({IF_USED_MOVE_X_TIMES, MOVE_PSYSHIELD_BASH, 20})}), }, #if P_GEN_8_CROSS_EVOS diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index 76125eb10a5..6aa899cc40c 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -1310,7 +1310,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sLinooneGalarLevelUpLearnset, .teachableLearnset = sLinooneGalarTeachableLearnset, .formSpeciesIdTable = sLinooneFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL_NIGHT, 35, SPECIES_OBSTAGOON}), + .evolutions = EVOLUTION({EVO_LEVEL, 35, SPECIES_OBSTAGOON, CONDITIONS({IF_TIME, TIME_NIGHT})}), }, [SPECIES_OBSTAGOON] = @@ -1451,8 +1451,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .tmIlliterate = TRUE, .levelUpLearnset = sWurmpleLevelUpLearnset, .teachableLearnset = sWurmpleTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_SILCOON, 7, SPECIES_SILCOON}, - {EVO_LEVEL_CASCOON, 7, SPECIES_CASCOON}), + .evolutions = EVOLUTION({EVO_LEVEL, 7, SPECIES_SILCOON, CONDITIONS({IF_PID_UPPER_MODULO_10_GT, 5})}, + {EVO_LEVEL, 7, SPECIES_CASCOON, CONDITIONS({IF_PID_UPPER_MODULO_10_LE, 5})}), }, [SPECIES_SILCOON] = @@ -2733,7 +2733,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sKirliaLevelUpLearnset, .teachableLearnset = sKirliaTeachableLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_GARDEVOIR}, - {EVO_ITEM_MALE, ITEM_DAWN_STONE, SPECIES_GALLADE}), + {EVO_ITEM, ITEM_DAWN_STONE, SPECIES_GALLADE, CONDITIONS({IF_GENDER, MON_MALE})}), }, [SPECIES_GARDEVOIR] = @@ -3607,8 +3607,12 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sNincadaLevelUpLearnset, .teachableLearnset = sNincadaTeachableLearnset, .eggMoveLearnset = sNincadaEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_NINJASK, 20, SPECIES_NINJASK}, - {EVO_LEVEL_SHEDINJA, 20, SPECIES_SHEDINJA}), + .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_NINJASK}, + #if P_SHEDINJA_BALL >= GEN_4 + {EVO_SPLIT_FROM_EVO, SPECIES_NINJASK, SPECIES_SHEDINJA, CONDITIONS({IF_BAG_ITEM_COUNT, ITEM_POKE_BALL, 1})}), + #else + {EVO_SPLIT_FROM_EVO, SPECIES_NINJASK, SPECIES_SHEDINJA, CONDITIONS({IF_BAG_ITEM_COUNT, ITEM_POKE_BALL, 1})}), + #endif }, [SPECIES_NINJASK] = @@ -4199,7 +4203,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sNosepassLevelUpLearnset, .teachableLearnset = sNosepassTeachableLearnset, .eggMoveLearnset = sNosepassEggMoveLearnset, - .evolutions = EVOLUTION({EVO_MAPSEC, MAPSEC_NEW_MAUVILLE, SPECIES_PROBOPASS}, + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_PROBOPASS, CONDITIONS({IF_IN_MAPSEC, MAPSEC_NEW_MAUVILLE})}, {EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_PROBOPASS}), }, @@ -5792,7 +5796,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sBudewLevelUpLearnset, .teachableLearnset = sBudewTeachableLearnset, .eggMoveLearnset = sBudewEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP_DAY, 0, SPECIES_ROSELIA}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_ROSELIA, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD},{IF_NOT_TIME, TIME_NIGHT})}), }, #endif //P_GEN_4_CROSS_EVOS @@ -8776,8 +8780,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sFeebasLevelUpLearnset, .teachableLearnset = sFeebasTeachableLearnset, .eggMoveLearnset = sFeebasEggMoveLearnset, - .evolutions = EVOLUTION({EVO_BEAUTY, 170, SPECIES_MILOTIC}, - {EVO_TRADE_ITEM, ITEM_PRISM_SCALE, SPECIES_MILOTIC}, + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_MILOTIC, CONDITIONS({IF_MIN_BEAUTY, 170})}, + {EVO_TRADE, 0, SPECIES_MILOTIC, CONDITIONS({IF_HOLD_ITEM, ITEM_PRISM_SCALE})}, {EVO_ITEM, ITEM_PRISM_SCALE, SPECIES_MILOTIC}), }, @@ -9614,7 +9618,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = ) .levelUpLearnset = sDusclopsLevelUpLearnset, .teachableLearnset = sDusclopsTeachableLearnset, - .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_REAPER_CLOTH, SPECIES_DUSKNOIR}, + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_DUSKNOIR, CONDITIONS({IF_HOLD_ITEM, ITEM_REAPER_CLOTH})}, {EVO_ITEM, ITEM_REAPER_CLOTH, SPECIES_DUSKNOIR}), }, @@ -9855,7 +9859,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sChinglingLevelUpLearnset, .teachableLearnset = sChinglingTeachableLearnset, .eggMoveLearnset = sChinglingEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP_NIGHT, 0, SPECIES_CHIMECHO}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_CHIMECHO, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD},{IF_TIME, TIME_NIGHT})}), }, #endif //P_GEN_4_CROSS_EVOS @@ -10156,7 +10160,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .teachableLearnset = sSnoruntTeachableLearnset, .eggMoveLearnset = sSnoruntEggMoveLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 42, SPECIES_GLALIE}, - {EVO_ITEM_FEMALE, ITEM_DAWN_STONE, SPECIES_FROSLASS}), + {EVO_ITEM, ITEM_DAWN_STONE, SPECIES_FROSLASS, CONDITIONS({IF_GENDER, MON_FEMALE})}), }, [SPECIES_GLALIE] = @@ -10663,8 +10667,8 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sClamperlLevelUpLearnset, .teachableLearnset = sClamperlTeachableLearnset, .eggMoveLearnset = sClamperlEggMoveLearnset, - .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_DEEP_SEA_TOOTH, SPECIES_HUNTAIL}, - {EVO_TRADE_ITEM, ITEM_DEEP_SEA_SCALE, SPECIES_GOREBYSS}, + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_HUNTAIL, CONDITIONS({IF_HOLD_ITEM, ITEM_DEEP_SEA_TOOTH})}, + {EVO_TRADE, 0, SPECIES_GOREBYSS, CONDITIONS({IF_HOLD_ITEM, ITEM_DEEP_SEA_SCALE})}, {EVO_ITEM, ITEM_DEEP_SEA_TOOTH, SPECIES_HUNTAIL}, {EVO_ITEM, ITEM_DEEP_SEA_SCALE, SPECIES_GOREBYSS}), }, diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index 44b221040cb..0e74dd37d70 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -1846,8 +1846,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, .formChangeTable = sBurmyFormChangeTable, - .evolutions = EVOLUTION({EVO_LEVEL_FEMALE, 20, SPECIES_WORMADAM_PLANT}, - {EVO_LEVEL_MALE, 20, SPECIES_MOTHIM_PLANT}), + .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_WORMADAM_PLANT, CONDITIONS({IF_GENDER, MON_FEMALE})}, + {EVO_LEVEL, 20, SPECIES_MOTHIM_PLANT, CONDITIONS({IF_GENDER, MON_MALE})}), }, [SPECIES_BURMY_SANDY] = @@ -1914,8 +1914,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, .formChangeTable = sBurmyFormChangeTable, - .evolutions = EVOLUTION({EVO_LEVEL_FEMALE, 20, SPECIES_WORMADAM_SANDY}, - {EVO_LEVEL_MALE, 20, SPECIES_MOTHIM_SANDY}), + .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_WORMADAM_SANDY, CONDITIONS({IF_GENDER, MON_FEMALE})}, + {EVO_LEVEL, 20, SPECIES_MOTHIM_SANDY, CONDITIONS({IF_GENDER, MON_MALE})}), }, [SPECIES_BURMY_TRASH] = @@ -1982,8 +1982,8 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .teachableLearnset = sBurmyTeachableLearnset, .formSpeciesIdTable = sBurmyFormSpeciesIdTable, .formChangeTable = sBurmyFormChangeTable, - .evolutions = EVOLUTION({EVO_LEVEL_FEMALE, 20, SPECIES_WORMADAM_TRASH}, - {EVO_LEVEL_MALE, 20, SPECIES_MOTHIM_TRASH}), + .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_WORMADAM_TRASH, CONDITIONS({IF_GENDER, MON_FEMALE})}, + {EVO_LEVEL, 20, SPECIES_MOTHIM_TRASH, CONDITIONS({IF_GENDER, MON_MALE})}), }, [SPECIES_WORMADAM_PLANT] = @@ -2332,7 +2332,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .tmIlliterate = TRUE, .levelUpLearnset = sCombeeLevelUpLearnset, .teachableLearnset = sCombeeTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_FEMALE, 21, SPECIES_VESPIQUEN}), + .evolutions = EVOLUTION({EVO_LEVEL, 21, SPECIES_VESPIQUEN, CONDITIONS({IF_GENDER, MON_FEMALE})}), }, [SPECIES_VESPIQUEN] = @@ -3334,7 +3334,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .levelUpLearnset = sBunearyLevelUpLearnset, .teachableLearnset = sBunearyTeachableLearnset, .eggMoveLearnset = sBunearyEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_LOPUNNY}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_LOPUNNY, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, [SPECIES_LOPUNNY] = @@ -4418,7 +4418,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .levelUpLearnset = sRioluLevelUpLearnset, .teachableLearnset = sRioluTeachableLearnset, .eggMoveLearnset = sRioluEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP_DAY, 0, SPECIES_LUCARIO}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_LUCARIO, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD},{IF_NOT_TIME, TIME_NIGHT})}), }, [SPECIES_LUCARIO] = diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index e66657c3ef1..ed9ad5e6dea 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -2516,7 +2516,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .levelUpLearnset = sWoobatLevelUpLearnset, .teachableLearnset = sWoobatTeachableLearnset, .eggMoveLearnset = sWoobatEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_SWOOBAT}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_SWOOBAT, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, [SPECIES_SWOOBAT] = @@ -3563,7 +3563,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sSwadloonLevelUpLearnset, .teachableLearnset = sSwadloonTeachableLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_LEAVANNY}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_LEAVANNY, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, [SPECIES_LEAVANNY] = @@ -4430,8 +4430,8 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .levelUpLearnset = sBasculinWhiteStripedLevelUpLearnset, .teachableLearnset = sBasculinWhiteStripedTeachableLearnset, .formSpeciesIdTable = sBasculinFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_RECOIL_DAMAGE_MALE, 294, SPECIES_BASCULEGION_M}, - {EVO_RECOIL_DAMAGE_FEMALE, 294, SPECIES_BASCULEGION_F}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_BASCULEGION_M, CONDITIONS({IF_RECOIL_DAMAGE_GE, 294}, {IF_GENDER, MON_MALE})}, + {EVO_LEVEL, 0, SPECIES_BASCULEGION_F, CONDITIONS({IF_RECOIL_DAMAGE_GE, 294}, {IF_GENDER, MON_FEMALE})}), }, [SPECIES_BASCULEGION_M] = @@ -5803,7 +5803,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .teachableLearnset = sYamaskGalarTeachableLearnset, .eggMoveLearnset = sYamaskGalarEggMoveLearnset, .formSpeciesIdTable = sYamaskFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_SCRIPT_TRIGGER_DMG, 49, SPECIES_RUNERIGUS}), + .evolutions = EVOLUTION({EVO_SCRIPT_TRIGGER, 0, SPECIES_RUNERIGUS, CONDITIONS({IF_CURRENT_DAMAGE_GE, 49})}), }, [SPECIES_RUNERIGUS] = @@ -8211,7 +8211,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .levelUpLearnset = sKarrablastLevelUpLearnset, .teachableLearnset = sKarrablastTeachableLearnset, .eggMoveLearnset = sKarrablastEggMoveLearnset, - .evolutions = EVOLUTION({EVO_TRADE_SPECIFIC_MON, SPECIES_SHELMET, SPECIES_ESCAVALIER}), + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_ESCAVALIER, CONDITIONS({IF_TRADE_PARTNER_SPECIES, SPECIES_SHELMET})}), }, [SPECIES_ESCAVALIER] = @@ -10245,7 +10245,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .levelUpLearnset = sShelmetLevelUpLearnset, .teachableLearnset = sShelmetTeachableLearnset, .eggMoveLearnset = sShelmetEggMoveLearnset, - .evolutions = EVOLUTION({EVO_TRADE_SPECIFIC_MON, SPECIES_KARRABLAST, SPECIES_ACCELGOR}), + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_ACCELGOR, CONDITIONS({IF_TRADE_PARTNER_SPECIES, SPECIES_KARRABLAST})}), }, [SPECIES_ACCELGOR] = @@ -10940,7 +10940,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sBisharpLevelUpLearnset, .teachableLearnset = sBisharpTeachableLearnset, - .evolutions = EVOLUTION({EVO_DEFEAT_THREE_WITH_ITEM, ITEM_LEADERS_CREST, SPECIES_KINGAMBIT}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_KINGAMBIT, CONDITIONS({IF_DEFEAT_X_WITH_ITEMS, SPECIES_BISHARP, ITEM_LEADERS_CREST, 3})}), }, #if P_GEN_9_CROSS_EVOS diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 8b332629c47..e355409e686 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -2190,7 +2190,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sPanchamLevelUpLearnset, .teachableLearnset = sPanchamTeachableLearnset, .eggMoveLearnset = sPanchamEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_DARK_TYPE_MON_IN_PARTY, 32, SPECIES_PANGORO}), + .evolutions = EVOLUTION({EVO_LEVEL, 32, SPECIES_PANGORO, CONDITIONS({IF_TYPE_IN_PARTY, TYPE_DARK})}), }, [SPECIES_PANGORO] = @@ -2409,8 +2409,8 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sEspurrLevelUpLearnset, .teachableLearnset = sEspurrTeachableLearnset, .eggMoveLearnset = sEspurrEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_MALE, 25, SPECIES_MEOWSTIC_M}, - {EVO_LEVEL_FEMALE, 25, SPECIES_MEOWSTIC_F}), + .evolutions = EVOLUTION({EVO_LEVEL, 25, SPECIES_MEOWSTIC_M, CONDITIONS({IF_GENDER, MON_MALE})}, + {EVO_LEVEL, 25, SPECIES_MEOWSTIC_F, CONDITIONS({IF_GENDER, MON_FEMALE})}), }, [SPECIES_MEOWSTIC_M] = @@ -2893,7 +2893,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sSpritzeeLevelUpLearnset, .teachableLearnset = sSpritzeeTeachableLearnset, .eggMoveLearnset = sSpritzeeEggMoveLearnset, - .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_SACHET, SPECIES_AROMATISSE}, + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_AROMATISSE, CONDITIONS({IF_HOLD_ITEM, ITEM_SACHET})}, {EVO_ITEM, ITEM_SACHET, SPECIES_AROMATISSE}), }, @@ -3033,7 +3033,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sSwirlixLevelUpLearnset, .teachableLearnset = sSwirlixTeachableLearnset, .eggMoveLearnset = sSwirlixEggMoveLearnset, - .evolutions = EVOLUTION({EVO_TRADE_ITEM, ITEM_WHIPPED_DREAM, SPECIES_SLURPUFF}, + .evolutions = EVOLUTION({EVO_TRADE, 0, SPECIES_SLURPUFF, CONDITIONS({IF_HOLD_ITEM, ITEM_WHIPPED_DREAM})}, {EVO_ITEM, ITEM_WHIPPED_DREAM, SPECIES_SLURPUFF}), }, @@ -3875,7 +3875,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sTyruntLevelUpLearnset, .teachableLearnset = sTyruntTeachableLearnset, .eggMoveLearnset = sTyruntEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_DAY, 39, SPECIES_TYRANTRUM}), + .evolutions = EVOLUTION({EVO_LEVEL, 39, SPECIES_TYRANTRUM, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}), }, [SPECIES_TYRANTRUM] = @@ -4017,7 +4017,7 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sAmauraLevelUpLearnset, .teachableLearnset = sAmauraTeachableLearnset, .eggMoveLearnset = sAmauraEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_NIGHT, 39, SPECIES_AURORUS}), + .evolutions = EVOLUTION({EVO_LEVEL, 39, SPECIES_AURORUS, CONDITIONS({IF_TIME, TIME_NIGHT})}), }, [SPECIES_AURORUS] = @@ -4442,8 +4442,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sSliggooLevelUpLearnset, .teachableLearnset = sSliggooTeachableLearnset, .formSpeciesIdTable = sSliggooFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL_RAIN, 50, SPECIES_GOODRA}, - {EVO_LEVEL_FOG, 50, SPECIES_GOODRA}), + .evolutions = EVOLUTION({EVO_LEVEL, 50, SPECIES_GOODRA, CONDITIONS({IF_WEATHER, WEATHER_RAIN})}, + {EVO_LEVEL, 50, SPECIES_GOODRA, CONDITIONS({IF_WEATHER, WEATHER_RAIN_THUNDERSTORM})}, + {EVO_LEVEL, 50, SPECIES_GOODRA, CONDITIONS({IF_WEATHER, WEATHER_DOWNPOUR})}, + {EVO_LEVEL, 50, SPECIES_GOODRA, CONDITIONS({IF_WEATHER, WEATHER_FOG_HORIZONTAL})}, + {EVO_LEVEL, 50, SPECIES_GOODRA, CONDITIONS({IF_WEATHER, WEATHER_FOG_DIAGONAL})}), }, [SPECIES_GOODRA] = @@ -4579,8 +4582,11 @@ const struct SpeciesInfo gSpeciesInfoGen6[] = .levelUpLearnset = sSliggooHisuiLevelUpLearnset, .teachableLearnset = sSliggooHisuiTeachableLearnset, .formSpeciesIdTable = sSliggooFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL_RAIN, 50, SPECIES_GOODRA_HISUI}, - {EVO_LEVEL_FOG, 50, SPECIES_GOODRA_HISUI}), + .evolutions = EVOLUTION({EVO_LEVEL, 50, SPECIES_GOODRA_HISUI, CONDITIONS({IF_WEATHER, WEATHER_RAIN})}, + {EVO_LEVEL, 50, SPECIES_GOODRA_HISUI, CONDITIONS({IF_WEATHER, WEATHER_RAIN_THUNDERSTORM})}, + {EVO_LEVEL, 50, SPECIES_GOODRA_HISUI, CONDITIONS({IF_WEATHER, WEATHER_DOWNPOUR})}, + {EVO_LEVEL, 50, SPECIES_GOODRA_HISUI, CONDITIONS({IF_WEATHER, WEATHER_FOG_HORIZONTAL})}, + {EVO_LEVEL, 50, SPECIES_GOODRA_HISUI, CONDITIONS({IF_WEATHER, WEATHER_FOG_DIAGONAL})}), }, [SPECIES_GOODRA_HISUI] = diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index b0115420ad7..785bb72db9e 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -923,7 +923,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .levelUpLearnset = sYungoosLevelUpLearnset, .teachableLearnset = sYungoosTeachableLearnset, .eggMoveLearnset = sYungoosEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_DAY, 20, SPECIES_GUMSHOOS}), + .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_GUMSHOOS, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}), }, [SPECIES_GUMSHOOS] = @@ -1179,7 +1179,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .levelUpLearnset = sCharjabugLevelUpLearnset, .teachableLearnset = sCharjabugTeachableLearnset, - .evolutions = EVOLUTION({EVO_MAPSEC, MAPSEC_NEW_MAUVILLE, SPECIES_VIKAVOLT}, + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_VIKAVOLT, CONDITIONS({IF_IN_MAPSEC, MAPSEC_NEW_MAUVILLE})}, {EVO_ITEM, ITEM_THUNDER_STONE, SPECIES_VIKAVOLT}, {EVO_NONE, 0, SPECIES_VIKAVOLT_TOTEM}), }, @@ -1378,7 +1378,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .levelUpLearnset = sCrabrawlerLevelUpLearnset, .teachableLearnset = sCrabrawlerTeachableLearnset, .eggMoveLearnset = sCrabrawlerEggMoveLearnset, - .evolutions = EVOLUTION({EVO_SPECIFIC_MAP, MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM, SPECIES_CRABOMINABLE}, + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_CRABOMINABLE, CONDITIONS({IF_IN_MAP, MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM})}, {EVO_ITEM, ITEM_ICE_STONE, SPECIES_CRABOMINABLE}), }, @@ -1997,8 +1997,8 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .teachableLearnset = sRockruffTeachableLearnset, .eggMoveLearnset = sRockruffEggMoveLearnset, .formSpeciesIdTable = sRockruffFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL_DAY, 25, SPECIES_LYCANROC_MIDDAY}, - {EVO_LEVEL_NIGHT, 25, SPECIES_LYCANROC_MIDNIGHT}), + .evolutions = EVOLUTION({EVO_LEVEL, 25, SPECIES_LYCANROC_MIDDAY, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}, + {EVO_LEVEL, 25, SPECIES_LYCANROC_MIDNIGHT, CONDITIONS({IF_TIME, TIME_NIGHT})}), }, [SPECIES_ROCKRUFF_OWN_TEMPO] = @@ -2059,7 +2059,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .teachableLearnset = sRockruffTeachableLearnset, .eggMoveLearnset = sRockruffEggMoveLearnset, .formSpeciesIdTable = sRockruffFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL_DUSK, 25, SPECIES_LYCANROC_DUSK}), + .evolutions = EVOLUTION({EVO_LEVEL, 25, SPECIES_LYCANROC_DUSK, CONDITIONS({IF_TIME, TIME_EVENING})}), }, [SPECIES_LYCANROC_MIDDAY] = @@ -2905,7 +2905,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .levelUpLearnset = sFomantisLevelUpLearnset, .teachableLearnset = sFomantisTeachableLearnset, .eggMoveLearnset = sFomantisEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_DAY, 34, SPECIES_LURANTIS}, + .evolutions = EVOLUTION({EVO_LEVEL, 34, SPECIES_LURANTIS, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}, {EVO_NONE, 0, SPECIES_LURANTIS_TOTEM}), }, @@ -3231,7 +3231,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .levelUpLearnset = sSalanditLevelUpLearnset, .teachableLearnset = sSalanditTeachableLearnset, .eggMoveLearnset = sSalanditEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_FEMALE, 33, SPECIES_SALAZZLE}, + .evolutions = EVOLUTION({EVO_LEVEL, 33, SPECIES_SALAZZLE, CONDITIONS({IF_GENDER, MON_FEMALE})}, {EVO_NONE, 0, SPECIES_SALAZZLE_TOTEM}), }, @@ -3622,7 +3622,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = ) .levelUpLearnset = sSteeneeLevelUpLearnset, .teachableLearnset = sSteeneeTeachableLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_STOMP, SPECIES_TSAREENA}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_TSAREENA, CONDITIONS({IF_KNOWS_MOVE, MOVE_STOMP})}), }, [SPECIES_TSAREENA] = @@ -4292,7 +4292,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sTypeNullLevelUpLearnset, .teachableLearnset = sTypeNullTeachableLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP, 0, SPECIES_SILVALLY_NORMAL}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_SILVALLY_NORMAL, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, #define SILVALLY_SPECIES_INFO(type, _palette) \ @@ -5882,8 +5882,8 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sCosmoemLevelUpLearnset, .teachableLearnset = sCosmoemTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_DAY, 53, SPECIES_SOLGALEO}, - {EVO_LEVEL_NIGHT, 53, SPECIES_LUNALA}), + .evolutions = EVOLUTION({EVO_LEVEL, 53, SPECIES_SOLGALEO, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}, + {EVO_LEVEL, 53, SPECIES_LUNALA, CONDITIONS({IF_TIME, TIME_NIGHT})}), }, [SPECIES_SOLGALEO] = @@ -7031,7 +7031,7 @@ const struct SpeciesInfo gSpeciesInfoGen7[] = .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sPoipoleLevelUpLearnset, .teachableLearnset = sPoipoleTeachableLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_DRAGON_PULSE, SPECIES_NAGANADEL}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_NAGANADEL, CONDITIONS({IF_KNOWS_MOVE, MOVE_DRAGON_PULSE})}), }, [SPECIES_NAGANADEL] = diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index a7239d1c322..a52cae4c370 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -2735,7 +2735,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = ) .levelUpLearnset = sDipplinLevelUpLearnset, .teachableLearnset = sDipplinTeachableLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_DRAGON_CHEER, SPECIES_HYDRAPPLE}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_HYDRAPPLE, CONDITIONS({IF_KNOWS_MOVE, MOVE_DRAGON_CHEER})}), }, [SPECIES_HYDRAPPLE] = @@ -3357,8 +3357,8 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .levelUpLearnset = sToxelLevelUpLearnset, .teachableLearnset = sToxelTeachableLearnset, .eggMoveLearnset = sToxelEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_NATURE_AMPED, 30, SPECIES_TOXTRICITY_AMPED}, - {EVO_LEVEL_NATURE_LOW_KEY, 30, SPECIES_TOXTRICITY_LOW_KEY}), + .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_AMPED_NATURE})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_LOW_KEY_NATURE})}), }, [SPECIES_TOXTRICITY_AMPED] = @@ -3854,7 +3854,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .levelUpLearnset = sClobbopusLevelUpLearnset, .teachableLearnset = sClobbopusTeachableLearnset, .eggMoveLearnset = sClobbopusEggMoveLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_TAUNT, SPECIES_GRAPPLOCT}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_GRAPPLOCT, CONDITIONS({IF_KNOWS_MOVE, MOVE_TAUNT})}), }, [SPECIES_GRAPPLOCT] = @@ -5108,7 +5108,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .levelUpLearnset = sSnomLevelUpLearnset, .teachableLearnset = sSnomTeachableLearnset, .eggMoveLearnset = sSnomEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP_NIGHT, 0, SPECIES_FROSMOTH}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_FROSMOTH, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD},{IF_TIME, TIME_NIGHT})}), }, [SPECIES_FROSMOTH] = @@ -6903,10 +6903,10 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, .levelUpLearnset = sKubfuLevelUpLearnset, .teachableLearnset = sKubfuTeachableLearnset, - .evolutions = EVOLUTION({EVO_DARK_SCROLL, 0, SPECIES_URSHIFU_SINGLE_STRIKE}, + .evolutions = EVOLUTION({EVO_SCRIPT_TRIGGER, 0, SPECIES_URSHIFU_SINGLE_STRIKE}, + {EVO_SCRIPT_TRIGGER, 1, SPECIES_URSHIFU_RAPID_STRIKE}, {EVO_ITEM, ITEM_SCROLL_OF_DARKNESS, SPECIES_URSHIFU_SINGLE_STRIKE}, - {EVO_WATER_SCROLL, 0, SPECIES_URSHIFU_RAPID_STRIKE}, - {EVO_ITEM, ITEM_SCROLL_OF_WATERS, SPECIES_URSHIFU_RAPID_STRIKE}), + {EVO_ITEM, ITEM_SCROLL_OF_WATERS, SPECIES_URSHIFU_RAPID_STRIKE}), }, [SPECIES_URSHIFU_SINGLE_STRIKE] = diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index d740424f82d..b9768b44c0d 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -638,8 +638,8 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .levelUpLearnset = sLechonkLevelUpLearnset, .teachableLearnset = sLechonkTeachableLearnset, .eggMoveLearnset = sLechonkEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_MALE, 18, SPECIES_OINKOLOGNE_M}, - {EVO_LEVEL_FEMALE, 18, SPECIES_OINKOLOGNE_F}), + .evolutions = EVOLUTION({EVO_LEVEL, 18, SPECIES_OINKOLOGNE_M, CONDITIONS({IF_GENDER, MON_MALE})}, + {EVO_LEVEL, 18, SPECIES_OINKOLOGNE_F, CONDITIONS({IF_GENDER, MON_FEMALE})}), }, [SPECIES_OINKOLOGNE_M] = @@ -1149,7 +1149,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = ) .levelUpLearnset = sPawmoLevelUpLearnset, .teachableLearnset = sPawmoTeachableLearnset, - .evolutions = EVOLUTION({EVO_OVERWORLD_STEPS, 1000, SPECIES_PAWMOT}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_PAWMOT, CONDITIONS({IF_MIN_OVERWORLD_STEPS, 1000})}), }, [SPECIES_PAWMOT] = @@ -1277,8 +1277,8 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .levelUpLearnset = sTandemausLevelUpLearnset, .teachableLearnset = sTandemausTeachableLearnset, .eggMoveLearnset = sTandemausEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_FAMILY_OF_FOUR, 25, SPECIES_MAUSHOLD_FOUR}, - {EVO_LEVEL_FAMILY_OF_THREE, 25, SPECIES_MAUSHOLD_THREE}), + .evolutions = EVOLUTION({EVO_LEVEL_BATTLE_ONLY, 25, SPECIES_MAUSHOLD_FOUR, CONDITIONS({IF_PID_MODULO_100_GT, 0})}, + {EVO_LEVEL_BATTLE_ONLY, 25, SPECIES_MAUSHOLD_THREE, CONDITIONS({IF_PID_MODULO_100_EQ, 0})}), }, [SPECIES_MAUSHOLD_THREE] = @@ -2941,7 +2941,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .levelUpLearnset = sBramblinLevelUpLearnset, .teachableLearnset = sBramblinTeachableLearnset, .eggMoveLearnset = sBramblinEggMoveLearnset, - .evolutions = EVOLUTION({EVO_OVERWORLD_STEPS, 1000, SPECIES_BRAMBLEGHAST}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_BRAMBLEGHAST, CONDITIONS({IF_MIN_OVERWORLD_STEPS, 1000})}), }, [SPECIES_BRAMBLEGHAST] = @@ -3394,7 +3394,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .levelUpLearnset = sRellorLevelUpLearnset, .teachableLearnset = sRellorTeachableLearnset, .eggMoveLearnset = sRellorEggMoveLearnset, - .evolutions = EVOLUTION({EVO_OVERWORLD_STEPS, 1000, SPECIES_RABSCA}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_RABSCA, CONDITIONS({IF_MIN_OVERWORLD_STEPS, 1000})}), }, [SPECIES_RABSCA] = @@ -4614,7 +4614,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .levelUpLearnset = sGreavardLevelUpLearnset, .teachableLearnset = sGreavardTeachableLearnset, .eggMoveLearnset = sGreavardEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_NIGHT, 30, SPECIES_HOUNDSTONE}), + .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_HOUNDSTONE, CONDITIONS({IF_TIME, TIME_NIGHT})}), }, [SPECIES_HOUNDSTONE] = @@ -6246,7 +6246,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .levelUpLearnset = sGimmighoulLevelUpLearnset, .teachableLearnset = sGimmighoulTeachableLearnset, .formSpeciesIdTable = sGimmighoulFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_ITEM_COUNT_999, ITEM_GIMMIGHOUL_COIN, SPECIES_GHOLDENGO}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_GHOLDENGO, CONDITIONS({IF_BAG_ITEM_COUNT, ITEM_GIMMIGHOUL_COIN, 999})}), }, [SPECIES_GIMMIGHOUL_ROAMING] = @@ -6301,7 +6301,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .levelUpLearnset = sGimmighoulLevelUpLearnset, .teachableLearnset = sGimmighoulTeachableLearnset, .formSpeciesIdTable = sGimmighoulFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_ITEM_COUNT_999, ITEM_GIMMIGHOUL_COIN, SPECIES_GHOLDENGO}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_GHOLDENGO, CONDITIONS({IF_BAG_ITEM_COUNT, ITEM_GIMMIGHOUL_COIN, 999})}), }, [SPECIES_GHOLDENGO] = diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 20eb136f39f..d932f4e954c 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -542,7 +542,7 @@ static void CB2_TradeEvolutionSceneUpdate(void) RunTasks(); } -static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) +static void CreateShedinja(u32 preEvoSpecies, u32 postEvoSpecies, struct Pokemon *mon) { u32 data = 0; u16 ball = ITEM_POKE_BALL; @@ -551,41 +551,48 @@ static void CreateShedinja(u16 preEvoSpecies, struct Pokemon *mon) if (evolutions == NULL) return; - if (evolutions[0].method == EVO_LEVEL_NINJASK && gPlayerPartyCount < PARTY_SIZE && (P_SHEDINJA_BALL < GEN_4 || CheckBagHasItem(ball, 1))) + for (u32 i = 0; evolutions[i].method != EVOLUTIONS_END; i++) { - s32 i; - struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; - - CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon)); - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, &evolutions[1].targetSpecies); - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, GetSpeciesName(evolutions[1].targetSpecies)); - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, &data); - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, &data); - if (P_SHEDINJA_BALL >= GEN_4) + if (evolutions[i].method == EVO_SPLIT_FROM_EVO + && evolutions[i].param == postEvoSpecies + && gPlayerPartyCount < PARTY_SIZE + && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, PARTY_SIZE, NULL)) { - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_POKEBALL, &ball); - RemoveBagItem(ball, 1); - } - - for (i = MON_DATA_COOL_RIBBON; i < MON_DATA_COOL_RIBBON + CONTEST_CATEGORIES_COUNT; i++) - SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data); - for (i = MON_DATA_CHAMPION_RIBBON; i <= MON_DATA_WORLD_RIBBON; i++) - SetMonData(&gPlayerParty[gPlayerPartyCount], i, &data); - - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_STATUS, &data); - data = MAIL_NONE; - SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MAIL, &data); - - CalculateMonStats(&gPlayerParty[gPlayerPartyCount]); - CalculatePlayerPartyCount(); - - GetSetPokedexFlag(SpeciesToNationalPokedexNum(evolutions[1].targetSpecies), FLAG_SET_SEEN); - GetSetPokedexFlag(SpeciesToNationalPokedexNum(evolutions[1].targetSpecies), FLAG_SET_CAUGHT); + s32 j; + struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; + + CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon)); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, &evolutions[i].targetSpecies); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, GetSpeciesName(evolutions[i].targetSpecies)); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_HELD_ITEM, &data); + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MARKINGS, &data); + if (P_SHEDINJA_BALL >= GEN_4) + { + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_POKEBALL, &ball); + RemoveBagItem(ball, 1); + } + + for (j = MON_DATA_COOL_RIBBON; j < MON_DATA_COOL_RIBBON + CONTEST_CATEGORIES_COUNT; j++) + SetMonData(&gPlayerParty[gPlayerPartyCount], j, &data); + for (j = MON_DATA_CHAMPION_RIBBON; j <= MON_DATA_WORLD_RIBBON; j++) + SetMonData(&gPlayerParty[gPlayerPartyCount], j, &data); + + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_STATUS, &data); + data = MAIL_NONE; + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MAIL, &data); + + CalculateMonStats(&gPlayerParty[gPlayerPartyCount]); + CalculatePlayerPartyCount(); + + GetSetPokedexFlag(SpeciesToNationalPokedexNum(evolutions[i].targetSpecies), FLAG_SET_SEEN); + GetSetPokedexFlag(SpeciesToNationalPokedexNum(evolutions[i].targetSpecies), FLAG_SET_CAUGHT); + + if (GetMonData(shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA + && GetMonData(shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE + && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NINJASK) + SetMonData(shedinja, MON_DATA_NICKNAME, sText_ShedinjaJapaneseName); - if (GetMonData(shedinja, MON_DATA_SPECIES) == SPECIES_SHEDINJA - && GetMonData(shedinja, MON_DATA_LANGUAGE) == LANGUAGE_JAPANESE - && GetMonData(mon, MON_DATA_SPECIES) == SPECIES_NINJASK) - SetMonData(shedinja, MON_DATA_NICKNAME, sText_ShedinjaJapaneseName); + } } } @@ -820,7 +827,7 @@ static void Task_EvolutionScene(u8 taskId) Overworld_PlaySpecialMapMusic(); } if (!gTasks[taskId].tEvoWasStopped) - CreateShedinja(gTasks[taskId].tPreEvoSpecies, mon); + CreateShedinja(gTasks[taskId].tPreEvoSpecies, gTasks[taskId].tPostEvoSpecies, mon); DestroyTask(taskId); FreeMonSpritesGfx(); diff --git a/src/party_menu.c b/src/party_menu.c index bda62ba3d1f..8cd99e5834b 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -1142,7 +1142,7 @@ static bool8 DisplayPartyPokemonDataForMoveTutorOrEvolutionItem(u8 slot) DisplayPartyPokemonDataToTeachMove(slot, ItemIdToBattleMoveId(item)); break; case 2: // Evolution stone - if (!GetMonData(currentPokemon, MON_DATA_IS_EGG) && GetEvolutionTargetSpecies(currentPokemon, EVO_MODE_ITEM_CHECK, item, NULL) != SPECIES_NONE) + if (!GetMonData(currentPokemon, MON_DATA_IS_EGG) && GetEvolutionTargetSpecies(currentPokemon, EVO_MODE_ITEM_CHECK, item, NULL, NULL) != SPECIES_NONE) return FALSE; DisplayPartyPokemonDescriptionData(slot, PARTYBOX_DESC_NO_USE); break; @@ -5563,21 +5563,16 @@ void ItemUseCB_RareCandy(u8 taskId, TaskFunc task) PlaySE(SE_SELECT); if (cannotUseEffect) { - u16 targetSpecies = SPECIES_NONE; - bool32 evoModeNormal = TRUE; + u32 targetSpecies = SPECIES_NONE; + bool32 canStopEvo = TRUE; // Resets values to 0 so other means of teaching moves doesn't overwrite levels sInitialLevel = 0; sFinalLevel = 0; - if (holdEffectParam == 0) + if (holdEffectParam == 0) // Rare Candy { - targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_NORMAL, ITEM_NONE, NULL); - if (targetSpecies == SPECIES_NONE) - { - targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_CANT_STOP, ITEM_NONE, NULL); - evoModeNormal = FALSE; - } + targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_NORMAL, ITEM_NONE, NULL, &canStopEvo); } if (targetSpecies != SPECIES_NONE) @@ -5585,7 +5580,7 @@ void ItemUseCB_RareCandy(u8 taskId, TaskFunc task) RemoveBagItem(gSpecialVar_ItemId, 1); FreePartyPointers(); gCB2_AfterEvolution = gPartyMenu.exitCallback; - BeginEvolutionScene(mon, targetSpecies, evoModeNormal, gPartyMenu.slotId); + BeginEvolutionScene(mon, targetSpecies, canStopEvo, gPartyMenu.slotId); DestroyTask(taskId); } else @@ -5759,19 +5754,14 @@ static void CB2_ReturnToPartyMenuUsingRareCandy(void) static void PartyMenuTryEvolution(u8 taskId) { struct Pokemon *mon = &gPlayerParty[gPartyMenu.slotId]; - u16 targetSpecies = SPECIES_NONE; - bool32 evoModeNormal = TRUE; + u32 targetSpecies = SPECIES_NONE; + bool32 canStopEvo = TRUE; // Resets values to 0 so other means of teaching moves doesn't overwrite levels sInitialLevel = 0; sFinalLevel = 0; - targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_NORMAL, ITEM_NONE, NULL); - if (targetSpecies == SPECIES_NONE) - { - targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_CANT_STOP, ITEM_NONE, NULL); - evoModeNormal = FALSE; - } + targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_NORMAL, ITEM_NONE, NULL, &canStopEvo); if (targetSpecies != SPECIES_NONE) { @@ -5780,7 +5770,7 @@ static void PartyMenuTryEvolution(u8 taskId) gCB2_AfterEvolution = CB2_ReturnToPartyMenuUsingRareCandy; else gCB2_AfterEvolution = gPartyMenu.exitCallback; - BeginEvolutionScene(mon, targetSpecies, evoModeNormal, gPartyMenu.slotId); + BeginEvolutionScene(mon, targetSpecies, canStopEvo, gPartyMenu.slotId); DestroyTask(taskId); } else diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 3c14080614d..9203a3facf1 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -28,6 +28,7 @@ #include "region_map.h" #include "pokemon.h" #include "reset_rtc_screen.h" +#include "rtc.h" #include "scanline_effect.h" #include "shop.h" #include "sound.h" @@ -204,54 +205,19 @@ static const u8 sText_EVO_Buttons_Decapped_PE[] = _("{DPAD_UPDOWN}Evos {A_BUTTO static const u8 sText_EVO_Name[] = _("{STR_VAR_3}:"); static const u8 sText_EVO_PreEvo[] = _("{STR_VAR_1} evolves from {STR_VAR_2}"); static const u8 sText_EVO_PreEvo_PE_Mega[] = _("{STR_VAR_1} Mega Evolves with {STR_VAR_2}"); -static const u8 sText_EVO_FRIENDSHIP[] = _("{LV}{UP_ARROW}, high friendship"); -static const u8 sText_EVO_FRIENDSHIP_DAY[] = _("{LV}{UP_ARROW}, high friendship, day"); -static const u8 sText_EVO_FRIENDSHIP_NIGHT[] = _("{LV}{UP_ARROW}, high friendship, night"); -static const u8 sText_EVO_FRIENDSHIP_MOVE_TYPE[] = _("{LV}{UP_ARROW}, high friendship, {STR_VAR_2} move"); -static const u8 sText_EVO_LEVEL[] = _("{LV}{UP_ARROW} to {STR_VAR_2}"); -static const u8 sText_EVO_TRADE[] = _("Trading"); -static const u8 sText_EVO_TRADE_ITEM[] = _("Trading, holding {STR_VAR_2}"); -static const u8 sText_EVO_ITEM[] = _("{STR_VAR_2} is used"); -static const u8 sText_EVO_LEVEL_ATK_GT_DEF[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, Atk > Def"); -static const u8 sText_EVO_LEVEL_ATK_EQ_DEF[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, Atk = Def"); -static const u8 sText_EVO_LEVEL_ATK_LT_DEF[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, Atk < Def"); static const u8 sText_EVO_LEVEL_SILCOON[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, Silcoon persona"); static const u8 sText_EVO_LEVEL_CASCOON[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, Cascoon persona"); -static const u8 sText_EVO_LEVEL_NINJASK[] = _("{LV}{UP_ARROW} to {STR_VAR_2}"); -static const u8 sText_EVO_LEVEL_SHEDINJA[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, party<6, 1x POKéBALL"); -static const u8 sText_EVO_BEAUTY[] = _("{LV}{UP_ARROW}, high beauty"); -static const u8 sText_EVO_LEVEL_FEMALE[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, is female"); -static const u8 sText_EVO_LEVEL_MALE[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, is male"); -static const u8 sText_EVO_LEVEL_NIGHT[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, night"); -static const u8 sText_EVO_LEVEL_DAY[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, day"); -static const u8 sText_EVO_LEVEL_DUSK[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, dusk (5-6PM)"); -static const u8 sText_EVO_ITEM_HOLD_DAY[] = _("{LV}{UP_ARROW}, holds {STR_VAR_2}, day"); -static const u8 sText_EVO_ITEM_HOLD_NIGHT[] = _("{LV}{UP_ARROW}, holds {STR_VAR_2}, night"); static const u8 sText_EVO_MOVE[] = _("{LV}{UP_ARROW}, knows {STR_VAR_2}"); -static const u8 sText_EVO_MAPSEC[] = _("{LV}{UP_ARROW} on {STR_VAR_2}"); -static const u8 sText_EVO_ITEM_MALE[] = _("{STR_VAR_2} used on male"); -static const u8 sText_EVO_ITEM_FEMALE[] = _("{STR_VAR_2} used on female"); static const u8 sText_EVO_LEVEL_RAIN[] = _("{LV}{UP_ARROW} to {STR_VAR_2} while raining"); -static const u8 sText_EVO_SPECIFIC_MON_IN_PARTY[] = _("{LV}{UP_ARROW} with {STR_VAR_2} in party"); -static const u8 sText_EVO_LEVEL_DARK_TYPE_MON_IN_PARTY[] = _("{LV}{UP_ARROW} with dark type in party"); static const u8 sText_EVO_TRADE_SPECIFIC_MON[] = _("Traded for {STR_VAR_2}"); -static const u8 sText_EVO_SPECIFIC_MAP[] = _("{LV}{UP_ARROW} on {STR_VAR_2}"); -static const u8 sText_EVO_LEVEL_NATURE_AMPED[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, Amped natures"); -static const u8 sText_EVO_LEVEL_NATURE_LOW_KEY[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, Low Key natures"); static const u8 sText_EVO_CRITICAL_HITS[] = _("Land {STR_VAR_2} critical hits in\nsingle battle"); static const u8 sText_EVO_SCRIPT_TRIGGER_DMG[] = _("Takes at least {STR_VAR_2} HP in damage"); static const u8 sText_EVO_DARK_SCROLL[] = _("ScrllOfDrknss is used"); static const u8 sText_EVO_WATER_SCROLL[] = _("ScrollOfWatrs is used"); -static const u8 sText_EVO_ITEM_NIGHT[] = _("{STR_VAR_2} is used, night"); -static const u8 sText_EVO_ITEM_DAY[] = _("{STR_VAR_2} is used, day"); -static const u8 sText_EVO_ITEM_HOLD[] = _("{LV}{UP_ARROW}, holds {STR_VAR_2}"); static const u8 sText_EVO_USE_MOVE_TWENTY_TIMES[] = _("{LV}{UP_ARROW} after 20x {STR_VAR_2}"); static const u8 sText_EVO_RECOIL_DAMAGE_MALE[] = _("{LV}{UP_ARROW} with {STR_VAR_2} recoil, male"); static const u8 sText_EVO_RECOIL_DAMAGE_FEMALE[] = _("{LV}{UP_ARROW} with {STR_VAR_2} recoil, female"); -static const u8 sText_EVO_ITEM_COUNT_999[] = _("{LV}{UP_ARROW} with 999 {STR_VAR_2} in bag"); static const u8 sText_EVO_DEFEAT_THREE_WITH_ITEM[] = _("{LV}{UP_ARROW} defeating 3 {STR_VAR_3} holding {STR_VAR_2}"); -static const u8 sText_EVO_OVERWORLD_STEPS[] = _("{LV}{UP_ARROW} after {STR_VAR_2} steps"); -static const u8 sText_EVO_UNKNOWN[] = _("Method unknown"); static const u8 sText_EVO_NONE[] = _("{STR_VAR_1} has no evolution."); static const u8 sText_FORMS_Buttons_PE[] = _("{A_BUTTON}FORM MODE {START_BUTTON}EVOs"); @@ -596,7 +562,7 @@ static void PrintStatsScreen_Moves_Bottom(u8 taskId); static void PrintStatsScreen_Left(u8 taskId); static void PrintStatsScreen_Abilities(u8 taskId); static void PrintInfoScreenTextWhite(const u8* str, u8 left, u8 top); -static void PrintInfoScreenTextSmall(const u8* str, u8 left, u8 top); +static void PrintInfoScreenTextSmall(const u8* str, u8 fontId, u8 left, u8 top); static void PrintInfoScreenTextSmallWhite(const u8* str, u8 left, u8 top); static void Task_LoadEvolutionScreen(u8 taskId); static void Task_HandleEvolutionScreenInput(u8 taskId); @@ -2656,7 +2622,7 @@ static void PrintMonDexNumAndName_2(u8 windowId, u8 fontId, const u8* str, u8 le color[0] = TEXT_COLOR_TRANSPARENT; color[1] = TEXT_DYNAMIC_COLOR_6; color[2] = TEXT_COLOR_LIGHT_GRAY; - AddTextPrinterParameterized4(windowId, fontId, left * 8 - 13, (top * 8) + 1, 0, 0, color, -1, str); + AddTextPrinterParameterized4(windowId, fontId, left * 8 - 13, (top * 8) + 1, 0, 0, color, TEXT_SKIP_DRAW, str); } // u16 ignored is passed but never used @@ -4252,12 +4218,6 @@ static void SpriteCB_SlideCaughtMonToCenter(struct Sprite *sprite) #undef tPersonalityLo #undef tPersonalityHi - - - - - - //************************************ //* * //* Print data * @@ -4281,14 +4241,14 @@ static void PrintInfoScreenTextWhite(const u8* str, u8 left, u8 top) AddTextPrinterParameterized4(0, FONT_NORMAL, left, top, 0, 0, color, TEXT_SKIP_DRAW, str); } -static void PrintInfoScreenTextSmall(const u8* str, u8 left, u8 top) +static void PrintInfoScreenTextSmall(const u8* str, u8 fontId, u8 left, u8 top) { u8 color[3]; color[0] = TEXT_COLOR_TRANSPARENT; color[1] = TEXT_DYNAMIC_COLOR_6; color[2] = TEXT_COLOR_LIGHT_GRAY; - AddTextPrinterParameterized4(0, 0, left, top, 0, 0, color, 0, str); + AddTextPrinterParameterized4(0, fontId, left, top, 0, 0, color, 0, str); } static void UNUSED PrintInfoScreenTextSmallWhite(const u8* str, u8 left, u8 top) { @@ -6217,7 +6177,7 @@ static void HandleTargetSpeciesPrintText(u32 targetSpecies, u32 base_x, u32 base else StringCopy(gStringVar3, gText_ThreeQuestionMarks); //show questionmarks instead of name StringExpandPlaceholders(gStringVar3, sText_EVO_Name); //evolution mon name - PrintInfoScreenTextSmall(gStringVar3, base_x, base_y + base_y_offset*base_i); //evolution mon name + PrintInfoScreenTextSmall(gStringVar3, FONT_SMALL, base_x, base_y + base_y_offset*base_i); //evolution mon name } static void HandleTargetSpeciesPrintIcon(u8 taskId, u16 targetSpecies, u8 base_i, u8 iterations) @@ -6239,7 +6199,7 @@ static void CreateCaughtBallEvolutionScreen(u16 targetSpecies, u8 x, u8 y, u16 u else { //FillWindowPixelRect(0, PIXEL_FILL(0), x, y, 8, 16); //not sure why this was even here - PrintInfoScreenTextSmall(gText_OneDash, x+1, y-1); + PrintInfoScreenTextSmall(gText_OneDash, FONT_SMALL, x+1, y-1); } } @@ -6263,7 +6223,7 @@ static void HandlePreEvolutionSpeciesPrint(u8 taskId, u16 preSpecies, u16 specie } - PrintInfoScreenTextSmall(gStringVar3, base_x, base_y + base_y_offset*base_i); //evolution mon name + PrintInfoScreenTextSmall(gStringVar3, FONT_SMALL, base_x, base_y + base_y_offset*base_i); //evolution mon name if (base_i < 3) { @@ -6388,11 +6348,8 @@ static u8 PrintPreEvolutions(u8 taskId, u16 species) static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 depth, u32 *depth_i, u32 alreadyPrintedIcons[], u32 *icon_depth_i) { int i; - const struct MapHeader *mapHeader; + //const struct MapHeader *mapHeader; u16 targetSpecies = 0; - - u16 item; - bool8 left = TRUE; u8 base_x = 13+8; u8 base_x_offset = 54+8; @@ -6413,17 +6370,14 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept if (depth == 0) { StringExpandPlaceholders(gStringVar4, sText_EVO_NONE); - PrintInfoScreenTextSmall(gStringVar4, base_x-7-7, base_y + base_y_offset*(*depth_i)); + PrintInfoScreenTextSmall(gStringVar4, FONT_SMALL, base_x-7-7, base_y + base_y_offset*(*depth_i)); } return; } //Calculate number of possible direct evolutions (e.g. Eevee has 5 but torchic has 1) for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) - { - if (evolutions[i].method != 0) - times += 1; - } + times += 1; gTasks[taskId].data[3] = times; sPokedexView->sEvoScreenData.numAllEvolutions += times; @@ -6451,47 +6405,37 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept } } - switch (evolutions[i].method) + switch ((enum EvolutionMethods)evolutions[i].method) { - case EVO_FRIENDSHIP: - ConvertIntToDecimalStringN(gStringVar2, 220, STR_CONV_MODE_LEADING_ZEROS, 3); //friendship value - StringExpandPlaceholders(gStringVar4, sText_EVO_FRIENDSHIP ); - break; - case EVO_FRIENDSHIP_DAY: - StringExpandPlaceholders(gStringVar4, sText_EVO_FRIENDSHIP_DAY ); - break; - case EVO_FRIENDSHIP_NIGHT: - StringExpandPlaceholders(gStringVar4, sText_EVO_FRIENDSHIP_NIGHT ); + case EVO_SCRIPT_TRIGGER: + case EVO_LEVEL_BATTLE_ONLY: + case EVO_NONE: + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Unknown")); break; case EVO_LEVEL: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL ); + StringCopy(gStringVar4, COMPOUND_STRING("{LV}{UP_ARROW}")); + if (evolutions[i].param > 1) + { + StringAppend(gStringVar4, COMPOUND_STRING(" to ")); + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEFT_ALIGN, EVO_SCREEN_LVL_DIGITS); //level + StringAppend(gStringVar4, gStringVar2); + } break; case EVO_TRADE: - StringExpandPlaceholders(gStringVar4, sText_EVO_TRADE ); - break; - case EVO_TRADE_ITEM: - item = evolutions[i].param; //item - CopyItemName(item, gStringVar2); //item - StringExpandPlaceholders(gStringVar4, sText_EVO_TRADE_ITEM ); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Trading")); break; case EVO_ITEM: - item = evolutions[i].param; - CopyItemName(item, gStringVar2); - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM ); - break; - case EVO_LEVEL_ATK_GT_DEF: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ATK_GT_DEF ); + CopyItemName(evolutions[i].param, gStringVar2); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("{STR_VAR_2} is used")); break; - case EVO_LEVEL_ATK_EQ_DEF: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ATK_EQ_DEF ); + case EVO_SPLIT_FROM_EVO: + StringCopy(gStringVar4, COMPOUND_STRING("Splits from ")); + StringAppend(gStringVar4, GetSpeciesName(evolutions[i].param)); //mon name break; - case EVO_LEVEL_ATK_LT_DEF: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ATK_LT_DEF ); + case EVO_BATTLE_END: + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("End battle")); break; + /* case EVO_LEVEL_SILCOON: ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_SILCOON ); @@ -6500,98 +6444,18 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_CASCOON ); break; - case EVO_LEVEL_NINJASK: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_NINJASK ); - break; - case EVO_LEVEL_SHEDINJA: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_SHEDINJA ); - break; - case EVO_BEAUTY: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, 3); //beauty - StringExpandPlaceholders(gStringVar4, sText_EVO_BEAUTY ); - break; - case EVO_LEVEL_FEMALE: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_FEMALE ); - break; - case EVO_LEVEL_MALE: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_MALE ); - break; - case EVO_LEVEL_NIGHT: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_NIGHT ); - break; - case EVO_LEVEL_DAY: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_DAY ); - break; - case EVO_LEVEL_DUSK: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_DUSK ); - break; - case EVO_ITEM_HOLD_DAY: - item = evolutions[i].param; //item - CopyItemName(item, gStringVar2); //item - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM_HOLD_DAY ); - break; - case EVO_ITEM_HOLD_NIGHT: - item = evolutions[i].param; //item - CopyItemName(item, gStringVar2); //item - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM_HOLD_NIGHT ); - break; case EVO_MOVE: StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); StringExpandPlaceholders(gStringVar4, sText_EVO_MOVE ); break; - case EVO_FRIENDSHIP_MOVE_TYPE: - StringCopy(gStringVar2, gTypesInfo[evolutions[i].param].name); - StringExpandPlaceholders(gStringVar4, sText_EVO_FRIENDSHIP_MOVE_TYPE ); - break; - case EVO_MAPSEC: - StringCopy(gStringVar2, gRegionMapEntries[evolutions[i].param].name); - StringExpandPlaceholders(gStringVar4, sText_EVO_MAPSEC ); - break; - case EVO_ITEM_MALE: - item = evolutions[i].param; //item - CopyItemName(item, gStringVar2); //item - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM_MALE ); - break; - case EVO_ITEM_FEMALE: - item = evolutions[i].param; //item - CopyItemName(item, gStringVar2); //item - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM_FEMALE ); - break; case EVO_LEVEL_RAIN: //if (j == WEATHER_RAIN || j == WEATHER_RAIN_THUNDERSTORM || j == WEATHER_DOWNPOUR) StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_RAIN ); break; - case EVO_SPECIFIC_MON_IN_PARTY: - StringCopy(gStringVar2, GetSpeciesName(evolutions[i].param)); //mon name - StringExpandPlaceholders(gStringVar4, sText_EVO_SPECIFIC_MON_IN_PARTY ); - break; - case EVO_LEVEL_DARK_TYPE_MON_IN_PARTY: - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_DARK_TYPE_MON_IN_PARTY ); - break; case EVO_TRADE_SPECIFIC_MON: StringCopy(gStringVar2, GetSpeciesName(evolutions[i].param)); //mon name StringExpandPlaceholders(gStringVar4, sText_EVO_TRADE_SPECIFIC_MON ); break; - case EVO_SPECIFIC_MAP: - mapHeader = Overworld_GetMapHeaderByGroupAndId(evolutions[i].param >> 8, evolutions[i].param & 0xFF); - GetMapName(gStringVar2, mapHeader->regionMapSectionId, 0); - StringExpandPlaceholders(gStringVar4, sText_EVO_SPECIFIC_MAP ); - break; - case EVO_LEVEL_NATURE_AMPED: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_NATURE_AMPED); - break; - case EVO_LEVEL_NATURE_LOW_KEY: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_NATURE_LOW_KEY); - break; case EVO_CRITICAL_HITS: ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_CRITS_DIGITS); //crits StringExpandPlaceholders(gStringVar4, sText_EVO_CRITICAL_HITS); @@ -6610,21 +6474,6 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept CopyItemName(item, gStringVar2); StringExpandPlaceholders(gStringVar4, sText_EVO_WATER_SCROLL ); break; - case EVO_ITEM_NIGHT: - item = evolutions[i].param; - CopyItemName(item, gStringVar2); - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM_NIGHT ); - break; - case EVO_ITEM_DAY: - item = evolutions[i].param; - CopyItemName(item, gStringVar2); - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM_DAY ); - break; - case EVO_ITEM_HOLD: - item = evolutions[i].param; - CopyItemName(item, gStringVar2); - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM_HOLD ); - break; case EVO_USE_MOVE_TWENTY_TIMES: StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); StringExpandPlaceholders(gStringVar4, sText_EVO_USE_MOVE_TWENTY_TIMES ); @@ -6637,26 +6486,159 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, 3); StringExpandPlaceholders(gStringVar4, sText_EVO_RECOIL_DAMAGE_FEMALE); break; - case EVO_ITEM_COUNT_999: - item = evolutions[i].param; - CopyItemName(item, gStringVar2); - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM_COUNT_999); - break; case EVO_DEFEAT_THREE_WITH_ITEM: item = evolutions[i].param; CopyItemName(item, gStringVar2); StringCopy(gStringVar3, GetSpeciesName(species)); StringExpandPlaceholders(gStringVar4, sText_EVO_DEFEAT_THREE_WITH_ITEM); break; - case EVO_OVERWORLD_STEPS: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, 4); - StringExpandPlaceholders(gStringVar4, sText_EVO_OVERWORLD_STEPS); - break; - default: - StringExpandPlaceholders(gStringVar4, sText_EVO_UNKNOWN); - break; + */ }//Switch end - PrintInfoScreenTextSmall(gStringVar4, base_x + depth_x*depth+base_x_offset, base_y + base_y_offset*(*depth_i)); //Print actual instructions + + // Check for additional conditions. Skips if there's no additional conditions. + for (j = 0; evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) + { + switch((enum EvolutionConditions)evolutions[i].params[j].condition) + { + // Gen 2 + case IF_GENDER: + switch(evolutions[i].params[j].arg1) + { + case MON_MALE: StringAppend(gStringVar4, COMPOUND_STRING(", Male")); break; + case MON_FEMALE: StringAppend(gStringVar4, COMPOUND_STRING(", Female")); break; + } + break; + case IF_MIN_FRIENDSHIP: + StringAppend(gStringVar4, COMPOUND_STRING(", high friendship")); + break; + case IF_ATK_GT_DEF: + StringAppend(gStringVar4, COMPOUND_STRING(", Atk > Def")); + break; + case IF_ATK_EQ_DEF: + StringAppend(gStringVar4, COMPOUND_STRING(", Atk = Def")); + break; + case IF_ATK_LT_DEF: + StringAppend(gStringVar4, COMPOUND_STRING(", Atk < Def")); + break; + case IF_TIME: + switch(evolutions[i].params[j].arg1) + { + case TIME_MORNING: StringAppend(gStringVar4, COMPOUND_STRING(", Morning")); break; + case TIME_DAY: StringAppend(gStringVar4, COMPOUND_STRING(", Day")); break; + case TIME_EVENING: StringAppend(gStringVar4, COMPOUND_STRING(", Evening")); break; + case TIME_NIGHT: StringAppend(gStringVar4, COMPOUND_STRING(", Night")); break; + } + break; + case IF_NOT_TIME: + switch(evolutions[i].params[j].arg1) + { + case TIME_MORNING: StringAppend(gStringVar4, COMPOUND_STRING(", NOT Morning")); break; + case TIME_DAY: StringAppend(gStringVar4, COMPOUND_STRING(", NOT Day")); break; + case TIME_EVENING: StringAppend(gStringVar4, COMPOUND_STRING(", NOT Evening")); break; + case TIME_NIGHT: StringAppend(gStringVar4, COMPOUND_STRING(", Day")); break; // More intuitive than "NOT Night" + } + break; + case IF_HOLD_ITEM: + StringAppend(gStringVar4, COMPOUND_STRING(", holds ")); + CopyItemName(evolutions[i].params[j].arg1, gStringVar2); //item + StringAppend(gStringVar4, gStringVar2); + break; + // Gen 3 + case IF_PID_UPPER_MODULO_10_GT: + case IF_PID_UPPER_MODULO_10_LE: + StringAppend(gStringVar4, COMPOUND_STRING(", ")); + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1 * 10, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING("% at random")); + break; + case IF_MIN_BEAUTY: + StringAppend(gStringVar4, COMPOUND_STRING(", high beauty")); + break; + // Gen 4 + case IF_SPECIES_IN_PARTY: + StringAppend(gStringVar4, COMPOUND_STRING(", ")); + StringAppend(gStringVar4, GetSpeciesName(evolutions[i].params[j].arg1)); //mon name + StringAppend(gStringVar4, COMPOUND_STRING(" in party")); + break; + case IF_IN_MAPSEC: + StringAppend(gStringVar4, COMPOUND_STRING(" in ")); + StringCopy(gStringVar2, gRegionMapEntries[evolutions[i].params[j].arg1].name); + StringAppend(gStringVar4, gStringVar2); + break; + case IF_IN_MAP: + StringAppend(gStringVar4, COMPOUND_STRING(" in ")); + GetMapName(gStringVar2, Overworld_GetMapHeaderByGroupAndId(evolutions[i].params[j].arg1 >> 8, evolutions[i].params[j].arg1 & 0xFF)->regionMapSectionId, 0); + StringAppend(gStringVar4, gStringVar2); + break; + case IF_KNOWS_MOVE: + break; + // Gen 5 + case IF_TRADE_PARTNER_SPECIES: + break; + // Gen 6 + case IF_TYPE_IN_PARTY: + StringAppend(gStringVar4, COMPOUND_STRING(", ")); + StringAppend(gStringVar4, gTypesInfo[evolutions[i].params[j].arg1].name); //type name + StringAppend(gStringVar4, COMPOUND_STRING("-type in party")); + break; + case IF_WEATHER: + break; + case IF_KNOWS_MOVE_TYPE: + StringAppend(gStringVar4, COMPOUND_STRING(", ")); + StringAppend(gStringVar4, gTypesInfo[evolutions[i].params[j].arg1].name); + StringAppend(gStringVar4, COMPOUND_STRING(" move")); + break; + // Gen 8 + case IF_NATURE: + StringAppend(gStringVar4, COMPOUND_STRING(", ")); + StringCopy(gStringVar2, gNaturesInfo[evolutions[i].params[j].arg1].name); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" nature")); + break; + case IF_AMPED_NATURE: + StringAppend(gStringVar4, COMPOUND_STRING(", Amped natures")); + break; + case IF_LOW_KEY_NATURE: + StringAppend(gStringVar4, COMPOUND_STRING(", Low-Key natures")); + break; + case IF_RECOIL_DAMAGE_GE: + break; + case IF_CURRENT_DAMAGE_GE: + break; + case IF_CRITICAL_HITS_GE: + break; + case IF_USED_MOVE_X_TIMES: + break; + // Gen 9 + case IF_DEFEAT_X_WITH_ITEMS: + break; + case IF_PID_MODULO_100_GT: + break; + case IF_PID_MODULO_100_EQ: + break; + case IF_PID_MODULO_100_LT: + break; + case IF_MIN_OVERWORLD_STEPS: + StringAppend(gStringVar4, COMPOUND_STRING(", after ")); + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg1, STR_CONV_MODE_LEFT_ALIGN, 4); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" steps")); + break; + case IF_BAG_ITEM_COUNT: + StringAppend(gStringVar4, COMPOUND_STRING(", ")); + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].params[j].arg2, STR_CONV_MODE_LEFT_ALIGN, 3); + StringAppend(gStringVar4, gStringVar2); + StringAppend(gStringVar4, COMPOUND_STRING(" ")); + CopyItemNameHandlePlural(evolutions[i].params[j].arg1, gStringVar2, evolutions[i].params[j].arg2); + StringAppend(gStringVar4, gStringVar2); + break; + case CONDITIONS_END: + break; + } + } + + StringAppend(gStringVar4, COMPOUND_STRING(".")); + PrintInfoScreenTextSmall(gStringVar4, GetFontIdToFit(gStringVar4, FONT_SMALL, 0, 137), base_x + depth_x*depth+base_x_offset, base_y + base_y_offset*(*depth_i)); //Print actual instructions (*depth_i)++; PrintEvolutionTargetSpeciesAndMethod(taskId, targetSpecies, depth+1, depth_i, alreadyPrintedIcons, icon_depth_i); @@ -6967,7 +6949,7 @@ static void PrintForms(u8 taskId, u16 species) if (times == 0) { StringExpandPlaceholders(gStringVar4, sText_FORMS_NONE); - PrintInfoScreenTextSmall(gStringVar4, base_x, base_y + base_y_offset*times); + PrintInfoScreenTextSmall(gStringVar4, FONT_SMALL, base_x, base_y + base_y_offset*times); } } diff --git a/src/pokemon.c b/src/pokemon.c index e9acd576ecb..828e86268e8 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4040,11 +4040,12 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov case 7: // ITEM4_EVO_STONE { - u16 targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_ITEM_USE, item, NULL); + bool32 canStopEvo = TRUE; + u32 targetSpecies = GetEvolutionTargetSpecies(mon, EVO_MODE_ITEM_USE, item, NULL, &canStopEvo); if (targetSpecies != SPECIES_NONE) { - BeginEvolutionScene(mon, targetSpecies, FALSE, partyIndex); + BeginEvolutionScene(mon, targetSpecies, canStopEvo, partyIndex); return FALSE; } } @@ -4432,25 +4433,25 @@ u32 GetGMaxTargetSpecies(u32 species) return species; } -u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner) +bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, struct Pokemon *tradePartner, u32 partyId, bool32 *canStopEvo) { - int i, j; - u16 targetSpecies = SPECIES_NONE; - u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); - u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + u32 i, j; + u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); + u32 gender = GetMonGender(mon); + u32 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + u32 attack = GetMonData(mon, MON_DATA_ATK, 0); + u32 defense = GetMonData(mon, MON_DATA_DEF, 0); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - u8 level; - u16 friendship; - u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); u16 upperPersonality = personality >> 16; - u32 holdEffect, currentMap, partnerSpecies, partnerHeldItem, partnerHoldEffect; - bool32 consumeItem = FALSE; - u16 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); - const struct Evolution *evolutions = GetSpeciesEvolutions(species); - - if (evolutions == NULL) - return SPECIES_NONE; - + u32 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); + u32 weather = GetCurrentWeather(); + u32 nature = GetNature(mon); + bool32 removeHoldItem = FALSE; + u32 removeBagItem = ITEM_NONE; + u32 removeBagItemCount = 0; + u32 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); + + u32 partnerSpecies, partnerHeldItem, partnerHoldEffect; if (tradePartner != NULL) { partnerSpecies = GetMonData(tradePartner, MON_DATA_SPECIES, 0); @@ -4472,6 +4473,243 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 partnerHoldEffect = HOLD_EFFECT_NONE; } + // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. + for (i = 0; params != NULL && params[i].condition != CONDITIONS_END; i++) + { + enum EvolutionConditions condition = params[i].condition; + u32 currentCondition = FALSE; + switch(condition) + { + // Gen 2 + case IF_GENDER: + if (gender == GetMonGender(mon)) + currentCondition = TRUE; + break; + case IF_MIN_FRIENDSHIP: + if (friendship >= params[i].arg1) + currentCondition = TRUE; + break; + case IF_ATK_GT_DEF: + if (attack > defense) + currentCondition = TRUE; + break; + case IF_ATK_EQ_DEF: + if (attack == defense) + currentCondition = TRUE; + break; + case IF_ATK_LT_DEF: + if (attack < defense) + currentCondition = TRUE; + break; + case IF_TIME: + if (GetTimeOfDay() == params[i].arg1) + currentCondition = TRUE; + break; + case IF_NOT_TIME: + if (GetTimeOfDay() != params[i].arg1) + currentCondition = TRUE; + break; + case IF_HOLD_ITEM: + if (heldItem == params[i].arg1) + { + currentCondition = TRUE; + removeHoldItem = TRUE; + } + break; + // Gen 3 + case IF_PID_UPPER_MODULO_10_GT: + if ((upperPersonality % 10) > params[i].arg1) + currentCondition = TRUE; + break; + case IF_PID_UPPER_MODULO_10_LE: + if ((upperPersonality % 10) <= params[i].arg1) + currentCondition = TRUE; + break; + case IF_MIN_BEAUTY: + if (beauty >= params[i].arg1) + currentCondition = TRUE; + break; + // Gen 4 + case IF_SPECIES_IN_PARTY: + for (j = 0; j < PARTY_SIZE; j++) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL) == params[i].arg1) + { + currentCondition = TRUE; + break; + } + } + break; + case IF_IN_MAP: + if (params[i].arg1 == ((gSaveBlock1Ptr->location.mapGroup) << 8 | gSaveBlock1Ptr->location.mapNum)) + currentCondition = TRUE; + break; + case IF_IN_MAPSEC: + if (gMapHeader.regionMapSectionId == params[i].arg1) + currentCondition = TRUE; + break; + case IF_KNOWS_MOVE: + if (MonKnowsMove(mon, params[i].arg1)) + currentCondition = TRUE; + break; + // Gen 5 + case IF_TRADE_PARTNER_SPECIES: + if (params[i].arg1 == partnerSpecies && partnerHoldEffect != HOLD_EFFECT_PREVENT_EVOLVE) + currentCondition = TRUE; + break; + // Gen 6 + case IF_TYPE_IN_PARTY: + for (j = 0; j < PARTY_SIZE; j++) + { + u16 currSpecies = GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL); + if (gSpeciesInfo[currSpecies].types[0] == params[i].arg1 + || gSpeciesInfo[currSpecies].types[1] == params[i].arg1) + { + currentCondition = TRUE; + break; + } + } + break; + case IF_WEATHER: + if (weather == params[i].arg1) + currentCondition = TRUE; + break; + case IF_KNOWS_MOVE_TYPE: + for (j = 0; j < MAX_MON_MOVES; j++) + { + if (GetMoveType(GetMonData(mon, MON_DATA_MOVE1 + j, NULL)) == params[i].arg1) + { + currentCondition = TRUE; + break; + } + } + break; + // Gen 8 + case IF_NATURE: + if (nature == params[i].arg1) + currentCondition = TRUE; + break; + case IF_AMPED_NATURE: + switch (nature) + { + case NATURE_HARDY: + case NATURE_BRAVE: + case NATURE_ADAMANT: + case NATURE_NAUGHTY: + case NATURE_DOCILE: + case NATURE_IMPISH: + case NATURE_LAX: + case NATURE_HASTY: + case NATURE_JOLLY: + case NATURE_NAIVE: + case NATURE_RASH: + case NATURE_SASSY: + case NATURE_QUIRKY: + currentCondition = TRUE; + break; + } + break; + case IF_LOW_KEY_NATURE: + switch (nature) + { + case NATURE_LONELY: + case NATURE_BOLD: + case NATURE_RELAXED: + case NATURE_TIMID: + case NATURE_SERIOUS: + case NATURE_MODEST: + case NATURE_MILD: + case NATURE_QUIET: + case NATURE_BASHFUL: + case NATURE_CALM: + case NATURE_GENTLE: + case NATURE_CAREFUL: + currentCondition = TRUE; + break; + } + break; + case IF_RECOIL_DAMAGE_GE: + if (evolutionTracker >= params[i].arg1) + currentCondition = TRUE; + break; + case IF_CURRENT_DAMAGE_GE: + { + u32 currentHp = GetMonData(mon, MON_DATA_HP, NULL); + if (currentHp != 0 && (GetMonData(mon, MON_DATA_MAX_HP, NULL) - currentHp >= params[i].arg1)) + currentCondition = TRUE; + break; + } + case IF_CRITICAL_HITS_GE: + if (partyId != PARTY_SIZE && gPartyCriticalHits[partyId] >= params[i].arg1) + currentCondition = TRUE; + break; + case IF_USED_MOVE_X_TIMES: + if (evolutionTracker >= params[i].arg2) + currentCondition = TRUE; + // Gen 9 + case IF_DEFEAT_X_WITH_ITEMS: + if (evolutionTracker >= params[i].arg3) + currentCondition = TRUE; + break; + case IF_PID_MODULO_100_GT: + if ((personality % 100) > params[i].arg1) + currentCondition = TRUE; + break; + case IF_PID_MODULO_100_EQ: + if ((personality % 100) == params[i].arg1) + currentCondition = TRUE; + break; + case IF_PID_MODULO_100_LT: + if ((personality % 100) < params[i].arg1) + currentCondition = TRUE; + break; + case IF_MIN_OVERWORLD_STEPS: + if (mon == GetFirstLiveMon() && gFollowerSteps >= params[i].arg1) + currentCondition = TRUE; + break; + case IF_BAG_ITEM_COUNT: + if (CheckBagHasItem(params[i].arg1, params[i].arg2)) + { + currentCondition = TRUE; + removeBagItem = params[i].arg1; + removeBagItemCount = params[i].arg2; + if (canStopEvo != NULL) + *canStopEvo = FALSE; + } + break; + case CONDITIONS_END: + break; + } + if (currentCondition == FALSE) + return FALSE; + } + // All conditions passed. Consume hold and bag items. + if (removeHoldItem) + { + heldItem = ITEM_NONE; + SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem); + } + if (removeBagItem != ITEM_NONE) + { + RemoveBagItem(removeBagItem, removeBagItemCount); + } + + return TRUE; +} + +u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner, bool32 *canStopEvo) +{ + int i; + u32 targetSpecies = SPECIES_NONE; + u32 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); + u32 level = GetMonData(mon, MON_DATA_LEVEL, 0); + u32 holdEffect; + const struct Evolution *evolutions = GetSpeciesEvolutions(species); + + if (evolutions == NULL) + return SPECIES_NONE; + if (heldItem == ITEM_ENIGMA_BERRY_E_READER) #if FREE_ENIGMA_BERRY == FALSE holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; @@ -4491,270 +4729,31 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 { case EVO_MODE_NORMAL: case EVO_MODE_BATTLE_ONLY: - level = GetMonData(mon, MON_DATA_LEVEL, 0); - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) { + bool32 conditionsMet = FALSE; if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) continue; + // Check main primary evolution method switch (evolutions[i].method) { - case EVO_FRIENDSHIP: - if (friendship >= FRIENDSHIP_EVO_THRESHOLD) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_FRIENDSHIP_DAY: - if (GetTimeOfDay() != TIME_NIGHT && friendship >= FRIENDSHIP_EVO_THRESHOLD) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_DAY: - if (GetTimeOfDay() != TIME_NIGHT && evolutions[i].param <= level) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_FRIENDSHIP_NIGHT: - if (GetTimeOfDay() == TIME_NIGHT && friendship >= FRIENDSHIP_EVO_THRESHOLD) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_NIGHT: - if (GetTimeOfDay() == TIME_NIGHT && evolutions[i].param <= level) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_ITEM_HOLD_NIGHT: - if (GetTimeOfDay() == TIME_NIGHT && heldItem == evolutions[i].param) - { - targetSpecies = evolutions[i].targetSpecies; - consumeItem = TRUE; - } - break; - case EVO_ITEM_HOLD_DAY: - if (GetTimeOfDay() != TIME_NIGHT && heldItem == evolutions[i].param) - { - targetSpecies = evolutions[i].targetSpecies; - consumeItem = TRUE; - } - break; - case EVO_LEVEL_DUSK: - if (GetTimeOfDay() == TIME_EVENING && evolutions[i].param <= level) - targetSpecies = evolutions[i].targetSpecies; - break; case EVO_LEVEL: if (evolutions[i].param <= level) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_FEMALE: - if (evolutions[i].param <= level && GetMonGender(mon) == MON_FEMALE) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_MALE: - if (evolutions[i].param <= level && GetMonGender(mon) == MON_MALE) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_ATK_GT_DEF: - if (evolutions[i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) > GetMonData(mon, MON_DATA_DEF, 0)) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_ATK_EQ_DEF: - if (evolutions[i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) == GetMonData(mon, MON_DATA_DEF, 0)) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_ATK_LT_DEF: - if (evolutions[i].param <= level) - if (GetMonData(mon, MON_DATA_ATK, 0) < GetMonData(mon, MON_DATA_DEF, 0)) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_SILCOON: - if (evolutions[i].param <= level && (upperPersonality % 10) <= 4) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_CASCOON: - if (evolutions[i].param <= level && (upperPersonality % 10) > 4) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_NINJASK: - if (evolutions[i].param <= level) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_FAMILY_OF_FOUR: - if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level && (personality % 100) != 0) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_FAMILY_OF_THREE: - if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level && (personality % 100) == 0) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_BEAUTY: - if (evolutions[i].param <= beauty) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_MOVE: - if (MonKnowsMove(mon, evolutions[i].param)) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_MOVE_TWO_SEGMENT: - if (MonKnowsMove(mon, evolutions[i].param) && (personality % 100) != 0) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_MOVE_THREE_SEGMENT: - if (MonKnowsMove(mon, evolutions[i].param) && (personality % 100) == 0) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_FRIENDSHIP_MOVE_TYPE: - if (friendship >= FRIENDSHIP_EVO_THRESHOLD) - { - for (j = 0; j < MAX_MON_MOVES; j++) - { - if (GetMoveType(GetMonData(mon, MON_DATA_MOVE1 + j, NULL)) == evolutions[i].param) - { - targetSpecies = evolutions[i].targetSpecies; - break; - } - } - } - break; - case EVO_SPECIFIC_MON_IN_PARTY: - for (j = 0; j < PARTY_SIZE; j++) - { - if (GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL) == evolutions[i].param) - { - targetSpecies = evolutions[i].targetSpecies; - break; - } - } - break; - case EVO_LEVEL_DARK_TYPE_MON_IN_PARTY: - if (evolutions[i].param <= level) - { - for (j = 0; j < PARTY_SIZE; j++) - { - u16 currSpecies = GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL); - if (gSpeciesInfo[currSpecies].types[0] == TYPE_DARK - || gSpeciesInfo[currSpecies].types[1] == TYPE_DARK) - { - targetSpecies = evolutions[i].targetSpecies; - break; - } - } - } - break; - case EVO_LEVEL_RAIN: - j = GetCurrentWeather(); - if (evolutions[i].param <= level - && (j == WEATHER_RAIN || j == WEATHER_RAIN_THUNDERSTORM || j == WEATHER_DOWNPOUR)) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_FOG: - j = GetCurrentWeather(); - if (evolutions[i].param <= level - && (j == WEATHER_FOG_HORIZONTAL || j == WEATHER_FOG_DIAGONAL)) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_MAPSEC: - if (gMapHeader.regionMapSectionId == evolutions[i].param) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_SPECIFIC_MAP: - currentMap = ((gSaveBlock1Ptr->location.mapGroup) << 8 | gSaveBlock1Ptr->location.mapNum); - if (currentMap == evolutions[i].param) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_LEVEL_NATURE_AMPED: - if (evolutions[i].param <= level) - { - u8 nature = GetNature(mon); - switch (nature) - { - case NATURE_HARDY: - case NATURE_BRAVE: - case NATURE_ADAMANT: - case NATURE_NAUGHTY: - case NATURE_DOCILE: - case NATURE_IMPISH: - case NATURE_LAX: - case NATURE_HASTY: - case NATURE_JOLLY: - case NATURE_NAIVE: - case NATURE_RASH: - case NATURE_SASSY: - case NATURE_QUIRKY: - targetSpecies = evolutions[i].targetSpecies; - break; - } - } - break; - case EVO_LEVEL_NATURE_LOW_KEY: - if (evolutions[i].param <= level) - { - u8 nature = GetNature(mon); - switch (nature) - { - case NATURE_LONELY: - case NATURE_BOLD: - case NATURE_RELAXED: - case NATURE_TIMID: - case NATURE_SERIOUS: - case NATURE_MODEST: - case NATURE_MILD: - case NATURE_QUIET: - case NATURE_BASHFUL: - case NATURE_CALM: - case NATURE_GENTLE: - case NATURE_CAREFUL: - targetSpecies = evolutions[i].targetSpecies; - break; - } - } - break; - case EVO_ITEM_HOLD: - if (heldItem == evolutions[i].param) - { - targetSpecies = evolutions[i].targetSpecies; - consumeItem = TRUE; - } - break; - case EVO_USE_MOVE_TWENTY_TIMES: - if (evolutionTracker >= 20) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; - case EVO_RECOIL_DAMAGE_MALE: - if (evolutionTracker >= evolutions[i].param && GetMonGender(mon) == MON_MALE) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_RECOIL_DAMAGE_FEMALE: - if (evolutionTracker >= evolutions[i].param && GetMonGender(mon) == MON_FEMALE) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_DEFEAT_THREE_WITH_ITEM: - if (evolutionTracker >= 3) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_OVERWORLD_STEPS: - if (mon == GetFirstLiveMon() && gFollowerSteps >= evolutions[i].param) - targetSpecies = evolutions[i].targetSpecies; + case EVO_LEVEL_BATTLE_ONLY: + if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level) + conditionsMet = TRUE; break; } - } - break; - case EVO_MODE_CANT_STOP: - level = GetMonData(mon, MON_DATA_LEVEL, 0); - friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - - for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) - { - if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) - continue; - switch (evolutions[i].method) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, PARTY_SIZE, canStopEvo)) { - case EVO_ITEM_COUNT_999: - if (CheckBagHasItem(evolutions[i].param, 999)) - { - targetSpecies = evolutions[i].targetSpecies; - RemoveBagItem(evolutions[i].param, 999); - } + // All checks passed, so stop checking the rest of the evolutions. + // This is different from vanilla where the loop continues. + // If you have overlapping evolutions, put the ones you want to happen first on top of the list. + targetSpecies = evolutions[i].targetSpecies; break; } } @@ -4762,24 +4761,23 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 case EVO_MODE_TRADE: for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) { + bool32 conditionsMet = FALSE; if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) continue; switch (evolutions[i].method) { case EVO_TRADE: - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_TRADE_ITEM: - if (evolutions[i].param == heldItem) - { - targetSpecies = evolutions[i].targetSpecies; - consumeItem = TRUE; - } + conditionsMet = TRUE; break; - case EVO_TRADE_SPECIFIC_MON: - if (evolutions[i].param == partnerSpecies && partnerHoldEffect != HOLD_EFFECT_PREVENT_EVOLVE) - targetSpecies = evolutions[i].targetSpecies; + } + + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, tradePartner, PARTY_SIZE, canStopEvo)) + { + // All checks passed, so stop checking the rest of the evolutions. + // This is different from vanilla where the loop continues. + // If you have overlapping evolutions, put the ones you want to happen first on top of the list. + targetSpecies = evolutions[i].targetSpecies; break; } } @@ -4788,6 +4786,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 case EVO_MODE_ITEM_CHECK: for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) { + bool32 conditionsMet = FALSE; if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) continue; @@ -4795,23 +4794,18 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 { case EVO_ITEM: if (evolutions[i].param == evolutionItem) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_ITEM_FEMALE: - if (GetMonGender(mon) == MON_FEMALE && evolutions[i].param == evolutionItem) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; - case EVO_ITEM_MALE: - if (GetMonGender(mon) == MON_MALE && evolutions[i].param == evolutionItem) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_ITEM_NIGHT: - if (GetTimeOfDay() == TIME_NIGHT && evolutions[i].param == evolutionItem) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_ITEM_DAY: - if (GetTimeOfDay() != TIME_NIGHT && evolutions[i].param == evolutionItem) - targetSpecies = evolutions[i].targetSpecies; + } + + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, PARTY_SIZE, canStopEvo)) + { + // All checks passed, so stop checking the rest of the evolutions. + // This is different from vanilla where the loop continues. + // If you have overlapping evolutions, put the ones you want to happen first on top of the list. + targetSpecies = evolutions[i].targetSpecies; + if (canStopEvo != NULL) + *canStopEvo = FALSE; break; } } @@ -4820,14 +4814,23 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 case EVO_MODE_BATTLE_SPECIAL: for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) { + bool32 conditionsMet = FALSE; if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) continue; switch (evolutions[i].method) { - case EVO_CRITICAL_HITS: - if (gPartyCriticalHits[evolutionItem] >= evolutions[i].param) - targetSpecies = evolutions[i].targetSpecies; + case EVO_BATTLE_END: + conditionsMet = TRUE; + break; + } + + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, evolutionItem, canStopEvo)) + { + // All checks passed, so stop checking the rest of the evolutions. + // This is different from vanilla where the loop continues. + // If you have overlapping evolutions, put the ones you want to happen first on top of the list. + targetSpecies = evolutions[i].targetSpecies; break; } } @@ -4836,34 +4839,31 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 case EVO_MODE_OVERWORLD_SPECIAL: for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) { + bool32 conditionsMet = FALSE; if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) continue; switch (evolutions[i].method) { - case EVO_SCRIPT_TRIGGER_DMG: - { - u16 currentHp = GetMonData(mon, MON_DATA_HP, NULL); - if (evolutionItem == EVO_SCRIPT_TRIGGER_DMG - && currentHp != 0 - && (GetMonData(mon, MON_DATA_MAX_HP, NULL) - currentHp >= evolutions[i].param)) - targetSpecies = evolutions[i].targetSpecies; + case EVO_SCRIPT_TRIGGER: + if (gSpecialVar_0x8000 == evolutions[i].param) + conditionsMet = TRUE; break; } - case EVO_DARK_SCROLL: - if (evolutionItem == EVO_DARK_SCROLL) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_WATER_SCROLL: - if (evolutionItem == EVO_WATER_SCROLL) - targetSpecies = evolutions[i].targetSpecies; + + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, PARTY_SIZE, canStopEvo)) + { + // All checks passed, so stop checking the rest of the evolutions. + // This is different from vanilla where the loop continues. + // If you have overlapping evolutions, put the ones you want to happen first on top of the list. + targetSpecies = evolutions[i].targetSpecies; break; } } break; } - // Pikachu, Meowth, and Eevee cannot evolve if they have the + // Pikachu, Meowth, Eevee and Duraludon cannot evolve if they have the // Gigantamax Factor. We assume that is because their evolutions // do not have a Gigantamax Form. if (GetMonData(mon, MON_DATA_GIGANTAMAX_FACTOR, NULL) @@ -4873,12 +4873,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 return SPECIES_NONE; } - if (consumeItem) - { - heldItem = ITEM_NONE; - SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem); - } - return targetSpecies; } @@ -6700,13 +6694,12 @@ void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv) void TrySpecialOverworldEvo(void) { u8 i; - u8 evoMethod = gSpecialVar_0x8000; - u16 canStopEvo = gSpecialVar_0x8001; + bool32 canStopEvo = gSpecialVar_0x8001; u16 tryMultiple = gSpecialVar_0x8002; for (i = 0; i < PARTY_SIZE; i++) { - u16 targetSpecies = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_OVERWORLD_SPECIAL, evoMethod, SPECIES_NONE); + u32 targetSpecies = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_OVERWORLD_SPECIAL, 0, SPECIES_NONE, &canStopEvo); if (targetSpecies != SPECIES_NONE && !(sTriedEvolving & (1u << i))) { sTriedEvolving |= 1u << i; diff --git a/src/trade.c b/src/trade.c index 04b1977c17b..45f812996d5 100644 --- a/src/trade.c +++ b/src/trade.c @@ -3416,7 +3416,7 @@ enum { static bool8 DoTradeAnim_Cable(void) { - u16 evoTarget; + u32 evoTarget; switch (sTradeAnim->state) { @@ -3852,7 +3852,7 @@ static bool8 DoTradeAnim_Cable(void) case STATE_TRY_EVOLUTION: // Only if in-game trade, link trades use CB2_TryLinkTradeEvolution TradeMons(gSpecialVar_0x8005, 0); gCB2_AfterEvolution = CB2_InGameTrade; - evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE, &gPlayerParty[gSelectedTradeMonPositions[TRADE_PARTNER]]); + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE, &gPlayerParty[gSelectedTradeMonPositions[TRADE_PARTNER]], NULL); if (evoTarget != SPECIES_NONE) TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeAnim->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); sTradeAnim->state++; @@ -3889,7 +3889,7 @@ static bool8 DoTradeAnim_Cable(void) static bool8 DoTradeAnim_Wireless(void) { - u16 evoTarget; + u32 evoTarget; switch (sTradeAnim->state) { @@ -4349,7 +4349,7 @@ static bool8 DoTradeAnim_Wireless(void) case STATE_TRY_EVOLUTION: // Only if in-game trade, link trades use CB2_TryLinkTradeEvolution TradeMons(gSpecialVar_0x8005, 0); gCB2_AfterEvolution = CB2_InGameTrade; - evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE, &gPlayerParty[gSelectedTradeMonPositions[TRADE_PARTNER]]); + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE, &gPlayerParty[gSelectedTradeMonPositions[TRADE_PARTNER]], NULL); if (evoTarget != SPECIES_NONE) TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeAnim->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); sTradeAnim->state++; @@ -4383,7 +4383,7 @@ static bool8 DoTradeAnim_Wireless(void) // In-game trades resolve evolution during the trade sequence, in STATE_TRY_EVOLUTION static void CB2_TryLinkTradeEvolution(void) { - u16 evoTarget; + u32 evoTarget; switch (gMain.state) { case 0: @@ -4392,7 +4392,7 @@ static void CB2_TryLinkTradeEvolution(void) break; case 4: gCB2_AfterEvolution = CB2_SaveAndEndTrade; - evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE, &gPlayerParty[gSelectedTradeMonPositions[TRADE_PARTNER]]); + evoTarget = GetEvolutionTargetSpecies(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], EVO_MODE_TRADE, ITEM_NONE, &gPlayerParty[gSelectedTradeMonPositions[TRADE_PARTNER]], NULL); if (evoTarget != SPECIES_NONE) TradeEvolutionScene(&gPlayerParty[gSelectedTradeMonPositions[TRADE_PLAYER]], evoTarget, sTradeAnim->monSpriteIds[TRADE_PARTNER], gSelectedTradeMonPositions[TRADE_PLAYER]); else if (IsWirelessTrade()) diff --git a/test/species.c b/test/species.c index 2d702b6c453..3eb8c093955 100644 --- a/test/species.c +++ b/test/species.c @@ -98,10 +98,10 @@ TEST("Form change targets have the appropriate species flags") TEST("No species has two evolutions that use the evolution tracker") { - u32 i; + u32 i, j; u32 species = SPECIES_NONE; u32 evolutionTrackerEvolutions; - bool32 hasGenderBasedRecoil; + bool32 hasRecoilEvo; const struct Evolution *evolutions; for (i = 0; i < NUM_SPECIES; i++) @@ -110,24 +110,28 @@ TEST("No species has two evolutions that use the evolution tracker") } evolutionTrackerEvolutions = 0; - hasGenderBasedRecoil = FALSE; + hasRecoilEvo = FALSE; evolutions = GetSpeciesEvolutions(species); for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) { - if (evolutions[i].method == EVO_USE_MOVE_TWENTY_TIMES - || evolutions[i].method == EVO_DEFEAT_THREE_WITH_ITEM - ) - evolutionTrackerEvolutions++; - - if (evolutions[i].method == EVO_RECOIL_DAMAGE_MALE - || evolutions[i].method == EVO_RECOIL_DAMAGE_FEMALE) + if (evolutions[i].params == NULL) + continue; + for (j = 0; evolutions[i].params[j].condition != CONDITIONS_END; j++) { - // Special handling for these since they can be combined as the evolution tracker field is used for the same purpose - if (!hasGenderBasedRecoil) - { - hasGenderBasedRecoil = TRUE; + if (evolutions[i].params[j].condition == IF_USED_MOVE_X_TIMES + || evolutions[i].params[j].condition == IF_DEFEAT_X_WITH_ITEMS + ) evolutionTrackerEvolutions++; + + if (evolutions[i].params[j].condition == IF_RECOIL_DAMAGE_GE) + { + // Special handling for these since they can be combined as the evolution tracker field is used for the same purpose + if (!hasRecoilEvo) + { + hasRecoilEvo = TRUE; + evolutionTrackerEvolutions++; + } } } } @@ -148,4 +152,4 @@ TEST("Every species has a description") } EXPECT_NE(StringCompare(GetSpeciesPokedexDescription(species), gFallbackPokedexText), 0); -} +} \ No newline at end of file