summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGriffinR <griffin.g.richards@gmail.com>2022-02-14 21:17:44 -0500
committerGitHub <noreply@github.com>2022-02-14 21:17:44 -0500
commit759f373d3153afb0e9dcf5050a700aeca036a919 (patch)
treeb43e8d72d1886eb1c38dadd67113bec77ef41a26
parent8d85ff1683437897cb0c06dd84fa2d927f560090 (diff)
parent59695b82210cb2c95c10b52efc1a88e18c67dea9 (diff)
Merge pull request #488 from GriffinRichards/map-constants
Sync roamer.c, add missing map constant usage
-rw-r--r--include/constants/pokemon.h8
-rw-r--r--src/battle_setup.c8
-rw-r--r--src/event_object_movement.c9
-rw-r--r--src/menu_helpers.c4
-rw-r--r--src/overworld.c9
-rw-r--r--src/roamer.c194
-rw-r--r--src/script.c9
-rw-r--r--src/wild_encounter.c2
-rw-r--r--src/wild_pokemon_area.c3
9 files changed, 147 insertions, 99 deletions
diff --git a/include/constants/pokemon.h b/include/constants/pokemon.h
index 737eed4d4..43a6231ca 100644
--- a/include/constants/pokemon.h
+++ b/include/constants/pokemon.h
@@ -209,8 +209,14 @@
#define FRIENDSHIP_EVENT_FAINT_OUTSIDE_BATTLE 8
#define FRIENDSHIP_EVENT_FAINT_LARGE 9
-#define PARTY_SIZE 6
+#define MAX_PER_STAT_IVS 31
+#define MAX_IV_MASK 31
+#define USE_RANDOM_IVS (MAX_PER_STAT_IVS + 1)
+#define MAX_PER_STAT_EVS 255
#define MAX_TOTAL_EVS 510
+#define EV_ITEM_RAISE_LIMIT 100
+
+#define PARTY_SIZE 6
#define UNOWN_FORM_COUNT 28
#define BOX_NAME_LENGTH 8
diff --git a/src/battle_setup.c b/src/battle_setup.c
index 49e2d9e01..6b87edd69 100644
--- a/src/battle_setup.c
+++ b/src/battle_setup.c
@@ -211,7 +211,13 @@ static void CreateBattleStartTask(u8 transition, u16 song) // song == 0 means de
static bool8 CheckSilphScopeInPokemonTower(u16 mapGroup, u16 mapNum)
{
if (mapGroup == MAP_GROUP(POKEMON_TOWER_1F)
- && ((u16)(mapNum - MAP_NUM(POKEMON_TOWER_1F)) <= 6)
+ && (mapNum == MAP_NUM(POKEMON_TOWER_1F)
+ || mapNum == MAP_NUM(POKEMON_TOWER_2F)
+ || mapNum == MAP_NUM(POKEMON_TOWER_3F)
+ || mapNum == MAP_NUM(POKEMON_TOWER_4F)
+ || mapNum == MAP_NUM(POKEMON_TOWER_5F)
+ || mapNum == MAP_NUM(POKEMON_TOWER_6F)
+ || mapNum == MAP_NUM(POKEMON_TOWER_7F))
&& !(CheckBagHasItem(ITEM_SILPH_SCOPE, 1)))
return TRUE;
else
diff --git a/src/event_object_movement.c b/src/event_object_movement.c
index 5897e7dc6..c304b8b52 100644
--- a/src/event_object_movement.c
+++ b/src/event_object_movement.c
@@ -15,6 +15,7 @@
#include "script.h"
#include "trainer_see.h"
#include "trig.h"
+#include "constants/maps.h"
#include "constants/event_object_movement.h"
#include "constants/event_objects.h"
#include "constants/trainer_types.h"
@@ -1215,8 +1216,8 @@ static void ClearObjectEvent(struct ObjectEvent *objectEvent)
{
*objectEvent = (struct ObjectEvent){};
objectEvent->localId = 0xFF;
- objectEvent->mapNum = 0xFF;
- objectEvent->mapGroup = 0xFF;
+ objectEvent->mapNum = MAP_NUM(UNDEFINED);
+ objectEvent->mapGroup = MAP_GROUP(UNDEFINED);
objectEvent->movementActionId = 0xFF;
}
@@ -8037,7 +8038,9 @@ static void CalcWhetherObjectIsOffscreen(struct ObjectEvent *objectEvent, struct
x2 = graphicsInfo->width + (s16)x;
y2 = graphicsInfo->height + (s16)y;
- if (gSaveBlock1Ptr->location.mapGroup == 1 && gSaveBlock1Ptr->location.mapNum == 4 && objectEvent->localId == 1)
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SSANNE_EXTERIOR)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SSANNE_EXTERIOR)
+ && objectEvent->localId == 1)
{
var = -32;
}
diff --git a/src/menu_helpers.c b/src/menu_helpers.c
index a64a4a0cd..11d26f204 100644
--- a/src/menu_helpers.c
+++ b/src/menu_helpers.c
@@ -10,6 +10,7 @@
#include "field_specials.h"
#include "constants/songs.h"
#include "constants/items.h"
+#include "constants/maps.h"
static EWRAM_DATA const struct YesNoFuncTable *gUnknown_20399C8 = NULL;
static EWRAM_DATA TaskFunc gUnknown_20399CC = NULL;
@@ -94,7 +95,8 @@ bool8 itemid_link_can_give_berry(u16 itemId)
{
if (itemId != ITEM_ENIGMA_BERRY)
return TRUE;
- else if (!gSaveBlock1Ptr->location.mapGroup && gSaveBlock1Ptr->location.mapNum == 1)
+ else if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRADE_CENTER)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRADE_CENTER))
return FALSE;
else if (InUnionRoom() != TRUE)
return TRUE;
diff --git a/src/overworld.c b/src/overworld.c
index cb5507b4c..fc54745a9 100644
--- a/src/overworld.c
+++ b/src/overworld.c
@@ -520,9 +520,9 @@ static void SetWarpData(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId
static bool32 IsDummyWarp(struct WarpData *warp)
{
- if (warp->mapGroup != -1)
+ if (warp->mapGroup != (s8)MAP_GROUP(UNDEFINED))
return FALSE;
- else if (warp->mapNum != -1)
+ else if (warp->mapNum != (s8)MAP_NUM(UNDEFINED))
return FALSE;
else if (warp->warpId != -1)
return FALSE;
@@ -895,7 +895,10 @@ bool8 sub_8055B38(u16 metatileBehavior)
{
if (MetatileBehavior_IsSurfable(metatileBehavior) != TRUE)
return FALSE;
- if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEAFOAM_ISLANDS_B3F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEAFOAM_ISLANDS_B3F)) || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEAFOAM_ISLANDS_B4F) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEAFOAM_ISLANDS_B4F)))
+ if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEAFOAM_ISLANDS_B3F)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEAFOAM_ISLANDS_B3F))
+ || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEAFOAM_ISLANDS_B4F)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEAFOAM_ISLANDS_B4F)))
return TRUE;
return FALSE;
}
diff --git a/src/roamer.c b/src/roamer.c
index 6367e9d43..f1f9a0743 100644
--- a/src/roamer.c
+++ b/src/roamer.c
@@ -5,53 +5,74 @@
#include "constants/maps.h"
#include "constants/region_map_sections.h"
-EWRAM_DATA u8 sLocationHistory[3][2] = {};
-EWRAM_DATA u8 sRoamerLocation[2] = {};
-
-#define saveRoamer (*(&gSaveBlock1Ptr->roamer))
+// Despite having a variable to track it, the roamer is
+// hard-coded to only ever be in map group 3
+#define ROAMER_MAP_GROUP 3
enum
{
- MAP_GRP = 0, // map group
- MAP_NUM = 1, // map number
+ MAP_GRP, // map group
+ MAP_NUM, // map number
};
-const u8 sRoamerLocations[][7] = {
- {MAP_NUM(ROUTE1), MAP_NUM(ROUTE2), MAP_NUM(ROUTE21_NORTH), MAP_NUM(ROUTE22), 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE2), MAP_NUM(ROUTE1), MAP_NUM(ROUTE3), MAP_NUM(ROUTE22), 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE3), MAP_NUM(ROUTE2), MAP_NUM(ROUTE4), 0xff, 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE4), MAP_NUM(ROUTE3), MAP_NUM(ROUTE5), MAP_NUM(ROUTE9), MAP_NUM(ROUTE24), 0xff, 0xff},
+#define ROAMER (&gSaveBlock1Ptr->roamer)
+EWRAM_DATA u8 sLocationHistory[3][2] = {};
+EWRAM_DATA u8 sRoamerLocation[2] = {};
+
+#define ___ MAP_NUM(UNDEFINED) // For empty spots in the location table
+
+// Note: There are two potential softlocks that can occur with this table if its maps are
+// changed in particular ways. They can be avoided by ensuring the following:
+// - There must be at least 2 location sets that start with a different map,
+// i.e. every location set cannot start with the same map. This is because of
+// the while loop in RoamerMoveToOtherLocationSet.
+// - Each location set must have at least 3 unique maps. This is because of
+// the while loop in RoamerMove. In this loop the first map in the set is
+// ignored, and an additional map is ignored if the roamer was there recently.
+// - Additionally, while not a softlock, it's worth noting that if for any
+// map in the location table there is not a location set that starts with
+// that map then the roamer will be significantly less likely to move away
+// from that map when it lands there.
+static const u8 sRoamerLocations[][7] = {
+ {MAP_NUM(ROUTE1), MAP_NUM(ROUTE2), MAP_NUM(ROUTE21_NORTH), MAP_NUM(ROUTE22), ___, ___, ___},
+ {MAP_NUM(ROUTE2), MAP_NUM(ROUTE1), MAP_NUM(ROUTE3), MAP_NUM(ROUTE22), ___, ___, ___},
+ {MAP_NUM(ROUTE3), MAP_NUM(ROUTE2), MAP_NUM(ROUTE4), ___, ___, ___, ___},
+ {MAP_NUM(ROUTE4), MAP_NUM(ROUTE3), MAP_NUM(ROUTE5), MAP_NUM(ROUTE9), MAP_NUM(ROUTE24), ___, ___},
{MAP_NUM(ROUTE5), MAP_NUM(ROUTE4), MAP_NUM(ROUTE6), MAP_NUM(ROUTE7), MAP_NUM(ROUTE8), MAP_NUM(ROUTE9), MAP_NUM(ROUTE24)},
- {MAP_NUM(ROUTE6), MAP_NUM(ROUTE5), MAP_NUM(ROUTE7), MAP_NUM(ROUTE8), MAP_NUM(ROUTE11), 0xff, 0xff},
- {MAP_NUM(ROUTE7), MAP_NUM(ROUTE5), MAP_NUM(ROUTE6), MAP_NUM(ROUTE8), MAP_NUM(ROUTE16), 0xff, 0xff},
- {MAP_NUM(ROUTE8), MAP_NUM(ROUTE5), MAP_NUM(ROUTE6), MAP_NUM(ROUTE7), MAP_NUM(ROUTE10), MAP_NUM(ROUTE12), 0xff},
- {MAP_NUM(ROUTE9), MAP_NUM(ROUTE4), MAP_NUM(ROUTE5), MAP_NUM(ROUTE10), MAP_NUM(ROUTE24), 0xff, 0xff},
- {MAP_NUM(ROUTE10), MAP_NUM(ROUTE8), MAP_NUM(ROUTE9), MAP_NUM(ROUTE12), 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE11), MAP_NUM(ROUTE6), MAP_NUM(ROUTE12), 0xff, 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE12), MAP_NUM(ROUTE10), MAP_NUM(ROUTE11), MAP_NUM(ROUTE13), 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE13), MAP_NUM(ROUTE12), MAP_NUM(ROUTE14), 0xff, 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE14), MAP_NUM(ROUTE13), MAP_NUM(ROUTE15), 0xff, 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE15), MAP_NUM(ROUTE14), MAP_NUM(ROUTE18), MAP_NUM(ROUTE19), 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE16), MAP_NUM(ROUTE7), MAP_NUM(ROUTE17), 0xff, 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE17), MAP_NUM(ROUTE16), MAP_NUM(ROUTE18), 0xff, 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE18), MAP_NUM(ROUTE15), MAP_NUM(ROUTE17), MAP_NUM(ROUTE19), 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE19), MAP_NUM(ROUTE15), MAP_NUM(ROUTE18), MAP_NUM(ROUTE20), 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE20), MAP_NUM(ROUTE19), MAP_NUM(ROUTE21_NORTH), 0xff, 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE21_NORTH), MAP_NUM(ROUTE1), MAP_NUM(ROUTE20), 0xff, 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE22), MAP_NUM(ROUTE1), MAP_NUM(ROUTE2), MAP_NUM(ROUTE23), 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE23), MAP_NUM(ROUTE22), MAP_NUM(ROUTE2), 0xff, 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE24), MAP_NUM(ROUTE4), MAP_NUM(ROUTE5), MAP_NUM(ROUTE9), 0xff, 0xff, 0xff},
- {MAP_NUM(ROUTE25), MAP_NUM(ROUTE24), MAP_NUM(ROUTE9), 0xff, 0xff, 0xff, 0xff},
- {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
+ {MAP_NUM(ROUTE6), MAP_NUM(ROUTE5), MAP_NUM(ROUTE7), MAP_NUM(ROUTE8), MAP_NUM(ROUTE11), ___, ___},
+ {MAP_NUM(ROUTE7), MAP_NUM(ROUTE5), MAP_NUM(ROUTE6), MAP_NUM(ROUTE8), MAP_NUM(ROUTE16), ___, ___},
+ {MAP_NUM(ROUTE8), MAP_NUM(ROUTE5), MAP_NUM(ROUTE6), MAP_NUM(ROUTE7), MAP_NUM(ROUTE10), MAP_NUM(ROUTE12), ___},
+ {MAP_NUM(ROUTE9), MAP_NUM(ROUTE4), MAP_NUM(ROUTE5), MAP_NUM(ROUTE10), MAP_NUM(ROUTE24), ___, ___},
+ {MAP_NUM(ROUTE10), MAP_NUM(ROUTE8), MAP_NUM(ROUTE9), MAP_NUM(ROUTE12), ___, ___, ___},
+ {MAP_NUM(ROUTE11), MAP_NUM(ROUTE6), MAP_NUM(ROUTE12), ___, ___, ___, ___},
+ {MAP_NUM(ROUTE12), MAP_NUM(ROUTE10), MAP_NUM(ROUTE11), MAP_NUM(ROUTE13), ___, ___, ___},
+ {MAP_NUM(ROUTE13), MAP_NUM(ROUTE12), MAP_NUM(ROUTE14), ___, ___, ___, ___},
+ {MAP_NUM(ROUTE14), MAP_NUM(ROUTE13), MAP_NUM(ROUTE15), ___, ___, ___, ___},
+ {MAP_NUM(ROUTE15), MAP_NUM(ROUTE14), MAP_NUM(ROUTE18), MAP_NUM(ROUTE19), ___, ___, ___},
+ {MAP_NUM(ROUTE16), MAP_NUM(ROUTE7), MAP_NUM(ROUTE17), ___, ___, ___, ___},
+ {MAP_NUM(ROUTE17), MAP_NUM(ROUTE16), MAP_NUM(ROUTE18), ___, ___, ___, ___},
+ {MAP_NUM(ROUTE18), MAP_NUM(ROUTE15), MAP_NUM(ROUTE17), MAP_NUM(ROUTE19), ___, ___, ___},
+ {MAP_NUM(ROUTE19), MAP_NUM(ROUTE15), MAP_NUM(ROUTE18), MAP_NUM(ROUTE20), ___, ___, ___},
+ {MAP_NUM(ROUTE20), MAP_NUM(ROUTE19), MAP_NUM(ROUTE21_NORTH), ___, ___, ___, ___},
+ {MAP_NUM(ROUTE21_NORTH), MAP_NUM(ROUTE1), MAP_NUM(ROUTE20), ___, ___, ___, ___},
+ {MAP_NUM(ROUTE22), MAP_NUM(ROUTE1), MAP_NUM(ROUTE2), MAP_NUM(ROUTE23), ___, ___, ___},
+ {MAP_NUM(ROUTE23), MAP_NUM(ROUTE22), MAP_NUM(ROUTE2), ___, ___, ___, ___},
+ {MAP_NUM(ROUTE24), MAP_NUM(ROUTE4), MAP_NUM(ROUTE5), MAP_NUM(ROUTE9), ___, ___, ___},
+ {MAP_NUM(ROUTE25), MAP_NUM(ROUTE24), MAP_NUM(ROUTE9), ___, ___, ___, ___},
+ {___, ___, ___, ___, ___, ___, ___}
};
+#undef ___
+#define NUM_LOCATION_SETS (ARRAY_COUNT(sRoamerLocations) - 1)
+#define NUM_LOCATIONS_PER_SET (ARRAY_COUNT(sRoamerLocations[0]))
+
void ClearRoamerData(void)
{
u32 i;
- gSaveBlock1Ptr->roamer = (struct Roamer){};
+ *ROAMER = (struct Roamer){};
sRoamerLocation[MAP_GRP] = 0;
sRoamerLocation[MAP_NUM] = 0;
- for (i = 0; i < 3; i++)
+ for (i = 0; i < ARRAY_COUNT(sLocationHistory); i++)
{
sLocationHistory[i][MAP_GRP] = 0;
sLocationHistory[i][MAP_NUM] = 0;
@@ -77,24 +98,23 @@ void ClearRoamerData(void)
void CreateInitialRoamerMon(void)
{
- struct Pokemon * tmpMon = &gEnemyParty[0];
- u16 roamerMon;
-
- CreateMon(tmpMon, (roamerMon = GetRoamerSpecies()), 50, 0x20, 0, 0, 0, 0);
- saveRoamer.species = roamerMon;
- saveRoamer.level = 50;
- saveRoamer.status = 0;
- saveRoamer.active = TRUE;
- saveRoamer.ivs = GetMonData(tmpMon, MON_DATA_IVS);
- saveRoamer.personality = GetMonData(tmpMon, MON_DATA_PERSONALITY);
- saveRoamer.hp = GetMonData(tmpMon, MON_DATA_MAX_HP);
- saveRoamer.cool = GetMonData(tmpMon, MON_DATA_COOL);
- saveRoamer.beauty = GetMonData(tmpMon, MON_DATA_BEAUTY);
- saveRoamer.cute = GetMonData(tmpMon, MON_DATA_CUTE);
- saveRoamer.smart = GetMonData(tmpMon, MON_DATA_SMART);
- saveRoamer.tough = GetMonData(tmpMon, MON_DATA_TOUGH);
- sRoamerLocation[MAP_GRP] = 3;
- sRoamerLocation[MAP_NUM] = sRoamerLocations[Random() % (NELEMS(sRoamerLocations) - 1)][0];
+ struct Pokemon * mon = &gEnemyParty[0];
+ u16 species = GetRoamerSpecies();
+ CreateMon(mon, species, 50, USE_RANDOM_IVS, FALSE, 0, OT_ID_PLAYER_ID, 0);
+ ROAMER->species = species;
+ ROAMER->level = 50;
+ ROAMER->status = 0;
+ ROAMER->active = TRUE;
+ ROAMER->ivs = GetMonData(mon, MON_DATA_IVS);
+ ROAMER->personality = GetMonData(mon, MON_DATA_PERSONALITY);
+ ROAMER->hp = GetMonData(mon, MON_DATA_MAX_HP);
+ ROAMER->cool = GetMonData(mon, MON_DATA_COOL);
+ ROAMER->beauty = GetMonData(mon, MON_DATA_BEAUTY);
+ ROAMER->cute = GetMonData(mon, MON_DATA_CUTE);
+ ROAMER->smart = GetMonData(mon, MON_DATA_SMART);
+ ROAMER->tough = GetMonData(mon, MON_DATA_TOUGH);
+ sRoamerLocation[MAP_GRP] = ROAMER_MAP_GROUP;
+ sRoamerLocation[MAP_NUM] = sRoamerLocations[Random() % NUM_LOCATION_SETS][0];
}
void InitRoamer(void)
@@ -107,8 +127,10 @@ void UpdateLocationHistoryForRoamer(void)
{
sLocationHistory[2][MAP_GRP] = sLocationHistory[1][MAP_GRP];
sLocationHistory[2][MAP_NUM] = sLocationHistory[1][MAP_NUM];
+
sLocationHistory[1][MAP_GRP] = sLocationHistory[0][MAP_GRP];
sLocationHistory[1][MAP_NUM] = sLocationHistory[0][MAP_NUM];
+
sLocationHistory[0][MAP_GRP] = gSaveBlock1Ptr->location.mapGroup;
sLocationHistory[0][MAP_NUM] = gSaveBlock1Ptr->location.mapNum;
}
@@ -116,16 +138,17 @@ void UpdateLocationHistoryForRoamer(void)
void RoamerMoveToOtherLocationSet(void)
{
u8 mapNum = 0;
- struct Roamer *roamer = &saveRoamer;
- if (!roamer->active)
+ if (!ROAMER->active)
return;
- sRoamerLocation[MAP_GRP] = 3;
+ sRoamerLocation[MAP_GRP] = ROAMER_MAP_GROUP;
+ // Choose a location set that starts with a map
+ // different from the roamer's current map
while (1)
{
- mapNum = sRoamerLocations[Random() % (NELEMS(sRoamerLocations) - 1)][0];
+ mapNum = sRoamerLocations[Random() % NUM_LOCATION_SETS][0];
if (sRoamerLocation[MAP_NUM] != mapNum)
{
sRoamerLocation[MAP_NUM] = mapNum;
@@ -145,20 +168,23 @@ void RoamerMove(void)
}
else
{
- struct Roamer *roamer = &saveRoamer;
-
- if (!roamer->active)
+ if (!ROAMER->active)
return;
- while (locSet < (NELEMS(sRoamerLocations) - 1))
+ while (locSet < NUM_LOCATION_SETS)
{
+ // Find the location set that starts with the roamer's current map
if (sRoamerLocation[MAP_NUM] == sRoamerLocations[locSet][0])
{
u8 mapNum;
while (1)
{
- mapNum = sRoamerLocations[locSet][(Random() % 6) + 1];
- if (!(sLocationHistory[2][MAP_GRP] == 3 && sLocationHistory[2][MAP_NUM] == mapNum) && mapNum != 0xFF)
+ // Choose a new map (excluding the first) within this set
+ // Also exclude a map if the roamer was there 2 moves ago
+ mapNum = sRoamerLocations[locSet][(Random() % (NUM_LOCATIONS_PER_SET - 1)) + 1];
+ if (!(sLocationHistory[2][MAP_GRP] == ROAMER_MAP_GROUP
+ && sLocationHistory[2][MAP_NUM] == mapNum)
+ && mapNum != MAP_NUM(UNDEFINED))
break;
}
sRoamerLocation[MAP_NUM] = mapNum;
@@ -171,9 +197,7 @@ void RoamerMove(void)
bool8 IsRoamerAt(u8 mapGroup, u8 mapNum)
{
- struct Roamer *roamer = &saveRoamer;
-
- if (roamer->active && mapGroup == sRoamerLocation[MAP_GRP] && mapNum == sRoamerLocation[MAP_NUM])
+ if (ROAMER->active && mapGroup == sRoamerLocation[MAP_GRP] && mapNum == sRoamerLocation[MAP_NUM])
return TRUE;
else
return FALSE;
@@ -181,20 +205,24 @@ bool8 IsRoamerAt(u8 mapGroup, u8 mapNum)
void CreateRoamerMonInstance(void)
{
- struct Pokemon *mon;
- struct Roamer *roamer;
-
- mon = &gEnemyParty[0];
+ u32 status;
+ struct Pokemon *mon = &gEnemyParty[0];
ZeroEnemyPartyMons();
- roamer = &saveRoamer;
- CreateMonWithIVsPersonality(mon, roamer->species, roamer->level, roamer->ivs, roamer->personality);
- SetMonData(mon, MON_DATA_STATUS, &gSaveBlock1Ptr->roamer.status);
- SetMonData(mon, MON_DATA_HP, &gSaveBlock1Ptr->roamer.hp);
- SetMonData(mon, MON_DATA_COOL, &gSaveBlock1Ptr->roamer.cool);
- SetMonData(mon, MON_DATA_BEAUTY, &gSaveBlock1Ptr->roamer.beauty);
- SetMonData(mon, MON_DATA_CUTE, &gSaveBlock1Ptr->roamer.cute);
- SetMonData(mon, MON_DATA_SMART, &gSaveBlock1Ptr->roamer.smart);
- SetMonData(mon, MON_DATA_TOUGH, &gSaveBlock1Ptr->roamer.tough);
+ CreateMonWithIVsPersonality(mon, ROAMER->species, ROAMER->level, ROAMER->ivs, ROAMER->personality);
+// The roamer's status field is u8, but SetMonData expects status to be u32, so will set the roamer's status
+// using the status field and the following 3 bytes (cool, beauty, and cute).
+#ifdef BUGFIX
+ status = ROAMER->status;
+ SetMonData(mon, MON_DATA_STATUS, &status);
+#else
+ SetMonData(mon, MON_DATA_STATUS, &ROAMER->status);
+#endif
+ SetMonData(mon, MON_DATA_HP, &ROAMER->hp);
+ SetMonData(mon, MON_DATA_COOL, &ROAMER->cool);
+ SetMonData(mon, MON_DATA_BEAUTY, &ROAMER->beauty);
+ SetMonData(mon, MON_DATA_CUTE, &ROAMER->cute);
+ SetMonData(mon, MON_DATA_SMART, &ROAMER->smart);
+ SetMonData(mon, MON_DATA_TOUGH, &ROAMER->tough);
}
bool8 TryStartRoamerEncounter(void)
@@ -211,16 +239,15 @@ bool8 TryStartRoamerEncounter(void)
}
void UpdateRoamerHPStatus(struct Pokemon *mon)
{
- saveRoamer.hp = GetMonData(mon, MON_DATA_HP);
- saveRoamer.status = GetMonData(mon, MON_DATA_STATUS);
+ ROAMER->hp = GetMonData(mon, MON_DATA_HP);
+ ROAMER->status = GetMonData(mon, MON_DATA_STATUS);
RoamerMoveToOtherLocationSet();
}
void SetRoamerInactive(void)
{
- struct Roamer *roamer = &saveRoamer;
- roamer->active = FALSE;
+ ROAMER->active = FALSE;
}
void GetRoamerLocation(u8 *mapGroup, u8 *mapNum)
@@ -231,8 +258,7 @@ void GetRoamerLocation(u8 *mapGroup, u8 *mapNum)
u16 GetRoamerLocationMapSectionId(void)
{
- struct Roamer *roamer = &saveRoamer;
- if (!saveRoamer.active)
+ if (!ROAMER->active)
return MAPSEC_NONE;
return Overworld_GetMapHeaderByGroupAndId(sRoamerLocation[MAP_GRP], sRoamerLocation[MAP_NUM])->regionMapSectionId;
}
diff --git a/src/script.c b/src/script.c
index c45c6744c..23973be9c 100644
--- a/src/script.c
+++ b/src/script.c
@@ -2,6 +2,7 @@
#include "script.h"
#include "event_data.h"
#include "quest_log.h"
+#include "constants/maps.h"
#define RAM_SCRIPT_MAGIC 51
#define SCRIPT_STACK_SIZE 20
@@ -511,9 +512,9 @@ bool32 ValidateRamScript(void)
struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data;
if (scriptData->magic != RAM_SCRIPT_MAGIC)
return FALSE;
- if (scriptData->mapGroup != 0xFF)
+ if (scriptData->mapGroup != MAP_GROUP(UNDEFINED))
return FALSE;
- if (scriptData->mapNum != 0xFF)
+ if (scriptData->mapNum != MAP_NUM(UNDEFINED))
return FALSE;
if (scriptData->objectId != 0xFF)
return FALSE;
@@ -529,9 +530,9 @@ u8 *sub_8069E48(void)
return NULL;
if (scriptData->magic != RAM_SCRIPT_MAGIC)
return NULL;
- if (scriptData->mapGroup != 0xFF)
+ if (scriptData->mapGroup != MAP_GROUP(UNDEFINED))
return NULL;
- if (scriptData->mapNum != 0xFF)
+ if (scriptData->mapNum != MAP_NUM(UNDEFINED))
return NULL;
if (scriptData->objectId != 0xFF)
return NULL;
diff --git a/src/wild_encounter.c b/src/wild_encounter.c
index d848d0ce5..b513ad47e 100644
--- a/src/wild_encounter.c
+++ b/src/wild_encounter.c
@@ -182,7 +182,7 @@ static u16 GetCurrentMapWildMonHeaderId(void)
for (i = 0; ; i++)
{
const struct WildPokemonHeader * wildHeader = &gWildMonHeaders[i];
- if (wildHeader->mapGroup == 0xFF)
+ if (wildHeader->mapGroup == MAP_GROUP(UNDEFINED))
break;
if (gWildMonHeaders[i].mapGroup == gSaveBlock1Ptr->location.mapGroup &&
diff --git a/src/wild_pokemon_area.c b/src/wild_pokemon_area.c
index 0cb4a10b1..c93ae36b6 100644
--- a/src/wild_pokemon_area.c
+++ b/src/wild_pokemon_area.c
@@ -6,6 +6,7 @@
#include "overworld.h"
#include "pokedex_area_markers.h"
#include "constants/region_map_sections.h"
+#include "constants/maps.h"
struct SeviiDexArea
{
@@ -181,7 +182,7 @@ s32 BuildPokedexAreaSubspriteBuffer(u16 species, struct Subsprite * subsprites)
alteringCaveNum = VarGet(VAR_ALTERING_CAVE_WILD_SET);
if (alteringCaveNum > 8)
alteringCaveNum = 0;
- for (i = 0, areaCount = 0; gWildMonHeaders[i].mapGroup != 0xFF; i++)
+ for (i = 0, areaCount = 0; gWildMonHeaders[i].mapGroup != MAP_GROUP(UNDEFINED); i++)
{
mapSecId = GetMapSecIdFromWildMonHeader(&gWildMonHeaders[i]);
if (mapSecId == MAPSEC_ALTERING_CAVE)