Add union for clone objects

This commit is contained in:
GriffinR
2022-02-05 13:42:46 -05:00
parent bef2668d8b
commit dd5f6ccd3b
7 changed files with 83 additions and 67 deletions
+27 -13
View File
@@ -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
+25 -25
View File
@@ -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;
}
}
+6 -6
View File
@@ -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);
+9 -9
View File
@@ -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;
}
}
+4 -4
View File
@@ -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);
+2 -2
View File
@@ -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;
}
}
+10 -8
View File
@@ -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;