From 62965de19ffd51a8e296e1cae7527e547e6988f6 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 7 Dec 2024 09:51:12 -0300 Subject: [PATCH 01/30] Initial version, gender condition --- include/constants/pokemon.h | 12 +- include/pokemon.h | 7 + src/battle_pyramid.c | 4 +- src/battle_script_commands.c | 16 +- src/data/pokemon/species_info.h | 1 + .../pokemon/species_info/gen_3_families.h | 4 +- .../pokemon/species_info/gen_4_families.h | 14 +- .../pokemon/species_info/gen_5_families.h | 4 +- .../pokemon/species_info/gen_6_families.h | 4 +- .../pokemon/species_info/gen_7_families.h | 2 +- .../pokemon/species_info/gen_9_families.h | 4 +- src/pokedex_plus_hgss.c | 6 + src/pokemon.c | 267 +++++++++++++----- test/species.c | 14 +- 14 files changed, 239 insertions(+), 120 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index ab0f6b845343..8cdd1729c092 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -245,6 +245,11 @@ #define EVOLUTIONS_END 0xFFFF // Not an actual evolution, used to mark the end of an evolution array. +enum EvolutionConditions { + IF_GENDER, // Pokémon is of specific gender + 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 @@ -262,8 +267,6 @@ enum EvolutionMethods { 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) @@ -272,8 +275,6 @@ enum EvolutionMethods { 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 @@ -294,8 +295,7 @@ enum EvolutionMethods { 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_RECOIL_DAMAGE, // Pokémon levels up after having suffered specified amount of non-fainting recoil damage 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 diff --git a/include/pokemon.h b/include/pokemon.h index 8a618f5fe119..68d645f22cc4 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -342,11 +342,18 @@ struct BattlePokemon /*0x5A*/ bool8 isShiny; }; +struct EvolutionParam +{ + u16 condition; + u16 arg; +}; + struct Evolution { u16 method; u16 param; u16 targetSpecies; + const struct EvolutionParam *params; }; struct SpeciesInfo /*0xC4*/ diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index a184c9160f1c..fd01a7d217c8 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 791ea1f68fcc..8cbd23f1ec73 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -17373,8 +17373,7 @@ static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount, u16 use 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: + case EVO_RECOIL_DAMAGE: if (gBattleMons[gBattlerAttacker].hp == 0) val = 0; SetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER, &val); @@ -17394,18 +17393,7 @@ 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(EVO_RECOIL_DAMAGE, gBattleStruct->moveDamage[gBattlerAttacker], MOVE_NONE); gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/data/pokemon/species_info.h b/src/data/pokemon/species_info.h index 864fdc529732..eb90686c4018 100644 --- a/src/data/pokemon/species_info.h +++ b/src/data/pokemon/species_info.h @@ -4,6 +4,7 @@ // Macros for ease of use. #define EVOLUTION(...) (const struct Evolution[]) { __VA_ARGS__, { EVOLUTIONS_END }, } +#define CONDITIONS(...) ((const struct EvolutionParam[]) { __VA_ARGS__, {CONDITIONS_END} }) #if P_FOOTPRINTS #define FOOTPRINT(sprite) .footprint = gMonFootprint_## sprite, diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index af1b4476d8f2..dae16696c358 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -2496,7 +2496,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] = @@ -9199,7 +9199,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] = diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index b84284de2905..b282c3e661ef 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -1685,8 +1685,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] = @@ -1752,8 +1752,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] = @@ -1819,8 +1819,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] = @@ -2155,7 +2155,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] = diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index 052b0f40c568..8a77205b7097 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -4038,8 +4038,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_RECOIL_DAMAGE, 294, SPECIES_BASCULEGION_M, CONDITIONS({IF_GENDER, MON_MALE})}, + {EVO_RECOIL_DAMAGE, 294, SPECIES_BASCULEGION_F, CONDITIONS({IF_GENDER, MON_FEMALE})}), }, [SPECIES_BASCULEGION_M] = diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 147fadbaf806..8eef5abbfc7a 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -2265,8 +2265,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] = diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index cb126fd171a4..96b9a1e656b0 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -3097,7 +3097,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}), }, diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index d617d36f1b0a..84b9f627287d 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -628,8 +628,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] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 74b57fa3a50b..ba9571b0bfa5 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6511,6 +6511,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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 ); @@ -6519,6 +6520,7 @@ 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_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 ); @@ -6553,6 +6555,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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 @@ -6563,6 +6566,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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 ); @@ -6628,6 +6632,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); StringExpandPlaceholders(gStringVar4, sText_EVO_USE_MOVE_TWENTY_TIMES ); break; + /* case EVO_RECOIL_DAMAGE_MALE: ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, 3); StringExpandPlaceholders(gStringVar4, sText_EVO_RECOIL_DAMAGE_MALE); @@ -6636,6 +6641,7 @@ 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); diff --git a/src/pokemon.c b/src/pokemon.c index 743f5b2771ed..414c39575763 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4500,111 +4500,105 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 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; + conditionsMet = TRUE; break; case EVO_FRIENDSHIP_DAY: if (GetTimeOfDay() != TIME_NIGHT && friendship >= FRIENDSHIP_EVO_THRESHOLD) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_LEVEL_DAY: if (GetTimeOfDay() != TIME_NIGHT && evolutions[i].param <= level) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_FRIENDSHIP_NIGHT: if (GetTimeOfDay() == TIME_NIGHT && friendship >= FRIENDSHIP_EVO_THRESHOLD) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_LEVEL_NIGHT: if (GetTimeOfDay() == TIME_NIGHT && evolutions[i].param <= level) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_ITEM_HOLD_NIGHT: if (GetTimeOfDay() == TIME_NIGHT && heldItem == evolutions[i].param) { - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; consumeItem = TRUE; } break; case EVO_ITEM_HOLD_DAY: if (GetTimeOfDay() != TIME_NIGHT && heldItem == evolutions[i].param) { - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; consumeItem = TRUE; } break; case EVO_LEVEL_DUSK: if (GetTimeOfDay() == TIME_EVENING && evolutions[i].param <= level) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; 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; + conditionsMet = TRUE; 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; + conditionsMet = TRUE; 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; + conditionsMet = TRUE; 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; + conditionsMet = TRUE; break; case EVO_LEVEL_SILCOON: if (evolutions[i].param <= level && (upperPersonality % 10) <= 4) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_LEVEL_CASCOON: if (evolutions[i].param <= level && (upperPersonality % 10) > 4) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_LEVEL_NINJASK: if (evolutions[i].param <= level) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_LEVEL_FAMILY_OF_FOUR: if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level && (personality % 100) != 0) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_LEVEL_FAMILY_OF_THREE: if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level && (personality % 100) == 0) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_BEAUTY: if (evolutions[i].param <= beauty) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_MOVE: if (MonKnowsMove(mon, evolutions[i].param)) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_MOVE_TWO_SEGMENT: if (MonKnowsMove(mon, evolutions[i].param) && (personality % 100) != 0) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_MOVE_THREE_SEGMENT: if (MonKnowsMove(mon, evolutions[i].param) && (personality % 100) == 0) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_FRIENDSHIP_MOVE_TYPE: if (friendship >= FRIENDSHIP_EVO_THRESHOLD) @@ -4613,7 +4607,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 { if (gMovesInfo[GetMonData(mon, MON_DATA_MOVE1 + j, NULL)].type == evolutions[i].param) { - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; } } @@ -4624,7 +4618,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 { if (GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL) == evolutions[i].param) { - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; } } @@ -4638,7 +4632,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (gSpeciesInfo[currSpecies].types[0] == TYPE_DARK || gSpeciesInfo[currSpecies].types[1] == TYPE_DARK) { - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; } } @@ -4648,22 +4642,22 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 j = GetCurrentWeather(); if (evolutions[i].param <= level && (j == WEATHER_RAIN || j == WEATHER_RAIN_THUNDERSTORM || j == WEATHER_DOWNPOUR)) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_LEVEL_FOG: j = GetCurrentWeather(); if (evolutions[i].param <= level && (j == WEATHER_FOG_HORIZONTAL || j == WEATHER_FOG_DIAGONAL)) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_MAPSEC: if (gMapHeader.regionMapSectionId == evolutions[i].param) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_SPECIFIC_MAP: currentMap = ((gSaveBlock1Ptr->location.mapGroup) << 8 | gSaveBlock1Ptr->location.mapNum); if (currentMap == evolutions[i].param) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_LEVEL_NATURE_AMPED: if (evolutions[i].param <= level) @@ -4684,7 +4678,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 case NATURE_RASH: case NATURE_SASSY: case NATURE_QUIRKY: - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; } } @@ -4707,7 +4701,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 case NATURE_CALM: case NATURE_GENTLE: case NATURE_CAREFUL: - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; } } @@ -4715,29 +4709,49 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 case EVO_ITEM_HOLD: if (heldItem == evolutions[i].param) { - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; consumeItem = TRUE; } break; case EVO_USE_MOVE_TWENTY_TIMES: if (evolutionTracker >= 20) - targetSpecies = evolutions[i].targetSpecies; - break; - case EVO_RECOIL_DAMAGE_MALE: - if (evolutionTracker >= evolutions[i].param && GetMonGender(mon) == MON_MALE) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; - case EVO_RECOIL_DAMAGE_FEMALE: - if (evolutionTracker >= evolutions[i].param && GetMonGender(mon) == MON_FEMALE) - targetSpecies = evolutions[i].targetSpecies; + case EVO_RECOIL_DAMAGE: + if (evolutionTracker >= evolutions[i].param) + conditionsMet = TRUE; break; case EVO_DEFEAT_THREE_WITH_ITEM: if (evolutionTracker >= 3) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_OVERWORLD_STEPS: if (mon == GetFirstLiveMon() && gFollowerSteps >= evolutions[i].param) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; + break; + } + + // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. + for (j = 0; conditionsMet == TRUE && evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) + { + u32 currentCondition = FALSE; + switch(evolutions[i].params[j].condition) + { + case IF_GENDER: + if (evolutions[i].params[j].arg == GetMonGender(mon)) + currentCondition = TRUE; + break; + } + if (currentCondition == FALSE) + conditionsMet = FALSE; + } + + if (conditionsMet) + { + // 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; } } @@ -4748,6 +4762,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) { + bool32 conditionsMet = FALSE; if (SanitizeSpeciesId(evolutions[i].targetSpecies) == SPECIES_NONE) continue; @@ -4756,34 +4771,83 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 case EVO_ITEM_COUNT_999: if (CheckBagHasItem(evolutions[i].param, 999)) { - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; RemoveBagItem(evolutions[i].param, 999); } break; } + + // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. + for (j = 0; conditionsMet == TRUE && evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) + { + u32 currentCondition = FALSE; + switch(evolutions[i].params[j].condition) + { + case IF_GENDER: + if (evolutions[i].params[j].arg == GetMonGender(mon)) + currentCondition = TRUE; + break; + } + if (currentCondition == FALSE) + conditionsMet = FALSE; + } + + if (conditionsMet) + { + // 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; 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; + conditionsMet = TRUE; break; case EVO_TRADE_ITEM: if (evolutions[i].param == heldItem) { - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; consumeItem = TRUE; } break; case EVO_TRADE_SPECIFIC_MON: if (evolutions[i].param == partnerSpecies && partnerHoldEffect != HOLD_EFFECT_PREVENT_EVOLVE) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; + break; + } + + // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. + for (j = 0; conditionsMet == TRUE && evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) + { + u32 currentCondition = FALSE; + switch(evolutions[i].params[j].condition) + { + case IF_GENDER: + if (evolutions[i].params[j].arg == GetMonGender(mon)) + currentCondition = TRUE; + break; + } + if (currentCondition == FALSE) + conditionsMet = FALSE; + } + + if (conditionsMet) + { + // 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; } } @@ -4792,6 +4856,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; @@ -4799,23 +4864,39 @@ 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; - break; - case EVO_ITEM_MALE: - if (GetMonGender(mon) == MON_MALE && evolutions[i].param == evolutionItem) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_ITEM_NIGHT: if (GetTimeOfDay() == TIME_NIGHT && evolutions[i].param == evolutionItem) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_ITEM_DAY: if (GetTimeOfDay() != TIME_NIGHT && evolutions[i].param == evolutionItem) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; + break; + } + + // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. + for (j = 0; conditionsMet == TRUE && evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) + { + u32 currentCondition = FALSE; + switch(evolutions[i].params[j].condition) + { + case IF_GENDER: + if (evolutions[i].params[j].arg == GetMonGender(mon)) + currentCondition = TRUE; + break; + } + if (currentCondition == FALSE) + conditionsMet = FALSE; + } + + if (conditionsMet) + { + // 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; } } @@ -4824,6 +4905,7 @@ 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; @@ -4831,7 +4913,31 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 { case EVO_CRITICAL_HITS: if (gPartyCriticalHits[evolutionItem] >= evolutions[i].param) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; + break; + } + + // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. + for (j = 0; conditionsMet == TRUE && evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) + { + u32 currentCondition = FALSE; + switch(evolutions[i].params[j].condition) + { + case IF_GENDER: + if (evolutions[i].params[j].arg == GetMonGender(mon)) + currentCondition = TRUE; + break; + } + if (currentCondition == FALSE) + conditionsMet = FALSE; + } + + if (conditionsMet) + { + // 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; } } @@ -4840,6 +4946,7 @@ 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; @@ -4851,16 +4958,40 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutionItem == EVO_SCRIPT_TRIGGER_DMG && currentHp != 0 && (GetMonData(mon, MON_DATA_MAX_HP, NULL) - currentHp >= evolutions[i].param)) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; } case EVO_DARK_SCROLL: if (evolutionItem == EVO_DARK_SCROLL) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; break; case EVO_WATER_SCROLL: if (evolutionItem == EVO_WATER_SCROLL) - targetSpecies = evolutions[i].targetSpecies; + conditionsMet = TRUE; + break; + } + + // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. + for (j = 0; conditionsMet == TRUE && evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) + { + u32 currentCondition = FALSE; + switch(evolutions[i].params[j].condition) + { + case IF_GENDER: + if (evolutions[i].params[j].arg == GetMonGender(mon)) + currentCondition = TRUE; + break; + } + if (currentCondition == FALSE) + conditionsMet = FALSE; + } + + if (conditionsMet) + { + // 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; } } diff --git a/test/species.c b/test/species.c index 2d702b6c453b..b64cfb7204f3 100644 --- a/test/species.c +++ b/test/species.c @@ -101,7 +101,6 @@ TEST("No species has two evolutions that use the evolution tracker") u32 i; u32 species = SPECIES_NONE; u32 evolutionTrackerEvolutions; - bool32 hasGenderBasedRecoil; const struct Evolution *evolutions; for (i = 0; i < NUM_SPECIES; i++) @@ -110,26 +109,15 @@ TEST("No species has two evolutions that use the evolution tracker") } evolutionTrackerEvolutions = 0; - hasGenderBasedRecoil = 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 + || evolutions[i].method == EVO_RECOIL_DAMAGE ) evolutionTrackerEvolutions++; - - if (evolutions[i].method == EVO_RECOIL_DAMAGE_MALE - || evolutions[i].method == EVO_RECOIL_DAMAGE_FEMALE) - { - // Special handling for these since they can be combined as the evolution tracker field is used for the same purpose - if (!hasGenderBasedRecoil) - { - hasGenderBasedRecoil = TRUE; - evolutionTrackerEvolutions++; - } - } } EXPECT(evolutionTrackerEvolutions < 2); From 32b2e0523cee8a4038e6b3e9669da6634219fd90 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 7 Dec 2024 11:04:03 -0300 Subject: [PATCH 02/30] Fixed evolution test --- test/species.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/test/species.c b/test/species.c index b64cfb7204f3..2d93b918a70e 100644 --- a/test/species.c +++ b/test/species.c @@ -101,6 +101,7 @@ TEST("No species has two evolutions that use the evolution tracker") u32 i; u32 species = SPECIES_NONE; u32 evolutionTrackerEvolutions; + bool32 hasRecoilEvo; const struct Evolution *evolutions; for (i = 0; i < NUM_SPECIES; i++) @@ -109,15 +110,25 @@ TEST("No species has two evolutions that use the evolution tracker") } evolutionTrackerEvolutions = 0; + 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 - || evolutions[i].method == EVO_RECOIL_DAMAGE ) evolutionTrackerEvolutions++; + + if (evolutions[i].method == EVO_RECOIL_DAMAGE) + { + // 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++; + } + } } EXPECT(evolutionTrackerEvolutions < 2); @@ -136,4 +147,4 @@ TEST("Every species has a description") } EXPECT_NE(StringCompare(GetSpeciesPokedexDescription(species), gFallbackPokedexText), 0); -} +} \ No newline at end of file From ceccd3035b6146a9fa4d4b146bebc6eeab5a7004 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 7 Dec 2024 12:15:16 -0300 Subject: [PATCH 03/30] Friendship condition --- include/constants/pokemon.h | 8 +-- .../pokemon/species_info/gen_1_families.h | 22 +++---- .../pokemon/species_info/gen_2_families.h | 4 +- .../pokemon/species_info/gen_3_families.h | 4 +- .../pokemon/species_info/gen_4_families.h | 4 +- .../pokemon/species_info/gen_5_families.h | 4 +- .../pokemon/species_info/gen_7_families.h | 2 +- .../pokemon/species_info/gen_8_families.h | 2 +- src/pokedex_plus_hgss.c | 4 +- src/pokemon.c | 59 ++++++++++--------- 10 files changed, 58 insertions(+), 55 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 8cdd1729c092..fc6e635a4cc9 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -246,15 +246,13 @@ #define EVOLUTIONS_END 0xFFFF // Not an actual evolution, used to mark the end of an evolution array. enum EvolutionConditions { - IF_GENDER, // Pokémon is of specific gender + IF_GENDER, // Pokémon is of specific gender + IF_MIN_FRIENDSHIP, // Pokémon has the defined amount of Friendship 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 @@ -273,7 +271,7 @@ enum EvolutionMethods { 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_LEVEL_MOVE_TYPE, // Pokémon levels up, knows move with specified type EVO_MAPSEC, // Pokémon levels up on specified mapsec 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 diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index ba9f845395b9..5bd4f11f1495 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -2495,7 +2495,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] = @@ -4436,7 +4436,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 @@ -4921,7 +4921,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 @@ -5218,7 +5218,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 @@ -6347,7 +6347,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] = @@ -13174,7 +13174,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 @@ -15982,13 +15982,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_LEVEL_MOVE_TYPE, TYPE_FAIRY, SPECIES_SYLVEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}, + {EVO_LEVEL_DAY, 0, SPECIES_ESPEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}, + {EVO_LEVEL_NIGHT, 0, SPECIES_UMBREON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}, {EVO_SPECIFIC_MAP, MAP_PETALBURG_WOODS, SPECIES_LEAFEON}, {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_ITEM, ITEM_ICE_STONE, SPECIES_GLACEON}), }, #if P_GIGANTAMAX_FORMS @@ -17286,7 +17286,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 b3bd0da95abc..8f629b00cf65 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -1406,7 +1406,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] = @@ -2008,7 +2008,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 diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index dae16696c358..e07117bc7c66 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -5281,7 +5281,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sBudewLevelUpLearnset, .teachableLearnset = sBudewTeachableLearnset, .eggMoveLearnset = sBudewEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP_DAY, 0, SPECIES_ROSELIA}), + .evolutions = EVOLUTION({EVO_LEVEL_DAY, 0, SPECIES_ROSELIA, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, #endif //P_GEN_4_CROSS_EVOS @@ -8923,7 +8923,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sChinglingLevelUpLearnset, .teachableLearnset = sChinglingTeachableLearnset, .eggMoveLearnset = sChinglingEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP_NIGHT, 0, SPECIES_CHIMECHO}), + .evolutions = EVOLUTION({EVO_LEVEL_NIGHT, 0, SPECIES_CHIMECHO, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, #endif //P_GEN_4_CROSS_EVOS diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index b282c3e661ef..13bd39a19f2d 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -3072,7 +3072,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] = @@ -4058,7 +4058,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .levelUpLearnset = sRioluLevelUpLearnset, .teachableLearnset = sRioluTeachableLearnset, .eggMoveLearnset = sRioluEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP_DAY, 0, SPECIES_LUCARIO}), + .evolutions = EVOLUTION({EVO_LEVEL_DAY, 0, SPECIES_LUCARIO, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, [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 8a77205b7097..aa09a463e15e 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -2269,7 +2269,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] = @@ -3229,7 +3229,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] = diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index 96b9a1e656b0..36a4eee81f07 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -4116,7 +4116,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) \ diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 37eefda7f9e3..64043dae63cd 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -5010,7 +5010,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .levelUpLearnset = sSnomLevelUpLearnset, .teachableLearnset = sSnomTeachableLearnset, .eggMoveLearnset = sSnomEggMoveLearnset, - .evolutions = EVOLUTION({EVO_FRIENDSHIP_NIGHT, 0, SPECIES_FROSMOTH}), + .evolutions = EVOLUTION({EVO_LEVEL_NIGHT, 0, SPECIES_FROSMOTH, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), }, [SPECIES_FROSMOTH] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index ba9571b0bfa5..be0aba6d9b94 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6452,6 +6452,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept switch (evolutions[i].method) { + /* case EVO_FRIENDSHIP: ConvertIntToDecimalStringN(gStringVar2, 220, STR_CONV_MODE_LEADING_ZEROS, 3); //friendship value StringExpandPlaceholders(gStringVar4, sText_EVO_FRIENDSHIP ); @@ -6462,6 +6463,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept case EVO_FRIENDSHIP_NIGHT: StringExpandPlaceholders(gStringVar4, sText_EVO_FRIENDSHIP_NIGHT ); break; + */ case EVO_LEVEL: ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL ); @@ -6547,7 +6549,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); StringExpandPlaceholders(gStringVar4, sText_EVO_MOVE ); break; - case EVO_FRIENDSHIP_MOVE_TYPE: + case EVO_LEVEL_MOVE_TYPE: StringCopy(gStringVar2, gTypesInfo[evolutions[i].param].name); StringExpandPlaceholders(gStringVar4, sText_EVO_FRIENDSHIP_MOVE_TYPE ); break; diff --git a/src/pokemon.c b/src/pokemon.c index 414c39575763..6a63944e12db 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4443,8 +4443,8 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 u16 species = GetMonData(mon, MON_DATA_SPECIES, 0); u16 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - u8 level; - u16 friendship; + u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); + u16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); u16 upperPersonality = personality >> 16; u32 holdEffect, currentMap, partnerSpecies, partnerHeldItem, partnerHoldEffect; @@ -4495,9 +4495,6 @@ 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; @@ -4507,22 +4504,10 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 // Check main primary evolution method switch (evolutions[i].method) { - case EVO_FRIENDSHIP: - if (friendship >= FRIENDSHIP_EVO_THRESHOLD) - conditionsMet = TRUE; - break; - case EVO_FRIENDSHIP_DAY: - if (GetTimeOfDay() != TIME_NIGHT && friendship >= FRIENDSHIP_EVO_THRESHOLD) - conditionsMet = TRUE; - break; case EVO_LEVEL_DAY: if (GetTimeOfDay() != TIME_NIGHT && evolutions[i].param <= level) conditionsMet = TRUE; break; - case EVO_FRIENDSHIP_NIGHT: - if (GetTimeOfDay() == TIME_NIGHT && friendship >= FRIENDSHIP_EVO_THRESHOLD) - conditionsMet = TRUE; - break; case EVO_LEVEL_NIGHT: if (GetTimeOfDay() == TIME_NIGHT && evolutions[i].param <= level) conditionsMet = TRUE; @@ -4600,16 +4585,13 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (MonKnowsMove(mon, evolutions[i].param) && (personality % 100) == 0) conditionsMet = TRUE; break; - case EVO_FRIENDSHIP_MOVE_TYPE: - if (friendship >= FRIENDSHIP_EVO_THRESHOLD) + case EVO_LEVEL_MOVE_TYPE: + for (j = 0; j < MAX_MON_MOVES; j++) { - for (j = 0; j < MAX_MON_MOVES; j++) + if (gMovesInfo[GetMonData(mon, MON_DATA_MOVE1 + j, NULL)].type == evolutions[i].param) { - if (gMovesInfo[GetMonData(mon, MON_DATA_MOVE1 + j, NULL)].type == evolutions[i].param) - { - conditionsMet = TRUE; - break; - } + conditionsMet = TRUE; + break; } } break; @@ -4741,6 +4723,10 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].params[j].arg == GetMonGender(mon)) currentCondition = TRUE; break; + case IF_MIN_FRIENDSHIP: + if (friendship >= evolutions[i].params[j].arg) + currentCondition = TRUE; + break; } if (currentCondition == FALSE) conditionsMet = FALSE; @@ -4757,9 +4743,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 } 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++) { bool32 conditionsMet = FALSE; @@ -4787,6 +4770,10 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].params[j].arg == GetMonGender(mon)) currentCondition = TRUE; break; + case IF_MIN_FRIENDSHIP: + if (friendship >= evolutions[i].params[j].arg) + currentCondition = TRUE; + break; } if (currentCondition == FALSE) conditionsMet = FALSE; @@ -4837,6 +4824,10 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].params[j].arg == GetMonGender(mon)) currentCondition = TRUE; break; + case IF_MIN_FRIENDSHIP: + if (friendship >= evolutions[i].params[j].arg) + currentCondition = TRUE; + break; } if (currentCondition == FALSE) conditionsMet = FALSE; @@ -4886,6 +4877,10 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].params[j].arg == GetMonGender(mon)) currentCondition = TRUE; break; + case IF_MIN_FRIENDSHIP: + if (friendship >= evolutions[i].params[j].arg) + currentCondition = TRUE; + break; } if (currentCondition == FALSE) conditionsMet = FALSE; @@ -4927,6 +4922,10 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].params[j].arg == GetMonGender(mon)) currentCondition = TRUE; break; + case IF_MIN_FRIENDSHIP: + if (friendship >= evolutions[i].params[j].arg) + currentCondition = TRUE; + break; } if (currentCondition == FALSE) conditionsMet = FALSE; @@ -4981,6 +4980,10 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].params[j].arg == GetMonGender(mon)) currentCondition = TRUE; break; + case IF_MIN_FRIENDSHIP: + if (friendship >= evolutions[i].params[j].arg) + currentCondition = TRUE; + break; } if (currentCondition == FALSE) conditionsMet = FALSE; From 648d736b7730418a9b27e4506d315ed450f4ae90 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 7 Dec 2024 12:39:34 -0300 Subject: [PATCH 04/30] Attack vs Defense condition --- include/constants/pokemon.h | 10 +- .../pokemon/species_info/gen_1_families.h | 6 +- src/pokedex_plus_hgss.c | 2 + src/pokemon.c | 103 ++++++++++++++---- 4 files changed, 91 insertions(+), 30 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index fc6e635a4cc9..90c4aae1611c 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -246,8 +246,11 @@ #define EVOLUTIONS_END 0xFFFF // Not an actual evolution, used to mark the end of an evolution array. enum EvolutionConditions { - IF_GENDER, // Pokémon is of specific gender - IF_MIN_FRIENDSHIP, // Pokémon has the defined amount of Friendship + IF_GENDER, // Pokémon is of specific gender. + IF_MIN_FRIENDSHIP, // Pokémon has the defined amount of Friendship. + IF_ATK_GT_DEF, // Pokémon's Attack is greater than its Defense stat. + IF_ATK_EQ_DEF, // Pokémon's Attack is equal to its Defense stat. + IF_ATK_LT_DEF, // Pokémon's Attack is lower than its Defense stat. CONDITIONS_END }; @@ -257,9 +260,6 @@ enum EvolutionMethods { 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) diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 5bd4f11f1495..d34e6bdf86ef 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -12269,9 +12269,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 diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index be0aba6d9b94..47142634764d 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6481,6 +6481,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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 ); @@ -6493,6 +6494,7 @@ 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_ATK_LT_DEF ); 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 ); diff --git a/src/pokemon.c b/src/pokemon.c index 6a63944e12db..0537af226219 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4439,17 +4439,19 @@ static u32 GetGMaxTargetSpecies(u32 species) u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner) { 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 targetSpecies = SPECIES_NONE; + u32 species = GetMonData(mon, MON_DATA_SPECIES, 0); + u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); - u8 level = GetMonData(mon, MON_DATA_LEVEL, 0); - u16 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); - u8 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); + u32 level = GetMonData(mon, MON_DATA_LEVEL, 0); + u32 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + u32 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); + u32 attack = GetMonData(mon, MON_DATA_ATK, 0); + u32 defense = GetMonData(mon, MON_DATA_DEF, 0); u16 upperPersonality = personality >> 16; u32 holdEffect, currentMap, partnerSpecies, partnerHeldItem, partnerHoldEffect; bool32 consumeItem = FALSE; - u16 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); + u32 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); const struct Evolution *evolutions = GetSpeciesEvolutions(species); if (evolutions == NULL) @@ -4534,21 +4536,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].param <= level) conditionsMet = TRUE; 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)) - conditionsMet = TRUE; - 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)) - conditionsMet = TRUE; - 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)) - conditionsMet = TRUE; - break; case EVO_LEVEL_SILCOON: if (evolutions[i].param <= level && (upperPersonality % 10) <= 4) conditionsMet = TRUE; @@ -4727,6 +4714,18 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (friendship >= evolutions[i].params[j].arg) currentCondition = TRUE; break; + case IF_ATK_GT_DEF: + if (attack > defense) + conditionsMet = TRUE; + break; + case IF_ATK_EQ_DEF: + if (attack == defense) + conditionsMet = TRUE; + break; + case IF_ATK_LT_DEF: + if (attack < defense) + conditionsMet = TRUE; + break; } if (currentCondition == FALSE) conditionsMet = FALSE; @@ -4774,6 +4773,18 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (friendship >= evolutions[i].params[j].arg) currentCondition = TRUE; break; + case IF_ATK_GT_DEF: + if (attack > defense) + conditionsMet = TRUE; + break; + case IF_ATK_EQ_DEF: + if (attack == defense) + conditionsMet = TRUE; + break; + case IF_ATK_LT_DEF: + if (attack < defense) + conditionsMet = TRUE; + break; } if (currentCondition == FALSE) conditionsMet = FALSE; @@ -4828,6 +4839,18 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (friendship >= evolutions[i].params[j].arg) currentCondition = TRUE; break; + case IF_ATK_GT_DEF: + if (attack > defense) + conditionsMet = TRUE; + break; + case IF_ATK_EQ_DEF: + if (attack == defense) + conditionsMet = TRUE; + break; + case IF_ATK_LT_DEF: + if (attack < defense) + conditionsMet = TRUE; + break; } if (currentCondition == FALSE) conditionsMet = FALSE; @@ -4881,6 +4904,18 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (friendship >= evolutions[i].params[j].arg) currentCondition = TRUE; break; + case IF_ATK_GT_DEF: + if (attack > defense) + conditionsMet = TRUE; + break; + case IF_ATK_EQ_DEF: + if (attack == defense) + conditionsMet = TRUE; + break; + case IF_ATK_LT_DEF: + if (attack < defense) + conditionsMet = TRUE; + break; } if (currentCondition == FALSE) conditionsMet = FALSE; @@ -4926,6 +4961,18 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (friendship >= evolutions[i].params[j].arg) currentCondition = TRUE; break; + case IF_ATK_GT_DEF: + if (attack > defense) + conditionsMet = TRUE; + break; + case IF_ATK_EQ_DEF: + if (attack == defense) + conditionsMet = TRUE; + break; + case IF_ATK_LT_DEF: + if (attack < defense) + conditionsMet = TRUE; + break; } if (currentCondition == FALSE) conditionsMet = FALSE; @@ -4984,6 +5031,18 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (friendship >= evolutions[i].params[j].arg) currentCondition = TRUE; break; + case IF_ATK_GT_DEF: + if (attack > defense) + conditionsMet = TRUE; + break; + case IF_ATK_EQ_DEF: + if (attack == defense) + conditionsMet = TRUE; + break; + case IF_ATK_LT_DEF: + if (attack < defense) + conditionsMet = TRUE; + break; } if (currentCondition == FALSE) conditionsMet = FALSE; From 7100c54f5c0c90522f3e4b8ef6125807430743f2 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 7 Dec 2024 12:59:13 -0300 Subject: [PATCH 05/30] Added function for conditions --- src/pokemon.c | 240 ++++++++++---------------------------------------- 1 file changed, 45 insertions(+), 195 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 0537af226219..646c7f38758f 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4436,6 +4436,45 @@ static u32 GetGMaxTargetSpecies(u32 species) return SPECIES_NONE; } +static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params) +{ + u32 j; + u32 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); + u32 attack = GetMonData(mon, MON_DATA_ATK, 0); + u32 defense = GetMonData(mon, MON_DATA_DEF, 0); + // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. + for (j = 0; params != NULL && params[j].condition != CONDITIONS_END; j++) + { + u32 currentCondition = FALSE; + switch(params[j].condition) + { + case IF_GENDER: + if (params[j].arg == GetMonGender(mon)) + currentCondition = TRUE; + break; + case IF_MIN_FRIENDSHIP: + if (friendship >= params[j].arg) + 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; + } + if (currentCondition == FALSE) + return FALSE; + } + return TRUE; +} + u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner) { int i, j; @@ -4444,10 +4483,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); u32 level = GetMonData(mon, MON_DATA_LEVEL, 0); - u32 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); u32 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); - u32 attack = GetMonData(mon, MON_DATA_ATK, 0); - u32 defense = GetMonData(mon, MON_DATA_DEF, 0); u16 upperPersonality = personality >> 16; u32 holdEffect, currentMap, partnerSpecies, partnerHeldItem, partnerHoldEffect; bool32 consumeItem = FALSE; @@ -4700,38 +4736,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. - for (j = 0; conditionsMet == TRUE && evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) - { - u32 currentCondition = FALSE; - switch(evolutions[i].params[j].condition) - { - case IF_GENDER: - if (evolutions[i].params[j].arg == GetMonGender(mon)) - currentCondition = TRUE; - break; - case IF_MIN_FRIENDSHIP: - if (friendship >= evolutions[i].params[j].arg) - currentCondition = TRUE; - break; - case IF_ATK_GT_DEF: - if (attack > defense) - conditionsMet = TRUE; - break; - case IF_ATK_EQ_DEF: - if (attack == defense) - conditionsMet = TRUE; - break; - case IF_ATK_LT_DEF: - if (attack < defense) - conditionsMet = TRUE; - break; - } - if (currentCondition == FALSE) - conditionsMet = FALSE; - } - - if (conditionsMet) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4759,38 +4764,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. - for (j = 0; conditionsMet == TRUE && evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) - { - u32 currentCondition = FALSE; - switch(evolutions[i].params[j].condition) - { - case IF_GENDER: - if (evolutions[i].params[j].arg == GetMonGender(mon)) - currentCondition = TRUE; - break; - case IF_MIN_FRIENDSHIP: - if (friendship >= evolutions[i].params[j].arg) - currentCondition = TRUE; - break; - case IF_ATK_GT_DEF: - if (attack > defense) - conditionsMet = TRUE; - break; - case IF_ATK_EQ_DEF: - if (attack == defense) - conditionsMet = TRUE; - break; - case IF_ATK_LT_DEF: - if (attack < defense) - conditionsMet = TRUE; - break; - } - if (currentCondition == FALSE) - conditionsMet = FALSE; - } - - if (conditionsMet) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4825,38 +4799,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. - for (j = 0; conditionsMet == TRUE && evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) - { - u32 currentCondition = FALSE; - switch(evolutions[i].params[j].condition) - { - case IF_GENDER: - if (evolutions[i].params[j].arg == GetMonGender(mon)) - currentCondition = TRUE; - break; - case IF_MIN_FRIENDSHIP: - if (friendship >= evolutions[i].params[j].arg) - currentCondition = TRUE; - break; - case IF_ATK_GT_DEF: - if (attack > defense) - conditionsMet = TRUE; - break; - case IF_ATK_EQ_DEF: - if (attack == defense) - conditionsMet = TRUE; - break; - case IF_ATK_LT_DEF: - if (attack < defense) - conditionsMet = TRUE; - break; - } - if (currentCondition == FALSE) - conditionsMet = FALSE; - } - - if (conditionsMet) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4890,38 +4833,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. - for (j = 0; conditionsMet == TRUE && evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) - { - u32 currentCondition = FALSE; - switch(evolutions[i].params[j].condition) - { - case IF_GENDER: - if (evolutions[i].params[j].arg == GetMonGender(mon)) - currentCondition = TRUE; - break; - case IF_MIN_FRIENDSHIP: - if (friendship >= evolutions[i].params[j].arg) - currentCondition = TRUE; - break; - case IF_ATK_GT_DEF: - if (attack > defense) - conditionsMet = TRUE; - break; - case IF_ATK_EQ_DEF: - if (attack == defense) - conditionsMet = TRUE; - break; - case IF_ATK_LT_DEF: - if (attack < defense) - conditionsMet = TRUE; - break; - } - if (currentCondition == FALSE) - conditionsMet = FALSE; - } - - if (conditionsMet) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4947,38 +4859,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. - for (j = 0; conditionsMet == TRUE && evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) - { - u32 currentCondition = FALSE; - switch(evolutions[i].params[j].condition) - { - case IF_GENDER: - if (evolutions[i].params[j].arg == GetMonGender(mon)) - currentCondition = TRUE; - break; - case IF_MIN_FRIENDSHIP: - if (friendship >= evolutions[i].params[j].arg) - currentCondition = TRUE; - break; - case IF_ATK_GT_DEF: - if (attack > defense) - conditionsMet = TRUE; - break; - case IF_ATK_EQ_DEF: - if (attack == defense) - conditionsMet = TRUE; - break; - case IF_ATK_LT_DEF: - if (attack < defense) - conditionsMet = TRUE; - break; - } - if (currentCondition == FALSE) - conditionsMet = FALSE; - } - - if (conditionsMet) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -5017,38 +4898,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. - for (j = 0; conditionsMet == TRUE && evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) - { - u32 currentCondition = FALSE; - switch(evolutions[i].params[j].condition) - { - case IF_GENDER: - if (evolutions[i].params[j].arg == GetMonGender(mon)) - currentCondition = TRUE; - break; - case IF_MIN_FRIENDSHIP: - if (friendship >= evolutions[i].params[j].arg) - currentCondition = TRUE; - break; - case IF_ATK_GT_DEF: - if (attack > defense) - conditionsMet = TRUE; - break; - case IF_ATK_EQ_DEF: - if (attack == defense) - conditionsMet = TRUE; - break; - case IF_ATK_LT_DEF: - if (attack < defense) - conditionsMet = TRUE; - break; - } - if (currentCondition == FALSE) - conditionsMet = FALSE; - } - - if (conditionsMet) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. From 982f09fe3492790ad8e225118bff2b83c91acdab Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 7 Dec 2024 15:09:18 -0300 Subject: [PATCH 06/30] Time conditions --- include/constants/pokemon.h | 11 ++--- .../pokemon/species_info/gen_1_families.h | 10 ++--- .../pokemon/species_info/gen_2_families.h | 14 +++--- .../pokemon/species_info/gen_3_families.h | 6 +-- .../pokemon/species_info/gen_4_families.h | 2 +- .../pokemon/species_info/gen_6_families.h | 4 +- .../pokemon/species_info/gen_7_families.h | 14 +++--- .../pokemon/species_info/gen_8_families.h | 2 +- .../pokemon/species_info/gen_9_families.h | 2 +- src/pokedex_plus_hgss.c | 30 +++++++------ src/pokemon.c | 45 +++++-------------- 11 files changed, 56 insertions(+), 84 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 90c4aae1611c..b1485f066d47 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -247,6 +247,8 @@ enum EvolutionConditions { IF_GENDER, // Pokémon is of specific gender. + IF_TIME, // Is the specific time of day. + IF_NOT_TIME, // Is NOT the specific time of day. IF_MIN_FRIENDSHIP, // Pokémon has the defined amount of Friendship. IF_ATK_GT_DEF, // Pokémon's Attack is greater than its Defense stat. IF_ATK_EQ_DEF, // Pokémon's Attack is equal to its Defense stat. @@ -265,11 +267,6 @@ enum EvolutionMethods { 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_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_LEVEL_MOVE_TYPE, // Pokémon levels up, knows move with specified type EVO_MAPSEC, // Pokémon levels up on specified mapsec @@ -284,9 +281,7 @@ enum EvolutionMethods { 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_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 diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index d34e6bdf86ef..90c19e8465be 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -2044,7 +2044,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}), }, @@ -13108,8 +13108,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_ITEM_HOLD, ITEM_OVAL_STONE, SPECIES_CHANSEY, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}, + {EVO_ITEM, ITEM_OVAL_STONE, SPECIES_CHANSEY, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}), }, #endif //P_GEN_4_CROSS_EVOS @@ -15983,8 +15983,8 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = {EVO_ITEM, ITEM_WATER_STONE, SPECIES_VAPOREON}, {EVO_ITEM, ITEM_FIRE_STONE, SPECIES_FLAREON}, {EVO_LEVEL_MOVE_TYPE, TYPE_FAIRY, SPECIES_SYLVEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}, - {EVO_LEVEL_DAY, 0, SPECIES_ESPEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}, - {EVO_LEVEL_NIGHT, 0, SPECIES_UMBREON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}, + {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_SPECIFIC_MAP, MAP_PETALBURG_WOODS, SPECIES_LEAFEON}, {EVO_ITEM, ITEM_LEAF_STONE, SPECIES_LEAFEON}, {EVO_SPECIFIC_MAP, MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM, SPECIES_GLACEON}, diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index 8f629b00cf65..177e4431e451 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -4257,8 +4257,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_ITEM_HOLD, ITEM_RAZOR_FANG, SPECIES_GLISCOR, CONDITIONS({IF_TIME, TIME_NIGHT})}, + {EVO_ITEM, ITEM_RAZOR_FANG, SPECIES_GLISCOR, CONDITIONS({IF_TIME, TIME_NIGHT})}), }, #if P_GEN_4_CROSS_EVOS @@ -4953,8 +4953,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_ITEM_HOLD, ITEM_RAZOR_CLAW, SPECIES_WEAVILE, CONDITIONS({IF_TIME, TIME_NIGHT})}, + {EVO_ITEM, ITEM_RAZOR_CLAW, SPECIES_WEAVILE, CONDITIONS({IF_TIME, TIME_NIGHT})}), }, #if P_GEN_4_CROSS_EVOS @@ -5110,8 +5110,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_ITEM_HOLD, ITEM_RAZOR_CLAW, SPECIES_SNEASLER, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}, + {EVO_ITEM, ITEM_RAZOR_CLAW, SPECIES_SNEASLER, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}), }, [SPECIES_SNEASLER] = @@ -5322,7 +5322,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}), }, diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index e07117bc7c66..12554b1e5c76 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -1214,7 +1214,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] = @@ -5281,7 +5281,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sBudewLevelUpLearnset, .teachableLearnset = sBudewTeachableLearnset, .eggMoveLearnset = sBudewEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_DAY, 0, SPECIES_ROSELIA, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), + .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 @@ -8923,7 +8923,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sChinglingLevelUpLearnset, .teachableLearnset = sChinglingTeachableLearnset, .eggMoveLearnset = sChinglingEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_NIGHT, 0, SPECIES_CHIMECHO, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_CHIMECHO, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD},{IF_TIME, TIME_NIGHT})}), }, #endif //P_GEN_4_CROSS_EVOS diff --git a/src/data/pokemon/species_info/gen_4_families.h b/src/data/pokemon/species_info/gen_4_families.h index 13bd39a19f2d..4fe2a9673ba6 100644 --- a/src/data/pokemon/species_info/gen_4_families.h +++ b/src/data/pokemon/species_info/gen_4_families.h @@ -4058,7 +4058,7 @@ const struct SpeciesInfo gSpeciesInfoGen4[] = .levelUpLearnset = sRioluLevelUpLearnset, .teachableLearnset = sRioluTeachableLearnset, .eggMoveLearnset = sRioluEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_DAY, 0, SPECIES_LUCARIO, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), + .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_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 8eef5abbfc7a..3e5dc89047d2 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -3603,7 +3603,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] = @@ -3729,7 +3729,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] = diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index 36a4eee81f07..e0b84e8287e9 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -888,7 +888,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] = @@ -1901,8 +1901,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] = @@ -1962,7 +1962,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] = @@ -2780,7 +2780,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}), }, @@ -5644,8 +5644,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] = diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 64043dae63cd..296de4a7e532 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -5010,7 +5010,7 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .levelUpLearnset = sSnomLevelUpLearnset, .teachableLearnset = sSnomTeachableLearnset, .eggMoveLearnset = sSnomEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_NIGHT, 0, SPECIES_FROSMOTH, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_FROSMOTH, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD},{IF_TIME, TIME_NIGHT})}), }, [SPECIES_FROSMOTH] = diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 84b9f627287d..6295e38a0cdf 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -4546,7 +4546,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] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 47142634764d..e66e3d7f116d 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -225,8 +225,8 @@ static const u8 sText_EVO_LEVEL_MALE[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, is ma 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_LEVEL_ITEM_HOLD_DAY[] = _("{LV}{UP_ARROW}, holds {STR_VAR_2}, day"); +static const u8 sText_EVO_LEVEL_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"); @@ -242,9 +242,9 @@ static const u8 sText_EVO_CRITICAL_HITS[] = _("Land {STR_VAR_2} critical hits in 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_LEVEL_ITEM_NIGHT[] = _("{STR_VAR_2} is used, night"); +static const u8 sText_EVO_LEVEL_ITEM_DAY[] = _("{STR_VAR_2} is used, day"); +static const u8 sText_EVO_LEVEL_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"); @@ -6524,7 +6524,6 @@ 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_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 ); @@ -6537,16 +6536,17 @@ 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_DUSK ); break; - case EVO_ITEM_HOLD_DAY: + case EVO_LEVEL_ITEM_HOLD_DAY: item = evolutions[i].param; //item CopyItemName(item, gStringVar2); //item - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM_HOLD_DAY ); + StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_HOLD_DAY ); break; - case EVO_ITEM_HOLD_NIGHT: + case EVO_LEVEL_ITEM_HOLD_NIGHT: item = evolutions[i].param; //item CopyItemName(item, gStringVar2); //item - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM_HOLD_NIGHT ); + StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_HOLD_NIGHT ); break; + */ case EVO_MOVE: StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); StringExpandPlaceholders(gStringVar4, sText_EVO_MOVE ); @@ -6617,20 +6617,22 @@ 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 ); + StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_NIGHT ); break; case EVO_ITEM_DAY: item = evolutions[i].param; CopyItemName(item, gStringVar2); - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM_DAY ); + StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_DAY ); break; - case EVO_ITEM_HOLD: + */ + case EVO_LEVEL_ITEM_HOLD: item = evolutions[i].param; CopyItemName(item, gStringVar2); - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM_HOLD ); + StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_HOLD); break; case EVO_USE_MOVE_TWENTY_TIMES: StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); diff --git a/src/pokemon.c b/src/pokemon.c index 646c7f38758f..89e34696f507 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4468,6 +4468,14 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (attack < defense) currentCondition = TRUE; break; + case IF_TIME: + if (GetTimeOfDay() == params[j].arg) + currentCondition = TRUE; + break; + case IF_NOT_TIME: + if (GetTimeOfDay() != params[j].arg) + currentCondition = TRUE; + break; } if (currentCondition == FALSE) return FALSE; @@ -4533,6 +4541,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 { case EVO_MODE_NORMAL: case EVO_MODE_BATTLE_ONLY: + DebugPrintf("hours:%d", gLocalTime.hours); for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) { bool32 conditionsMet = FALSE; @@ -4542,32 +4551,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 // Check main primary evolution method switch (evolutions[i].method) { - case EVO_LEVEL_DAY: - if (GetTimeOfDay() != TIME_NIGHT && evolutions[i].param <= level) - conditionsMet = TRUE; - break; - case EVO_LEVEL_NIGHT: - if (GetTimeOfDay() == TIME_NIGHT && evolutions[i].param <= level) - conditionsMet = TRUE; - break; - case EVO_ITEM_HOLD_NIGHT: - if (GetTimeOfDay() == TIME_NIGHT && heldItem == evolutions[i].param) - { - conditionsMet = TRUE; - consumeItem = TRUE; - } - break; - case EVO_ITEM_HOLD_DAY: - if (GetTimeOfDay() != TIME_NIGHT && heldItem == evolutions[i].param) - { - conditionsMet = TRUE; - consumeItem = TRUE; - } - break; - case EVO_LEVEL_DUSK: - if (GetTimeOfDay() == TIME_EVENING && evolutions[i].param <= level) - conditionsMet = TRUE; - break; case EVO_LEVEL: if (evolutions[i].param <= level) conditionsMet = TRUE; @@ -4711,7 +4694,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 } } break; - case EVO_ITEM_HOLD: + case EVO_LEVEL_ITEM_HOLD: if (heldItem == evolutions[i].param) { conditionsMet = TRUE; @@ -4823,14 +4806,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].param == evolutionItem) conditionsMet = TRUE; break; - case EVO_ITEM_NIGHT: - if (GetTimeOfDay() == TIME_NIGHT && evolutions[i].param == evolutionItem) - conditionsMet = TRUE; - break; - case EVO_ITEM_DAY: - if (GetTimeOfDay() != TIME_NIGHT && evolutions[i].param == evolutionItem) - conditionsMet = TRUE; - break; } if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) From cf95cde0d409456627adc712c28e7e1509134698 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 7 Dec 2024 15:54:14 -0300 Subject: [PATCH 07/30] Species and Type in Party conditionals --- include/constants/pokemon.h | 7 ++- .../pokemon/species_info/gen_2_families.h | 2 +- .../pokemon/species_info/gen_6_families.h | 2 +- src/pokedex_plus_hgss.c | 2 + src/pokemon.c | 46 +++++++++---------- 5 files changed, 30 insertions(+), 29 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index b1485f066d47..b4af28941568 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -246,6 +246,7 @@ #define EVOLUTIONS_END 0xFFFF // Not an actual evolution, used to mark the end of an evolution array. enum EvolutionConditions { + // Gen 2 IF_GENDER, // Pokémon is of specific gender. IF_TIME, // Is the specific time of day. IF_NOT_TIME, // Is NOT the specific time of day. @@ -253,6 +254,10 @@ enum EvolutionConditions { IF_ATK_GT_DEF, // Pokémon's Attack is greater than its Defense stat. IF_ATK_EQ_DEF, // Pokémon's Attack is equal to its Defense stat. IF_ATK_LT_DEF, // Pokémon's Attack is lower than its Defense stat. + // Gen 4 + IF_SPECIES_IN_PARTY, // The party contains a Pokémon of the specified species. + // Gen 6 + IF_TYPE_IN_PARTY, // The party contains a Pokémon of the specified type. CONDITIONS_END }; @@ -271,8 +276,6 @@ enum EvolutionMethods { EVO_LEVEL_MOVE_TYPE, // Pokémon levels up, knows move with specified type EVO_MAPSEC, // Pokémon levels up on specified mapsec 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. diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index 177e4431e451..020a2eff6476 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -6283,7 +6283,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 diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 3e5dc89047d2..e789103af807 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -2064,7 +2064,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] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index e66e3d7f116d..2037e45a9f85 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6575,6 +6575,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept //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 ); @@ -6582,6 +6583,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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 ); diff --git a/src/pokemon.c b/src/pokemon.c index 89e34696f507..d2633e5ba5e5 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4476,6 +4476,27 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (GetTimeOfDay() != params[j].arg) currentCondition = TRUE; break; + case IF_SPECIES_IN_PARTY: + for (j = 0; j < PARTY_SIZE; j++) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL) == params[j].arg) + { + currentCondition = TRUE; + break; + } + } + break; + 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[j].arg || gSpeciesInfo[currSpecies].types[1] == params[j].arg) + { + currentCondition = TRUE; + break; + } + } + break; } if (currentCondition == FALSE) return FALSE; @@ -4601,31 +4622,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 } } 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) - { - conditionsMet = TRUE; - 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) - { - conditionsMet = TRUE; - break; - } - } - } - break; case EVO_LEVEL_RAIN: j = GetCurrentWeather(); if (evolutions[i].param <= level From 563ff0a366af5cd8d6727d5b627b2483cf269631 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 7 Dec 2024 16:53:43 -0300 Subject: [PATCH 08/30] Weather condition --- include/constants/pokemon.h | 3 +-- src/data/pokemon/species_info/gen_6_families.h | 14 ++++++++++---- src/pokedex_plus_hgss.c | 2 -- src/pokemon.c | 17 +++++------------ 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index b4af28941568..42167d2500d9 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -258,6 +258,7 @@ enum EvolutionConditions { IF_SPECIES_IN_PARTY, // The party contains a Pokémon of the specified species. // Gen 6 IF_TYPE_IN_PARTY, // The party contains a Pokémon of the specified type. + IF_WEATHER, // It is the specific weather in the current map. CONDITIONS_END }; @@ -275,7 +276,6 @@ enum EvolutionMethods { EVO_MOVE, // Pokémon levels up, knows specified move EVO_LEVEL_MOVE_TYPE, // Pokémon levels up, knows move with specified type EVO_MAPSEC, // Pokémon levels up on specified mapsec - EVO_LEVEL_RAIN, // Pokémon reaches the specified level during rain in the overworld 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. @@ -285,7 +285,6 @@ enum EvolutionMethods { EVO_DARK_SCROLL, // interacts with Scroll of Darkness EVO_WATER_SCROLL, // interacts with Scroll of Waters EVO_LEVEL_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 diff --git a/src/data/pokemon/species_info/gen_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index e789103af807..566fe5966453 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -4119,8 +4119,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] = @@ -4248,8 +4251,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/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 2037e45a9f85..db4c3c43bac1 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6570,12 +6570,10 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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 ); diff --git a/src/pokemon.c b/src/pokemon.c index d2633e5ba5e5..78c288226b0c 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4442,6 +4442,7 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct 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 weather = GetCurrentWeather(); // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. for (j = 0; params != NULL && params[j].condition != CONDITIONS_END; j++) { @@ -4497,6 +4498,10 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct } } break; + case IF_WEATHER: + if (weather == params[j].arg) + currentCondition = TRUE; + break; } if (currentCondition == FALSE) return FALSE; @@ -4622,18 +4627,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 } } break; - case EVO_LEVEL_RAIN: - j = GetCurrentWeather(); - if (evolutions[i].param <= level - && (j == WEATHER_RAIN || j == WEATHER_RAIN_THUNDERSTORM || j == WEATHER_DOWNPOUR)) - conditionsMet = TRUE; - break; - case EVO_LEVEL_FOG: - j = GetCurrentWeather(); - if (evolutions[i].param <= level - && (j == WEATHER_FOG_HORIZONTAL || j == WEATHER_FOG_DIAGONAL)) - conditionsMet = TRUE; - break; case EVO_MAPSEC: if (gMapHeader.regionMapSectionId == evolutions[i].param) conditionsMet = TRUE; From fd73b116e2ae6494e9f7dd47b55bafd5a39df7ec Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 7 Dec 2024 18:10:45 -0300 Subject: [PATCH 09/30] Personality conditions --- include/constants/pokemon.h | 15 +++-- .../pokemon/species_info/gen_2_families.h | 4 +- .../pokemon/species_info/gen_3_families.h | 4 +- .../pokemon/species_info/gen_9_families.h | 4 +- src/pokedex_plus_hgss.c | 2 +- src/pokemon.c | 57 ++++++++++--------- 6 files changed, 47 insertions(+), 39 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 42167d2500d9..8bbe72c1f25a 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -254,11 +254,19 @@ enum EvolutionConditions { IF_ATK_GT_DEF, // Pokémon's Attack is greater than its Defense stat. IF_ATK_EQ_DEF, // Pokémon's Attack is equal to its Defense stat. IF_ATK_LT_DEF, // Pokémon's Attack is lower than its Defense stat. + // Gen 3 + IF_PID_UPPER_MODULO_10_GT, // The Pokémon's personality value's modulo by 10 is greater than the defined value. + IF_PID_UPPER_MODULO_10_EQ, // The Pokémon's personality value's modulo by 10 is equal than the defined value. + IF_PID_UPPER_MODULO_10_LT, // The Pokémon's personality value's modulo by 10 is lower than the defined value. // Gen 4 IF_SPECIES_IN_PARTY, // The party contains a Pokémon of the specified species. // Gen 6 IF_TYPE_IN_PARTY, // The party contains a Pokémon of the specified type. IF_WEATHER, // It is the specific weather in the current map. + // Gen 9 + 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. CONDITIONS_END }; @@ -268,8 +276,6 @@ enum EvolutionMethods { 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_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 @@ -285,10 +291,7 @@ enum EvolutionMethods { EVO_DARK_SCROLL, // interacts with Scroll of Darkness EVO_WATER_SCROLL, // interacts with Scroll of Waters EVO_LEVEL_ITEM_HOLD, // Pokémon levels up, holds specified item - 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_LEVEL_BATTLE_ONLY, // Pokémon reaches the specified level, in battle only EVO_USE_MOVE_TWENTY_TIMES, // Pokémon levels up after having used a move for at least 20 times EVO_RECOIL_DAMAGE, // Pokémon levels up after having suffered specified amount of non-fainting recoil damage EVO_ITEM_COUNT_999, // Pokémon levels up after trainer has collected 999 of a specific item diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index 020a2eff6476..8dd1edb3a2d4 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -4052,8 +4052,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_MOVE, MOVE_HYPER_DRILL, SPECIES_DUDUNSPARCE_TWO_SEGMENT, CONDITIONS({IF_PID_MODULO_100_GT, 0})}, + {EVO_MOVE, MOVE_HYPER_DRILL, SPECIES_DUDUNSPARCE_THREE_SEGMENT, CONDITIONS({IF_PID_MODULO_100_EQ, 0})}), }, #if P_GEN_9_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 12554b1e5c76..50c702ca631a 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -1349,8 +1349,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_LT, 4})}), }, [SPECIES_SILCOON] = diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 6295e38a0cdf..801bc255a7e5 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -1257,8 +1257,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] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index db4c3c43bac1..2e6b2f833519 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6494,7 +6494,6 @@ 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_ATK_LT_DEF ); 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 ); @@ -6503,6 +6502,7 @@ 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 ); diff --git a/src/pokemon.c b/src/pokemon.c index 78c288226b0c..f35813f29c1b 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4442,6 +4442,8 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct 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); + u16 upperPersonality = personality >> 16; u32 weather = GetCurrentWeather(); // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. for (j = 0; params != NULL && params[j].condition != CONDITIONS_END; j++) @@ -4477,6 +4479,18 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (GetTimeOfDay() != params[j].arg) currentCondition = TRUE; break; + case IF_PID_UPPER_MODULO_10_GT: + if ((upperPersonality % 10) > params[j].arg) + currentCondition = TRUE; + break; + case IF_PID_UPPER_MODULO_10_EQ: + if ((upperPersonality % 10) == params[j].arg) + currentCondition = TRUE; + break; + case IF_PID_UPPER_MODULO_10_LT: + if ((upperPersonality % 10) < params[j].arg) + currentCondition = TRUE; + break; case IF_SPECIES_IN_PARTY: for (j = 0; j < PARTY_SIZE; j++) { @@ -4491,7 +4505,8 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct for (j = 0; j < PARTY_SIZE; j++) { u16 currSpecies = GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL); - if (gSpeciesInfo[currSpecies].types[0] == params[j].arg || gSpeciesInfo[currSpecies].types[1] == params[j].arg) + if (gSpeciesInfo[currSpecies].types[0] == params[j].arg + || gSpeciesInfo[currSpecies].types[1] == params[j].arg) { currentCondition = TRUE; break; @@ -4502,6 +4517,18 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (weather == params[j].arg) currentCondition = TRUE; break; + case IF_PID_MODULO_100_GT: + if ((personality % 100) > params[j].arg) + currentCondition = TRUE; + break; + case IF_PID_MODULO_100_EQ: + if ((personality % 100) == params[j].arg) + currentCondition = TRUE; + break; + case IF_PID_MODULO_100_LT: + if ((personality % 100) < params[j].arg) + currentCondition = TRUE; + break; } if (currentCondition == FALSE) return FALSE; @@ -4515,10 +4542,8 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 u32 targetSpecies = SPECIES_NONE; u32 species = GetMonData(mon, MON_DATA_SPECIES, 0); u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); - u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); u32 level = GetMonData(mon, MON_DATA_LEVEL, 0); u32 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); - u16 upperPersonality = personality >> 16; u32 holdEffect, currentMap, partnerSpecies, partnerHeldItem, partnerHoldEffect; bool32 consumeItem = FALSE; u32 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); @@ -4581,24 +4606,12 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].param <= level) conditionsMet = TRUE; break; - case EVO_LEVEL_SILCOON: - if (evolutions[i].param <= level && (upperPersonality % 10) <= 4) - conditionsMet = TRUE; - break; - case EVO_LEVEL_CASCOON: - if (evolutions[i].param <= level && (upperPersonality % 10) > 4) - conditionsMet = TRUE; - break; case EVO_LEVEL_NINJASK: if (evolutions[i].param <= level) conditionsMet = TRUE; break; - case EVO_LEVEL_FAMILY_OF_FOUR: - if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level && (personality % 100) != 0) - conditionsMet = TRUE; - break; - case EVO_LEVEL_FAMILY_OF_THREE: - if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level && (personality % 100) == 0) + case EVO_LEVEL_BATTLE_ONLY: + if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level) conditionsMet = TRUE; break; case EVO_BEAUTY: @@ -4609,14 +4622,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (MonKnowsMove(mon, evolutions[i].param)) conditionsMet = TRUE; break; - case EVO_MOVE_TWO_SEGMENT: - if (MonKnowsMove(mon, evolutions[i].param) && (personality % 100) != 0) - conditionsMet = TRUE; - break; - case EVO_MOVE_THREE_SEGMENT: - if (MonKnowsMove(mon, evolutions[i].param) && (personality % 100) == 0) - conditionsMet = TRUE; - break; case EVO_LEVEL_MOVE_TYPE: for (j = 0; j < MAX_MON_MOVES; j++) { @@ -4874,7 +4879,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 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) From 035b40dde9eabd5ea6c514a2a2cdd0821ecd6304 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 7 Dec 2024 18:32:41 -0300 Subject: [PATCH 10/30] Map conditions --- include/constants/pokemon.h | 10 +++++----- .../pokemon/species_info/gen_1_families.h | 6 +++--- .../pokemon/species_info/gen_3_families.h | 2 +- .../pokemon/species_info/gen_7_families.h | 4 ++-- src/pokedex_plus_hgss.c | 6 ++++-- src/pokemon.c | 19 +++++++++---------- 6 files changed, 24 insertions(+), 23 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 8bbe72c1f25a..1c6634515746 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -255,11 +255,13 @@ enum EvolutionConditions { IF_ATK_EQ_DEF, // Pokémon's Attack is equal to its Defense stat. IF_ATK_LT_DEF, // Pokémon's Attack is lower than its Defense stat. // Gen 3 - IF_PID_UPPER_MODULO_10_GT, // The Pokémon's personality value's modulo by 10 is greater than the defined value. - IF_PID_UPPER_MODULO_10_EQ, // The Pokémon's personality value's modulo by 10 is equal than the defined value. - IF_PID_UPPER_MODULO_10_LT, // The Pokémon's personality value's modulo by 10 is lower than the defined value. + 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_EQ, // The Pokémon's upper personality value's modulo by 10 is equal than the defined value. + IF_PID_UPPER_MODULO_10_LT, // The Pokémon's upper personality value's modulo by 10 is lower than the defined value. // Gen 4 IF_SPECIES_IN_PARTY, // The party contains a Pokémon of the specified species. + IF_IN_MAP, // It's in the specific map. + IF_IN_MAPSEC, // It's in the specific map sector. // Gen 6 IF_TYPE_IN_PARTY, // The party contains a Pokémon of the specified type. IF_WEATHER, // It is the specific weather in the current map. @@ -281,9 +283,7 @@ enum EvolutionMethods { EVO_BEAUTY, // Pokémon levels up with beauty ≥ specified value EVO_MOVE, // Pokémon levels up, knows specified move EVO_LEVEL_MOVE_TYPE, // Pokémon levels up, knows move with specified type - EVO_MAPSEC, // Pokémon levels up on specified mapsec 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 diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 90c19e8465be..57c7d74af39c 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -9634,7 +9634,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}), }, @@ -15985,9 +15985,9 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = {EVO_LEVEL_MOVE_TYPE, TYPE_FAIRY, SPECIES_SYLVEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}, {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_SPECIFIC_MAP, MAP_PETALBURG_WOODS, SPECIES_LEAFEON}, + {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_LEVEL, 0, SPECIES_GLACEON, CONDITIONS({IF_IN_MAP, MAP_SHOAL_CAVE_LOW_TIDE_ICE_ROOM})}, {EVO_ITEM, ITEM_ICE_STONE, SPECIES_GLACEON}), }, diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index 50c702ca631a..25aa6521925a 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -3805,7 +3805,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}), }, diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index e0b84e8287e9..e3f4fe2475ea 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -1136,7 +1136,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}), }, @@ -1324,7 +1324,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}), }, diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 2e6b2f833519..dcb76360da9a 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6387,7 +6387,7 @@ 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; @@ -6555,11 +6555,11 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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 @@ -6586,11 +6586,13 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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); diff --git a/src/pokemon.c b/src/pokemon.c index f35813f29c1b..35ab96fdd35e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4501,6 +4501,14 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct } } break; + case IF_IN_MAPSEC: + if (gMapHeader.regionMapSectionId == params[j].arg) + currentCondition = TRUE; + break; + case IF_IN_MAP: + if (params[j].arg == ((gSaveBlock1Ptr->location.mapGroup) << 8 | gSaveBlock1Ptr->location.mapNum)) + currentCondition = TRUE; + break; case IF_TYPE_IN_PARTY: for (j = 0; j < PARTY_SIZE; j++) { @@ -4544,7 +4552,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); u32 level = GetMonData(mon, MON_DATA_LEVEL, 0); u32 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); - u32 holdEffect, currentMap, partnerSpecies, partnerHeldItem, partnerHoldEffect; + u32 holdEffect, partnerSpecies, partnerHeldItem, partnerHoldEffect; bool32 consumeItem = FALSE; u32 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); const struct Evolution *evolutions = GetSpeciesEvolutions(species); @@ -4632,15 +4640,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 } } break; - case EVO_MAPSEC: - if (gMapHeader.regionMapSectionId == evolutions[i].param) - conditionsMet = TRUE; - break; - case EVO_SPECIFIC_MAP: - currentMap = ((gSaveBlock1Ptr->location.mapGroup) << 8 | gSaveBlock1Ptr->location.mapNum); - if (currentMap == evolutions[i].param) - conditionsMet = TRUE; - break; case EVO_LEVEL_NATURE_AMPED: if (evolutions[i].param <= level) { From eee1e9906ec0bf18d0d9d7551e34bd5c20e46e81 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 7 Dec 2024 18:49:20 -0300 Subject: [PATCH 11/30] Knows Move conditions --- include/constants/pokemon.h | 4 +- .../pokemon/species_info/gen_1_families.h | 8 ++-- .../pokemon/species_info/gen_2_families.h | 16 ++++---- .../pokemon/species_info/gen_7_families.h | 4 +- .../pokemon/species_info/gen_8_families.h | 4 +- src/pokedex_plus_hgss.c | 2 - src/pokemon.c | 38 ++++++++++--------- 7 files changed, 38 insertions(+), 38 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 1c6634515746..99a0974c1b88 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -262,9 +262,11 @@ enum EvolutionConditions { IF_SPECIES_IN_PARTY, // The party contains a Pokémon of the specified species. IF_IN_MAP, // It's in the specific map. IF_IN_MAPSEC, // It's in the specific map sector. + IF_KNOWS_MOVE, // Pokémon knows specific move. // Gen 6 IF_TYPE_IN_PARTY, // The party contains a Pokémon of the specified type. IF_WEATHER, // It is the specific weather in the current map. + IF_KNOWS_MOVE_TYPE, // Pokémon knows a move with a specific type. // Gen 9 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. @@ -281,8 +283,6 @@ enum EvolutionMethods { 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_MOVE, // Pokémon levels up, knows specified move - EVO_LEVEL_MOVE_TYPE, // Pokémon levels up, knows move with specified type EVO_TRADE_SPECIFIC_MON, // Pokémon is traded for a specified Pokémon 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. diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 57c7d74af39c..8e54b033e989 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -12535,7 +12535,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 @@ -13307,7 +13307,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 @@ -14076,7 +14076,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 @@ -15982,7 +15982,7 @@ 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_LEVEL_MOVE_TYPE, TYPE_FAIRY, SPECIES_SYLVEON, CONDITIONS({IF_MIN_FRIENDSHIP, FRIENDSHIP_EVO_THRESHOLD})}, + {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})}, diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index 8dd1edb3a2d4..440c825aeb90 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -2215,7 +2215,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 @@ -2578,7 +2578,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 @@ -2854,7 +2854,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 @@ -3791,7 +3791,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 @@ -4052,8 +4052,8 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sDunsparceLevelUpLearnset, .teachableLearnset = sDunsparceTeachableLearnset, .eggMoveLearnset = sDunsparceEggMoveLearnset, - .evolutions = EVOLUTION({EVO_MOVE, MOVE_HYPER_DRILL, SPECIES_DUDUNSPARCE_TWO_SEGMENT, CONDITIONS({IF_PID_MODULO_100_GT, 0})}, - {EVO_MOVE, MOVE_HYPER_DRILL, SPECIES_DUDUNSPARCE_THREE_SEGMENT, CONDITIONS({IF_PID_MODULO_100_EQ, 0})}), + .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 @@ -4603,7 +4603,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] = @@ -5721,7 +5721,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 diff --git a/src/data/pokemon/species_info/gen_7_families.h b/src/data/pokemon/species_info/gen_7_families.h index e3f4fe2475ea..3fe5ca5bae84 100644 --- a/src/data/pokemon/species_info/gen_7_families.h +++ b/src/data/pokemon/species_info/gen_7_families.h @@ -3474,7 +3474,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] = @@ -6773,7 +6773,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 296de4a7e532..70f7b4bd956e 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -2673,7 +2673,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] = @@ -3772,7 +3772,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] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index dcb76360da9a..e93451b996fe 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6546,7 +6546,6 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept CopyItemName(item, gStringVar2); //item StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_HOLD_NIGHT ); break; - */ case EVO_MOVE: StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); StringExpandPlaceholders(gStringVar4, sText_EVO_MOVE ); @@ -6555,7 +6554,6 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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 ); diff --git a/src/pokemon.c b/src/pokemon.c index 35ab96fdd35e..aba5714b6fd6 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4451,6 +4451,7 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct u32 currentCondition = FALSE; switch(params[j].condition) { + // Gen 2 case IF_GENDER: if (params[j].arg == GetMonGender(mon)) currentCondition = TRUE; @@ -4491,6 +4492,7 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if ((upperPersonality % 10) < params[j].arg) currentCondition = TRUE; break; + // Gen 4 case IF_SPECIES_IN_PARTY: for (j = 0; j < PARTY_SIZE; j++) { @@ -4501,14 +4503,19 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct } } break; + case IF_IN_MAP: + if (params[j].arg == ((gSaveBlock1Ptr->location.mapGroup) << 8 | gSaveBlock1Ptr->location.mapNum)) + currentCondition = TRUE; + break; case IF_IN_MAPSEC: if (gMapHeader.regionMapSectionId == params[j].arg) currentCondition = TRUE; break; - case IF_IN_MAP: - if (params[j].arg == ((gSaveBlock1Ptr->location.mapGroup) << 8 | gSaveBlock1Ptr->location.mapNum)) + case IF_KNOWS_MOVE: + if (MonKnowsMove(mon, params[j].arg)) currentCondition = TRUE; break; + // Gen 6 case IF_TYPE_IN_PARTY: for (j = 0; j < PARTY_SIZE; j++) { @@ -4525,6 +4532,16 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (weather == params[j].arg) currentCondition = TRUE; break; + case IF_KNOWS_MOVE_TYPE: + for (j = 0; j < MAX_MON_MOVES; j++) + { + if (gMovesInfo[GetMonData(mon, MON_DATA_MOVE1 + j, NULL)].type == params[j].arg) + { + currentCondition = TRUE; + break; + } + } + break; case IF_PID_MODULO_100_GT: if ((personality % 100) > params[j].arg) currentCondition = TRUE; @@ -4546,7 +4563,7 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner) { - int i, j; + int i; u32 targetSpecies = SPECIES_NONE; u32 species = GetMonData(mon, MON_DATA_SPECIES, 0); u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); @@ -4600,7 +4617,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 { case EVO_MODE_NORMAL: case EVO_MODE_BATTLE_ONLY: - DebugPrintf("hours:%d", gLocalTime.hours); for (i = 0; evolutions[i].method != EVOLUTIONS_END; i++) { bool32 conditionsMet = FALSE; @@ -4626,20 +4642,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].param <= beauty) conditionsMet = TRUE; break; - case EVO_MOVE: - if (MonKnowsMove(mon, evolutions[i].param)) - conditionsMet = TRUE; - break; - case EVO_LEVEL_MOVE_TYPE: - for (j = 0; j < MAX_MON_MOVES; j++) - { - if (gMovesInfo[GetMonData(mon, MON_DATA_MOVE1 + j, NULL)].type == evolutions[i].param) - { - conditionsMet = TRUE; - break; - } - } - break; case EVO_LEVEL_NATURE_AMPED: if (evolutions[i].param <= level) { From 9475aa896697ba1098303e46984f0e1dcc96ad7a Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 7 Dec 2024 19:10:13 -0300 Subject: [PATCH 12/30] Nature condition --- include/constants/pokemon.h | 4 +- .../pokemon/species_info/gen_8_families.h | 27 ++++++- src/pokedex_plus_hgss.c | 2 +- src/pokemon.c | 71 +++++-------------- 4 files changed, 44 insertions(+), 60 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 99a0974c1b88..c8dc678f7933 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -267,6 +267,8 @@ enum EvolutionConditions { IF_TYPE_IN_PARTY, // The party contains a Pokémon of the specified type. IF_WEATHER, // It is the specific weather in the current map. IF_KNOWS_MOVE_TYPE, // Pokémon knows a move with a specific type. + // Gen 8 + IF_NATURE, // Pokémon has a specific nature. // Gen 9 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. @@ -284,8 +286,6 @@ enum EvolutionMethods { EVO_LEVEL_SHEDINJA, // Pokémon reaches the specified level (special value for Shedinja) EVO_BEAUTY, // Pokémon levels up with beauty ≥ specified value EVO_TRADE_SPECIFIC_MON, // Pokémon is traded for a specified Pokémon - 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 diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 70f7b4bd956e..6495494fb271 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -3288,8 +3288,31 @@ 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_NATURE, NATURE_HARDY})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_BRAVE})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_ADAMANT})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_NAUGHTY})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_DOCILE})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_IMPISH})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_LAX})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_HASTY})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_JOLLY})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_NAIVE})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_RASH})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_SASSY})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_QUIRKY})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_LONELY})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_BOLD})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_RELAXED})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_TIMID})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_SERIOUS})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_MODEST})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_MILD})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_QUIET})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_BASHFUL})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_CALM})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_GENTLE})}, + {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_CAREFUL})}), }, [SPECIES_TOXTRICITY_AMPED] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index e93451b996fe..02d9a62b5b98 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6590,7 +6590,6 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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); @@ -6599,6 +6598,7 @@ 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_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); diff --git a/src/pokemon.c b/src/pokemon.c index aba5714b6fd6..20847b226745 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4436,15 +4436,17 @@ static u32 GetGMaxTargetSpecies(u32 species) return SPECIES_NONE; } -static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params) +static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, bool32 *consumeItem) { u32 j; + 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); u16 upperPersonality = personality >> 16; u32 weather = GetCurrentWeather(); + u32 nature = GetNature(mon); // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. for (j = 0; params != NULL && params[j].condition != CONDITIONS_END; j++) { @@ -4453,7 +4455,7 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct { // Gen 2 case IF_GENDER: - if (params[j].arg == GetMonGender(mon)) + if (gender == GetMonGender(mon)) currentCondition = TRUE; break; case IF_MIN_FRIENDSHIP: @@ -4542,6 +4544,12 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct } } break; + // Gen 8 + case IF_NATURE: + if (nature == params[j].arg) + currentCondition = TRUE; + break; + // Gen 9 case IF_PID_MODULO_100_GT: if ((personality % 100) > params[j].arg) currentCondition = TRUE; @@ -4642,53 +4650,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].param <= beauty) conditionsMet = TRUE; 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: - conditionsMet = TRUE; - 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: - conditionsMet = TRUE; - break; - } - } - break; case EVO_LEVEL_ITEM_HOLD: if (heldItem == evolutions[i].param) { @@ -4714,7 +4675,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4742,7 +4703,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4777,7 +4738,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4803,7 +4764,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4829,7 +4790,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4868,7 +4829,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. From ef73f478784ebddf3a13aefec9a1f0f366426341 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 8 Dec 2024 12:31:18 -0300 Subject: [PATCH 13/30] Held item conditions --- include/constants/pokemon.h | 3 +- .../pokemon/species_info/gen_1_families.h | 22 +++++----- .../pokemon/species_info/gen_2_families.h | 6 +-- .../pokemon/species_info/gen_3_families.h | 8 ++-- .../pokemon/species_info/gen_6_families.h | 4 +- src/pokedex_plus_hgss.c | 4 +- src/pokemon.c | 41 +++++++++---------- 7 files changed, 44 insertions(+), 44 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index c8dc678f7933..23dec4947692 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -254,6 +254,7 @@ enum EvolutionConditions { IF_ATK_GT_DEF, // Pokémon's Attack is greater than its Defense stat. IF_ATK_EQ_DEF, // Pokémon's Attack is equal to its Defense stat. IF_ATK_LT_DEF, // Pokémon's Attack is lower than its Defense stat. + IF_HOLD_ITEM, // 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_EQ, // The Pokémon's upper personality value's modulo by 10 is equal than the defined value. @@ -280,7 +281,6 @@ enum EvolutionMethods { 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_TRADE_ITEM, // Pokémon is traded while it's holding the specified item EVO_ITEM, // specified item is used on Pokémon 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) @@ -290,7 +290,6 @@ enum EvolutionMethods { 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_LEVEL_ITEM_HOLD, // Pokémon levels up, holds specified item EVO_LEVEL_BATTLE_ONLY, // Pokémon reaches the specified level, in battle only EVO_USE_MOVE_TWENTY_TIMES, // Pokémon levels up after having used a move for at least 20 times EVO_RECOIL_DAMAGE, // Pokémon levels up after having suffered specified amount of non-fainting recoil damage diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 8e54b033e989..d89de9ef1bcd 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -7315,7 +7315,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}), }, @@ -9117,7 +9117,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}), }, @@ -10997,7 +10997,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}), }, @@ -12959,7 +12959,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}), }, @@ -13108,7 +13108,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = .levelUpLearnset = sHappinyLevelUpLearnset, .teachableLearnset = sHappinyTeachableLearnset, .eggMoveLearnset = sHappinyEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_ITEM_HOLD, ITEM_OVAL_STONE, SPECIES_CHANSEY, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}, + .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 @@ -13643,7 +13643,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}), }, @@ -14352,7 +14352,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}), }, @@ -14825,7 +14825,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}), }, @@ -15028,7 +15028,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}), }, @@ -16681,7 +16681,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}), }, @@ -16750,7 +16750,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}), }, diff --git a/src/data/pokemon/species_info/gen_2_families.h b/src/data/pokemon/species_info/gen_2_families.h index 440c825aeb90..36ae6191a480 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -4257,7 +4257,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sGligarLevelUpLearnset, .teachableLearnset = sGligarTeachableLearnset, .eggMoveLearnset = sGligarEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL_ITEM_HOLD, ITEM_RAZOR_FANG, SPECIES_GLISCOR, CONDITIONS({IF_TIME, TIME_NIGHT})}, + .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})}), }, @@ -4953,7 +4953,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .teachableLearnset = sSneaselTeachableLearnset, .eggMoveLearnset = sSneaselEggMoveLearnset, .formSpeciesIdTable = sSneaselFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL_ITEM_HOLD, ITEM_RAZOR_CLAW, SPECIES_WEAVILE, CONDITIONS({IF_TIME, TIME_NIGHT})}, + .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})}), }, @@ -5110,7 +5110,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sSneaselHisuiLevelUpLearnset, .teachableLearnset = sSneaselHisuiTeachableLearnset, .formSpeciesIdTable = sSneaselFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL_ITEM_HOLD, ITEM_RAZOR_CLAW, SPECIES_SNEASLER, CONDITIONS({IF_NOT_TIME, TIME_NIGHT})}, + .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})}), }, diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index 25aa6521925a..addfb5c0f980 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -7953,7 +7953,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .teachableLearnset = sFeebasTeachableLearnset, .eggMoveLearnset = sFeebasEggMoveLearnset, .evolutions = EVOLUTION({EVO_BEAUTY, 170, SPECIES_MILOTIC}, - {EVO_TRADE_ITEM, ITEM_PRISM_SCALE, SPECIES_MILOTIC}, + {EVO_TRADE, 0, SPECIES_MILOTIC, CONDITIONS({IF_HOLD_ITEM, ITEM_PRISM_SCALE})}, {EVO_ITEM, ITEM_PRISM_SCALE, SPECIES_MILOTIC}), }, @@ -8711,7 +8711,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}), }, @@ -9663,8 +9663,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_6_families.h b/src/data/pokemon/species_info/gen_6_families.h index 566fe5966453..c57e26bfde25 100644 --- a/src/data/pokemon/species_info/gen_6_families.h +++ b/src/data/pokemon/species_info/gen_6_families.h @@ -2714,7 +2714,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}), }, @@ -2841,7 +2841,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}), }, diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 02d9a62b5b98..40b6d397cedd 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6471,11 +6471,13 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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 ); break; + */ case EVO_ITEM: item = evolutions[i].param; CopyItemName(item, gStringVar2); @@ -6628,12 +6630,12 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept CopyItemName(item, gStringVar2); StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_DAY ); break; - */ case EVO_LEVEL_ITEM_HOLD: item = evolutions[i].param; CopyItemName(item, gStringVar2); StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_HOLD); break; + */ case EVO_USE_MOVE_TWENTY_TIMES: StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); StringExpandPlaceholders(gStringVar4, sText_EVO_USE_MOVE_TWENTY_TIMES ); diff --git a/src/pokemon.c b/src/pokemon.c index 20847b226745..d199972c08e9 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4436,7 +4436,7 @@ static u32 GetGMaxTargetSpecies(u32 species) return SPECIES_NONE; } -static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, bool32 *consumeItem) +static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, u32 heldItem, bool32 *consumeItem) { u32 j; u32 gender = GetMonGender(mon); @@ -4447,6 +4447,8 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct u16 upperPersonality = personality >> 16; u32 weather = GetCurrentWeather(); u32 nature = GetNature(mon); + u32 conditionRemovesItem = FALSE; + // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. for (j = 0; params != NULL && params[j].condition != CONDITIONS_END; j++) { @@ -4482,6 +4484,14 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (GetTimeOfDay() != params[j].arg) currentCondition = TRUE; break; + case IF_HOLD_ITEM: + if (heldItem == params[j].arg) + { + currentCondition = TRUE; + conditionRemovesItem = TRUE; + } + break; + // Gen 3 case IF_PID_UPPER_MODULO_10_GT: if ((upperPersonality % 10) > params[j].arg) currentCondition = TRUE; @@ -4566,6 +4576,9 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (currentCondition == FALSE) return FALSE; } + if (conditionRemovesItem) + *consumeItem = TRUE; + return TRUE; } @@ -4650,13 +4663,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].param <= beauty) conditionsMet = TRUE; break; - case EVO_LEVEL_ITEM_HOLD: - if (heldItem == evolutions[i].param) - { - conditionsMet = TRUE; - consumeItem = TRUE; - } - break; case EVO_USE_MOVE_TWENTY_TIMES: if (evolutionTracker >= 20) conditionsMet = TRUE; @@ -4675,7 +4681,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4703,7 +4709,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4725,20 +4731,13 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 case EVO_TRADE: conditionsMet = TRUE; break; - case EVO_TRADE_ITEM: - if (evolutions[i].param == heldItem) - { - conditionsMet = TRUE; - consumeItem = TRUE; - } - break; case EVO_TRADE_SPECIFIC_MON: if (evolutions[i].param == partnerSpecies && partnerHoldEffect != HOLD_EFFECT_PREVENT_EVOLVE) conditionsMet = TRUE; break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4764,7 +4763,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4790,7 +4789,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4829,7 +4828,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. From 8032cce91e892c45be00697020c6fbc8d28a6a18 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 8 Dec 2024 12:33:15 -0300 Subject: [PATCH 14/30] Fixed looping conditions --- src/pokemon.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index d199972c08e9..28a861bb6793 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4438,7 +4438,7 @@ static u32 GetGMaxTargetSpecies(u32 species) static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, u32 heldItem, bool32 *consumeItem) { - u32 j; + u32 i, j; u32 gender = GetMonGender(mon); u32 friendship = GetMonData(mon, MON_DATA_FRIENDSHIP, 0); u32 attack = GetMonData(mon, MON_DATA_ATK, 0); @@ -4450,10 +4450,10 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct u32 conditionRemovesItem = FALSE; // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. - for (j = 0; params != NULL && params[j].condition != CONDITIONS_END; j++) + for (i = 0; params != NULL && params[i].condition != CONDITIONS_END; i++) { u32 currentCondition = FALSE; - switch(params[j].condition) + switch(params[i].condition) { // Gen 2 case IF_GENDER: @@ -4461,7 +4461,7 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct currentCondition = TRUE; break; case IF_MIN_FRIENDSHIP: - if (friendship >= params[j].arg) + if (friendship >= params[i].arg) currentCondition = TRUE; break; case IF_ATK_GT_DEF: @@ -4477,15 +4477,15 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct currentCondition = TRUE; break; case IF_TIME: - if (GetTimeOfDay() == params[j].arg) + if (GetTimeOfDay() == params[i].arg) currentCondition = TRUE; break; case IF_NOT_TIME: - if (GetTimeOfDay() != params[j].arg) + if (GetTimeOfDay() != params[i].arg) currentCondition = TRUE; break; case IF_HOLD_ITEM: - if (heldItem == params[j].arg) + if (heldItem == params[i].arg) { currentCondition = TRUE; conditionRemovesItem = TRUE; @@ -4493,22 +4493,22 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct break; // Gen 3 case IF_PID_UPPER_MODULO_10_GT: - if ((upperPersonality % 10) > params[j].arg) + if ((upperPersonality % 10) > params[i].arg) currentCondition = TRUE; break; case IF_PID_UPPER_MODULO_10_EQ: - if ((upperPersonality % 10) == params[j].arg) + if ((upperPersonality % 10) == params[i].arg) currentCondition = TRUE; break; case IF_PID_UPPER_MODULO_10_LT: - if ((upperPersonality % 10) < params[j].arg) + if ((upperPersonality % 10) < params[i].arg) 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[j].arg) + if (GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL) == params[i].arg) { currentCondition = TRUE; break; @@ -4516,15 +4516,15 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct } break; case IF_IN_MAP: - if (params[j].arg == ((gSaveBlock1Ptr->location.mapGroup) << 8 | gSaveBlock1Ptr->location.mapNum)) + if (params[i].arg == ((gSaveBlock1Ptr->location.mapGroup) << 8 | gSaveBlock1Ptr->location.mapNum)) currentCondition = TRUE; break; case IF_IN_MAPSEC: - if (gMapHeader.regionMapSectionId == params[j].arg) + if (gMapHeader.regionMapSectionId == params[i].arg) currentCondition = TRUE; break; case IF_KNOWS_MOVE: - if (MonKnowsMove(mon, params[j].arg)) + if (MonKnowsMove(mon, params[i].arg)) currentCondition = TRUE; break; // Gen 6 @@ -4532,8 +4532,8 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct for (j = 0; j < PARTY_SIZE; j++) { u16 currSpecies = GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL); - if (gSpeciesInfo[currSpecies].types[0] == params[j].arg - || gSpeciesInfo[currSpecies].types[1] == params[j].arg) + if (gSpeciesInfo[currSpecies].types[0] == params[i].arg + || gSpeciesInfo[currSpecies].types[1] == params[i].arg) { currentCondition = TRUE; break; @@ -4541,13 +4541,13 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct } break; case IF_WEATHER: - if (weather == params[j].arg) + if (weather == params[i].arg) currentCondition = TRUE; break; case IF_KNOWS_MOVE_TYPE: for (j = 0; j < MAX_MON_MOVES; j++) { - if (gMovesInfo[GetMonData(mon, MON_DATA_MOVE1 + j, NULL)].type == params[j].arg) + if (gMovesInfo[GetMonData(mon, MON_DATA_MOVE1 + j, NULL)].type == params[i].arg) { currentCondition = TRUE; break; @@ -4556,20 +4556,20 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct break; // Gen 8 case IF_NATURE: - if (nature == params[j].arg) + if (nature == params[i].arg) currentCondition = TRUE; break; // Gen 9 case IF_PID_MODULO_100_GT: - if ((personality % 100) > params[j].arg) + if ((personality % 100) > params[i].arg) currentCondition = TRUE; break; case IF_PID_MODULO_100_EQ: - if ((personality % 100) == params[j].arg) + if ((personality % 100) == params[i].arg) currentCondition = TRUE; break; case IF_PID_MODULO_100_LT: - if ((personality % 100) < params[j].arg) + if ((personality % 100) < params[i].arg) currentCondition = TRUE; break; } From d33fbd4b3bbccd51ccb267e1b99dd5ca6fd1bbc7 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 9 Dec 2024 12:12:03 -0300 Subject: [PATCH 15/30] Beauty condition --- include/constants/pokemon.h | 2 +- src/data/pokemon/species_info/gen_3_families.h | 2 +- src/pokedex_plus_hgss.c | 2 +- src/pokemon.c | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 23dec4947692..948421735ac5 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -259,6 +259,7 @@ enum EvolutionConditions { 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_EQ, // The Pokémon's upper personality value's modulo by 10 is equal than the defined value. IF_PID_UPPER_MODULO_10_LT, // The Pokémon's upper personality value's modulo by 10 is lower than the defined value. + IF_MIN_BEAUTY, // 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, // It's in the specific map. @@ -284,7 +285,6 @@ enum EvolutionMethods { EVO_ITEM, // specified item is used on Pokémon 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_TRADE_SPECIFIC_MON, // Pokémon is traded for a specified Pokémon 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 diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index addfb5c0f980..b6aa9c67b204 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -7952,7 +7952,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sFeebasLevelUpLearnset, .teachableLearnset = sFeebasTeachableLearnset, .eggMoveLearnset = sFeebasEggMoveLearnset, - .evolutions = EVOLUTION({EVO_BEAUTY, 170, 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}), }, diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 40b6d397cedd..67c277f46cd7 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6513,11 +6513,11 @@ 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_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 ); diff --git a/src/pokemon.c b/src/pokemon.c index 28a861bb6793..0dff495d3962 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4445,6 +4445,7 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct u32 defense = GetMonData(mon, MON_DATA_DEF, 0); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY, 0); u16 upperPersonality = personality >> 16; + u32 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); u32 weather = GetCurrentWeather(); u32 nature = GetNature(mon); u32 conditionRemovesItem = FALSE; @@ -4504,6 +4505,10 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if ((upperPersonality % 10) < params[i].arg) currentCondition = TRUE; break; + case IF_MIN_BEAUTY: + if (beauty >= params[i].arg) + currentCondition = TRUE; + break; // Gen 4 case IF_SPECIES_IN_PARTY: for (j = 0; j < PARTY_SIZE; j++) @@ -4589,7 +4594,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 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 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); u32 holdEffect, partnerSpecies, partnerHeldItem, partnerHoldEffect; bool32 consumeItem = FALSE; u32 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); @@ -4659,10 +4663,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level) conditionsMet = TRUE; break; - case EVO_BEAUTY: - if (evolutions[i].param <= beauty) - conditionsMet = TRUE; - break; case EVO_USE_MOVE_TWENTY_TIMES: if (evolutionTracker >= 20) conditionsMet = TRUE; From 01f5f28ea386d59059fdc002f98fa9c2506b2948 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Mon, 9 Dec 2024 12:54:55 -0300 Subject: [PATCH 16/30] Overworld steps condition --- include/constants/pokemon.h | 64 +++++++++---------- .../pokemon/species_info/gen_9_families.h | 6 +- src/pokedex_plus_hgss.c | 2 + src/pokemon.c | 8 +-- 4 files changed, 41 insertions(+), 39 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 948421735ac5..141c812e0237 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -247,55 +247,55 @@ enum EvolutionConditions { // Gen 2 - IF_GENDER, // Pokémon is of specific gender. - IF_TIME, // Is the specific time of day. - IF_NOT_TIME, // Is NOT the specific time of day. - IF_MIN_FRIENDSHIP, // Pokémon has the defined amount of Friendship. - IF_ATK_GT_DEF, // Pokémon's Attack is greater than its Defense stat. - IF_ATK_EQ_DEF, // Pokémon's Attack is equal to its Defense stat. - IF_ATK_LT_DEF, // Pokémon's Attack is lower than its Defense stat. - IF_HOLD_ITEM, // Pokémon is holding a specific item. + 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_EQ, // The Pokémon's upper personality value's modulo by 10 is equal than the defined value. IF_PID_UPPER_MODULO_10_LT, // The Pokémon's upper personality value's modulo by 10 is lower than the defined value. - IF_MIN_BEAUTY, // Pokémon has the defined amount of Beauty. + 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, // It's in the specific map. - IF_IN_MAPSEC, // It's in the specific map sector. - IF_KNOWS_MOVE, // Pokémon knows specific move. + 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 6 IF_TYPE_IN_PARTY, // The party contains a Pokémon of the specified type. - IF_WEATHER, // It is the specific weather in the current map. - IF_KNOWS_MOVE_TYPE, // Pokémon knows a move with a specific 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, // Pokémon has a specific nature. + IF_NATURE, // The Pokémon has a specific nature. // Gen 9 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. 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_LEVEL, // Pokémon reaches the specified level - EVO_TRADE, // Pokémon is traded - EVO_ITEM, // specified item is used on Pokémon - 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_TRADE_SPECIFIC_MON, // Pokémon is traded for a specified Pokémon - 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_LEVEL_BATTLE_ONLY, // Pokémon reaches the specified level, in battle only - EVO_USE_MOVE_TWENTY_TIMES, // Pokémon levels up after having used a move for at least 20 times - EVO_RECOIL_DAMAGE, // Pokémon levels up after having suffered specified amount of non-fainting recoil damage - 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_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_TRADE_SPECIFIC_MON, // Pokémon is traded for a specified Pokémon + 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_LEVEL_BATTLE_ONLY, // Pokémon reaches the specified level, in battle only + EVO_USE_MOVE_TWENTY_TIMES, // Pokémon levels up after having used a move for at least 20 times + EVO_RECOIL_DAMAGE, // Pokémon levels up after having suffered specified amount of non-fainting recoil damage + 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 }; enum EvolutionMode { diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 801bc255a7e5..7fce8efb61a7 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -1131,7 +1131,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] = @@ -2895,7 +2895,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] = @@ -3342,7 +3342,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] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 67c277f46cd7..f7b063e6ed98 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6661,10 +6661,12 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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; diff --git a/src/pokemon.c b/src/pokemon.c index 0dff495d3962..2baeb814f38c 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4577,6 +4577,10 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if ((personality % 100) < params[i].arg) currentCondition = TRUE; break; + case IF_MIN_OVERWORLD_STEPS: + if (mon == GetFirstLiveMon() && gFollowerSteps >= params[i].arg) + currentCondition = TRUE; + break; } if (currentCondition == FALSE) return FALSE; @@ -4675,10 +4679,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutionTracker >= 3) conditionsMet = TRUE; break; - case EVO_OVERWORLD_STEPS: - if (mon == GetFirstLiveMon() && gFollowerSteps >= evolutions[i].param) - conditionsMet = TRUE; - break; } if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) From 4eaae06746ba4c19cdaf0eb709b15c3bc2567d08 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 12 Jan 2025 15:13:51 -0300 Subject: [PATCH 17/30] Evolution tracker conditions --- include/constants/pokemon.h | 6 +- src/battle_script_commands.c | 55 ++++++++++--------- .../pokemon/species_info/gen_1_families.h | 2 +- .../pokemon/species_info/gen_2_families.h | 2 +- .../pokemon/species_info/gen_5_families.h | 6 +- src/pokedex_plus_hgss.c | 4 +- src/pokemon.c | 26 ++++----- test/species.c | 27 +++++---- 8 files changed, 68 insertions(+), 60 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index eac92da80f31..aae9718e3f43 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -271,6 +271,9 @@ enum EvolutionConditions { 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_RECOIL_DAMAGE_GE, // The Pokémon suffered at least certain amount of non-fainting recoil damage. + IF_USED_MOVE_TWENTY_TIMES, // The Pokémon has used a move for at least 20 times. + IF_DEFEAT_THREE_WITH_ITEM, // The Pokémon defeated 3 Pokémon of the same species holding the specified item. // Gen 9 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. @@ -292,10 +295,7 @@ enum EvolutionMethods { EVO_DARK_SCROLL, // interacts with Scroll of Darkness EVO_WATER_SCROLL, // interacts with Scroll of Waters EVO_LEVEL_BATTLE_ONLY, // Pokémon reaches the specified level, in battle only - EVO_USE_MOVE_TWENTY_TIMES, // Pokémon levels up after having used a move for at least 20 times - EVO_RECOIL_DAMAGE, // Pokémon levels up after having suffered specified amount of non-fainting recoil damage 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 }; enum EvolutionMode { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f0d4039f9b60..6492a275ada1 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -337,7 +337,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); @@ -6946,7 +6946,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_TWENTY_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. @@ -17387,9 +17387,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 @@ -17406,30 +17406,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: - 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_TWENTY_TIMES: + if (evolutions[i].params[j].arg == 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_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].params[j].arg) + SetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER, &val); + break; + } + return; } - return; } } } @@ -17438,14 +17443,14 @@ static void TryUpdateEvolutionTracker(u32 evolutionMethod, u32 upAmount, u16 use void BS_TryUpdateRecoilTracker(void) { NATIVE_ARGS(); - TryUpdateEvolutionTracker(EVO_RECOIL_DAMAGE, gBattleStruct->moveDamage[gBattlerAttacker], MOVE_NONE); + 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_THREE_WITH_ITEM, 1, MOVE_NONE); gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 0188be5c718d..2f78f755fea6 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -6862,7 +6862,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_TWENTY_TIMES, MOVE_RAGE_FIST})}), }, #if P_GEN_9_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 36ae6191a480..627c18055cc1 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -6823,7 +6823,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_TWENTY_TIMES, MOVE_PSYSHIELD_BASH})}), }, #if P_GEN_8_CROSS_EVOS diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index aa09a463e15e..92688e3fd26a 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -4038,8 +4038,8 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .levelUpLearnset = sBasculinWhiteStripedLevelUpLearnset, .teachableLearnset = sBasculinWhiteStripedTeachableLearnset, .formSpeciesIdTable = sBasculinFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_RECOIL_DAMAGE, 294, SPECIES_BASCULEGION_M, CONDITIONS({IF_GENDER, MON_MALE})}, - {EVO_RECOIL_DAMAGE, 294, SPECIES_BASCULEGION_F, CONDITIONS({IF_GENDER, MON_FEMALE})}), + .evolutions = EVOLUTION({EVO_LEVEL, 294, SPECIES_BASCULEGION_M, CONDITIONS({IF_RECOIL_DAMAGE_GE, 294}, {IF_GENDER, MON_MALE})}, + {EVO_LEVEL, 294, SPECIES_BASCULEGION_F, CONDITIONS({IF_RECOIL_DAMAGE_GE, 294}, {IF_GENDER, MON_FEMALE})}), }, [SPECIES_BASCULEGION_M] = @@ -10049,7 +10049,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_THREE_WITH_ITEM, ITEM_LEADERS_CREST})}), }, #if P_GEN_9_CROSS_EVOS diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index a8ef4682bfad..bc563d4acaec 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6637,12 +6637,10 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept CopyItemName(item, gStringVar2); StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_HOLD); break; - */ case EVO_USE_MOVE_TWENTY_TIMES: StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); StringExpandPlaceholders(gStringVar4, sText_EVO_USE_MOVE_TWENTY_TIMES ); break; - /* case EVO_RECOIL_DAMAGE_MALE: ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, 3); StringExpandPlaceholders(gStringVar4, sText_EVO_RECOIL_DAMAGE_MALE); @@ -6657,13 +6655,13 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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); diff --git a/src/pokemon.c b/src/pokemon.c index 4ece6ba9a889..f9f1dc629f36 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4463,6 +4463,7 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct u32 weather = GetCurrentWeather(); u32 nature = GetNature(mon); u32 conditionRemovesItem = FALSE; + u32 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); // 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++) @@ -4578,6 +4579,18 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (nature == params[i].arg) currentCondition = TRUE; break; + case IF_RECOIL_DAMAGE_GE: + if (evolutionTracker >= params[i].arg) + currentCondition = TRUE; + break; + case IF_USED_MOVE_TWENTY_TIMES: + if (evolutionTracker >= 20) + currentCondition = TRUE; + break; + case IF_DEFEAT_THREE_WITH_ITEM: + if (evolutionTracker >= 3) + currentCondition = TRUE; + break; // Gen 9 case IF_PID_MODULO_100_GT: if ((personality % 100) > params[i].arg) @@ -4614,7 +4627,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 u32 level = GetMonData(mon, MON_DATA_LEVEL, 0); u32 holdEffect, partnerSpecies, partnerHeldItem, partnerHoldEffect; bool32 consumeItem = FALSE; - u32 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); const struct Evolution *evolutions = GetSpeciesEvolutions(species); if (evolutions == NULL) @@ -4681,18 +4693,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level) conditionsMet = TRUE; break; - case EVO_USE_MOVE_TWENTY_TIMES: - if (evolutionTracker >= 20) - conditionsMet = TRUE; - break; - case EVO_RECOIL_DAMAGE: - if (evolutionTracker >= evolutions[i].param) - conditionsMet = TRUE; - break; - case EVO_DEFEAT_THREE_WITH_ITEM: - if (evolutionTracker >= 3) - conditionsMet = TRUE; - break; } if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) diff --git a/test/species.c b/test/species.c index 2d93b918a70e..c7e36e44075e 100644 --- a/test/species.c +++ b/test/species.c @@ -98,7 +98,7 @@ 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 hasRecoilEvo; @@ -115,18 +115,23 @@ TEST("No species has two evolutions that use the evolution tracker") 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) + 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 (!hasRecoilEvo) - { - hasRecoilEvo = TRUE; + if (evolutions[i].params[j].condition == IF_USED_MOVE_TWENTY_TIMES + || evolutions[i].params[j].condition == IF_DEFEAT_THREE_WITH_ITEM + ) 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++; + } } } } From 646f2ad4c2ccd78269f9d256f02e083ad515e027 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 15 Jan 2025 11:53:18 -0300 Subject: [PATCH 18/30] Karrablast/Shelmet evo --- include/constants/pokemon.h | 3 +- .../pokemon/species_info/gen_5_families.h | 4 +- src/pokedex_plus_hgss.c | 2 - src/pokemon.c | 74 ++++++++++--------- 4 files changed, 44 insertions(+), 39 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index aae9718e3f43..e4ab219fd981 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -265,6 +265,8 @@ enum EvolutionConditions { 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. @@ -289,7 +291,6 @@ enum EvolutionMethods { EVO_ITEM, // specified item is used on Pokémon 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_TRADE_SPECIFIC_MON, // Pokémon is traded for a specified Pokémon 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 diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index 92688e3fd26a..e1eea1f9aa26 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -7566,7 +7566,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] = @@ -9408,7 +9408,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] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index bc563d4acaec..cba428ff11aa 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6583,12 +6583,10 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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); diff --git a/src/pokemon.c b/src/pokemon.c index f9f1dc629f36..c788ba65ba40 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4450,9 +4450,10 @@ u32 GetGMaxTargetSpecies(u32 species) return species; } -static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, u32 heldItem, bool32 *consumeItem) +static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, struct Pokemon *tradePartner, bool32 *consumeItem) { 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); @@ -4465,11 +4466,34 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct u32 conditionRemovesItem = FALSE; u32 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); + u32 partnerSpecies, partnerHeldItem, partnerHoldEffect; + if (tradePartner != NULL) + { + partnerSpecies = GetMonData(tradePartner, MON_DATA_SPECIES, 0); + partnerHeldItem = GetMonData(tradePartner, MON_DATA_HELD_ITEM, 0); + + if (partnerHeldItem == ITEM_ENIGMA_BERRY_E_READER) + #if FREE_ENIGMA_BERRY == FALSE + partnerHoldEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; + #else + partnerHoldEffect = 0; + #endif //FREE_ENIGMA_BERRY + else + partnerHoldEffect = ItemId_GetHoldEffect(partnerHeldItem); + } + else + { + partnerSpecies = SPECIES_NONE; + partnerHeldItem = ITEM_NONE; + 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(params[i].condition) + switch(condition) { // Gen 2 case IF_GENDER: @@ -4547,6 +4571,11 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (MonKnowsMove(mon, params[i].arg)) currentCondition = TRUE; break; + // Gen 5 + case IF_TRADE_PARTNER_SPECIES: + if (params[i].arg == partnerSpecies && partnerHoldEffect != HOLD_EFFECT_PREVENT_EVOLVE) + currentCondition = TRUE; + break; // Gen 6 case IF_TYPE_IN_PARTY: for (j = 0; j < PARTY_SIZE; j++) @@ -4608,6 +4637,8 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (mon == GetFirstLiveMon() && gFollowerSteps >= params[i].arg) currentCondition = TRUE; break; + case CONDITIONS_END: + break; } if (currentCondition == FALSE) return FALSE; @@ -4625,34 +4656,13 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 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, partnerSpecies, partnerHeldItem, partnerHoldEffect; + u32 holdEffect; bool32 consumeItem = FALSE; const struct Evolution *evolutions = GetSpeciesEvolutions(species); if (evolutions == NULL) return SPECIES_NONE; - if (tradePartner != NULL) - { - partnerSpecies = GetMonData(tradePartner, MON_DATA_SPECIES, 0); - partnerHeldItem = GetMonData(tradePartner, MON_DATA_HELD_ITEM, 0); - - if (partnerHeldItem == ITEM_ENIGMA_BERRY_E_READER) - #if FREE_ENIGMA_BERRY == FALSE - partnerHoldEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; - #else - partnerHoldEffect = 0; - #endif //FREE_ENIGMA_BERRY - else - partnerHoldEffect = ItemId_GetHoldEffect(partnerHeldItem); - } - else - { - partnerSpecies = SPECIES_NONE; - partnerHeldItem = ITEM_NONE; - partnerHoldEffect = HOLD_EFFECT_NONE; - } - if (heldItem == ITEM_ENIGMA_BERRY_E_READER) #if FREE_ENIGMA_BERRY == FALSE holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; @@ -4695,7 +4705,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4723,7 +4733,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4745,13 +4755,9 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 case EVO_TRADE: conditionsMet = TRUE; break; - case EVO_TRADE_SPECIFIC_MON: - if (evolutions[i].param == partnerSpecies && partnerHoldEffect != HOLD_EFFECT_PREVENT_EVOLVE) - conditionsMet = TRUE; - break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, tradePartner, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4777,7 +4783,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4803,7 +4809,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4842,7 +4848,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, heldItem, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. From 26e70ea52089512b601909a729cb140170624212 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 15 Jan 2025 15:25:10 -0300 Subject: [PATCH 19/30] Critical hits evo --- include/constants/pokemon.h | 5 ++-- src/battle_script_commands.c | 2 +- .../pokemon/species_info/gen_1_families.h | 2 +- src/pokedex_plus_hgss.c | 2 +- src/pokemon.c | 25 +++++++++++-------- 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index e4ab219fd981..7c53df832c84 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -274,9 +274,10 @@ enum EvolutionConditions { // Gen 8 IF_NATURE, // The Pokémon has a specific nature. IF_RECOIL_DAMAGE_GE, // The Pokémon suffered at least certain amount of non-fainting recoil damage. + IF_CRITICAL_HITS_GE, // The Pokémon performed the specified number of critical hits in one battle at least. IF_USED_MOVE_TWENTY_TIMES, // The Pokémon has used a move for at least 20 times. - IF_DEFEAT_THREE_WITH_ITEM, // The Pokémon defeated 3 Pokémon of the same species holding the specified item. // Gen 9 + IF_DEFEAT_THREE_WITH_ITEM, // The Pokémon defeated 3 Pokémon of the same species 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. @@ -291,12 +292,12 @@ enum EvolutionMethods { EVO_ITEM, // specified item is used on Pokémon 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_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_LEVEL_BATTLE_ONLY, // Pokémon reaches the specified level, in battle only EVO_ITEM_COUNT_999, // Pokémon levels up after trainer has collected 999 of a specific item + EVO_BATTLE_END, // Battle ends, doesn't need to level up }; enum EvolutionMode { diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6492a275ada1..907896fbf63a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2015,7 +2015,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]++; diff --git a/src/data/pokemon/species_info/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index 2f78f755fea6..2f22d739e1fe 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -9851,7 +9851,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] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index cba428ff11aa..5ba3a3bfd0c6 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6600,11 +6600,11 @@ 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_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); break; + */ case EVO_SCRIPT_TRIGGER_DMG: ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_DMG_DIGITS); //damage StringExpandPlaceholders(gStringVar4, sText_EVO_SCRIPT_TRIGGER_DMG); diff --git a/src/pokemon.c b/src/pokemon.c index c788ba65ba40..5b1b1ba63eec 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4450,7 +4450,7 @@ u32 GetGMaxTargetSpecies(u32 species) return species; } -static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, struct Pokemon *tradePartner, bool32 *consumeItem) +static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, struct Pokemon *tradePartner, bool32 *consumeItem, u32 partyId) { u32 i, j; u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); @@ -4612,15 +4612,19 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (evolutionTracker >= params[i].arg) currentCondition = TRUE; break; + case IF_CRITICAL_HITS_GE: + if (partyId != PARTY_SIZE && gPartyCriticalHits[partyId] >= params[i].arg) + currentCondition = TRUE; + break; case IF_USED_MOVE_TWENTY_TIMES: if (evolutionTracker >= 20) currentCondition = TRUE; break; + // Gen 9 case IF_DEFEAT_THREE_WITH_ITEM: if (evolutionTracker >= 3) currentCondition = TRUE; break; - // Gen 9 case IF_PID_MODULO_100_GT: if ((personality % 100) > params[i].arg) currentCondition = TRUE; @@ -4705,7 +4709,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem, PARTY_SIZE)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4733,7 +4737,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem, PARTY_SIZE)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4757,7 +4761,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, tradePartner, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, tradePartner, &consumeItem, PARTY_SIZE)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4783,7 +4787,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem, PARTY_SIZE)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4803,13 +4807,12 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 switch (evolutions[i].method) { - case EVO_CRITICAL_HITS: - if (gPartyCriticalHits[evolutionItem] >= evolutions[i].param) + case EVO_BATTLE_END: conditionsMet = TRUE; - break; + break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem, evolutionItem)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. @@ -4848,7 +4851,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem)) + if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem, PARTY_SIZE)) { // All checks passed, so stop checking the rest of the evolutions. // This is different from vanilla where the loop continues. From 00e2fc9fcf6f6777b19d0f716ed61bf07af4aa90 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 16 Jan 2025 08:46:31 -0300 Subject: [PATCH 20/30] Shedinja --- include/constants/pokemon.h | 3 +- .../pokemon/species_info/gen_3_families.h | 4 +- src/evolution_scene.c | 74 ++++++++++--------- src/pokedex_plus_hgss.c | 2 - src/pokemon.c | 4 - 5 files changed, 43 insertions(+), 44 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 7c53df832c84..a83aff12b6d7 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -290,8 +290,7 @@ enum EvolutionMethods { EVO_LEVEL, // Pokémon reaches the specified level EVO_TRADE, // Pokémon is traded EVO_ITEM, // specified item is used on Pokémon - 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_SPLIT_FROM_EVO, // A clone is generated and evolved when another evolution happens 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 diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index b6aa9c67b204..8b2a8d2345a8 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -3290,8 +3290,8 @@ 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}, + {EVO_SPLIT_FROM_EVO, SPECIES_NINJASK, SPECIES_SHEDINJA}), }, [SPECIES_NINJASK] = diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 20eb136f39fb..44aa8255c27b 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,47 @@ 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 && (P_SHEDINJA_BALL < GEN_4 || CheckBagHasItem(ball, 1))) { - 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 +826,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/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 5ba3a3bfd0c6..ae58f2084ab9 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6506,7 +6506,6 @@ 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 ); @@ -6515,7 +6514,6 @@ 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_SHEDINJA ); break; - /* case EVO_BEAUTY: ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, 3); //beauty StringExpandPlaceholders(gStringVar4, sText_EVO_BEAUTY ); diff --git a/src/pokemon.c b/src/pokemon.c index 5b1b1ba63eec..46daffb61e00 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4699,10 +4699,6 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (evolutions[i].param <= level) conditionsMet = TRUE; break; - case EVO_LEVEL_NINJASK: - if (evolutions[i].param <= level) - conditionsMet = TRUE; - break; case EVO_LEVEL_BATTLE_ONLY: if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level) conditionsMet = TRUE; From c912934a018f57bf88c4dd30b8f7a7b2629abeb9 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 17 Jan 2025 17:23:30 -0300 Subject: [PATCH 21/30] Evolution triggers --- include/constants/pokemon.h | 5 ++-- .../pokemon/species_info/gen_5_families.h | 2 +- .../pokemon/species_info/gen_8_families.h | 6 ++-- src/pokedex_plus_hgss.c | 2 -- src/pokemon.c | 29 +++++++------------ 5 files changed, 17 insertions(+), 27 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index a83aff12b6d7..fe3bea9981a7 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -274,6 +274,7 @@ enum EvolutionConditions { // Gen 8 IF_NATURE, // The Pokémon has a specific nature. 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_TWENTY_TIMES, // The Pokémon has used a move for at least 20 times. // Gen 9 @@ -291,9 +292,7 @@ enum EvolutionMethods { 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_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_SCRIPT_TRIGGER, // Player interacts with an overworld trigger EVO_LEVEL_BATTLE_ONLY, // Pokémon reaches the specified level, in battle only EVO_ITEM_COUNT_999, // Pokémon levels up after trainer has collected 999 of a specific item EVO_BATTLE_END, // Battle ends, doesn't need to level up diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index e1eea1f9aa26..57b2f262dc46 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -5316,7 +5316,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] = diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index 555b9e6dfef0..c721a9b6c2a4 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -6805,10 +6805,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/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index ae58f2084ab9..165d0c999954 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6602,7 +6602,6 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_CRITS_DIGITS); //crits StringExpandPlaceholders(gStringVar4, sText_EVO_CRITICAL_HITS); break; - */ case EVO_SCRIPT_TRIGGER_DMG: ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_DMG_DIGITS); //damage StringExpandPlaceholders(gStringVar4, sText_EVO_SCRIPT_TRIGGER_DMG); @@ -6617,7 +6616,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); diff --git a/src/pokemon.c b/src/pokemon.c index 46daffb61e00..1ed02022abad 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4612,9 +4612,16 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (evolutionTracker >= params[i].arg) 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].arg)) + currentCondition = TRUE; + break; + } case IF_CRITICAL_HITS_GE: if (partyId != PARTY_SIZE && gPartyCriticalHits[partyId] >= params[i].arg) - currentCondition = TRUE; + currentCondition = TRUE; break; case IF_USED_MOVE_TWENTY_TIMES: if (evolutionTracker >= 20) @@ -4828,21 +4835,8 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 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)) - conditionsMet = TRUE; - break; - } - case EVO_DARK_SCROLL: - if (evolutionItem == EVO_DARK_SCROLL) - conditionsMet = TRUE; - break; - case EVO_WATER_SCROLL: - if (evolutionItem == EVO_WATER_SCROLL) + case EVO_SCRIPT_TRIGGER: + if (gSpecialVar_0x8000 == evolutions[i].param) conditionsMet = TRUE; break; } @@ -6698,13 +6692,12 @@ void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv) void TrySpecialOverworldEvo(void) { u8 i; - u8 evoMethod = gSpecialVar_0x8000; u16 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); + u16 targetSpecies = GetEvolutionTargetSpecies(&gPlayerParty[i], EVO_MODE_OVERWORLD_SPECIAL, 0, SPECIES_NONE); if (targetSpecies != SPECIES_NONE && !(sTriedEvolving & (1u << i))) { sTriedEvolving |= 1u << i; From 909266a97caccdd2e941f0146ee3212e9dd6a55b Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 21 Jan 2025 20:57:58 -0300 Subject: [PATCH 22/30] Removed EVO_MODE_CANT_STOP --- include/constants/pokemon.h | 1 - include/pokemon.h | 2 +- src/battle_main.c | 14 ++++---------- src/party_menu.c | 30 ++++++++++-------------------- src/pokemon.c | 36 ++++++++++-------------------------- src/trade.c | 12 ++++++------ 6 files changed, 31 insertions(+), 64 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 65f8c7be8684..57d331d1c1b7 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -301,7 +301,6 @@ enum EvolutionMethods { 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 c761ce2a06ce..495252ce2a46 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -729,7 +729,7 @@ 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); +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 0f7780185529..59ef0ea8001b 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/party_menu.c b/src/party_menu.c index bda62ba3d1fb..8cd99e5834bd 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/pokemon.c b/src/pokemon.c index e1ebe2850ac7..b39fb3c310bb 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; } } @@ -4642,7 +4643,7 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct return TRUE; } -u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner) +u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 evolutionItem, struct Pokemon *tradePartner, bool32 *canStopEvo) { int i; u32 targetSpecies = SPECIES_NONE; @@ -4692,32 +4693,13 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level) conditionsMet = TRUE; break; - } - - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem, PARTY_SIZE)) - { - // 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; - case EVO_MODE_CANT_STOP: - 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_ITEM_COUNT_999: if (CheckBagHasItem(evolutions[i].param, 999)) { conditionsMet = TRUE; RemoveBagItem(evolutions[i].param, 999); + if (canStopEvo != NULL) + *canStopEvo = FALSE; } break; } @@ -4778,6 +4760,8 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 // 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; } } @@ -6672,12 +6656,12 @@ void RemoveIVIndexFromList(u8 *ivs, u8 selectedIv) void TrySpecialOverworldEvo(void) { u8 i; - 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, 0, 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 04b1977c17b0..45f812996d59 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()) From d49cf2e50304691a4cdf2eaa2ce254b1b7a5381d Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 21 Jan 2025 21:29:56 -0300 Subject: [PATCH 23/30] Added 2 args for conditinos --- include/constants/pokemon.h | 4 +- include/pokemon.h | 4 +- src/battle_script_commands.c | 14 ++--- .../pokemon/species_info/gen_1_families.h | 2 +- .../pokemon/species_info/gen_2_families.h | 2 +- .../pokemon/species_info/gen_5_families.h | 2 +- src/pokemon.c | 59 +++++++++---------- test/species.c | 4 +- 8 files changed, 46 insertions(+), 45 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 57d331d1c1b7..10867069c19f 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -277,9 +277,9 @@ enum EvolutionConditions { 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_TWENTY_TIMES, // The Pokémon has used a move for at least 20 times. + IF_USED_MOVE_X_TIMES, // The Pokémon has used a move for at least X amount of times. // Gen 9 - IF_DEFEAT_THREE_WITH_ITEM, // The Pokémon defeated 3 Pokémon of the same species holding the specified item. + 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. diff --git a/include/pokemon.h b/include/pokemon.h index 495252ce2a46..463e12a1d284 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -346,7 +346,9 @@ struct BattlePokemon struct EvolutionParam { u16 condition; - u16 arg; + u16 arg1; + u16 arg2; + u16 arg3; }; struct Evolution diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 99a355fd2d01..eedf13b5df50 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -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(IF_USED_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. @@ -17424,8 +17424,8 @@ static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 // Reset progress if you faint for the recoil method. switch (evolutionCondition) { - case IF_USED_MOVE_TWENTY_TIMES: - if (evolutions[i].params[j].arg == usedMove) + 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: @@ -17433,9 +17433,9 @@ static void TryUpdateEvolutionTracker(u32 evolutionCondition, u32 upAmount, u16 val = 0; SetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]], MON_DATA_EVOLUTION_TRACKER, &val); break; - case IF_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].params[j].arg) + 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; } @@ -17456,7 +17456,7 @@ void BS_TryUpdateRecoilTracker(void) void BS_TryUpdateLeadersCrestTracker(void) { NATIVE_ARGS(); - TryUpdateEvolutionTracker(IF_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/gen_1_families.h b/src/data/pokemon/species_info/gen_1_families.h index d538bf74f0d1..d1de884aac1b 100644 --- a/src/data/pokemon/species_info/gen_1_families.h +++ b/src/data/pokemon/species_info/gen_1_families.h @@ -7401,7 +7401,7 @@ const struct SpeciesInfo gSpeciesInfoGen1[] = ) .levelUpLearnset = sPrimeapeLevelUpLearnset, .teachableLearnset = sPrimeapeTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_ANNIHILAPE, CONDITIONS({IF_USED_MOVE_TWENTY_TIMES, MOVE_RAGE_FIST})}), + .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_ANNIHILAPE, CONDITIONS({IF_USED_MOVE_X_TIMES, MOVE_RAGE_FIST, 20})}), }, #if P_GEN_9_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 71e3d4b71255..d3b31faa7612 100644 --- a/src/data/pokemon/species_info/gen_2_families.h +++ b/src/data/pokemon/species_info/gen_2_families.h @@ -7402,7 +7402,7 @@ const struct SpeciesInfo gSpeciesInfoGen2[] = .levelUpLearnset = sStantlerLevelUpLearnset, .teachableLearnset = sStantlerTeachableLearnset, .eggMoveLearnset = sStantlerEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_WYRDEER, CONDITIONS({IF_USED_MOVE_TWENTY_TIMES, MOVE_PSYSHIELD_BASH})}), + .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_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index 9fcb75f80930..07152d09a3d9 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -10940,7 +10940,7 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = ) .levelUpLearnset = sBisharpLevelUpLearnset, .teachableLearnset = sBisharpTeachableLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 0, SPECIES_KINGAMBIT, CONDITIONS({IF_DEFEAT_THREE_WITH_ITEM, ITEM_LEADERS_CREST})}), + .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/pokemon.c b/src/pokemon.c index b39fb3c310bb..4c0732c5c475 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4484,7 +4484,7 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct currentCondition = TRUE; break; case IF_MIN_FRIENDSHIP: - if (friendship >= params[i].arg) + if (friendship >= params[i].arg1) currentCondition = TRUE; break; case IF_ATK_GT_DEF: @@ -4500,15 +4500,15 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct currentCondition = TRUE; break; case IF_TIME: - if (GetTimeOfDay() == params[i].arg) + if (GetTimeOfDay() == params[i].arg1) currentCondition = TRUE; break; case IF_NOT_TIME: - if (GetTimeOfDay() != params[i].arg) + if (GetTimeOfDay() != params[i].arg1) currentCondition = TRUE; break; case IF_HOLD_ITEM: - if (heldItem == params[i].arg) + if (heldItem == params[i].arg1) { currentCondition = TRUE; conditionRemovesItem = TRUE; @@ -4516,26 +4516,26 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct break; // Gen 3 case IF_PID_UPPER_MODULO_10_GT: - if ((upperPersonality % 10) > params[i].arg) + if ((upperPersonality % 10) > params[i].arg1) currentCondition = TRUE; break; case IF_PID_UPPER_MODULO_10_EQ: - if ((upperPersonality % 10) == params[i].arg) + if ((upperPersonality % 10) == params[i].arg1) currentCondition = TRUE; break; case IF_PID_UPPER_MODULO_10_LT: - if ((upperPersonality % 10) < params[i].arg) + if ((upperPersonality % 10) < params[i].arg1) currentCondition = TRUE; break; case IF_MIN_BEAUTY: - if (beauty >= params[i].arg) + 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].arg) + if (GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL) == params[i].arg1) { currentCondition = TRUE; break; @@ -4543,20 +4543,20 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct } break; case IF_IN_MAP: - if (params[i].arg == ((gSaveBlock1Ptr->location.mapGroup) << 8 | gSaveBlock1Ptr->location.mapNum)) + if (params[i].arg1 == ((gSaveBlock1Ptr->location.mapGroup) << 8 | gSaveBlock1Ptr->location.mapNum)) currentCondition = TRUE; break; case IF_IN_MAPSEC: - if (gMapHeader.regionMapSectionId == params[i].arg) + if (gMapHeader.regionMapSectionId == params[i].arg1) currentCondition = TRUE; break; case IF_KNOWS_MOVE: - if (MonKnowsMove(mon, params[i].arg)) + if (MonKnowsMove(mon, params[i].arg1)) currentCondition = TRUE; break; // Gen 5 case IF_TRADE_PARTNER_SPECIES: - if (params[i].arg == partnerSpecies && partnerHoldEffect != HOLD_EFFECT_PREVENT_EVOLVE) + if (params[i].arg1 == partnerSpecies && partnerHoldEffect != HOLD_EFFECT_PREVENT_EVOLVE) currentCondition = TRUE; break; // Gen 6 @@ -4564,8 +4564,8 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct for (j = 0; j < PARTY_SIZE; j++) { u16 currSpecies = GetMonData(&gPlayerParty[j], MON_DATA_SPECIES, NULL); - if (gSpeciesInfo[currSpecies].types[0] == params[i].arg - || gSpeciesInfo[currSpecies].types[1] == params[i].arg) + if (gSpeciesInfo[currSpecies].types[0] == params[i].arg1 + || gSpeciesInfo[currSpecies].types[1] == params[i].arg1) { currentCondition = TRUE; break; @@ -4573,13 +4573,13 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct } break; case IF_WEATHER: - if (weather == params[i].arg) + 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].arg) + if (GetMoveType(GetMonData(mon, MON_DATA_MOVE1 + j, NULL)) == params[i].arg1) { currentCondition = TRUE; break; @@ -4588,47 +4588,46 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct break; // Gen 8 case IF_NATURE: - if (nature == params[i].arg) + if (nature == params[i].arg1) currentCondition = TRUE; break; case IF_RECOIL_DAMAGE_GE: - if (evolutionTracker >= params[i].arg) + 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].arg)) + 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].arg) + if (partyId != PARTY_SIZE && gPartyCriticalHits[partyId] >= params[i].arg1) currentCondition = TRUE; break; - case IF_USED_MOVE_TWENTY_TIMES: - if (evolutionTracker >= 20) + case IF_USED_MOVE_X_TIMES: + if (evolutionTracker >= params[i].arg2) currentCondition = TRUE; - break; // Gen 9 - case IF_DEFEAT_THREE_WITH_ITEM: - if (evolutionTracker >= 3) + 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].arg) + if ((personality % 100) > params[i].arg1) currentCondition = TRUE; break; case IF_PID_MODULO_100_EQ: - if ((personality % 100) == params[i].arg) + if ((personality % 100) == params[i].arg1) currentCondition = TRUE; break; case IF_PID_MODULO_100_LT: - if ((personality % 100) < params[i].arg) + if ((personality % 100) < params[i].arg1) currentCondition = TRUE; break; case IF_MIN_OVERWORLD_STEPS: - if (mon == GetFirstLiveMon() && gFollowerSteps >= params[i].arg) + if (mon == GetFirstLiveMon() && gFollowerSteps >= params[i].arg1) currentCondition = TRUE; break; case CONDITIONS_END: diff --git a/test/species.c b/test/species.c index c7e36e44075e..3eb8c0939558 100644 --- a/test/species.c +++ b/test/species.c @@ -119,8 +119,8 @@ TEST("No species has two evolutions that use the evolution tracker") continue; for (j = 0; evolutions[i].params[j].condition != CONDITIONS_END; j++) { - if (evolutions[i].params[j].condition == IF_USED_MOVE_TWENTY_TIMES - || evolutions[i].params[j].condition == IF_DEFEAT_THREE_WITH_ITEM + if (evolutions[i].params[j].condition == IF_USED_MOVE_X_TIMES + || evolutions[i].params[j].condition == IF_DEFEAT_X_WITH_ITEMS ) evolutionTrackerEvolutions++; From 46f286dec179978b3c3360c05f1557011a3b957f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 21 Jan 2025 22:34:45 -0300 Subject: [PATCH 24/30] Gholdengo condition --- include/constants/pokemon.h | 2 +- .../pokemon/species_info/gen_9_families.h | 4 +- src/pokedex_plus_hgss.c | 2 - src/pokemon.c | 56 ++++++++++--------- 4 files changed, 33 insertions(+), 31 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 10867069c19f..ee63f6b045ed 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -284,6 +284,7 @@ enum EvolutionConditions { 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 }; @@ -295,7 +296,6 @@ enum EvolutionMethods { 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_ITEM_COUNT_999, // Pokémon levels up after trainer has collected 999 of a specific item EVO_BATTLE_END, // Battle ends, doesn't need to level up }; diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 0fb7f3d2f843..b9768b44c0d6 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -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/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 606568d6121b..829374caf423 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6642,13 +6642,11 @@ 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); diff --git a/src/pokemon.c b/src/pokemon.c index 4c0732c5c475..f5e2bf437f9a 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4433,7 +4433,7 @@ u32 GetGMaxTargetSpecies(u32 species) return species; } -static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, struct Pokemon *tradePartner, bool32 *consumeItem, u32 partyId) +static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, struct Pokemon *tradePartner, u32 partyId, bool32 *canStopEvo) { u32 i, j; u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); @@ -4446,7 +4446,9 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct u32 beauty = GetMonData(mon, MON_DATA_BEAUTY, 0); u32 weather = GetCurrentWeather(); u32 nature = GetNature(mon); - u32 conditionRemovesItem = FALSE; + bool32 removeHoldItem = FALSE; + u32 removeBagItem = ITEM_NONE; + u32 removeBagItemCount = 0; u32 evolutionTracker = GetMonData(mon, MON_DATA_EVOLUTION_TRACKER, 0); u32 partnerSpecies, partnerHeldItem, partnerHoldEffect; @@ -4511,7 +4513,7 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct if (heldItem == params[i].arg1) { currentCondition = TRUE; - conditionRemovesItem = TRUE; + removeHoldItem = TRUE; } break; // Gen 3 @@ -4630,14 +4632,32 @@ static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct 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; } - if (conditionRemovesItem) - *consumeItem = TRUE; + // 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; } @@ -4650,7 +4670,6 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM, 0); u32 level = GetMonData(mon, MON_DATA_LEVEL, 0); u32 holdEffect; - bool32 consumeItem = FALSE; const struct Evolution *evolutions = GetSpeciesEvolutions(species); if (evolutions == NULL) @@ -4692,18 +4711,9 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 if (mode == EVO_MODE_BATTLE_ONLY && evolutions[i].param <= level) conditionsMet = TRUE; break; - case EVO_ITEM_COUNT_999: - if (CheckBagHasItem(evolutions[i].param, 999)) - { - conditionsMet = TRUE; - RemoveBagItem(evolutions[i].param, 999); - if (canStopEvo != NULL) - *canStopEvo = FALSE; - } - break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem, PARTY_SIZE)) + 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. @@ -4727,7 +4737,7 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, tradePartner, &consumeItem, PARTY_SIZE)) + 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. @@ -4753,7 +4763,7 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem, PARTY_SIZE)) + 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. @@ -4780,7 +4790,7 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem, evolutionItem)) + 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. @@ -4806,7 +4816,7 @@ u32 GetEvolutionTargetSpecies(struct Pokemon *mon, enum EvolutionMode mode, u16 break; } - if (conditionsMet && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, &consumeItem, PARTY_SIZE)) + 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. @@ -4828,12 +4838,6 @@ u32 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; } From 8f042265f26856462a3980202f9585fbb59826e4 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 21 Jan 2025 22:40:02 -0300 Subject: [PATCH 25/30] Shedinja uses IF_BAG_ITEM_COUNT --- include/pokemon.h | 1 + src/data/pokemon/species_info/gen_3_families.h | 6 +++++- src/evolution_scene.c | 3 ++- src/pokemon.c | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/pokemon.h b/include/pokemon.h index 463e12a1d284..f8717ab0c734 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -731,6 +731,7 @@ u8 *UseStatIncreaseItem(u16 itemId); u8 GetNature(struct Pokemon *mon); u8 GetNatureFromPersonality(u32 personality); u32 GetGMaxTargetSpecies(u32 species); +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); diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index e87a8ac170d5..34e1468f6f7f 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -3608,7 +3608,11 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .teachableLearnset = sNincadaTeachableLearnset, .eggMoveLearnset = sNincadaEggMoveLearnset, .evolutions = EVOLUTION({EVO_LEVEL, 20, SPECIES_NINJASK}, - {EVO_SPLIT_FROM_EVO, SPECIES_NINJASK, SPECIES_SHEDINJA}), + #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] = diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 44aa8255c27b..d932f4e954cd 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -555,7 +555,8 @@ static void CreateShedinja(u32 preEvoSpecies, u32 postEvoSpecies, struct Pokemon { if (evolutions[i].method == EVO_SPLIT_FROM_EVO && evolutions[i].param == postEvoSpecies - && gPlayerPartyCount < PARTY_SIZE && (P_SHEDINJA_BALL < GEN_4 || CheckBagHasItem(ball, 1))) + && gPlayerPartyCount < PARTY_SIZE + && DoesMonMeetAdditionalConditions(mon, evolutions[i].params, NULL, PARTY_SIZE, NULL)) { s32 j; struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; diff --git a/src/pokemon.c b/src/pokemon.c index f5e2bf437f9a..f6b28368909e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4433,7 +4433,7 @@ u32 GetGMaxTargetSpecies(u32 species) return species; } -static bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, struct Pokemon *tradePartner, u32 partyId, bool32 *canStopEvo) +bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct EvolutionParam *params, struct Pokemon *tradePartner, u32 partyId, bool32 *canStopEvo) { u32 i, j; u32 heldItem = GetMonData(mon, MON_DATA_HELD_ITEM); From 853cf2db1c04e0a84e5d46d64e2a09eeee2bbdc4 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 22 Jan 2025 00:31:22 -0300 Subject: [PATCH 26/30] Starting to generate HGSS descriptions based on conditions --- src/pokedex_plus_hgss.c | 150 +++++++++++++++++++++++++++++++--------- 1 file changed, 116 insertions(+), 34 deletions(-) diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 829374caf423..b90ebc002488 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,11 +205,6 @@ 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"); @@ -228,14 +224,12 @@ static const u8 sText_EVO_LEVEL_DUSK[] = _("{LV}{UP_ARROW} to {STR_VAR_2}, dusk static const u8 sText_EVO_LEVEL_ITEM_HOLD_DAY[] = _("{LV}{UP_ARROW}, holds {STR_VAR_2}, day"); static const u8 sText_EVO_LEVEL_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"); @@ -6453,21 +6447,16 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept switch (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 ); - break; - */ case EVO_LEVEL: - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL ); + if (evolutions[i].param > 1) + { + ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("{LV}{UP_ARROW} to {STR_VAR_2}")); + } + else + { + StringCopy(gStringVar4, COMPOUND_STRING("{LV}{UP_ARROW}")); + } break; case EVO_TRADE: StringExpandPlaceholders(gStringVar4, sText_EVO_TRADE ); @@ -6551,14 +6540,6 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); StringExpandPlaceholders(gStringVar4, sText_EVO_MOVE ); break; - case EVO_LEVEL_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 @@ -6584,11 +6565,6 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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); @@ -6662,6 +6638,112 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept StringExpandPlaceholders(gStringVar4, sText_EVO_UNKNOWN); break; }//Switch end + + // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. + for (j = 0; evolutions[i].params != NULL && evolutions[i].params[j].condition != CONDITIONS_END; j++) + { + enum EvolutionConditions condition = evolutions[i].params[j].condition; + switch(condition) + { + // Gen 2 + case IF_GENDER: + break; + case IF_MIN_FRIENDSHIP: + StringAppend(gStringVar4, COMPOUND_STRING(", high friendship")); + break; + case IF_ATK_GT_DEF: + break; + case IF_ATK_EQ_DEF: + break; + case IF_ATK_LT_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: + break; + // Gen 3 + case IF_PID_UPPER_MODULO_10_GT: + break; + case IF_PID_UPPER_MODULO_10_EQ: + break; + case IF_PID_UPPER_MODULO_10_LT: + break; + case IF_MIN_BEAUTY: + break; + // Gen 4 + case IF_SPECIES_IN_PARTY: + break; + case IF_IN_MAPSEC: + StringCopy(gStringVar2, gRegionMapEntries[evolutions[i].params[j].arg1].name); + StringAppend(gStringVar4, COMPOUND_STRING(" in ")); + StringAppend(gStringVar4, gStringVar2); + break; + case IF_IN_MAP: + GetMapName(gStringVar2, Overworld_GetMapHeaderByGroupAndId(evolutions[i].params[j].arg1 >> 8, evolutions[i].params[j].arg1 & 0xFF)->regionMapSectionId, 0); + StringAppend(gStringVar4, COMPOUND_STRING(" in ")); + StringAppend(gStringVar4, gStringVar2); + break; + case IF_KNOWS_MOVE: + break; + // Gen 5 + case IF_TRADE_PARTNER_SPECIES: + break; + // Gen 6 + case IF_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: + 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: + break; + case IF_BAG_ITEM_COUNT: + break; + case CONDITIONS_END: + break; + } + } + + StringAppend(gStringVar4, COMPOUND_STRING(".")); PrintInfoScreenTextSmall(gStringVar4, base_x + depth_x*depth+base_x_offset, base_y + base_y_offset*(*depth_i)); //Print actual instructions (*depth_i)++; From 275a2a2a27062250608baaa01aacafff1ba9bce6 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 22 Jan 2025 18:50:45 -0300 Subject: [PATCH 27/30] More HGSS dex conditions --- include/constants/pokemon.h | 2 + .../pokemon/species_info/gen_5_families.h | 4 +- .../pokemon/species_info/gen_8_families.h | 27 +--- src/pokedex_plus_hgss.c | 153 ++++-------------- src/pokemon.c | 39 +++++ 5 files changed, 79 insertions(+), 146 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index ee63f6b045ed..076afd0badc8 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -274,6 +274,8 @@ enum EvolutionConditions { 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. diff --git a/src/data/pokemon/species_info/gen_5_families.h b/src/data/pokemon/species_info/gen_5_families.h index 07152d09a3d9..ed9ad5e6deaa 100644 --- a/src/data/pokemon/species_info/gen_5_families.h +++ b/src/data/pokemon/species_info/gen_5_families.h @@ -4430,8 +4430,8 @@ const struct SpeciesInfo gSpeciesInfoGen5[] = .levelUpLearnset = sBasculinWhiteStripedLevelUpLearnset, .teachableLearnset = sBasculinWhiteStripedTeachableLearnset, .formSpeciesIdTable = sBasculinFormSpeciesIdTable, - .evolutions = EVOLUTION({EVO_LEVEL, 294, SPECIES_BASCULEGION_M, CONDITIONS({IF_RECOIL_DAMAGE_GE, 294}, {IF_GENDER, MON_MALE})}, - {EVO_LEVEL, 294, SPECIES_BASCULEGION_F, CONDITIONS({IF_RECOIL_DAMAGE_GE, 294}, {IF_GENDER, MON_FEMALE})}), + .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] = diff --git a/src/data/pokemon/species_info/gen_8_families.h b/src/data/pokemon/species_info/gen_8_families.h index b3f80911067a..a52cae4c3704 100644 --- a/src/data/pokemon/species_info/gen_8_families.h +++ b/src/data/pokemon/species_info/gen_8_families.h @@ -3357,31 +3357,8 @@ const struct SpeciesInfo gSpeciesInfoGen8[] = .levelUpLearnset = sToxelLevelUpLearnset, .teachableLearnset = sToxelTeachableLearnset, .eggMoveLearnset = sToxelEggMoveLearnset, - .evolutions = EVOLUTION({EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_HARDY})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_BRAVE})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_ADAMANT})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_NAUGHTY})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_DOCILE})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_IMPISH})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_LAX})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_HASTY})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_JOLLY})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_NAIVE})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_RASH})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_SASSY})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_AMPED, CONDITIONS({IF_NATURE, NATURE_QUIRKY})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_LONELY})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_BOLD})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_RELAXED})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_TIMID})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_SERIOUS})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_MODEST})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_MILD})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_QUIET})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_BASHFUL})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_CALM})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_GENTLE})}, - {EVO_LEVEL, 30, SPECIES_TOXTRICITY_LOW_KEY, CONDITIONS({IF_NATURE, NATURE_CAREFUL})}), + .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] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index b90ebc002488..43a2c688950f 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -206,29 +206,13 @@ 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_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_LEVEL_ITEM_HOLD_DAY[] = _("{LV}{UP_ARROW}, holds {STR_VAR_2}, day"); -static const u8 sText_EVO_LEVEL_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_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_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"); @@ -238,7 +222,6 @@ 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_LEVEL_ITEM_NIGHT[] = _("{STR_VAR_2} is used, night"); static const u8 sText_EVO_LEVEL_ITEM_DAY[] = _("{STR_VAR_2} is used, day"); -static const u8 sText_EVO_LEVEL_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"); @@ -6459,33 +6442,14 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept } break; case EVO_TRADE: - StringExpandPlaceholders(gStringVar4, sText_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 ); - break; - */ case EVO_ITEM: item = evolutions[i].param; CopyItemName(item, gStringVar2); - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM ); + 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 ); - 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 ); - 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 ); - 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 ); @@ -6502,77 +6466,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_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_LEVEL_ITEM_HOLD_DAY: - item = evolutions[i].param; //item - CopyItemName(item, gStringVar2); //item - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_HOLD_DAY ); - break; - case EVO_LEVEL_ITEM_HOLD_NIGHT: - item = evolutions[i].param; //item - CopyItemName(item, gStringVar2); //item - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_HOLD_NIGHT ); - break; case EVO_MOVE: StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); StringExpandPlaceholders(gStringVar4, sText_EVO_MOVE ); 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_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); @@ -6591,21 +6496,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_LEVEL_ITEM_NIGHT ); - break; - case EVO_ITEM_DAY: - item = evolutions[i].param; - CopyItemName(item, gStringVar2); - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_DAY ); - break; - case EVO_LEVEL_ITEM_HOLD: - item = evolutions[i].param; - CopyItemName(item, gStringVar2); - StringExpandPlaceholders(gStringVar4, sText_EVO_LEVEL_ITEM_HOLD); - break; case EVO_USE_MOVE_TWENTY_TIMES: StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); StringExpandPlaceholders(gStringVar4, sText_EVO_USE_MOVE_TWENTY_TIMES ); @@ -6634,12 +6524,9 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept StringExpandPlaceholders(gStringVar4, sText_EVO_OVERWORLD_STEPS); break; */ - default: - StringExpandPlaceholders(gStringVar4, sText_EVO_UNKNOWN); - break; }//Switch end - // Check for additional conditions (only if the primary method passes). Skips if there's no additional conditions. + // 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++) { enum EvolutionConditions condition = evolutions[i].params[j].condition; @@ -6647,15 +6534,23 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept { // 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) @@ -6676,6 +6571,9 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept } 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: @@ -6685,18 +6583,22 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept case IF_PID_UPPER_MODULO_10_LT: 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: - StringCopy(gStringVar2, gRegionMapEntries[evolutions[i].params[j].arg1].name); StringAppend(gStringVar4, COMPOUND_STRING(" in ")); + StringCopy(gStringVar2, gRegionMapEntries[evolutions[i].params[j].arg1].name); StringAppend(gStringVar4, gStringVar2); break; case IF_IN_MAP: - GetMapName(gStringVar2, Overworld_GetMapHeaderByGroupAndId(evolutions[i].params[j].arg1 >> 8, evolutions[i].params[j].arg1 & 0xFF)->regionMapSectionId, 0); 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: @@ -6706,6 +6608,9 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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; @@ -6716,8 +6621,18 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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 nature")); + break; + case IF_LOW_KEY_NATURE: + StringAppend(gStringVar4, COMPOUND_STRING(", Low-Key nature")); break; - case IF_RECOIL_DAMAGE_GE: + case IF_RECOIL_DAMAGE_GE: break; case IF_CURRENT_DAMAGE_GE: break; diff --git a/src/pokemon.c b/src/pokemon.c index f6b28368909e..b91ab02a6c58 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4593,6 +4593,45 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti 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; From 8ecd200851bf50613fe798d25025b9f9b5f1b245 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 22 Jan 2025 22:01:52 -0300 Subject: [PATCH 28/30] More HGSS Dex --- src/pokedex_plus_hgss.c | 84 +++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 50 deletions(-) diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 43a2c688950f..f3a42cf5931f 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -205,30 +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_TRADE[] = _("Trading"); -static const u8 sText_EVO_ITEM[] = _("{STR_VAR_2} is used"); 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_MOVE[] = _("{LV}{UP_ARROW}, knows {STR_VAR_2}"); static const u8 sText_EVO_LEVEL_RAIN[] = _("{LV}{UP_ARROW} to {STR_VAR_2} while raining"); static const u8 sText_EVO_TRADE_SPECIFIC_MON[] = _("Traded for {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_LEVEL_ITEM_NIGHT[] = _("{STR_VAR_2} is used, night"); -static const u8 sText_EVO_LEVEL_ITEM_DAY[] = _("{STR_VAR_2} is used, day"); 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"); @@ -6367,9 +6356,6 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept int i; //const struct MapHeader *mapHeader; u16 targetSpecies = 0; - - u16 item; - bool8 left = TRUE; u8 base_x = 13+8; u8 base_x_offset = 54+8; @@ -6397,10 +6383,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept //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; @@ -6428,26 +6411,35 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept } } - switch (evolutions[i].method) + switch ((enum EvolutionMethods)evolutions[i].method) { + case EVO_SCRIPT_TRIGGER: + case EVO_LEVEL_BATTLE_ONLY: + case EVO_NONE: + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Unknown")); + break; case EVO_LEVEL: + StringCopy(gStringVar4, COMPOUND_STRING("{LV}{UP_ARROW}")); if (evolutions[i].param > 1) { - ConvertIntToDecimalStringN(gStringVar2, evolutions[i].param, STR_CONV_MODE_LEADING_ZEROS, EVO_SCREEN_LVL_DIGITS); //level - StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("{LV}{UP_ARROW} to {STR_VAR_2}")); - } - else - { - StringCopy(gStringVar4, COMPOUND_STRING("{LV}{UP_ARROW}")); + 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); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Trading")); break; case EVO_ITEM: - item = evolutions[i].param; - CopyItemName(item, gStringVar2); - StringExpandPlaceholders(gStringVar4, sText_EVO_ITEM); + CopyItemName(evolutions[i].param, gStringVar2); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("{STR_VAR_2} is used")); + break; + case EVO_SPLIT_FROM_EVO: + StringCopy(gStringVar4, COMPOUND_STRING("Splits from ")); + StringAppend(gStringVar4, GetSpeciesName(evolutions[i].param)); //mon name + break; + case EVO_BATTLE_END: + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("End battle")); break; /* case EVO_LEVEL_SILCOON: @@ -6458,14 +6450,6 @@ 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_MOVE: StringCopy(gStringVar2, GetMoveName(evolutions[i].param)); StringExpandPlaceholders(gStringVar4, sText_EVO_MOVE ); @@ -6508,29 +6492,19 @@ 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; */ }//Switch end // 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++) { - enum EvolutionConditions condition = evolutions[i].params[j].condition; - switch(condition) + switch((enum EvolutionConditions)evolutions[i].params[j].condition) { // Gen 2 case IF_GENDER: @@ -6627,10 +6601,10 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept StringAppend(gStringVar4, COMPOUND_STRING(" nature")); break; case IF_AMPED_NATURE: - StringAppend(gStringVar4, COMPOUND_STRING(", Amped nature")); + StringAppend(gStringVar4, COMPOUND_STRING(", Amped natures")); break; case IF_LOW_KEY_NATURE: - StringAppend(gStringVar4, COMPOUND_STRING(", Low-Key nature")); + StringAppend(gStringVar4, COMPOUND_STRING(", Low-Key natures")); break; case IF_RECOIL_DAMAGE_GE: break; @@ -6650,8 +6624,18 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept 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; From c61963c91080ea9fca2b389a202e857b761565ea Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 23 Jan 2025 20:03:07 -0300 Subject: [PATCH 29/30] Wurmple --- include/constants/pokemon.h | 3 +-- src/data/pokemon/species_info/gen_3_families.h | 2 +- src/pokedex_plus_hgss.c | 9 +++++---- src/pokemon.c | 8 ++------ 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h index 076afd0badc8..fcbd6fcbbd98 100644 --- a/include/constants/pokemon.h +++ b/include/constants/pokemon.h @@ -258,8 +258,7 @@ enum EvolutionConditions { 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_EQ, // The Pokémon's upper personality value's modulo by 10 is equal than the defined value. - IF_PID_UPPER_MODULO_10_LT, // The Pokémon's upper personality value's modulo by 10 is lower 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. diff --git a/src/data/pokemon/species_info/gen_3_families.h b/src/data/pokemon/species_info/gen_3_families.h index 34e1468f6f7f..6aa899cc40c7 100644 --- a/src/data/pokemon/species_info/gen_3_families.h +++ b/src/data/pokemon/species_info/gen_3_families.h @@ -1452,7 +1452,7 @@ const struct SpeciesInfo gSpeciesInfoGen3[] = .levelUpLearnset = sWurmpleLevelUpLearnset, .teachableLearnset = sWurmpleTeachableLearnset, .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_LT, 4})}), + {EVO_LEVEL, 7, SPECIES_CASCOON, CONDITIONS({IF_PID_UPPER_MODULO_10_LE, 5})}), }, [SPECIES_SILCOON] = diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index f3a42cf5931f..2a8c4b8f971a 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6551,10 +6551,11 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept break; // Gen 3 case IF_PID_UPPER_MODULO_10_GT: - break; - case IF_PID_UPPER_MODULO_10_EQ: - break; - case IF_PID_UPPER_MODULO_10_LT: + 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")); diff --git a/src/pokemon.c b/src/pokemon.c index b91ab02a6c58..828e86268e83 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4521,12 +4521,8 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti if ((upperPersonality % 10) > params[i].arg1) currentCondition = TRUE; break; - case IF_PID_UPPER_MODULO_10_EQ: - if ((upperPersonality % 10) == params[i].arg1) - currentCondition = TRUE; - break; - case IF_PID_UPPER_MODULO_10_LT: - if ((upperPersonality % 10) < params[i].arg1) + case IF_PID_UPPER_MODULO_10_LE: + if ((upperPersonality % 10) <= params[i].arg1) currentCondition = TRUE; break; case IF_MIN_BEAUTY: From 46cc9b97f017928618ff2857e2e3c7ee21a8e059 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 23 Jan 2025 22:42:57 -0300 Subject: [PATCH 30/30] Adjust text automatically for conditions --- src/pokedex_plus_hgss.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 2a8c4b8f971a..9203a3facf1e 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -562,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); @@ -2622,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 @@ -4218,12 +4218,6 @@ static void SpriteCB_SlideCaughtMonToCenter(struct Sprite *sprite) #undef tPersonalityLo #undef tPersonalityHi - - - - - - //************************************ //* * //* Print data * @@ -4247,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) { @@ -6183,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) @@ -6205,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); } } @@ -6229,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) { @@ -6376,7 +6370,7 @@ 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; } @@ -6644,7 +6638,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept } StringAppend(gStringVar4, COMPOUND_STRING(".")); - PrintInfoScreenTextSmall(gStringVar4, base_x + depth_x*depth+base_x_offset, base_y + base_y_offset*(*depth_i)); //Print actual instructions + 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); @@ -6955,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); } }