summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@gmail.com>2019-10-31 20:25:41 -0400
committerPikalaxALT <PikalaxALT@gmail.com>2019-10-31 20:25:41 -0400
commitf0a7ee8d16f40707fbec80d7224f410ae455c071 (patch)
tree83da7d0c549974e392aa3eb897fb038e889fbd20
parent3f7c66703b42f1e9a9c87c0c56c80fb19b727aaf (diff)
Improve documentation of wild_encounter
-rw-r--r--src/wild_encounter.c170
1 files changed, 97 insertions, 73 deletions
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index 71c580e15..f17e1f79b 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -21,7 +21,7 @@
struct WildEncounterData
{
u32 rngState;
- u16 prevMetaTileBehavior;
+ u16 prevMetatileBehavior;
u16 encounterRateBuff;
u8 stepsSinceLastEncounter;
u8 abilityEffect;
@@ -37,7 +37,7 @@ static bool8 IsWildLevelAllowedByRepel(u8 level);
static void ApplyFluteEncounterRateMod(u32 *rate);
static u8 GetFluteEncounterRateModType(void);
static void ApplyCleanseTagEncounterRateMod(u32 *rate);
-static u8 IsLeadMonHoldingCleanseTag(void);
+static bool8 IsLeadMonHoldingCleanseTag(void);
static u16 WildEncounterRandom(void);
static void AddToWildEncounterRateBuff(u8 encouterRate);
@@ -67,80 +67,93 @@ void DisableWildEncounters(bool8 state)
static u8 ChooseWildMonIndex_Land(void)
{
- u8 pct = Random() % 100;
- if (pct < 20)
+ u8 rand = Random() % ENCOUNTER_CHANCE_LAND_MONS_TOTAL;
+
+ if (rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_0)
return 0;
- if (pct >= 20 && pct < 40)
+ else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_0 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_1)
return 1;
- if (pct >= 40 && pct < 50)
+ else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_1 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_2)
return 2;
- if (pct >= 50 && pct < 60)
+ else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_2 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_3)
return 3;
- if (pct >= 60 && pct < 70)
+ else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_3 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_4)
return 4;
- if (pct >= 70 && pct < 80)
+ else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_4 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_5)
return 5;
- if (pct >= 80 && pct < 85)
+ else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_5 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_6)
return 6;
- if (pct >= 85 && pct < 90)
+ else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_6 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_7)
return 7;
- if (pct >= 90 && pct < 94)
+ else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_7 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_8)
return 8;
- if (pct >= 94 && pct < 98)
+ else if (rand >= ENCOUNTER_CHANCE_LAND_MONS_SLOT_8 && rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_9)
return 9;
- if (pct == 98)
+ else if (rand == ENCOUNTER_CHANCE_LAND_MONS_SLOT_9)
return 10;
- return 11;
+ else
+ return 11;
}
static u8 ChooseWildMonIndex_WaterRock(void)
{
- u8 pct = Random() % 100;
- if (pct < 60)
+ u8 rand = Random() % ENCOUNTER_CHANCE_WATER_MONS_TOTAL;
+
+ if (rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_0)
return 0;
- if (pct >= 60 && pct < 90)
+ else if (rand >= ENCOUNTER_CHANCE_WATER_MONS_SLOT_0 && rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_1)
return 1;
- if (pct >= 90 && pct < 95)
+ else if (rand >= ENCOUNTER_CHANCE_WATER_MONS_SLOT_1 && rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_2)
return 2;
- if (pct >= 95 && pct < 99)
+ else if (rand >= ENCOUNTER_CHANCE_WATER_MONS_SLOT_2 && rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_3)
return 3;
- return 4;
+ else
+ return 4;
}
+enum
+{
+ OLD_ROD,
+ GOOD_ROD,
+ SUPER_ROD
+};
+
static u8 ChooseWildMonIndex_Fishing(u8 rod)
{
- u8 slot = 0;
- u8 pct = Random() % 100;
+ u8 wildMonIndex = 0;
+ u8 rand = Random() % max(max(ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_TOTAL, ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_TOTAL),
+ ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_TOTAL);
+
switch (rod)
{
- case 0: // old
- if (pct < 70)
- slot = 0;
+ case OLD_ROD:
+ if (rand < ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_0)
+ wildMonIndex = 0;
else
- slot = 1;
+ wildMonIndex = 1;
break;
- case 1:
- if (pct < 60)
- slot = 2;
- if (pct >= 60 && pct < 80)
- slot = 3;
- if (pct >= 80 && pct < 100)
- slot = 4;
+ case GOOD_ROD:
+ if (rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2)
+ wildMonIndex = 2;
+ if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2 && rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3)
+ wildMonIndex = 3;
+ if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3 && rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_4)
+ wildMonIndex = 4;
break;
- case 2:
- if (pct < 40)
- slot = 5;
- if (pct >= 40 && pct < 80)
- slot = 6;
- if (pct >= 80 && pct < 95)
- slot = 7;
- if (pct >= 95 && pct < 99)
- slot = 8;
- if (pct == 99)
- slot = 9;
+ case SUPER_ROD:
+ if (rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5)
+ wildMonIndex = 5;
+ if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6)
+ wildMonIndex = 6;
+ if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7)
+ wildMonIndex = 7;
+ if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8)
+ wildMonIndex = 8;
+ if (rand == ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8)
+ wildMonIndex = 9;
break;
}
- return slot;
+ return wildMonIndex;
}
static u8 ChooseWildMonLevel(const struct WildPokemon * info)
@@ -170,7 +183,7 @@ static u16 GetCurrentMapWildMonHeaderId(void)
for (i = 0; ; i++)
{
- const struct WildPokemonHeader *wildHeader = &gWildMonHeaders[i];
+ const struct WildPokemonHeader * wildHeader = &gWildMonHeaders[i];
if (wildHeader->mapGroup == 0xFF)
break;
@@ -246,24 +259,35 @@ u8 GetUnownLetterByPersonalityLoByte(u32 personality)
return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C;
}
-static bool8 TryGenerateWildMon(const struct WildPokemonInfo * info, u8 tableIdx, u8 a2)
+enum
+{
+ WILD_AREA_LAND,
+ WILD_AREA_WATER,
+ WILD_AREA_ROCKS,
+ WILD_AREA_FISHING,
+};
+
+#define WILD_CHECK_REPEL 0x1
+#define WILD_CHECK_KEEN_EYE 0x2
+
+static bool8 TryGenerateWildMon(const struct WildPokemonInfo * info, u8 area, u8 flags)
{
u8 slot = 0;
u8 level;
- switch (tableIdx)
+ switch (area)
{
- case 0:
+ case WILD_AREA_LAND:
slot = ChooseWildMonIndex_Land();
break;
- case 1:
+ case WILD_AREA_WATER:
slot = ChooseWildMonIndex_WaterRock();
break;
- case 2:
+ case WILD_AREA_ROCKS:
slot = ChooseWildMonIndex_WaterRock();
break;
}
level = ChooseWildMonLevel(&info->wildPokemon[slot]);
- if (a2 == 1 && !IsWildLevelAllowedByRepel(level))
+ if (flags == WILD_CHECK_REPEL && !IsWildLevelAllowedByRepel(level))
{
return FALSE;
}
@@ -332,10 +356,10 @@ static bool8 DoGlobalWildEncounterDiceRoll(void)
return TRUE;
}
-bool8 StandardWildEncounter(u32 currMetaTileBehavior, u16 previousMetaTileBehavior)
+bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavior)
{
u16 headerId;
- struct Roamer *roamer;
+ struct Roamer * roamer;
if (sWildEncountersDisabled == TRUE)
return FALSE;
@@ -343,11 +367,11 @@ bool8 StandardWildEncounter(u32 currMetaTileBehavior, u16 previousMetaTileBehavi
headerId = GetCurrentMapWildMonHeaderId();
if (headerId != 0xFFFF)
{
- if (sub_8058F1C(currMetaTileBehavior, 4) == TRUE)
+ if (sub_8058F1C(currMetatileBehavior, 4) == TRUE)
{
if (gWildMonHeaders[headerId].landMonsInfo == NULL)
return FALSE;
- else if (previousMetaTileBehavior != sub_8058F1C(currMetaTileBehavior, 0) && !DoGlobalWildEncounterDiceRoll())
+ else if (previousMetatileBehavior != sub_8058F1C(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll())
return FALSE;
if (DoWildEncounterRateTest(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
{
@@ -370,7 +394,7 @@ bool8 StandardWildEncounter(u32 currMetaTileBehavior, u16 previousMetaTileBehavi
{
// try a regular wild land encounter
- if (TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, 0, 1) == TRUE)
+ if (TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_REPEL) == TRUE)
{
BattleSetup_StartWildBattle();
return TRUE;
@@ -381,12 +405,12 @@ bool8 StandardWildEncounter(u32 currMetaTileBehavior, u16 previousMetaTileBehavi
}
}
}
- else if (sub_8058F1C(currMetaTileBehavior, 4) == 2
- || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(sub_8058F1C(currMetaTileBehavior, 0)) == TRUE))
+ else if (sub_8058F1C(currMetatileBehavior, 4) == 2
+ || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(sub_8058F1C(currMetatileBehavior, 0)) == TRUE))
{
if (gWildMonHeaders[headerId].waterMonsInfo == NULL)
return FALSE;
- else if (previousMetaTileBehavior != sub_8058F1C(currMetaTileBehavior, 0) && !DoGlobalWildEncounterDiceRoll())
+ else if (previousMetatileBehavior != sub_8058F1C(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll())
return FALSE;
else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE)
{
@@ -407,7 +431,7 @@ bool8 StandardWildEncounter(u32 currMetaTileBehavior, u16 previousMetaTileBehavi
}
else // try a regular surfing encounter
{
- if (TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, 1, 1) == TRUE)
+ if (TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, WILD_AREA_WATER, WILD_CHECK_REPEL) == TRUE)
{
BattleSetup_StartWildBattle();
return TRUE;
@@ -432,7 +456,7 @@ void ScrSpecial_RockSmashWildEncounter(void)
gSpecialVar_Result = FALSE;
else if (DoWildEncounterRateTest(gWildMonHeaders[headerIdx].rockSmashMonsInfo->encounterRate, TRUE) != TRUE)
gSpecialVar_Result = FALSE;
- else if (TryGenerateWildMon(gWildMonHeaders[headerIdx].rockSmashMonsInfo, 2, 1) == TRUE)
+ else if (TryGenerateWildMon(gWildMonHeaders[headerIdx].rockSmashMonsInfo, WILD_AREA_ROCKS, WILD_CHECK_REPEL) == TRUE)
{
BattleSetup_StartWildBattle();
gSpecialVar_Result = TRUE;
@@ -461,7 +485,7 @@ bool8 SweetScentWildEncounter(void)
if (gWildMonHeaders[headerId].landMonsInfo == NULL)
return FALSE;
- TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, 0, 0);
+ TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0);
BattleSetup_StartWildBattle();
return TRUE;
@@ -477,7 +501,7 @@ bool8 SweetScentWildEncounter(void)
if (gWildMonHeaders[headerId].waterMonsInfo == NULL)
return FALSE;
- TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, 1, 0);
+ TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, WILD_AREA_WATER, 0);
BattleSetup_StartWildBattle();
return TRUE;
}
@@ -685,9 +709,9 @@ void ResetEncounterRateModifiers(void)
sWildEncounterData.stepsSinceLastEncounter = 0;
}
-static bool8 HandleWildEncounterCooldown(u32 currMetaTileBehavior)
+static bool8 HandleWildEncounterCooldown(u32 currMetatileBehavior)
{
- u8 unk = sub_8058F1C(currMetaTileBehavior, 4);
+ u8 unk = sub_8058F1C(currMetatileBehavior, 4);
u32 minSteps;
u32 encRate;
if (unk == 0)
@@ -735,23 +759,23 @@ static bool8 HandleWildEncounterCooldown(u32 currMetaTileBehavior)
return FALSE;
}
-bool8 TryStandardWildEncounter(u32 currMetaTileBehavior)
+bool8 TryStandardWildEncounter(u32 currMetatileBehavior)
{
- if (!HandleWildEncounterCooldown(currMetaTileBehavior))
+ if (!HandleWildEncounterCooldown(currMetatileBehavior))
{
- sWildEncounterData.prevMetaTileBehavior = sub_8058F1C(currMetaTileBehavior, 0);
+ sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0);
return FALSE;
}
- else if (StandardWildEncounter(currMetaTileBehavior, sWildEncounterData.prevMetaTileBehavior) == TRUE)
+ else if (StandardWildEncounter(currMetatileBehavior, sWildEncounterData.prevMetatileBehavior) == TRUE)
{
sWildEncounterData.encounterRateBuff = 0;
sWildEncounterData.stepsSinceLastEncounter = 0;
- sWildEncounterData.prevMetaTileBehavior = sub_8058F1C(currMetaTileBehavior, 0);
+ sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0);
return TRUE;
}
else
{
- sWildEncounterData.prevMetaTileBehavior = sub_8058F1C(currMetaTileBehavior, 0);
+ sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0);
return FALSE;
}
}