|
|
|
@ -56,7 +56,11 @@ static bool8 IsWildLevelAllowedByRepel(u8 level);
|
|
|
|
|
static void ApplyFluteEncounterRateMod(u32 *encRate);
|
|
|
|
|
static void ApplyCleanseTagEncounterRateMod(u32 *encRate);
|
|
|
|
|
static u8 GetMaxLevelOfSpeciesInWildTable(const struct WildPokemon *wildMon, u16 species, u8 area);
|
|
|
|
|
#ifdef BUGFIX
|
|
|
|
|
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex, u32 size);
|
|
|
|
|
#else
|
|
|
|
|
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex);
|
|
|
|
|
#endif
|
|
|
|
|
static bool8 IsAbilityAllowingEncounter(u8 level);
|
|
|
|
|
|
|
|
|
|
EWRAM_DATA static u8 sWildEncountersDisabled = 0;
|
|
|
|
@ -463,6 +467,11 @@ static void CreateWildMon(u16 species, u8 level)
|
|
|
|
|
|
|
|
|
|
CreateMonWithNature(&gEnemyParty[0], species, level, USE_RANDOM_IVS, PickWildMonNature());
|
|
|
|
|
}
|
|
|
|
|
#ifdef BUGFIX
|
|
|
|
|
#define TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildPokemon, type, ability, ptr, count) TryGetAbilityInfluencedWildMonIndex(wildPokemon, type, ability, ptr, count)
|
|
|
|
|
#else
|
|
|
|
|
#define TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildPokemon, type, ability, ptr, count) TryGetAbilityInfluencedWildMonIndex(wildPokemon, type, ability, ptr)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 area, u8 flags)
|
|
|
|
|
{
|
|
|
|
@ -472,33 +481,33 @@ static bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 ar
|
|
|
|
|
switch (area)
|
|
|
|
|
{
|
|
|
|
|
case WILD_AREA_LAND:
|
|
|
|
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_STEEL, ABILITY_MAGNET_PULL, &wildMonIndex))
|
|
|
|
|
if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_STEEL, ABILITY_MAGNET_PULL, &wildMonIndex, LAND_WILD_COUNT))
|
|
|
|
|
break;
|
|
|
|
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex))
|
|
|
|
|
if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex, LAND_WILD_COUNT))
|
|
|
|
|
break;
|
|
|
|
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_LIGHTNING_ROD, &wildMonIndex))
|
|
|
|
|
if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_LIGHTNING_ROD, &wildMonIndex, LAND_WILD_COUNT))
|
|
|
|
|
break;
|
|
|
|
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_FIRE, ABILITY_FLASH_FIRE, &wildMonIndex))
|
|
|
|
|
if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_FIRE, ABILITY_FLASH_FIRE, &wildMonIndex, LAND_WILD_COUNT))
|
|
|
|
|
break;
|
|
|
|
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_GRASS, ABILITY_HARVEST, &wildMonIndex))
|
|
|
|
|
if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_GRASS, ABILITY_HARVEST, &wildMonIndex, LAND_WILD_COUNT))
|
|
|
|
|
break;
|
|
|
|
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_WATER, ABILITY_STORM_DRAIN, &wildMonIndex))
|
|
|
|
|
if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_WATER, ABILITY_STORM_DRAIN, &wildMonIndex, LAND_WILD_COUNT))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
wildMonIndex = ChooseWildMonIndex_Land();
|
|
|
|
|
break;
|
|
|
|
|
case WILD_AREA_WATER:
|
|
|
|
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_STEEL, ABILITY_MAGNET_PULL, &wildMonIndex))
|
|
|
|
|
if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_STEEL, ABILITY_MAGNET_PULL, &wildMonIndex, WATER_WILD_COUNT))
|
|
|
|
|
break;
|
|
|
|
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex))
|
|
|
|
|
if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_STATIC, &wildMonIndex, WATER_WILD_COUNT))
|
|
|
|
|
break;
|
|
|
|
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_LIGHTNING_ROD, &wildMonIndex))
|
|
|
|
|
if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_ELECTRIC, ABILITY_LIGHTNING_ROD, &wildMonIndex, WATER_WILD_COUNT))
|
|
|
|
|
break;
|
|
|
|
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_FIRE, ABILITY_FLASH_FIRE, &wildMonIndex))
|
|
|
|
|
if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_FIRE, ABILITY_FLASH_FIRE, &wildMonIndex, WATER_WILD_COUNT))
|
|
|
|
|
break;
|
|
|
|
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_GRASS, ABILITY_HARVEST, &wildMonIndex))
|
|
|
|
|
if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_GRASS, ABILITY_HARVEST, &wildMonIndex, WATER_WILD_COUNT))
|
|
|
|
|
break;
|
|
|
|
|
if (TryGetAbilityInfluencedWildMonIndex(wildMonInfo->wildPokemon, TYPE_WATER, ABILITY_STORM_DRAIN, &wildMonIndex))
|
|
|
|
|
if (TRY_GET_ABILITY_INFLUENCED_WILD_MON_INDEX(wildMonInfo->wildPokemon, TYPE_WATER, ABILITY_STORM_DRAIN, &wildMonIndex, WATER_WILD_COUNT))
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
wildMonIndex = ChooseWildMonIndex_WaterRock();
|
|
|
|
@ -1069,7 +1078,11 @@ static u8 GetMaxLevelOfSpeciesInWildTable(const struct WildPokemon *wildMon, u16
|
|
|
|
|
return maxLevel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef BUGFIX
|
|
|
|
|
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex, u32 size)
|
|
|
|
|
#else
|
|
|
|
|
static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildMon, u8 type, u16 ability, u8 *monIndex)
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
if (GetMonData(&gPlayerParty[0], MON_DATA_SANITY_IS_EGG))
|
|
|
|
|
return FALSE;
|
|
|
|
@ -1078,7 +1091,11 @@ static bool8 TryGetAbilityInfluencedWildMonIndex(const struct WildPokemon *wildM
|
|
|
|
|
else if (Random() % 2 != 0)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
#ifdef BUGFIX
|
|
|
|
|
return TryGetRandomWildMonIndexByType(wildMon, type, size, monIndex);
|
|
|
|
|
#else
|
|
|
|
|
return TryGetRandomWildMonIndexByType(wildMon, type, LAND_WILD_COUNT, monIndex);
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void ApplyFluteEncounterRateMod(u32 *encRate)
|
|
|
|
|