make linkDirection more robust to member reordering
This commit is contained in:
@@ -210,8 +210,11 @@ struct ObjectEvent
|
|||||||
/*0x14*/ struct Coords16 previousCoords;
|
/*0x14*/ struct Coords16 previousCoords;
|
||||||
/*0x18*/ u16 facingDirection:4; // current direction?
|
/*0x18*/ u16 facingDirection:4; // current direction?
|
||||||
u16 movementDirection:4;
|
u16 movementDirection:4;
|
||||||
u16 rangeX:4;
|
struct __attribute__((packed))
|
||||||
u16 rangeY:4;
|
{
|
||||||
|
u16 rangeX:4;
|
||||||
|
u16 rangeY:4;
|
||||||
|
} range;
|
||||||
/*0x1A*/ u8 fieldEffectSpriteId;
|
/*0x1A*/ u8 fieldEffectSpriteId;
|
||||||
/*0x1B*/ u8 warpArrowSpriteId;
|
/*0x1B*/ u8 warpArrowSpriteId;
|
||||||
/*0x1C*/ u8 movementActionId;
|
/*0x1C*/ u8 movementActionId;
|
||||||
|
|||||||
+12
-12
@@ -1301,8 +1301,8 @@ static u8 InitObjectEventStateFromTemplate(const struct ObjectEventTemplate *tem
|
|||||||
objectEvent->previousCoords.y = y;
|
objectEvent->previousCoords.y = y;
|
||||||
objectEvent->currentElevation = template->elevation;
|
objectEvent->currentElevation = template->elevation;
|
||||||
objectEvent->previousElevation = template->elevation;
|
objectEvent->previousElevation = template->elevation;
|
||||||
objectEvent->rangeX = template->movementRangeX;
|
objectEvent->range.rangeX = template->movementRangeX;
|
||||||
objectEvent->rangeY = template->movementRangeY;
|
objectEvent->range.rangeY = template->movementRangeY;
|
||||||
objectEvent->trainerType = template->trainerType;
|
objectEvent->trainerType = template->trainerType;
|
||||||
objectEvent->mapNum = mapNum;
|
objectEvent->mapNum = mapNum;
|
||||||
objectEvent->trainerRange_berryTreeId = template->trainerRange_berryTreeId;
|
objectEvent->trainerRange_berryTreeId = template->trainerRange_berryTreeId;
|
||||||
@@ -1311,10 +1311,10 @@ static u8 InitObjectEventStateFromTemplate(const struct ObjectEventTemplate *tem
|
|||||||
SetObjectEventDynamicGraphicsId(objectEvent);
|
SetObjectEventDynamicGraphicsId(objectEvent);
|
||||||
if (sMovementTypeHasRange[objectEvent->movementType])
|
if (sMovementTypeHasRange[objectEvent->movementType])
|
||||||
{
|
{
|
||||||
if (objectEvent->rangeX == 0)
|
if (objectEvent->range.rangeX == 0)
|
||||||
objectEvent->rangeX++;
|
objectEvent->range.rangeX++;
|
||||||
if (objectEvent->rangeY == 0)
|
if (objectEvent->range.rangeY == 0)
|
||||||
objectEvent->rangeY++;
|
objectEvent->range.rangeY++;
|
||||||
}
|
}
|
||||||
return objectEventId;
|
return objectEventId;
|
||||||
}
|
}
|
||||||
@@ -4682,18 +4682,18 @@ static bool8 IsCoordOutsideObjectEventMovementRange(struct ObjectEvent *objectEv
|
|||||||
s16 top;
|
s16 top;
|
||||||
s16 bottom;
|
s16 bottom;
|
||||||
|
|
||||||
if (objectEvent->rangeX != 0)
|
if (objectEvent->range.rangeX != 0)
|
||||||
{
|
{
|
||||||
left = objectEvent->initialCoords.x - objectEvent->rangeX;
|
left = objectEvent->initialCoords.x - objectEvent->range.rangeX;
|
||||||
right = objectEvent->initialCoords.x + objectEvent->rangeX;
|
right = objectEvent->initialCoords.x + objectEvent->range.rangeX;
|
||||||
|
|
||||||
if (left > x || right < x)
|
if (left > x || right < x)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
if (objectEvent->rangeY != 0)
|
if (objectEvent->range.rangeY != 0)
|
||||||
{
|
{
|
||||||
top = objectEvent->initialCoords.y - objectEvent->rangeY;
|
top = objectEvent->initialCoords.y - objectEvent->range.rangeY;
|
||||||
bottom = objectEvent->initialCoords.y + objectEvent->rangeY;
|
bottom = objectEvent->initialCoords.y + objectEvent->range.rangeY;
|
||||||
|
|
||||||
if (top > y || bottom < y)
|
if (top > y || bottom < y)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|||||||
+1
-1
@@ -2931,7 +2931,7 @@ static void ZeroObjectEvent(struct ObjectEvent *objEvent)
|
|||||||
// conflict with the usual Event Object struct, thus the definitions.
|
// conflict with the usual Event Object struct, thus the definitions.
|
||||||
#define linkGender(obj) obj->singleMovementActive
|
#define linkGender(obj) obj->singleMovementActive
|
||||||
// not even one can reference *byte* aligned bitfield members...
|
// not even one can reference *byte* aligned bitfield members...
|
||||||
#define linkDirection(obj) ((u8 *)obj)[offsetof(typeof(*obj), fieldEffectSpriteId) - 1] // -> rangeX
|
#define linkDirection(obj) ((u8 *)obj)[offsetof(typeof(*obj), range)] // -> rangeX
|
||||||
|
|
||||||
static void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 gender)
|
static void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 gender)
|
||||||
{
|
{
|
||||||
|
|||||||
+6
-6
@@ -389,15 +389,15 @@ static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 ap
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
rangeX = trainerObj->rangeX;
|
rangeX = trainerObj->range.rangeX;
|
||||||
rangeY = trainerObj->rangeY;
|
rangeY = trainerObj->range.rangeY;
|
||||||
trainerObj->rangeX = 0;
|
trainerObj->range.rangeX = 0;
|
||||||
trainerObj->rangeY = 0;
|
trainerObj->range.rangeY = 0;
|
||||||
|
|
||||||
collision = GetCollisionAtCoords(trainerObj, x, y, direction);
|
collision = GetCollisionAtCoords(trainerObj, x, y, direction);
|
||||||
|
|
||||||
trainerObj->rangeX = rangeX;
|
trainerObj->range.rangeX = rangeX;
|
||||||
trainerObj->rangeY = rangeY;
|
trainerObj->range.rangeY = rangeY;
|
||||||
if (collision == COLLISION_OBJECT_EVENT)
|
if (collision == COLLISION_OBJECT_EVENT)
|
||||||
return approachDistance;
|
return approachDistance;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user