Merge pull request #1802 from abaresk/wild-encounters

Document new metatile wild encounter odds
This commit is contained in:
GriffinR
2022-10-17 18:56:58 -04:00
committed by GitHub
2 changed files with 25 additions and 22 deletions
+5 -5
View File
@@ -36,7 +36,7 @@
#include "constants/trainer_hill.h" #include "constants/trainer_hill.h"
static EWRAM_DATA u8 sWildEncounterImmunitySteps = 0; static EWRAM_DATA u8 sWildEncounterImmunitySteps = 0;
static EWRAM_DATA u16 sPreviousPlayerMetatileBehavior = 0; static EWRAM_DATA u16 sPrevMetatileBehavior = 0;
u8 gSelectedObjectEvent; u8 gSelectedObjectEvent;
@@ -671,18 +671,18 @@ static bool8 CheckStandardWildEncounter(u16 metatileBehavior)
if (sWildEncounterImmunitySteps < 4) if (sWildEncounterImmunitySteps < 4)
{ {
sWildEncounterImmunitySteps++; sWildEncounterImmunitySteps++;
sPreviousPlayerMetatileBehavior = metatileBehavior; sPrevMetatileBehavior = metatileBehavior;
return FALSE; return FALSE;
} }
if (StandardWildEncounter(metatileBehavior, sPreviousPlayerMetatileBehavior) == TRUE) if (StandardWildEncounter(metatileBehavior, sPrevMetatileBehavior) == TRUE)
{ {
sWildEncounterImmunitySteps = 0; sWildEncounterImmunitySteps = 0;
sPreviousPlayerMetatileBehavior = metatileBehavior; sPrevMetatileBehavior = metatileBehavior;
return TRUE; return TRUE;
} }
sPreviousPlayerMetatileBehavior = metatileBehavior; sPrevMetatileBehavior = metatileBehavior;
return FALSE; return FALSE;
} }
+20 -17
View File
@@ -481,7 +481,7 @@ static bool8 DoMassOutbreakEncounterTest(void)
return FALSE; return FALSE;
} }
static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate) static bool8 EncounterOddsCheck(u16 encounterRate)
{ {
if (Random() % MAX_ENCOUNTER_RATE < encounterRate) if (Random() % MAX_ENCOUNTER_RATE < encounterRate)
return TRUE; return TRUE;
@@ -489,7 +489,8 @@ static bool8 DoWildEncounterRateDiceRoll(u16 encounterRate)
return FALSE; 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; encounterRate *= 16;
if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE | PLAYER_AVATAR_FLAG_ACRO_BIKE)) 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) if (encounterRate > MAX_ENCOUNTER_RATE)
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) if (Random() % 100 >= 60)
return FALSE; return FALSE;
@@ -537,7 +540,7 @@ static bool8 AreLegendariesInSootopolisPreventingEncounters(void)
return FlagGet(FLAG_LEGENDARIES_IN_SOOTOPOLIS); return FlagGet(FLAG_LEGENDARIES_IN_SOOTOPOLIS);
} }
bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavior) bool8 StandardWildEncounter(u16 curMetatileBehavior, u16 prevMetatileBehavior)
{ {
u16 headerId; u16 headerId;
struct Roamer *roamer; struct Roamer *roamer;
@@ -551,9 +554,9 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi
if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS) if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS)
{ {
headerId = GetBattlePikeWildMonHeaderId(); headerId = GetBattlePikeWildMonHeaderId();
if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll()) if (prevMetatileBehavior != curMetatileBehavior && !AllowWildCheckOnNewMetatile())
return FALSE; return FALSE;
else if (DoWildEncounterRateTest(gBattlePikeWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) else if (WildEncounterCheck(gBattlePikeWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
return FALSE; return FALSE;
else if (TryGenerateWildMon(gBattlePikeWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_KEEN_EYE) != TRUE) else if (TryGenerateWildMon(gBattlePikeWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_KEEN_EYE) != TRUE)
return FALSE; return FALSE;
@@ -566,9 +569,9 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi
if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR) if (gMapHeader.mapLayoutId == LAYOUT_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR)
{ {
headerId = gSaveBlock2Ptr->frontier.curChallengeBattleNum; headerId = gSaveBlock2Ptr->frontier.curChallengeBattleNum;
if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll()) if (prevMetatileBehavior != curMetatileBehavior && !AllowWildCheckOnNewMetatile())
return FALSE; return FALSE;
else if (DoWildEncounterRateTest(gBattlePyramidWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) else if (WildEncounterCheck(gBattlePyramidWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
return FALSE; return FALSE;
else if (TryGenerateWildMon(gBattlePyramidWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_KEEN_EYE) != TRUE) else if (TryGenerateWildMon(gBattlePyramidWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_KEEN_EYE) != TRUE)
return FALSE; return FALSE;
@@ -580,13 +583,13 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi
} }
else else
{ {
if (MetatileBehavior_IsLandWildEncounter(currMetaTileBehavior) == TRUE) if (MetatileBehavior_IsLandWildEncounter(curMetatileBehavior) == TRUE)
{ {
if (gWildMonHeaders[headerId].landMonsInfo == NULL) if (gWildMonHeaders[headerId].landMonsInfo == NULL)
return FALSE; return FALSE;
else if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll()) else if (prevMetatileBehavior != curMetatileBehavior && !AllowWildCheckOnNewMetatile())
return FALSE; return FALSE;
else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) else if (WildEncounterCheck(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
return FALSE; return FALSE;
if (TryStartRoamerEncounter() == TRUE) if (TryStartRoamerEncounter() == TRUE)
@@ -616,16 +619,16 @@ bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavi
return FALSE; return FALSE;
} }
} }
else if (MetatileBehavior_IsWaterWildEncounter(currMetaTileBehavior) == TRUE else if (MetatileBehavior_IsWaterWildEncounter(curMetatileBehavior) == TRUE
|| (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridgeOverWater(currMetaTileBehavior) == TRUE)) || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridgeOverWater(curMetatileBehavior) == TRUE))
{ {
if (AreLegendariesInSootopolisPreventingEncounters() == TRUE) if (AreLegendariesInSootopolisPreventingEncounters() == TRUE)
return FALSE; return FALSE;
else if (gWildMonHeaders[headerId].waterMonsInfo == NULL) else if (gWildMonHeaders[headerId].waterMonsInfo == NULL)
return FALSE; return FALSE;
else if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll()) else if (prevMetatileBehavior != curMetatileBehavior && !AllowWildCheckOnNewMetatile())
return FALSE; return FALSE;
else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE) else if (WildEncounterCheck(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE)
return FALSE; return FALSE;
if (TryStartRoamerEncounter() == TRUE) if (TryStartRoamerEncounter() == TRUE)
@@ -665,7 +668,7 @@ void RockSmashWildEncounter(void)
{ {
gSpecialVar_Result = FALSE; 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) && TryGenerateWildMon(wildPokemonInfo, WILD_AREA_ROCKS, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE)
{ {
BattleSetup_StartWildBattle(); BattleSetup_StartWildBattle();