[LEAK-INFORMED] match InitObjectEventStateFromTemplate
additionally, port range fixes from emerald as well as a couple other things
This commit is contained in:
@@ -82,14 +82,6 @@ struct BackupMapLayout
|
|||||||
u16 *map;
|
u16 *map;
|
||||||
};
|
};
|
||||||
|
|
||||||
union __attribute__((packed)) ObjectEventRange {
|
|
||||||
u8 as_byte;
|
|
||||||
struct __attribute__((packed)) {
|
|
||||||
u8 x:4;
|
|
||||||
u8 y:4;
|
|
||||||
} __attribute__((aligned (1))) as_nybbles;
|
|
||||||
} __attribute__((aligned (1)));
|
|
||||||
|
|
||||||
struct ObjectEventTemplate
|
struct ObjectEventTemplate
|
||||||
{
|
{
|
||||||
/*0x00*/ u8 localId;
|
/*0x00*/ u8 localId;
|
||||||
@@ -239,8 +231,9 @@ struct ObjectEvent
|
|||||||
/*0x10*/ struct Coords16 currentCoords;
|
/*0x10*/ struct Coords16 currentCoords;
|
||||||
/*0x14*/ struct Coords16 previousCoords;
|
/*0x14*/ struct Coords16 previousCoords;
|
||||||
/*0x18*/ u8 facingDirection:4;
|
/*0x18*/ u8 facingDirection:4;
|
||||||
/*0x18*/ u8 movementDirection:4;
|
u8 movementDirection:4;
|
||||||
/*0x19*/ union ObjectEventRange range;
|
u16 rangeX:4;
|
||||||
|
u16 rangeY:4;
|
||||||
/*0x1A*/ u8 fieldEffectSpriteId;
|
/*0x1A*/ u8 fieldEffectSpriteId;
|
||||||
/*0x1B*/ u8 warpArrowSpriteId;
|
/*0x1B*/ u8 warpArrowSpriteId;
|
||||||
/*0x1C*/ u8 movementActionId;
|
/*0x1C*/ u8 movementActionId;
|
||||||
|
|||||||
+45
-266
@@ -1326,53 +1326,63 @@ static u8 GetObjectEventIdByLocalId(u8 localId)
|
|||||||
return OBJECT_EVENTS_COUNT;
|
return OBJECT_EVENTS_COUNT;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef NONMATCHING
|
|
||||||
static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, u8 mapNum, u8 mapGroup)
|
static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, u8 mapNum, u8 mapGroup)
|
||||||
{
|
{
|
||||||
struct ObjectEvent *objectEvent;
|
struct ObjectEvent *objectEvent;
|
||||||
struct ObjectEventTemplate *template2 = template;
|
const struct MapHeader *mapHeader;
|
||||||
u8 objectEventId;
|
u8 objectEventId;
|
||||||
|
u8 var0;
|
||||||
|
u8 elevation;
|
||||||
|
u8 inConnection;
|
||||||
s16 x;
|
s16 x;
|
||||||
s16 y;
|
s16 y;
|
||||||
s16 var;
|
|
||||||
s16 x2;
|
s16 x2;
|
||||||
s16 y2;
|
s16 y2;
|
||||||
s16 elevation2;
|
s16 x3;
|
||||||
|
s16 y3;
|
||||||
|
|
||||||
if(template->inConnection == 0xFF)
|
var0 = 0;
|
||||||
|
elevation = 0;
|
||||||
|
x2 = 0;
|
||||||
|
y2 = 0;
|
||||||
|
x3 = 0;
|
||||||
|
y3 = 0;
|
||||||
|
inConnection = template->inConnection;
|
||||||
|
|
||||||
|
if (inConnection == 0xFF)
|
||||||
{
|
{
|
||||||
var = 1;
|
var0 = 1;
|
||||||
mapNum = template2->trainerType;
|
elevation = template->elevation;
|
||||||
mapGroup = template2->trainerRange_berryTreeId & 0xFF;
|
mapNum = template->trainerType;
|
||||||
elevation2 = template2->elevation;
|
mapGroup = template->trainerRange_berryTreeId & 0xFF;
|
||||||
x = template2->x;
|
x2 = template->x;
|
||||||
y = template2->y;
|
y2 = template->y;
|
||||||
x2 = template2->x;
|
x3 = template->x;
|
||||||
y2 = template2->y;
|
y3 = template->y;
|
||||||
template = &Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum)->events->objectEvents[elevation2 - 1];
|
mapHeader = Overworld_GetMapHeaderByGroupAndId(mapGroup, mapNum);
|
||||||
|
template = &(mapHeader->events->objectEvents[elevation - 1]);
|
||||||
}
|
}
|
||||||
if (GetAvailableObjectEventId(template->localId, mapNum, mapGroup, &objectEventId)
|
if (GetAvailableObjectEventId(template->localId, mapNum, mapGroup, &objectEventId)
|
||||||
&& !sub_805E238(template, var, x2, y2))
|
|| !sub_805E238(template, var0, x3, y3))
|
||||||
return OBJECT_EVENTS_COUNT;
|
return OBJECT_EVENTS_COUNT;
|
||||||
objectEvent = &gObjectEvents[objectEventId];
|
objectEvent = &gObjectEvents[objectEventId];
|
||||||
ClearObjectEvent(objectEvent);
|
ClearObjectEvent(objectEvent);
|
||||||
if (var)
|
if (var0)
|
||||||
{
|
|
||||||
x = x2 * 0x10000 + 0x7000;
|
|
||||||
y = y2 * 0x10000 + 0x7000;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
x = x2 + 7;
|
x = x2 + 7;
|
||||||
y = y2 + 7;
|
y = y2 + 7;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
x = template->x + 7;
|
||||||
|
y = template->y + 7;
|
||||||
|
}
|
||||||
objectEvent->active = TRUE;
|
objectEvent->active = TRUE;
|
||||||
objectEvent->triggerGroundEffectsOnMove = TRUE;
|
objectEvent->triggerGroundEffectsOnMove = TRUE;
|
||||||
objectEvent->graphicsId = template->graphicsId;
|
objectEvent->graphicsId = template->graphicsId;
|
||||||
objectEvent->movementType = template->movementType;
|
objectEvent->movementType = template->movementType;
|
||||||
objectEvent->localId = template->localId;
|
objectEvent->localId = template->localId;
|
||||||
objectEvent->mapNum = mapNum;
|
objectEvent->mapNum = mapNum;
|
||||||
// objectEvent++; objectEvent--; is a trick used in pokeruby and pokeemerald here
|
|
||||||
objectEvent->mapGroup = mapGroup;
|
objectEvent->mapGroup = mapGroup;
|
||||||
objectEvent->initialCoords.x = x;
|
objectEvent->initialCoords.x = x;
|
||||||
objectEvent->initialCoords.y = y;
|
objectEvent->initialCoords.y = y;
|
||||||
@@ -1382,258 +1392,27 @@ static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template,
|
|||||||
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->range.as_nybbles.x = template->movementRangeX;
|
objectEvent->rangeX = template->movementRangeX;
|
||||||
objectEvent->range.as_nybbles.y = template->movementRangeY;
|
objectEvent->rangeY = template->movementRangeY;
|
||||||
objectEvent->trainerType = template->trainerType;
|
objectEvent->trainerType = template->trainerType;
|
||||||
objectEvent->trainerRange_berryTreeId = template->trainerRange_berryTreeId;
|
objectEvent->trainerRange_berryTreeId = template->trainerRange_berryTreeId;
|
||||||
|
objectEvent->mapNum = mapNum; // oops (yes this is required for matching)
|
||||||
objectEvent->previousMovementDirection = gInitialMovementTypeFacingDirections[template->movementType];
|
objectEvent->previousMovementDirection = gInitialMovementTypeFacingDirections[template->movementType];
|
||||||
SetObjectEventDirection(objectEvent, objectEvent->previousMovementDirection);
|
SetObjectEventDirection(objectEvent, objectEvent->previousMovementDirection);
|
||||||
SetObjectEventDynamicGraphicsId(objectEvent);
|
SetObjectEventDynamicGraphicsId(objectEvent);
|
||||||
/*#ifndef NONMATCHING
|
|
||||||
asm("":::"r5", "r6"); is a trick used in pokeruby and pokeemerald here
|
|
||||||
#endif*/
|
|
||||||
if (gRangedMovementTypes[objectEvent->movementType])
|
if (gRangedMovementTypes[objectEvent->movementType])
|
||||||
{
|
{
|
||||||
if (objectEvent->range.as_nybbles.x == 0)
|
if (objectEvent->rangeX == 0)
|
||||||
{
|
{
|
||||||
objectEvent->range.as_nybbles.x++;
|
objectEvent->rangeX++;
|
||||||
}
|
}
|
||||||
if (objectEvent->range.as_nybbles.y == 0)
|
if (objectEvent->rangeY == 0)
|
||||||
{
|
{
|
||||||
objectEvent->range.as_nybbles.y++;
|
objectEvent->rangeY++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return objectEventId;
|
return objectEventId;
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
NAKED
|
|
||||||
static u8 InitObjectEventStateFromTemplate(struct ObjectEventTemplate *template, u8 mapNum, u8 mapGroup)
|
|
||||||
{
|
|
||||||
asm_unified("\n\
|
|
||||||
push {r4-r7,lr}\n\
|
|
||||||
mov r7, r10\n\
|
|
||||||
mov r6, r9\n\
|
|
||||||
mov r5, r8\n\
|
|
||||||
push {r5-r7}\n\
|
|
||||||
sub sp, 0xC\n\
|
|
||||||
adds r5, r0, 0\n\
|
|
||||||
lsls r1, 24\n\
|
|
||||||
lsrs r7, r1, 24\n\
|
|
||||||
lsls r2, 24\n\
|
|
||||||
lsrs r6, r2, 24\n\
|
|
||||||
movs r0, 0\n\
|
|
||||||
mov r10, r0\n\
|
|
||||||
mov r8, r0\n\
|
|
||||||
mov r9, r0\n\
|
|
||||||
movs r1, 0\n\
|
|
||||||
str r1, [sp, 0x4]\n\
|
|
||||||
str r0, [sp, 0x8]\n\
|
|
||||||
ldrb r0, [r5, 0x2]\n\
|
|
||||||
cmp r0, 0xFF\n\
|
|
||||||
bne _0805E0DA\n\
|
|
||||||
movs r1, 0x1\n\
|
|
||||||
mov r10, r1\n\
|
|
||||||
ldrb r4, [r5, 0x8]\n\
|
|
||||||
ldrb r7, [r5, 0xC]\n\
|
|
||||||
ldrb r6, [r5, 0xE]\n\
|
|
||||||
ldrh r0, [r5, 0x4]\n\
|
|
||||||
mov r8, r0\n\
|
|
||||||
ldrh r5, [r5, 0x6]\n\
|
|
||||||
mov r9, r5\n\
|
|
||||||
mov r1, r8\n\
|
|
||||||
str r1, [sp, 0x4]\n\
|
|
||||||
mov r0, r9\n\
|
|
||||||
str r0, [sp, 0x8]\n\
|
|
||||||
adds r0, r6, 0\n\
|
|
||||||
adds r1, r7, 0\n\
|
|
||||||
bl Overworld_GetMapHeaderByGroupAndId\n\
|
|
||||||
ldr r1, [r0, 0x4]\n\
|
|
||||||
lsls r0, r4, 1\n\
|
|
||||||
adds r0, r4\n\
|
|
||||||
lsls r0, 3\n\
|
|
||||||
subs r0, 0x18\n\
|
|
||||||
ldr r1, [r1, 0x4]\n\
|
|
||||||
adds r5, r1, r0\n\
|
|
||||||
_0805E0DA:\n\
|
|
||||||
ldrb r0, [r5]\n\
|
|
||||||
adds r1, r7, 0\n\
|
|
||||||
adds r2, r6, 0\n\
|
|
||||||
mov r3, sp\n\
|
|
||||||
bl GetAvailableObjectEventId\n\
|
|
||||||
lsls r0, 24\n\
|
|
||||||
cmp r0, 0\n\
|
|
||||||
bne _0805E106\n\
|
|
||||||
ldr r1, [sp, 0x4]\n\
|
|
||||||
lsls r2, r1, 16\n\
|
|
||||||
asrs r2, 16\n\
|
|
||||||
ldr r0, [sp, 0x8]\n\
|
|
||||||
lsls r3, r0, 16\n\
|
|
||||||
asrs r3, 16\n\
|
|
||||||
adds r0, r5, 0\n\
|
|
||||||
mov r1, r10\n\
|
|
||||||
bl sub_805E238\n\
|
|
||||||
lsls r0, 24\n\
|
|
||||||
cmp r0, 0\n\
|
|
||||||
bne _0805E10A\n\
|
|
||||||
_0805E106:\n\
|
|
||||||
movs r0, 0x10\n\
|
|
||||||
b _0805E220\n\
|
|
||||||
_0805E10A:\n\
|
|
||||||
mov r0, sp\n\
|
|
||||||
ldrb r1, [r0]\n\
|
|
||||||
lsls r0, r1, 3\n\
|
|
||||||
adds r0, r1\n\
|
|
||||||
lsls r0, 2\n\
|
|
||||||
ldr r1, _0805E13C @ =gObjectEvents\n\
|
|
||||||
adds r4, r0, r1\n\
|
|
||||||
adds r0, r4, 0\n\
|
|
||||||
bl ClearObjectEvent\n\
|
|
||||||
mov r1, r10\n\
|
|
||||||
cmp r1, 0\n\
|
|
||||||
beq _0805E140\n\
|
|
||||||
mov r1, r8\n\
|
|
||||||
lsls r0, r1, 16\n\
|
|
||||||
movs r1, 0xE0\n\
|
|
||||||
lsls r1, 11\n\
|
|
||||||
adds r0, r1\n\
|
|
||||||
lsrs r3, r0, 16\n\
|
|
||||||
mov r1, r9\n\
|
|
||||||
lsls r0, r1, 16\n\
|
|
||||||
movs r1, 0xE0\n\
|
|
||||||
lsls r1, 11\n\
|
|
||||||
adds r0, r1\n\
|
|
||||||
b _0805E14E\n\
|
|
||||||
.align 2, 0\n\
|
|
||||||
_0805E13C: .4byte gObjectEvents\n\
|
|
||||||
_0805E140:\n\
|
|
||||||
ldrh r0, [r5, 0x4]\n\
|
|
||||||
adds r0, 0x7\n\
|
|
||||||
lsls r0, 16\n\
|
|
||||||
lsrs r3, r0, 16\n\
|
|
||||||
ldrh r0, [r5, 0x6]\n\
|
|
||||||
adds r0, 0x7\n\
|
|
||||||
lsls r0, 16\n\
|
|
||||||
_0805E14E:\n\
|
|
||||||
lsrs r2, r0, 16\n\
|
|
||||||
ldrb r0, [r4]\n\
|
|
||||||
movs r1, 0x1\n\
|
|
||||||
orrs r0, r1\n\
|
|
||||||
movs r1, 0x4\n\
|
|
||||||
orrs r0, r1\n\
|
|
||||||
strb r0, [r4]\n\
|
|
||||||
ldrb r0, [r5, 0x1]\n\
|
|
||||||
strb r0, [r4, 0x5]\n\
|
|
||||||
ldrb r0, [r5, 0x9]\n\
|
|
||||||
strb r0, [r4, 0x6]\n\
|
|
||||||
ldrb r0, [r5]\n\
|
|
||||||
strb r0, [r4, 0x8]\n\
|
|
||||||
strb r7, [r4, 0x9]\n\
|
|
||||||
strb r6, [r4, 0xA]\n\
|
|
||||||
strh r3, [r4, 0xC]\n\
|
|
||||||
strh r2, [r4, 0xE]\n\
|
|
||||||
strh r3, [r4, 0x10]\n\
|
|
||||||
strh r2, [r4, 0x12]\n\
|
|
||||||
strh r3, [r4, 0x14]\n\
|
|
||||||
strh r2, [r4, 0x16]\n\
|
|
||||||
ldrb r0, [r5, 0x8]\n\
|
|
||||||
movs r6, 0xF\n\
|
|
||||||
adds r1, r6, 0\n\
|
|
||||||
ands r1, r0\n\
|
|
||||||
ldrb r2, [r4, 0xB]\n\
|
|
||||||
movs r0, 0x10\n\
|
|
||||||
negs r0, r0\n\
|
|
||||||
mov r8, r0\n\
|
|
||||||
ands r0, r2\n\
|
|
||||||
orrs r0, r1\n\
|
|
||||||
strb r0, [r4, 0xB]\n\
|
|
||||||
ldrb r1, [r5, 0x8]\n\
|
|
||||||
lsls r1, 4\n\
|
|
||||||
ands r0, r6\n\
|
|
||||||
orrs r0, r1\n\
|
|
||||||
strb r0, [r4, 0xB]\n\
|
|
||||||
ldrb r1, [r5, 0xA]\n\
|
|
||||||
lsls r1, 28\n\
|
|
||||||
movs r0, 0xF\n\
|
|
||||||
mov r9, r0\n\
|
|
||||||
lsrs r1, 28\n\
|
|
||||||
ldrb r2, [r4, 0x19]\n\
|
|
||||||
mov r0, r8\n\
|
|
||||||
ands r0, r2\n\
|
|
||||||
orrs r0, r1\n\
|
|
||||||
strb r0, [r4, 0x19]\n\
|
|
||||||
ldrb r1, [r5, 0xA]\n\
|
|
||||||
lsrs r1, 4\n\
|
|
||||||
lsls r1, 4\n\
|
|
||||||
ands r0, r6\n\
|
|
||||||
orrs r0, r1\n\
|
|
||||||
strb r0, [r4, 0x19]\n\
|
|
||||||
ldrh r0, [r5, 0xC]\n\
|
|
||||||
strb r0, [r4, 0x7]\n\
|
|
||||||
ldrh r0, [r5, 0xE]\n\
|
|
||||||
strb r0, [r4, 0x1D]\n\
|
|
||||||
ldr r1, _0805E230 @ =gInitialMovementTypeFacingDirections\n\
|
|
||||||
ldrb r0, [r5, 0x9]\n\
|
|
||||||
adds r0, r1\n\
|
|
||||||
ldrb r1, [r0]\n\
|
|
||||||
adds r0, r4, 0\n\
|
|
||||||
adds r0, 0x20\n\
|
|
||||||
strb r1, [r0]\n\
|
|
||||||
ldrb r1, [r0]\n\
|
|
||||||
adds r0, r4, 0\n\
|
|
||||||
bl SetObjectEventDirection\n\
|
|
||||||
adds r0, r4, 0\n\
|
|
||||||
bl SetObjectEventDynamicGraphicsId\n\
|
|
||||||
ldr r1, _0805E234 @ =gRangedMovementTypes\n\
|
|
||||||
ldrb r0, [r4, 0x6]\n\
|
|
||||||
adds r0, r1\n\
|
|
||||||
ldrb r0, [r0]\n\
|
|
||||||
cmp r0, 0\n\
|
|
||||||
beq _0805E21C\n\
|
|
||||||
ldrb r2, [r4, 0x19]\n\
|
|
||||||
adds r0, r6, 0\n\
|
|
||||||
ands r0, r2\n\
|
|
||||||
cmp r0, 0\n\
|
|
||||||
bne _0805E204\n\
|
|
||||||
lsls r0, r2, 28\n\
|
|
||||||
lsrs r0, 28\n\
|
|
||||||
adds r0, 0x1\n\
|
|
||||||
mov r1, r9\n\
|
|
||||||
ands r0, r1\n\
|
|
||||||
mov r1, r8\n\
|
|
||||||
ands r1, r2\n\
|
|
||||||
orrs r1, r0\n\
|
|
||||||
strb r1, [r4, 0x19]\n\
|
|
||||||
_0805E204:\n\
|
|
||||||
ldrb r2, [r4, 0x19]\n\
|
|
||||||
movs r0, 0xF0\n\
|
|
||||||
ands r0, r2\n\
|
|
||||||
cmp r0, 0\n\
|
|
||||||
bne _0805E21C\n\
|
|
||||||
lsrs r1, r2, 4\n\
|
|
||||||
adds r1, 0x1\n\
|
|
||||||
lsls r1, 4\n\
|
|
||||||
adds r0, r6, 0\n\
|
|
||||||
ands r0, r2\n\
|
|
||||||
orrs r0, r1\n\
|
|
||||||
strb r0, [r4, 0x19]\n\
|
|
||||||
_0805E21C:\n\
|
|
||||||
mov r0, sp\n\
|
|
||||||
ldrb r0, [r0]\n\
|
|
||||||
_0805E220:\n\
|
|
||||||
add sp, 0xC\n\
|
|
||||||
pop {r3-r5}\n\
|
|
||||||
mov r8, r3\n\
|
|
||||||
mov r9, r4\n\
|
|
||||||
mov r10, r5\n\
|
|
||||||
pop {r4-r7}\n\
|
|
||||||
pop {r1}\n\
|
|
||||||
bx r1\n\
|
|
||||||
.align 2, 0\n\
|
|
||||||
_0805E230: .4byte gInitialMovementTypeFacingDirections\n\
|
|
||||||
_0805E234: .4byte gRangedMovementTypes\n\
|
|
||||||
");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static bool8 sub_805E238(struct ObjectEventTemplate *template, u8 var, s16 x, s16 y)
|
static bool8 sub_805E238(struct ObjectEventTemplate *template, u8 var, s16 x, s16 y)
|
||||||
{
|
{
|
||||||
@@ -5140,19 +4919,19 @@ static bool8 IsCoordOutsideObjectEventMovementRange(struct ObjectEvent *objectEv
|
|||||||
s16 top;
|
s16 top;
|
||||||
s16 bottom;
|
s16 bottom;
|
||||||
|
|
||||||
if (objectEvent->range.as_nybbles.x != 0)
|
if (objectEvent->rangeX != 0)
|
||||||
{
|
{
|
||||||
left = objectEvent->initialCoords.x - objectEvent->range.as_nybbles.x;
|
left = objectEvent->initialCoords.x - objectEvent->rangeX;
|
||||||
right = objectEvent->initialCoords.x + objectEvent->range.as_nybbles.x;
|
right = objectEvent->initialCoords.x + objectEvent->rangeX;
|
||||||
if (left > x || right < x)
|
if (left > x || right < x)
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (objectEvent->range.as_nybbles.y != 0)
|
if (objectEvent->rangeY != 0)
|
||||||
{
|
{
|
||||||
top = objectEvent->initialCoords.y - objectEvent->range.as_nybbles.y;
|
top = objectEvent->initialCoords.y - objectEvent->rangeY;
|
||||||
bottom = objectEvent->initialCoords.y + objectEvent->range.as_nybbles.y;
|
bottom = objectEvent->initialCoords.y + objectEvent->rangeY;
|
||||||
if (top > y || bottom < y)
|
if (top > y || bottom < y)
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|||||||
+34
-27
@@ -194,7 +194,7 @@ static void CreateConfirmLeaveTradeRoomPrompt(void);
|
|||||||
static void InitLinkRoomStartMenuScript(void);
|
static void InitLinkRoomStartMenuScript(void);
|
||||||
static void InitMenuBasedScript(const u8 *script);
|
static void InitMenuBasedScript(const u8 *script);
|
||||||
static void sub_80581DC(const u8 *script);
|
static void sub_80581DC(const u8 *script);
|
||||||
static void sub_8058230(void);
|
static void RunTerminateLinkScript(void);
|
||||||
static void SpawnLinkPlayerObjectEvent(u8 i, s16 x, s16 y, u8 gender);
|
static void SpawnLinkPlayerObjectEvent(u8 i, s16 x, s16 y, u8 gender);
|
||||||
static void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s16 y);
|
static void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s16 y);
|
||||||
static u8 GetSpriteForLinkedPlayer(u8 linkPlayerId);
|
static u8 GetSpriteForLinkedPlayer(u8 linkPlayerId);
|
||||||
@@ -2673,7 +2673,7 @@ static void HandleLinkPlayerKeyInput(u32 playerId, u16 key, struct TradeRoomPlay
|
|||||||
if (trainer->isLocalPlayer)
|
if (trainer->isLocalPlayer)
|
||||||
{
|
{
|
||||||
SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);
|
SetKeyInterceptCallback(KeyInterCB_DeferToEventScript);
|
||||||
sub_8058230();
|
RunTerminateLinkScript();
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -3170,7 +3170,7 @@ static void InitMenuBasedScript(const u8 *script)
|
|||||||
ScriptContext2_Enable();
|
ScriptContext2_Enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sub_8058230(void)
|
static void RunTerminateLinkScript(void)
|
||||||
{
|
{
|
||||||
ScriptContext1_SetupScript(TradeCenter_TerminateLink);
|
ScriptContext1_SetupScript(TradeCenter_TerminateLink);
|
||||||
ScriptContext2_Enable();
|
ScriptContext2_Enable();
|
||||||
@@ -3260,7 +3260,14 @@ static void ZeroObjectEvent(struct ObjectEvent *objEvent)
|
|||||||
memset(objEvent, 0, sizeof(struct ObjectEvent));
|
memset(objEvent, 0, sizeof(struct ObjectEvent));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 a4)
|
// Note: Emerald reuses the direction and range variables during Link mode
|
||||||
|
// as special gender and direction values. The types and placement
|
||||||
|
// conflict with the usual Event Object struct, thus the definitions.
|
||||||
|
#define linkGender(obj) obj->singleMovementActive
|
||||||
|
// not even one can reference *byte* aligned bitfield members...
|
||||||
|
#define linkDirection(obj) ((u8*)obj)[offsetof(typeof(*obj), fieldEffectSpriteId) - 1] // -> rangeX
|
||||||
|
|
||||||
|
static void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 gender)
|
||||||
{
|
{
|
||||||
u8 objEventId = GetFirstInactiveObjectEventId();
|
u8 objEventId = GetFirstInactiveObjectEventId();
|
||||||
struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];
|
struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];
|
||||||
@@ -3275,8 +3282,8 @@ static void SpawnLinkPlayerObjectEvent(u8 linkPlayerId, s16 x, s16 y, u8 a4)
|
|||||||
linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FREE;
|
linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FREE;
|
||||||
|
|
||||||
objEvent->active = TRUE;
|
objEvent->active = TRUE;
|
||||||
objEvent->singleMovementActive = a4;
|
linkGender(objEvent) = gender;
|
||||||
objEvent->range.as_byte = 2;
|
linkDirection(objEvent) = DIR_NORTH;
|
||||||
objEvent->spriteId = MAX_SPRITES;
|
objEvent->spriteId = MAX_SPRITES;
|
||||||
|
|
||||||
InitLinkPlayerObjectEventPos(objEvent, x, y);
|
InitLinkPlayerObjectEventPos(objEvent, x, y);
|
||||||
@@ -3293,17 +3300,17 @@ static void InitLinkPlayerObjectEventPos(struct ObjectEvent *objEvent, s16 x, s1
|
|||||||
ObjectEventUpdateZCoord(objEvent);
|
ObjectEventUpdateZCoord(objEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetLinkPlayerObjectRange(u8 linkPlayerId, u8 range)
|
static void SetLinkPlayerObjectRange(u8 linkPlayerId, u8 dir)
|
||||||
{
|
{
|
||||||
if (gLinkPlayerObjectEvents[linkPlayerId].active)
|
if (gLinkPlayerObjectEvents[linkPlayerId].active)
|
||||||
{
|
{
|
||||||
u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;
|
u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;
|
||||||
struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
|
struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
|
||||||
objEvent->range.as_byte = range;
|
linkDirection(objEvent) = dir;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void DestroyLinkPlayerOBject(u8 linkPlayerId)
|
static void DestroyLinkPlayerObject(u8 linkPlayerId)
|
||||||
{
|
{
|
||||||
struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];
|
struct LinkPlayerObjectEvent *linkPlayerObjEvent = &gLinkPlayerObjectEvents[linkPlayerId];
|
||||||
u8 objEventId = linkPlayerObjEvent->objEventId;
|
u8 objEventId = linkPlayerObjEvent->objEventId;
|
||||||
@@ -3334,7 +3341,7 @@ static u8 GetLinkPlayerFacingDirection(u8 linkPlayerId)
|
|||||||
{
|
{
|
||||||
u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;
|
u8 objEventId = gLinkPlayerObjectEvents[linkPlayerId].objEventId;
|
||||||
struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
|
struct ObjectEvent *objEvent = &gObjectEvents[objEventId];
|
||||||
return objEvent->range.as_byte;
|
return linkDirection(objEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 GetLinkPlayerElevation(u8 linkPlayerId)
|
static u8 GetLinkPlayerElevation(u8 linkPlayerId)
|
||||||
@@ -3393,35 +3400,35 @@ static void SetPlayerFacingDirection(u8 linkPlayerId, u8 facing)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
|
static u8 MovementEventModeCB_Normal(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)
|
||||||
{
|
{
|
||||||
return sLinkPlayerFacingHandlers[a3](linkPlayerObjEvent, objEvent, a3);
|
return sLinkPlayerFacingHandlers[dir](linkPlayerObjEvent, objEvent, dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
|
static u8 MovementEventModeCB_Ignored(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)
|
||||||
{
|
{
|
||||||
return FACING_UP;
|
return FACING_UP;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Duplicate Function
|
// Duplicate Function
|
||||||
static u8 MovementEventModeCB_Normal_2(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
|
static u8 MovementEventModeCB_Normal_2(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)
|
||||||
{
|
{
|
||||||
return sLinkPlayerFacingHandlers[a3](linkPlayerObjEvent, objEvent, a3);
|
return sLinkPlayerFacingHandlers[dir](linkPlayerObjEvent, objEvent, dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
|
static bool8 FacingHandler_DoNothing(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
|
static bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)
|
||||||
{
|
{
|
||||||
s16 x, y;
|
s16 x, y;
|
||||||
|
|
||||||
objEvent->range.as_byte = FlipVerticalAndClearForced(a3, objEvent->range.as_byte);
|
linkDirection(objEvent) = FlipVerticalAndClearForced(dir, linkDirection(objEvent));
|
||||||
ObjectEventMoveDestCoords(objEvent, objEvent->range.as_byte, &x, &y);
|
ObjectEventMoveDestCoords(objEvent, linkDirection(objEvent), &x, &y);
|
||||||
|
|
||||||
if (LinkPlayerDetectCollision(linkPlayerObjEvent->objEventId, objEvent->range.as_byte, x, y))
|
if (LinkPlayerDetectCollision(linkPlayerObjEvent->objEventId, linkDirection(objEvent), x, y))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -3434,9 +3441,9 @@ static bool8 FacingHandler_DpadMovement(struct LinkPlayerObjectEvent *linkPlayer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool8 FacingHandler_ForcedFacingChange(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 a3)
|
static bool8 FacingHandler_ForcedFacingChange(struct LinkPlayerObjectEvent *linkPlayerObjEvent, struct ObjectEvent *objEvent, u8 dir)
|
||||||
{
|
{
|
||||||
objEvent->range.as_byte = FlipVerticalAndClearForced(a3, objEvent->range.as_byte);
|
linkDirection(objEvent) = FlipVerticalAndClearForced(dir, linkDirection(objEvent));
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3450,7 +3457,7 @@ static void MovementStatusHandler_TryAdvanceScript(struct LinkPlayerObjectEvent
|
|||||||
{
|
{
|
||||||
objEvent->directionSequenceIndex--;
|
objEvent->directionSequenceIndex--;
|
||||||
linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FROZEN;
|
linkPlayerObjEvent->movementMode = MOVEMENT_MODE_FROZEN;
|
||||||
MoveCoords(objEvent->range.as_byte, &objEvent->initialCoords.x, &objEvent->initialCoords.y);
|
MoveCoords(linkDirection(objEvent), &objEvent->initialCoords.x, &objEvent->initialCoords.y);
|
||||||
if (!objEvent->directionSequenceIndex)
|
if (!objEvent->directionSequenceIndex)
|
||||||
{
|
{
|
||||||
ShiftStillObjectEventCoords(objEvent);
|
ShiftStillObjectEventCoords(objEvent);
|
||||||
@@ -3510,12 +3517,12 @@ static void CreateLinkPlayerSprite(u8 linkPlayerId, u8 gameVersion)
|
|||||||
if (gameVersion == VERSION_FIRE_RED || gameVersion == VERSION_LEAF_GREEN)
|
if (gameVersion == VERSION_FIRE_RED || gameVersion == VERSION_LEAF_GREEN)
|
||||||
{
|
{
|
||||||
objEvent->spriteId = AddPseudoObjectEvent(
|
objEvent->spriteId = AddPseudoObjectEvent(
|
||||||
GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, objEvent->singleMovementActive),
|
GetRivalAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, linkGender(objEvent)),
|
||||||
SpriteCB_LinkPlayer, 0, 0, 0);
|
SpriteCB_LinkPlayer, 0, 0, 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
objEvent->spriteId = AddPseudoObjectEvent(GetRSAvatarGraphicsIdByGender(objEvent->singleMovementActive), SpriteCB_LinkPlayer, 0, 0, 0);
|
objEvent->spriteId = AddPseudoObjectEvent(GetRSAvatarGraphicsIdByGender(linkGender(objEvent)), SpriteCB_LinkPlayer, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprite = &gSprites[objEvent->spriteId];
|
sprite = &gSprites[objEvent->spriteId];
|
||||||
@@ -3535,9 +3542,9 @@ static void SpriteCB_LinkPlayer(struct Sprite *sprite)
|
|||||||
sprite->oam.priority = ZCoordToPriority(objEvent->previousElevation);
|
sprite->oam.priority = ZCoordToPriority(objEvent->previousElevation);
|
||||||
|
|
||||||
if (!linkPlayerObjEvent->movementMode != MOVEMENT_MODE_FREE)
|
if (!linkPlayerObjEvent->movementMode != MOVEMENT_MODE_FREE)
|
||||||
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(objEvent->range.as_byte));
|
StartSpriteAnim(sprite, GetFaceDirectionAnimNum(linkDirection(objEvent)));
|
||||||
else
|
else
|
||||||
StartSpriteAnimIfDifferent(sprite, GetMoveDirectionAnimNum(objEvent->range.as_byte));
|
StartSpriteAnimIfDifferent(sprite, GetMoveDirectionAnimNum(linkDirection(objEvent)));
|
||||||
|
|
||||||
UpdateObjectEventSpriteVisibility(sprite, 0);
|
UpdateObjectEventSpriteVisibility(sprite, 0);
|
||||||
if (objEvent->triggerGroundEffectsOnMove)
|
if (objEvent->triggerGroundEffectsOnMove)
|
||||||
|
|||||||
@@ -93,8 +93,8 @@ void SetSav1ObjectEventsFromQuestLog(const struct QuestLog * questLog, const str
|
|||||||
{
|
{
|
||||||
gObjectEvents[i].initialCoords.x = templates[j].x + 7;
|
gObjectEvents[i].initialCoords.x = templates[j].x + 7;
|
||||||
gObjectEvents[i].initialCoords.y = templates[j].y + 7;
|
gObjectEvents[i].initialCoords.y = templates[j].y + 7;
|
||||||
gObjectEvents[i].range.as_nybbles.x = templates[j].movementRangeX;
|
gObjectEvents[i].rangeX = templates[j].movementRangeX;
|
||||||
gObjectEvents[i].range.as_nybbles.y = templates[j].movementRangeY;
|
gObjectEvents[i].rangeY = templates[j].movementRangeY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -219,15 +219,15 @@ static u8 CheckPathBetweenTrainerAndPlayer(struct ObjectEvent *trainerObj, u8 ap
|
|||||||
}
|
}
|
||||||
|
|
||||||
// preserve mapobj_unk_19 before clearing.
|
// preserve mapobj_unk_19 before clearing.
|
||||||
unk19_temp = trainerObj->range.as_nybbles.x;
|
unk19_temp = trainerObj->rangeX;
|
||||||
unk19b_temp = trainerObj->range.as_nybbles.y;
|
unk19b_temp = trainerObj->rangeY;
|
||||||
trainerObj->range.as_nybbles.x = 0;
|
trainerObj->rangeX = 0;
|
||||||
trainerObj->range.as_nybbles.y = 0;
|
trainerObj->rangeY = 0;
|
||||||
|
|
||||||
collision = GetCollisionAtCoords(trainerObj, x, y, direction);
|
collision = GetCollisionAtCoords(trainerObj, x, y, direction);
|
||||||
|
|
||||||
trainerObj->range.as_nybbles.x = unk19_temp;
|
trainerObj->rangeX = unk19_temp;
|
||||||
trainerObj->range.as_nybbles.y = unk19b_temp;
|
trainerObj->rangeY = unk19b_temp;
|
||||||
if (collision == 4)
|
if (collision == 4)
|
||||||
return approachDistance;
|
return approachDistance;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user