Improve documentation of wild_encounter

This commit is contained in:
PikalaxALT
2019-10-31 20:25:41 -04:00
parent 3f7c66703b
commit f0a7ee8d16
+97 -73
View File
@@ -21,7 +21,7 @@
struct WildEncounterData struct WildEncounterData
{ {
u32 rngState; u32 rngState;
u16 prevMetaTileBehavior; u16 prevMetatileBehavior;
u16 encounterRateBuff; u16 encounterRateBuff;
u8 stepsSinceLastEncounter; u8 stepsSinceLastEncounter;
u8 abilityEffect; u8 abilityEffect;
@@ -37,7 +37,7 @@ static bool8 IsWildLevelAllowedByRepel(u8 level);
static void ApplyFluteEncounterRateMod(u32 *rate); static void ApplyFluteEncounterRateMod(u32 *rate);
static u8 GetFluteEncounterRateModType(void); static u8 GetFluteEncounterRateModType(void);
static void ApplyCleanseTagEncounterRateMod(u32 *rate); static void ApplyCleanseTagEncounterRateMod(u32 *rate);
static u8 IsLeadMonHoldingCleanseTag(void); static bool8 IsLeadMonHoldingCleanseTag(void);
static u16 WildEncounterRandom(void); static u16 WildEncounterRandom(void);
static void AddToWildEncounterRateBuff(u8 encouterRate); static void AddToWildEncounterRateBuff(u8 encouterRate);
@@ -67,80 +67,93 @@ void DisableWildEncounters(bool8 state)
static u8 ChooseWildMonIndex_Land(void) static u8 ChooseWildMonIndex_Land(void)
{ {
u8 pct = Random() % 100; u8 rand = Random() % ENCOUNTER_CHANCE_LAND_MONS_TOTAL;
if (pct < 20)
if (rand < ENCOUNTER_CHANCE_LAND_MONS_SLOT_0)
return 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; 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; 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; 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; 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; 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; 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; 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; 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; return 9;
if (pct == 98) else if (rand == ENCOUNTER_CHANCE_LAND_MONS_SLOT_9)
return 10; return 10;
return 11; else
return 11;
} }
static u8 ChooseWildMonIndex_WaterRock(void) static u8 ChooseWildMonIndex_WaterRock(void)
{ {
u8 pct = Random() % 100; u8 rand = Random() % ENCOUNTER_CHANCE_WATER_MONS_TOTAL;
if (pct < 60)
if (rand < ENCOUNTER_CHANCE_WATER_MONS_SLOT_0)
return 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; 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; 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 3;
return 4; else
return 4;
} }
enum
{
OLD_ROD,
GOOD_ROD,
SUPER_ROD
};
static u8 ChooseWildMonIndex_Fishing(u8 rod) static u8 ChooseWildMonIndex_Fishing(u8 rod)
{ {
u8 slot = 0; u8 wildMonIndex = 0;
u8 pct = Random() % 100; 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) switch (rod)
{ {
case 0: // old case OLD_ROD:
if (pct < 70) if (rand < ENCOUNTER_CHANCE_FISHING_MONS_OLD_ROD_SLOT_0)
slot = 0; wildMonIndex = 0;
else else
slot = 1; wildMonIndex = 1;
break; break;
case 1: case GOOD_ROD:
if (pct < 60) if (rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2)
slot = 2; wildMonIndex = 2;
if (pct >= 60 && pct < 80) if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_2 && rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3)
slot = 3; wildMonIndex = 3;
if (pct >= 80 && pct < 100) if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_3 && rand < ENCOUNTER_CHANCE_FISHING_MONS_GOOD_ROD_SLOT_4)
slot = 4; wildMonIndex = 4;
break; break;
case 2: case SUPER_ROD:
if (pct < 40) if (rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5)
slot = 5; wildMonIndex = 5;
if (pct >= 40 && pct < 80) if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_5 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6)
slot = 6; wildMonIndex = 6;
if (pct >= 80 && pct < 95) if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_6 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7)
slot = 7; wildMonIndex = 7;
if (pct >= 95 && pct < 99) if (rand >= ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_7 && rand < ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8)
slot = 8; wildMonIndex = 8;
if (pct == 99) if (rand == ENCOUNTER_CHANCE_FISHING_MONS_SUPER_ROD_SLOT_8)
slot = 9; wildMonIndex = 9;
break; break;
} }
return slot; return wildMonIndex;
} }
static u8 ChooseWildMonLevel(const struct WildPokemon * info) static u8 ChooseWildMonLevel(const struct WildPokemon * info)
@@ -170,7 +183,7 @@ static u16 GetCurrentMapWildMonHeaderId(void)
for (i = 0; ; i++) for (i = 0; ; i++)
{ {
const struct WildPokemonHeader *wildHeader = &gWildMonHeaders[i]; const struct WildPokemonHeader * wildHeader = &gWildMonHeaders[i];
if (wildHeader->mapGroup == 0xFF) if (wildHeader->mapGroup == 0xFF)
break; break;
@@ -246,24 +259,35 @@ u8 GetUnownLetterByPersonalityLoByte(u32 personality)
return (((personality & 0x3000000) >> 18) | ((personality & 0x30000) >> 12) | ((personality & 0x300) >> 6) | (personality & 0x3)) % 0x1C; 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 slot = 0;
u8 level; u8 level;
switch (tableIdx) switch (area)
{ {
case 0: case WILD_AREA_LAND:
slot = ChooseWildMonIndex_Land(); slot = ChooseWildMonIndex_Land();
break; break;
case 1: case WILD_AREA_WATER:
slot = ChooseWildMonIndex_WaterRock(); slot = ChooseWildMonIndex_WaterRock();
break; break;
case 2: case WILD_AREA_ROCKS:
slot = ChooseWildMonIndex_WaterRock(); slot = ChooseWildMonIndex_WaterRock();
break; break;
} }
level = ChooseWildMonLevel(&info->wildPokemon[slot]); level = ChooseWildMonLevel(&info->wildPokemon[slot]);
if (a2 == 1 && !IsWildLevelAllowedByRepel(level)) if (flags == WILD_CHECK_REPEL && !IsWildLevelAllowedByRepel(level))
{ {
return FALSE; return FALSE;
} }
@@ -332,10 +356,10 @@ static bool8 DoGlobalWildEncounterDiceRoll(void)
return TRUE; return TRUE;
} }
bool8 StandardWildEncounter(u32 currMetaTileBehavior, u16 previousMetaTileBehavior) bool8 StandardWildEncounter(u32 currMetatileBehavior, u16 previousMetatileBehavior)
{ {
u16 headerId; u16 headerId;
struct Roamer *roamer; struct Roamer * roamer;
if (sWildEncountersDisabled == TRUE) if (sWildEncountersDisabled == TRUE)
return FALSE; return FALSE;
@@ -343,11 +367,11 @@ bool8 StandardWildEncounter(u32 currMetaTileBehavior, u16 previousMetaTileBehavi
headerId = GetCurrentMapWildMonHeaderId(); headerId = GetCurrentMapWildMonHeaderId();
if (headerId != 0xFFFF) if (headerId != 0xFFFF)
{ {
if (sub_8058F1C(currMetaTileBehavior, 4) == TRUE) if (sub_8058F1C(currMetatileBehavior, 4) == TRUE)
{ {
if (gWildMonHeaders[headerId].landMonsInfo == NULL) if (gWildMonHeaders[headerId].landMonsInfo == NULL)
return FALSE; return FALSE;
else if (previousMetaTileBehavior != sub_8058F1C(currMetaTileBehavior, 0) && !DoGlobalWildEncounterDiceRoll()) else if (previousMetatileBehavior != sub_8058F1C(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll())
return FALSE; return FALSE;
if (DoWildEncounterRateTest(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE) if (DoWildEncounterRateTest(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
{ {
@@ -370,7 +394,7 @@ bool8 StandardWildEncounter(u32 currMetaTileBehavior, u16 previousMetaTileBehavi
{ {
// try a regular wild land encounter // 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(); BattleSetup_StartWildBattle();
return TRUE; return TRUE;
@@ -381,12 +405,12 @@ bool8 StandardWildEncounter(u32 currMetaTileBehavior, u16 previousMetaTileBehavi
} }
} }
} }
else if (sub_8058F1C(currMetaTileBehavior, 4) == 2 else if (sub_8058F1C(currMetatileBehavior, 4) == 2
|| (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(sub_8058F1C(currMetaTileBehavior, 0)) == TRUE)) || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(sub_8058F1C(currMetatileBehavior, 0)) == TRUE))
{ {
if (gWildMonHeaders[headerId].waterMonsInfo == NULL) if (gWildMonHeaders[headerId].waterMonsInfo == NULL)
return FALSE; return FALSE;
else if (previousMetaTileBehavior != sub_8058F1C(currMetaTileBehavior, 0) && !DoGlobalWildEncounterDiceRoll()) else if (previousMetatileBehavior != sub_8058F1C(currMetatileBehavior, 0) && !DoGlobalWildEncounterDiceRoll())
return FALSE; return FALSE;
else if (DoWildEncounterRateTest(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE) 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 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(); BattleSetup_StartWildBattle();
return TRUE; return TRUE;
@@ -432,7 +456,7 @@ void ScrSpecial_RockSmashWildEncounter(void)
gSpecialVar_Result = FALSE; gSpecialVar_Result = FALSE;
else if (DoWildEncounterRateTest(gWildMonHeaders[headerIdx].rockSmashMonsInfo->encounterRate, TRUE) != TRUE) else if (DoWildEncounterRateTest(gWildMonHeaders[headerIdx].rockSmashMonsInfo->encounterRate, TRUE) != TRUE)
gSpecialVar_Result = FALSE; 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(); BattleSetup_StartWildBattle();
gSpecialVar_Result = TRUE; gSpecialVar_Result = TRUE;
@@ -461,7 +485,7 @@ bool8 SweetScentWildEncounter(void)
if (gWildMonHeaders[headerId].landMonsInfo == NULL) if (gWildMonHeaders[headerId].landMonsInfo == NULL)
return FALSE; return FALSE;
TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, 0, 0); TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0);
BattleSetup_StartWildBattle(); BattleSetup_StartWildBattle();
return TRUE; return TRUE;
@@ -477,7 +501,7 @@ bool8 SweetScentWildEncounter(void)
if (gWildMonHeaders[headerId].waterMonsInfo == NULL) if (gWildMonHeaders[headerId].waterMonsInfo == NULL)
return FALSE; return FALSE;
TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, 1, 0); TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, WILD_AREA_WATER, 0);
BattleSetup_StartWildBattle(); BattleSetup_StartWildBattle();
return TRUE; return TRUE;
} }
@@ -685,9 +709,9 @@ void ResetEncounterRateModifiers(void)
sWildEncounterData.stepsSinceLastEncounter = 0; 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 minSteps;
u32 encRate; u32 encRate;
if (unk == 0) if (unk == 0)
@@ -735,23 +759,23 @@ static bool8 HandleWildEncounterCooldown(u32 currMetaTileBehavior)
return FALSE; 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; return FALSE;
} }
else if (StandardWildEncounter(currMetaTileBehavior, sWildEncounterData.prevMetaTileBehavior) == TRUE) else if (StandardWildEncounter(currMetatileBehavior, sWildEncounterData.prevMetatileBehavior) == TRUE)
{ {
sWildEncounterData.encounterRateBuff = 0; sWildEncounterData.encounterRateBuff = 0;
sWildEncounterData.stepsSinceLastEncounter = 0; sWildEncounterData.stepsSinceLastEncounter = 0;
sWildEncounterData.prevMetaTileBehavior = sub_8058F1C(currMetaTileBehavior, 0); sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0);
return TRUE; return TRUE;
} }
else else
{ {
sWildEncounterData.prevMetaTileBehavior = sub_8058F1C(currMetaTileBehavior, 0); sWildEncounterData.prevMetatileBehavior = sub_8058F1C(currMetatileBehavior, 0);
return FALSE; return FALSE;
} }
} }