diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 2ba4c29cd0..1b907f3d2b 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -36,7 +36,7 @@ #include "constants/trainer_hill.h" static EWRAM_DATA u8 sWildEncounterImmunitySteps = 0; -static EWRAM_DATA u16 sPreviousPlayerMetatileBehavior = 0; +static EWRAM_DATA u16 sPrevMetatileBehavior = 0; u8 gSelectedObjectEvent; @@ -671,18 +671,18 @@ static bool8 CheckStandardWildEncounter(u16 metatileBehavior) if (sWildEncounterImmunitySteps < 4) { sWildEncounterImmunitySteps++; - sPreviousPlayerMetatileBehavior = metatileBehavior; + sPrevMetatileBehavior = metatileBehavior; return FALSE; } - if (StandardWildEncounter(metatileBehavior, sPreviousPlayerMetatileBehavior) == TRUE) + if (StandardWildEncounter(metatileBehavior, sPrevMetatileBehavior) == TRUE) { sWildEncounterImmunitySteps = 0; - sPreviousPlayerMetatileBehavior = metatileBehavior; + sPrevMetatileBehavior = metatileBehavior; return TRUE; } - sPreviousPlayerMetatileBehavior = metatileBehavior; + sPrevMetatileBehavior = metatileBehavior; return FALSE; } diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 01161e6ccb..eb42cd7bdf 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -481,7 +481,7 @@ static bool8 DoMassOutbreakEncounterTest(void) return FALSE; } -static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate) +static bool8 EncounterOddsCheck(u16 encounterRate) { if (Random() % MAX_ENCOUNTER_RATE < encounterRate) return TRUE; @@ -489,7 +489,8 @@ static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate) return FALSE; } -static bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility) +// Returns true if it will try to create a wild encounter. +static bool8 WildEncounterCheck(u32 encounterRate, bool8 ignoreAbility) { encounterRate *= 16; if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) @@ -515,10 +516,12 @@ static bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility) } if (encounterRate > MAX_ENCOUNTER_RATE) encounterRate = MAX_ENCOUNTER_RATE; - return DoWildEncounterRateDiceRoll(encounterRate); + return EncounterOddsCheck(encounterRate); } -static bool8 DoGlobalWildEncounterDiceRoll(void) +// When you first step on a different type of metatile, there's a 40% chance it +// skips the wild encounter check entirely. +static bool8 AllowWildCheckOnNewMetatile(void) { if (Random() % 100 >= 60) return FALSE; @@ -537,7 +540,7 @@ static bool8 AreLegendariesInSootopolisPreventingEncounters(void) return FlagGet(FLAG_LEGENDARIES_IN_SOOTOPOLIS); } -bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavior) +bool8 StandardWildEncounter(u16 curMetatileBehavior, u16 prevMetatileBehavior) { u16 headerId; struct Roamer *roamer; @@ -551,9 +554,9 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS) { headerId = GetBattlePikeWildMonHeaderId(); - if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll()) + if (prevMetatileBehavior != curMetatileBehavior && !AllowWildCheckOnNewMetatile()) return FALSE; - else if (DoWildEncounterRateTest(gBattlePikeWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) + else if (WildEncounterCheck(gBattlePikeWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) return FALSE; else if (TryGenerateWildMon(gBattlePikeWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_KEEN_EYE) != TRUE) return FALSE; @@ -566,9 +569,9 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR) { headerId = gSaveBlock2Ptr->frontier.curChallengeBattleNum; - if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll()) + if (prevMetatileBehavior != curMetatileBehavior && !AllowWildCheckOnNewMetatile()) return FALSE; - else if (DoWildEncounterRateTest(gBattlePyramidWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) + else if (WildEncounterCheck(gBattlePyramidWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) return FALSE; else if (TryGenerateWildMon(gBattlePyramidWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_KEEN_EYE) != TRUE) return FALSE; @@ -580,13 +583,13 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi } else { - if (MetatileBehavior_IsLandWildEncounter(currMetaTileBehavior) == TRUE) + if (MetatileBehavior_IsLandWildEncounter(curMetatileBehavior) == TRUE) { if (gWildMonHeaders[headerId].landMonsInfo == NULL) return FALSE; - else if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll()) + else if (prevMetatileBehavior != curMetatileBehavior && !AllowWildCheckOnNewMetatile()) return FALSE; - else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) + else if (WildEncounterCheck(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) return FALSE; if (TryStartRoamerEncounter() == TRUE) @@ -616,16 +619,16 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi return FALSE; } } - else if (MetatileBehavior_IsWaterWildEncounter(currMetaTileBehavior) == TRUE - || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridgeOverWater(currMetaTileBehavior) == TRUE)) + else if (MetatileBehavior_IsWaterWildEncounter(curMetatileBehavior) == TRUE + || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridgeOverWater(curMetatileBehavior) == TRUE)) { if (AreLegendariesInSootopolisPreventingEncounters() == TRUE) return FALSE; else if (gWildMonHeaders[headerId].waterMonsInfo == NULL) return FALSE; - else if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll()) + else if (prevMetatileBehavior != curMetatileBehavior && !AllowWildCheckOnNewMetatile()) return FALSE; - else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE) + else if (WildEncounterCheck(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE) return FALSE; if (TryStartRoamerEncounter() == TRUE) @@ -665,7 +668,7 @@ void RockSmashWildEncounter(void) { gSpecialVar_Result = FALSE; } - else if (DoWildEncounterRateTest(wildPokemonInfo->encounterRate, TRUE) == TRUE + else if (WildEncounterCheck(wildPokemonInfo->encounterRate, TRUE) == TRUE && TryGenerateWildMon(wildPokemonInfo, WILD_AREA_ROCKS, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE) { BattleSetup_StartWildBattle();