summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDizzyEggg <jajkodizzy@wp.pl>2017-11-17 17:50:07 +0100
committerDizzyEggg <jajkodizzy@wp.pl>2017-11-17 17:50:07 +0100
commita2a17bba926d1465108ab55c47f9145494ff78e5 (patch)
treef72fbf0ffd636f9f7ac39f49b2a2448ae9a6762c /src
parentb37d8c0821997038c96723d85bcc95734af0c159 (diff)
more work on wild encounter
Diffstat (limited to 'src')
-rw-r--r--src/wild_encounter.c257
1 files changed, 256 insertions, 1 deletions
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index 7d4cc7794..6238f6aab 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -11,6 +11,8 @@
#include "event_data.h"
#include "safari_zone.h"
#include "pokeblock.h"
+#include "battle_setup.h"
+#include "roamer.h"
EWRAM_DATA u8 sWildEncountersDisabled = 0;
EWRAM_DATA u32 sFeebasRngValue = 0;
@@ -18,6 +20,12 @@ EWRAM_DATA u32 sFeebasRngValue = 0;
#define NUM_FEEBAS_SPOTS 6
extern const u16 gRoute119WaterTileData[];
+extern const struct WildPokemonHeader gBattlePikeWildMonHeaders[];
+extern const struct WildPokemonHeader gBattlePyramidWildMonHeaders[];
+
+extern u8 GetBattlePikeWildMonHeaderId(void);
+extern bool32 TryGenerateBattlePikeWildMon(bool8 checkKeenEyeIntimidate);
+extern void GenerateBattlePyramidWildMon(void);
// this file's functions
u16 FeebasRandom(void);
@@ -374,7 +382,7 @@ enum
#define WILD_CHECK_REPEL 0x1
#define WILD_CHECK_KEEN_EYE 0x2
-bool8 TryGenerateWildMon(struct WildPokemonInfo *wildMonInfo, u8 area, u8 flags)
+bool8 TryGenerateWildMon(const struct WildPokemonInfo *wildMonInfo, u8 area, u8 flags)
{
u8 wildMonIndex = 0;
u8 level;
@@ -481,3 +489,250 @@ bool8 DoWildEncounterRateTest(u32 encounterRate, bool8 ignoreAbility)
encounterRate = 2880;
return DoWildEncounterRateDiceRoll(encounterRate);
}
+
+bool8 DoGlobalWildEncounterDiceRoll(void)
+{
+ if (Random() % 100 >= 60)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+bool8 AreLegendariesInSootopolisPreventingEncounters(void)
+{
+ if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP_SOOTOPOLIS_CITY
+ || gSaveBlock1Ptr->location.mapNum != MAP_ID_SOOTOPOLIS_CITY)
+ {
+ return FALSE;
+ }
+
+ return FlagGet(FLAG_LEGENDARIES_IN_SOOTOPOLIS);
+}
+
+bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavior)
+{
+ u16 headerId;
+ struct Roamer *roamer;
+
+ if (sWildEncountersDisabled == TRUE)
+ return FALSE;
+
+ headerId = GetCurrentMapWildMonHeaderId();
+ if (headerId == 0xFFFF) // invalid
+ {
+ if (gMapHeader.mapDataId == 0x166)
+ {
+ headerId = GetBattlePikeWildMonHeaderId();
+ if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll())
+ return FALSE;
+ if (DoWildEncounterRateTest(gBattlePikeWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
+ return FALSE;
+ if (TryGenerateWildMon(gBattlePikeWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_KEEN_EYE) != TRUE)
+ return FALSE;
+ if (!TryGenerateBattlePikeWildMon(TRUE))
+ return FALSE;
+
+ BattleSetup_StartBattlePikeWildBattle();
+ return TRUE;
+ }
+ if (gMapHeader.mapDataId == 0x169)
+ {
+ headerId = gSaveBlock2Ptr->battlePyramidWildHeaderId;
+ if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll())
+ return FALSE;
+ if (DoWildEncounterRateTest(gBattlePyramidWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
+ return FALSE;
+ if (TryGenerateWildMon(gBattlePyramidWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_KEEN_EYE) != TRUE)
+ return FALSE;
+
+ GenerateBattlePyramidWildMon();
+ BattleSetup_StartWildBattle();
+ return TRUE;
+ }
+ }
+ else
+ {
+ if (MetatileBehavior_IsLandWildEncounter(currMetaTileBehavior) == TRUE)
+ {
+ if (gWildMonHeaders[headerId].landMonsInfo == NULL)
+ return FALSE;
+ if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll())
+ return FALSE;
+ if (DoWildEncounterRateTest(gWildMonHeaders[headerId].landMonsInfo->encounterRate, FALSE) != TRUE)
+ return FALSE;
+
+ if (TryStartRoamerEncounter() == TRUE)
+ {
+ roamer = &gSaveBlock1Ptr->roamer;
+ if (!IsWildLevelAllowedByRepel(roamer->level))
+ return FALSE;
+
+ BattleSetup_StartRoamerBattle();
+ return TRUE;
+ }
+ else
+ {
+ if (DoMassOutbreakEncounterTest() == TRUE && SetUpMassOutbreakEncounter(WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE)
+ {
+ BattleSetup_StartWildBattle();
+ return TRUE;
+ }
+
+ // try a regular wild land encounter
+ if (TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE)
+ {
+ BattleSetup_StartWildBattle();
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+ }
+ else if (MetatileBehavior_IsWaterWildEncounter(currMetaTileBehavior) == TRUE
+ || (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING) && MetatileBehavior_IsBridge(currMetaTileBehavior) == TRUE))
+ {
+ if (AreLegendariesInSootopolisPreventingEncounters() == TRUE)
+ return FALSE;
+ if (gWildMonHeaders[headerId].waterMonsInfo == NULL)
+ return FALSE;
+ if (previousMetaTileBehavior != currMetaTileBehavior && !DoGlobalWildEncounterDiceRoll())
+ return FALSE;
+ if (DoWildEncounterRateTest(gWildMonHeaders[headerId].waterMonsInfo->encounterRate, FALSE) != TRUE)
+ return FALSE;
+
+ if (TryStartRoamerEncounter() == TRUE)
+ {
+ roamer = &gSaveBlock1Ptr->roamer;
+ if (!IsWildLevelAllowedByRepel(roamer->level))
+ return FALSE;
+
+ BattleSetup_StartRoamerBattle();
+ return TRUE;
+ }
+ else // try a regular surfing encounter
+ {
+ if (TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, WILD_AREA_WATER, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE)
+ {
+ BattleSetup_StartWildBattle();
+ return TRUE;
+ }
+
+ return FALSE;
+ }
+ }
+ }
+
+ return FALSE;
+}
+
+void RockSmashWildEncounter(void)
+{
+ u16 headerId = GetCurrentMapWildMonHeaderId();
+
+ if (headerId != 0xFFFF)
+ {
+ const struct WildPokemonInfo *wildPokemonInfo = gWildMonHeaders[headerId].rockSmashMonsInfo;
+
+ if (wildPokemonInfo == NULL)
+ {
+ gSpecialVar_Result = FALSE;
+ }
+ else if (DoWildEncounterRateTest(wildPokemonInfo->encounterRate, 1) == TRUE
+ && TryGenerateWildMon(wildPokemonInfo, 2, WILD_CHECK_REPEL | WILD_CHECK_KEEN_EYE) == TRUE)
+ {
+ BattleSetup_StartWildBattle();
+ gSpecialVar_Result = TRUE;
+ }
+ else
+ {
+ gSpecialVar_Result = FALSE;
+ }
+ }
+ else
+ {
+ gSpecialVar_Result = FALSE;
+ }
+}
+
+bool8 SweetScentWildEncounter(void)
+{
+ s16 x, y;
+ u16 headerId;
+
+ PlayerGetDestCoords(&x, &y);
+ headerId = GetCurrentMapWildMonHeaderId();
+ if (headerId == 0xFFFF) // invalid
+ {
+ if (gMapHeader.mapDataId == 0x166)
+ {
+ headerId = GetBattlePikeWildMonHeaderId();
+ if (TryGenerateWildMon(gBattlePikeWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0) != TRUE)
+ return FALSE;
+
+ TryGenerateBattlePikeWildMon(FALSE);
+ BattleSetup_StartBattlePikeWildBattle();
+ return TRUE;
+ }
+ if (gMapHeader.mapDataId == 0x169)
+ {
+ headerId = gSaveBlock2Ptr->battlePyramidWildHeaderId;
+ if (TryGenerateWildMon(gBattlePyramidWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0) != TRUE)
+ return FALSE;
+
+ GenerateBattlePyramidWildMon();
+ BattleSetup_StartWildBattle();
+ return TRUE;
+ }
+ }
+ else
+ {
+ if (MetatileBehavior_IsLandWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == TRUE)
+ {
+ if (gWildMonHeaders[headerId].landMonsInfo == NULL)
+ return FALSE;
+
+ if (TryStartRoamerEncounter() == TRUE)
+ {
+ BattleSetup_StartRoamerBattle();
+ return TRUE;
+ }
+
+ if (DoMassOutbreakEncounterTest() == TRUE)
+ SetUpMassOutbreakEncounter(0);
+ else
+ TryGenerateWildMon(gWildMonHeaders[headerId].landMonsInfo, WILD_AREA_LAND, 0);
+
+ BattleSetup_StartWildBattle();
+ return TRUE;
+ }
+ else if (MetatileBehavior_IsWaterWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == TRUE)
+ {
+ if (AreLegendariesInSootopolisPreventingEncounters() == TRUE)
+ return FALSE;
+ if (gWildMonHeaders[headerId].waterMonsInfo == NULL)
+ return FALSE;
+
+ if (TryStartRoamerEncounter() == TRUE)
+ {
+ BattleSetup_StartRoamerBattle();
+ return TRUE;
+ }
+
+ TryGenerateWildMon(gWildMonHeaders[headerId].waterMonsInfo, WILD_AREA_WATER, 0);
+ BattleSetup_StartWildBattle();
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+bool8 DoesCurrentMapHaveFishingMons(void)
+{
+ u16 headerId = GetCurrentMapWildMonHeaderId();
+
+ if (headerId != 0xFFFF && gWildMonHeaders[headerId].fishingMonsInfo != NULL)
+ return TRUE;
+ else
+ return FALSE;
+}