diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index 7ab2c12e4..520f06738 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -83,21 +83,35 @@ struct BackupMapLayout u16 *map; }; +#define OBJ_KIND_NORMAL 0 +#define OBJ_KIND_CLONE 255 + struct ObjectEventTemplate { - /*0x00*/ u8 localId; - /*0x01*/ u8 graphicsId; - /*0x02*/ u8 inConnection; - /*0x04*/ s16 x; - /*0x06*/ s16 y; - /*0x08*/ u8 elevation; - /*0x09*/ u8 movementType; - /*0x0A*/ u16 movementRangeX:4; - u16 movementRangeY:4; - /*0x0C*/ u16 trainerType; - /*0x0E*/ u16 trainerRange_berryTreeId; - /*0x10*/ const u8 *script; - /*0x14*/ u16 flagId; + u8 localId; + u8 graphicsId; + u8 kind; // The "kind" field determines how to access objUnion union below. + s16 x, y; + union { + struct { + u8 elevation; + u8 movementType; + u16 movementRangeX:4; + u16 movementRangeY:4; + u16 trainerType; + u16 trainerRange_berryTreeId; + } normal; + struct { + u8 targetLocalId; + u8 padding1; + u16 padding2:4; + u16 padding3:4; + u16 targetMapNum; + u16 targetMapGroup; + } clone; + } objUnion; + const u8 *script; + u16 flagId; }; /*size = 0x18*/ struct WarpEvent diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 52fb0c078..2da251912 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1322,7 +1322,7 @@ static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, const struct MapHeader *mapHeader; u8 objectEventId; u8 var0; - u8 elevation; + u8 localId; s16 x; s16 y; s16 x2; @@ -1331,24 +1331,24 @@ static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, s16 y3; var0 = 0; - elevation = 0; + localId = 0; x2 = 0; y2 = 0; x3 = 0; y3 = 0; - if (template->inConnection == 0xFF) + if (template->kind == OBJ_KIND_CLONE) { var0 = 1; - elevation = template->elevation; - mapNum = template->trainerType; - mapGroup = template->trainerRange_berryTreeId & 0xFF; + localId = template->objUnion.clone.targetLocalId; + mapNum = template->objUnion.clone.targetMapNum; + mapGroup = template->objUnion.clone.targetMapGroup & 0xFF; x2 = template->x; y2 = template->y; x3 = template->x; y3 = template->y; mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); - template = &(mapHeader->events->objectEvents[elevation - 1]); + template = &(mapHeader->events->objectEvents[localId - 1]); } if (GetAvailableObjectEventId(template->localId, mapNum, mapGroup, &objectEventId) || !sub_805E238(template, var0, x3, y3)) @@ -1368,7 +1368,7 @@ static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, objectEvent->active = TRUE; objectEvent->triggerGroundEffectsOnMove = TRUE; objectEvent->graphicsId = template->graphicsId; - objectEvent->movementType = template->movementType; + objectEvent->movementType = template->objUnion.normal.movementType; objectEvent->localId = template->localId; objectEvent->mapNum = mapNum; objectEvent->mapGroup = mapGroup; @@ -1378,14 +1378,14 @@ static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, objectEvent->currentCoords.y = y; objectEvent->previousCoords.x = x; objectEvent->previousCoords.y = y; - objectEvent->currentElevation = template->elevation; - objectEvent->previousElevation = template->elevation; - objectEvent->rangeX = template->movementRangeX; - objectEvent->rangeY = template->movementRangeY; - objectEvent->trainerType = template->trainerType; - objectEvent->trainerRange_berryTreeId = template->trainerRange_berryTreeId; + objectEvent->currentElevation = template->objUnion.normal.elevation; + objectEvent->previousElevation = template->objUnion.normal.elevation; + objectEvent->rangeX = template->objUnion.normal.movementRangeX; + objectEvent->rangeY = template->objUnion.normal.movementRangeY; + objectEvent->trainerType = template->objUnion.normal.trainerType; + objectEvent->trainerRange_berryTreeId = template->objUnion.normal.trainerRange_berryTreeId; objectEvent->mapNum = mapNum; // oops (yes this is required for matching) - objectEvent->previousMovementDirection = gInitialMovementTypeFacingDirections[template->movementType]; + objectEvent->previousMovementDirection = gInitialMovementTypeFacingDirections[template->objUnion.normal.movementType]; SetObjectEventDirection(objectEvent, objectEvent->previousMovementDirection); SetObjectEventDynamicGraphicsId(objectEvent); if (gRangedMovementTypes[objectEvent->movementType]) @@ -1675,15 +1675,15 @@ int SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 y -= 7; objectEventTemplate.localId = localId; objectEventTemplate.graphicsId = graphicsId; - objectEventTemplate.inConnection = 0; + objectEventTemplate.kind = OBJ_KIND_NORMAL; objectEventTemplate.x = x; objectEventTemplate.y = y; - objectEventTemplate.elevation = z; - objectEventTemplate.movementType = movementBehavior; - objectEventTemplate.movementRangeX = 0; - objectEventTemplate.movementRangeY = 0; - objectEventTemplate.trainerType = 0; - objectEventTemplate.trainerRange_berryTreeId = 0; + objectEventTemplate.objUnion.normal.elevation = z; + objectEventTemplate.objUnion.normal.movementType = movementBehavior; + objectEventTemplate.objUnion.normal.movementRangeX = 0; + objectEventTemplate.objUnion.normal.movementRangeY = 0; + objectEventTemplate.objUnion.normal.trainerType = 0; + objectEventTemplate.objUnion.normal.trainerRange_berryTreeId = 0; return SpawnSpecialObjectEvent(&objectEventTemplate); } @@ -1729,7 +1729,7 @@ static void MakeObjectTemplateFromObjectEventGraphicsInfoWithCallbackIndex(u16 g static void MakeObjectTemplateFromObjectEventTemplate(struct ObjectEventTemplate *objectEventTemplate, struct SpriteTemplate *spriteTemplate, const struct SubspriteTable **subspriteTables) { - MakeObjectTemplateFromObjectEventGraphicsInfoWithCallbackIndex(objectEventTemplate->graphicsId, objectEventTemplate->movementType, spriteTemplate, subspriteTables); + MakeObjectTemplateFromObjectEventGraphicsInfoWithCallbackIndex(objectEventTemplate->graphicsId, objectEventTemplate->objUnion.normal.movementType, spriteTemplate, subspriteTables); } u8 AddPseudoObjectEvent(u16 graphicsId, SpriteCallback callback, s16 x, s16 y, u8 subpriority) @@ -2588,7 +2588,7 @@ u8 sub_805FC9C(u8 localId, u8 mapNum, u8 mapGroup) u16 GetObjectEventFlagByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup) { - return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->trainerType; + return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->objUnion.normal.trainerType; } u8 sub_808F0BC(u8 objectEventId) @@ -2683,7 +2683,7 @@ void OverrideMovementTypeForObjectEvent(const struct ObjectEvent *objectEvent, u objectEventTemplate = GetBaseTemplateForObjectEvent(objectEvent); if (objectEventTemplate != NULL) { - objectEventTemplate->movementType = movementType; + objectEventTemplate->objUnion.normal.movementType = movementType; } } diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 16426cdc4..059ec1094 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -1291,12 +1291,12 @@ void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) playerObjEventTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_GFX_NORMAL, gender); playerObjEventTemplate.x = x - 7; playerObjEventTemplate.y = y - 7; - playerObjEventTemplate.elevation = 0; - playerObjEventTemplate.movementType = MOVEMENT_TYPE_PLAYER; - playerObjEventTemplate.movementRangeX = 0; - playerObjEventTemplate.movementRangeY = 0; - playerObjEventTemplate.trainerType = 0; - playerObjEventTemplate.trainerRange_berryTreeId = 0; + playerObjEventTemplate.objUnion.normal.elevation = 0; + playerObjEventTemplate.objUnion.normal.movementType = MOVEMENT_TYPE_PLAYER; + playerObjEventTemplate.objUnion.normal.movementRangeX = 0; + playerObjEventTemplate.objUnion.normal.movementRangeY = 0; + playerObjEventTemplate.objUnion.normal.trainerType = 0; + playerObjEventTemplate.objUnion.normal.trainerRange_berryTreeId = 0; playerObjEventTemplate.script = NULL; playerObjEventTemplate.flagId = 0; objectEventId = SpawnSpecialObjectEvent(&playerObjEventTemplate); diff --git a/src/overworld.c b/src/overworld.c index cb5507b4c..89bf5d785 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -403,22 +403,22 @@ static void LoadObjEventTemplatesFromHeader(void) u8 i, j; for (i = 0, j = 0; i < gMapHeader.events->objectEventCount; i++) { - if (gMapHeader.events->objectEvents[i].inConnection == 0xFF) + if (gMapHeader.events->objectEvents[i].kind == OBJ_KIND_CLONE) { // load "in_connection" object from the connecting map - u8 localId = gMapHeader.events->objectEvents[i].elevation; - u8 mapNum = gMapHeader.events->objectEvents[i].trainerType; - u8 mapGroup = gMapHeader.events->objectEvents[i].trainerRange_berryTreeId; + u8 localId = gMapHeader.events->objectEvents[i].objUnion.clone.targetLocalId; + u8 mapNum = gMapHeader.events->objectEvents[i].objUnion.clone.targetMapNum; + u8 mapGroup = gMapHeader.events->objectEvents[i].objUnion.clone.targetMapGroup; const struct MapHeader * connectionMap = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum); gSaveBlock1Ptr->objectEventTemplates[j] = connectionMap->events->objectEvents[localId - 1]; gSaveBlock1Ptr->objectEventTemplates[j].localId = gMapHeader.events->objectEvents[i].localId; gSaveBlock1Ptr->objectEventTemplates[j].x = gMapHeader.events->objectEvents[i].x; gSaveBlock1Ptr->objectEventTemplates[j].y = gMapHeader.events->objectEvents[i].y; - gSaveBlock1Ptr->objectEventTemplates[j].elevation = localId; - gSaveBlock1Ptr->objectEventTemplates[j].trainerType = mapNum; - gSaveBlock1Ptr->objectEventTemplates[j].trainerRange_berryTreeId = mapGroup; - gSaveBlock1Ptr->objectEventTemplates[j].inConnection = 0xFF; + gSaveBlock1Ptr->objectEventTemplates[j].objUnion.clone.targetLocalId = localId; + gSaveBlock1Ptr->objectEventTemplates[j].objUnion.clone.targetMapNum = mapNum; + gSaveBlock1Ptr->objectEventTemplates[j].objUnion.clone.targetMapGroup = mapGroup; + gSaveBlock1Ptr->objectEventTemplates[j].kind = OBJ_KIND_CLONE; j++; } else @@ -466,7 +466,7 @@ void Overworld_SetObjEventTemplateMovementType(u8 localId, u8 movementType) struct ObjectEventTemplate *objectEventTemplate = &savObjTemplates[i]; if (objectEventTemplate->localId == localId) { - objectEventTemplate->movementType = movementType; + objectEventTemplate->objUnion.normal.movementType = movementType; return; } } diff --git a/src/quest_log.c b/src/quest_log.c index 0032872fd..4f7c5866f 100644 --- a/src/quest_log.c +++ b/src/quest_log.c @@ -335,8 +335,8 @@ static void SetNPCInitialCoordsAtScene(u8 sceneNum) questLog->npcData[i].y = (u8)gSaveBlock1Ptr->objectEventTemplates[i].y; questLog->npcData[i].negy = FALSE; } - questLog->npcData[i].elevation = gSaveBlock1Ptr->objectEventTemplates[i].elevation; - questLog->npcData[i].movementType = gSaveBlock1Ptr->objectEventTemplates[i].movementType; + questLog->npcData[i].elevation = gSaveBlock1Ptr->objectEventTemplates[i].objUnion.normal.elevation; + questLog->npcData[i].movementType = gSaveBlock1Ptr->objectEventTemplates[i].objUnion.normal.movementType; } } @@ -525,8 +525,8 @@ static void QuestLogPlaybackSetObjectEventTemplates(u8 sceneNum) gSaveBlock1Ptr->objectEventTemplates[i].y = -(u8)questLog->npcData[i].y; else gSaveBlock1Ptr->objectEventTemplates[i].y = questLog->npcData[i].y; - gSaveBlock1Ptr->objectEventTemplates[i].elevation = questLog->npcData[i].elevation; - gSaveBlock1Ptr->objectEventTemplates[i].movementType = questLog->npcData[i].movementType; + gSaveBlock1Ptr->objectEventTemplates[i].objUnion.normal.elevation = questLog->npcData[i].elevation; + gSaveBlock1Ptr->objectEventTemplates[i].objUnion.normal.movementType = questLog->npcData[i].movementType; } SetSav1ObjectEventsFromQuestLog(questLog, gSaveBlock1Ptr->objectEventTemplates); diff --git a/src/quest_log_objects.c b/src/quest_log_objects.c index 47d328405..27f32b450 100644 --- a/src/quest_log_objects.c +++ b/src/quest_log_objects.c @@ -93,8 +93,8 @@ void SetSav1ObjectEventsFromQuestLog(const struct QuestLog * questLog, const str { gObjectEvents[i].initialCoords.x = templates[j].x + 7; gObjectEvents[i].initialCoords.y = templates[j].y + 7; - gObjectEvents[i].rangeX = templates[j].movementRangeX; - gObjectEvents[i].rangeY = templates[j].movementRangeY; + gObjectEvents[i].rangeX = templates[j].objUnion.normal.movementRangeX; + gObjectEvents[i].rangeY = templates[j].objUnion.normal.movementRangeY; } } diff --git a/src/vs_seeker.c b/src/vs_seeker.c index 295976dd8..91db509f3 100644 --- a/src/vs_seeker.c +++ b/src/vs_seeker.c @@ -639,12 +639,12 @@ void VsSeekerResetObjectMovementAfterChargeComplete(void) for (i = 0; i < gMapHeader.events->objectEventCount; i++) { if (( - templates[i].trainerType == TRAINER_TYPE_NORMAL - || templates[i].trainerType == TRAINER_TYPE_BURIED + templates[i].objUnion.normal.trainerType == TRAINER_TYPE_NORMAL + || templates[i].objUnion.normal.trainerType == TRAINER_TYPE_BURIED ) && ( - templates[i].movementType == MOVEMENT_TYPE_VS_SEEKER_4D - || templates[i].movementType == MOVEMENT_TYPE_VS_SEEKER_4E - || templates[i].movementType == MOVEMENT_TYPE_VS_SEEKER_4F + templates[i].objUnion.normal.movementType == MOVEMENT_TYPE_VS_SEEKER_4D + || templates[i].objUnion.normal.movementType == MOVEMENT_TYPE_VS_SEEKER_4E + || templates[i].objUnion.normal.movementType == MOVEMENT_TYPE_VS_SEEKER_4F )) { movementType = GetRandomFaceDirectionMovementType(); @@ -654,7 +654,7 @@ void VsSeekerResetObjectMovementAfterChargeComplete(void) { SetTrainerMovementType(objectEvent, movementType); } - templates[i].movementType = movementType; + templates[i].objUnion.normal.movementType = movementType; } } } @@ -808,7 +808,7 @@ static void GatherNearbyTrainerInfo(void) for (objectEventIdx = 0; objectEventIdx < gMapHeader.events->objectEventCount; objectEventIdx++) { - if (templates[objectEventIdx].trainerType == 1 || templates[objectEventIdx].trainerType == 3) + if (templates[objectEventIdx].objUnion.normal.trainerType == 1 || templates[objectEventIdx].objUnion.normal.trainerType == 3) { sVsSeeker->trainerInfo[vsSeekerObjectIdx].script = templates[objectEventIdx].script; sVsSeeker->trainerInfo[vsSeekerObjectIdx].trainerIdx = GetTrainerFlagFromScript(templates[objectEventIdx].script); @@ -942,7 +942,9 @@ void ClearRematchStateByTrainerId(void) for (i = 0; i < gMapHeader.events->objectEventCount; i++) { - if ((objectEventTemplates[i].trainerType == TRAINER_TYPE_NORMAL || objectEventTemplates[i].trainerType == TRAINER_TYPE_BURIED) && vsSeekerDataIdx == LookupVsSeekerOpponentInArray(sVsSeekerData, GetTrainerFlagFromScript(objectEventTemplates[i].script))) + if ((objectEventTemplates[i].objUnion.normal.trainerType == TRAINER_TYPE_NORMAL + || objectEventTemplates[i].objUnion.normal.trainerType == TRAINER_TYPE_BURIED) + && vsSeekerDataIdx == LookupVsSeekerOpponentInArray(sVsSeekerData, GetTrainerFlagFromScript(objectEventTemplates[i].script))) { struct ObjectEvent *objectEvent;