Merge pull request #484 from GriffinRichards/clone-union
Separate connection clone objects from normal objects
This commit is contained in:
+25
-25
@@ -1299,7 +1299,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;
|
||||
@@ -1308,24 +1308,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))
|
||||
@@ -1345,7 +1345,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;
|
||||
@@ -1355,14 +1355,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])
|
||||
@@ -1652,15 +1652,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 = TRAINER_TYPE_NONE;
|
||||
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 = TRAINER_TYPE_NONE;
|
||||
objectEventTemplate.objUnion.normal.trainerRange_berryTreeId = 0;
|
||||
return SpawnSpecialObjectEvent(&objectEventTemplate);
|
||||
}
|
||||
|
||||
@@ -1706,7 +1706,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)
|
||||
@@ -2569,7 +2569,7 @@ u16 GetBoulderRevealFlagByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
|
||||
{
|
||||
// Pushable boulder object events store the flag to reveal the boulder
|
||||
// on the floor below in their trainer type field.
|
||||
return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->trainerType;
|
||||
return GetObjectEventTemplateByLocalIdAndMap(localId, mapNum, mapGroup)->objUnion.normal.trainerType;
|
||||
}
|
||||
|
||||
// Unused
|
||||
@@ -2666,7 +2666,7 @@ void OverrideMovementTypeForObjectEvent(const struct ObjectEvent *objectEvent, u
|
||||
objectEventTemplate = GetBaseTemplateForObjectEvent(objectEvent);
|
||||
if (objectEventTemplate != NULL)
|
||||
{
|
||||
objectEventTemplate->movementType = movementType;
|
||||
objectEventTemplate->objUnion.normal.movementType = movementType;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -968,7 +968,7 @@ static void SetupWarp(struct MapHeader *unused, s8 warpEventId, struct MapPositi
|
||||
|
||||
warpEvent = &gMapHeader.events->warps[warpEventId];
|
||||
|
||||
if (warpEvent->mapNum == MAP_NUM(NONE))
|
||||
if (warpEvent->mapNum == MAP_NUM(DYNAMIC))
|
||||
{
|
||||
SetWarpDestinationToDynamicWarp(warpEvent->warpId);
|
||||
}
|
||||
@@ -979,7 +979,7 @@ static void SetupWarp(struct MapHeader *unused, s8 warpEventId, struct MapPositi
|
||||
SetWarpDestinationToMapWarp(warpEvent->mapGroup, warpEvent->mapNum, warpEvent->warpId);
|
||||
UpdateEscapeWarp(position->x, position->y);
|
||||
mapHeader = Overworld_GetMapHeaderByGroupAndId(warpEvent->mapGroup, warpEvent->mapNum);
|
||||
if (mapHeader->events->warps[warpEvent->warpId].mapNum == MAP_NUM(NONE))
|
||||
if (mapHeader->events->warps[warpEvent->warpId].mapNum == MAP_NUM(DYNAMIC))
|
||||
SetDynamicWarp(mapHeader->events->warps[warpEventId].warpId, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, warpEventId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1294,12 +1294,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 = TRAINER_TYPE_NONE;
|
||||
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 = TRAINER_TYPE_NONE;
|
||||
playerObjEventTemplate.objUnion.normal.trainerRange_berryTreeId = 0;
|
||||
playerObjEventTemplate.script = NULL;
|
||||
playerObjEventTemplate.flagId = 0;
|
||||
objectEventId = SpawnSpecialObjectEvent(&playerObjEventTemplate);
|
||||
|
||||
+11
-10
@@ -48,6 +48,7 @@
|
||||
#include "vs_seeker.h"
|
||||
#include "wild_encounter.h"
|
||||
#include "constants/cable_club.h"
|
||||
#include "constants/event_objects.h"
|
||||
#include "constants/maps.h"
|
||||
#include "constants/region_map_sections.h"
|
||||
#include "constants/songs.h"
|
||||
@@ -401,22 +402,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;
|
||||
// load target object from the connecting map
|
||||
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
|
||||
@@ -464,7 +465,7 @@ void 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
@@ -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);
|
||||
|
||||
@@ -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
@@ -638,11 +638,11 @@ 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].movementType == MOVEMENT_TYPE_RAISE_HAND_AND_STOP
|
||||
|| templates[i].movementType == MOVEMENT_TYPE_RAISE_HAND_AND_JUMP
|
||||
|| templates[i].movementType == MOVEMENT_TYPE_RAISE_HAND_AND_SWIM))
|
||||
if ((templates[i].objUnion.normal.trainerType == TRAINER_TYPE_NORMAL
|
||||
|| templates[i].objUnion.normal.trainerType == TRAINER_TYPE_BURIED)
|
||||
&& (templates[i].objUnion.normal.movementType == MOVEMENT_TYPE_RAISE_HAND_AND_STOP
|
||||
|| templates[i].objUnion.normal.movementType == MOVEMENT_TYPE_RAISE_HAND_AND_JUMP
|
||||
|| templates[i].objUnion.normal.movementType == MOVEMENT_TYPE_RAISE_HAND_AND_SWIM))
|
||||
{
|
||||
movementType = GetRandomFaceDirectionMovementType();
|
||||
TryGetObjectEventIdByLocalIdAndMap(templates[i].localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objEventId);
|
||||
@@ -651,7 +651,7 @@ void VsSeekerResetObjectMovementAfterChargeComplete(void)
|
||||
{
|
||||
SetTrainerMovementType(objectEvent, movementType);
|
||||
}
|
||||
templates[i].movementType = movementType;
|
||||
templates[i].objUnion.normal.movementType = movementType;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -807,7 +807,7 @@ static void GatherNearbyTrainerInfo(void)
|
||||
|
||||
for (objectEventIdx = 0; objectEventIdx < gMapHeader.events->objectEventCount; objectEventIdx++)
|
||||
{
|
||||
if (templates[objectEventIdx].trainerType == TRAINER_TYPE_NORMAL || templates[objectEventIdx].trainerType == TRAINER_TYPE_BURIED)
|
||||
if (templates[objectEventIdx].objUnion.normal.trainerType == TRAINER_TYPE_NORMAL || templates[objectEventIdx].objUnion.normal.trainerType == TRAINER_TYPE_BURIED)
|
||||
{
|
||||
sVsSeeker->trainerInfo[vsSeekerObjectIdx].script = templates[objectEventIdx].script;
|
||||
sVsSeeker->trainerInfo[vsSeekerObjectIdx].trainerIdx = GetTrainerFlagFromScript(templates[objectEventIdx].script);
|
||||
@@ -941,7 +941,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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user