diff options
author | GriffinR <griffin.g.richards@gmail.com> | 2022-02-14 21:17:44 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-14 21:17:44 -0500 |
commit | 759f373d3153afb0e9dcf5050a700aeca036a919 (patch) | |
tree | b43e8d72d1886eb1c38dadd67113bec77ef41a26 | |
parent | 8d85ff1683437897cb0c06dd84fa2d927f560090 (diff) | |
parent | 59695b82210cb2c95c10b52efc1a88e18c67dea9 (diff) |
Merge pull request #488 from GriffinRichards/map-constants
Sync roamer.c, add missing map constant usage
-rw-r--r-- | include/constants/pokemon.h | 8 | ||||
-rw-r--r-- | src/battle_setup.c | 8 | ||||
-rw-r--r-- | src/event_object_movement.c | 9 | ||||
-rw-r--r-- | src/menu_helpers.c | 4 | ||||
-rw-r--r-- | src/overworld.c | 9 | ||||
-rw-r--r-- | src/roamer.c | 194 | ||||
-rw-r--r-- | src/script.c | 9 | ||||
-rw-r--r-- | src/wild_encounter.c | 2 | ||||
-rw-r--r-- | src/wild_pokemon_area.c | 3 |
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) |