summaryrefslogtreecommitdiff
path: root/src/field/field_map_obj.c
diff options
context:
space:
mode:
authorcamthesaxman <cameronghall@cox.net>2018-02-07 15:32:43 -0600
committercamthesaxman <cameronghall@cox.net>2018-02-07 15:32:43 -0600
commit1dd9be3869f99ae7256c6f7a04e78322d4f9a0cd (patch)
tree85f7f0af4c90410afb96cd16b7fd9bf0da57999a /src/field/field_map_obj.c
parentc130c5aebaf05f6a256a24181033e54cf59d52bb (diff)
InitFieldObjectStateFromTemplate fakematching
Diffstat (limited to 'src/field/field_map_obj.c')
-rw-r--r--src/field/field_map_obj.c429
1 files changed, 80 insertions, 349 deletions
diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c
index 2352b82d1..f3a949b51 100644
--- a/src/field/field_map_obj.c
+++ b/src/field/field_map_obj.c
@@ -2023,190 +2023,80 @@ u8 GetFieldObjectIdByLocalId(u8 localId)
return 16;
}
-#if DEBUG
-__attribute__((naked))
-u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
-{
- asm(
- " push {r4, r5, r6, r7, lr}\n"
- " mov r7, r9\n"
- " mov r6, r8\n"
- " push {r6, r7}\n"
- " add sp, sp, #0xfffffffc\n"
- " add r5, r0, #0\n"
- " lsl r1, r1, #0x18\n"
- " lsr r6, r1, #0x18\n"
- " lsl r2, r2, #0x18\n"
- " lsr r7, r2, #0x18\n"
- " ldrb r0, [r5]\n"
- " add r1, r6, #0\n"
- " add r2, r7, #0\n"
- " mov r3, sp\n"
- " bl GetAvailableFieldObjectSlot\n"
- " lsl r0, r0, #0x18\n"
- " cmp r0, #0\n"
- " beq ._35 @cond_branch\n"
- " mov r0, #0x10\n"
- " b ._36\n"
- "._35:\n"
- " mov r0, sp\n"
- " ldrb r1, [r0]\n"
- " lsl r0, r1, #0x3\n"
- " add r0, r0, r1\n"
- " lsl r0, r0, #0x2\n"
- " ldr r1, ._40 @ gMapObjects\n"
- " add r4, r0, r1\n"
- " add r0, r4, #0\n"
- " bl npc_clear_ids_and_state\n"
- " ldrh r3, [r5, #0x4]\n"
- " add r3, r3, #0x7\n"
- " lsl r3, r3, #0x10\n"
- " lsr r3, r3, #0x10\n"
- " ldrh r2, [r5, #0x6]\n"
- " add r2, r2, #0x7\n"
- " lsl r2, r2, #0x10\n"
- " lsr r2, r2, #0x10\n"
- " ldrb r0, [r4]\n"
- " mov r1, #0x1\n"
- " orr r0, r0, r1\n"
- " mov r1, #0x4\n"
- " orr r0, 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 r6, [r4, #0x9]\n"
- " strb r7, [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"
- " mov r7, #0xf\n"
- " add r1, r7, #0\n"
- " and r1, r1, r0\n"
- " ldrb r2, [r4, #0xb]\n"
- " mov r0, #0x10\n"
- " neg r0, r0\n"
- " mov r8, r0\n"
- " and r0, r0, r2\n"
- " orr r0, r0, r1\n"
- " strb r0, [r4, #0xb]\n"
- " ldrb r1, [r5, #0x8]\n"
- " lsl r1, r1, #0x4\n"
- " and r0, r0, r7\n"
- " orr r0, r0, r1\n"
- " strb r0, [r4, #0xb]\n"
- " ldrb r1, [r5, #0xa]\n"
- " lsl r1, r1, #0x1c\n"
- " mov r0, #0xf\n"
- " mov r9, r0\n"
- " lsr r1, r1, #0x1c\n"
- " ldrb r2, [r4, #0x19]\n"
- " mov r0, r8\n"
- " and r0, r0, r2\n"
- " orr r0, r0, r1\n"
- " strb r0, [r4, #0x19]\n"
- " ldrb r1, [r5, #0xa]\n"
- " lsr r1, r1, #0x4\n"
- " lsl r1, r1, #0x4\n"
- " and r0, r0, r7\n"
- " orr r0, 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, ._40 + 4 @ gUnknown_0836DC09\n"
- " ldrb r0, [r5, #0x9]\n"
- " add r0, r0, r1\n"
- " ldrb r1, [r0]\n"
- " add r0, r4, #0\n"
- " add r0, r0, #0x20\n"
- " strb r1, [r0]\n"
- " ldrb r1, [r0]\n"
- " add r0, r4, #0\n"
- " bl FieldObjectSetDirection\n"
- " add r0, r4, #0\n"
- " bl FieldObjectHandleDynamicGraphicsId\n"
- " ldr r1, ._40 + 8 @ gUnknown_0836DBBC\n"
- " ldrb r0, [r4, #0x6]\n"
- " add r0, r0, r1\n"
- " ldrb r0, [r0]\n"
- " cmp r0, #0\n"
- " beq ._39 @cond_branch\n"
- " ldrb r2, [r4, #0x19]\n"
- " add r0, r7, #0\n"
- " and r0, r0, r2\n"
- " cmp r0, #0\n"
- " bne ._38 @cond_branch\n"
- " lsl r0, r2, #0x1c\n"
- " lsr r0, r0, #0x1c\n"
- " add r0, r0, #0x1\n"
- " mov r1, r9\n"
- " and r0, r0, r1\n"
- " mov r1, r8\n"
- " and r1, r1, r2\n"
- " orr r1, r1, r0\n"
- " strb r1, [r4, #0x19]\n"
- "._38:\n"
- " ldrb r2, [r4, #0x19]\n"
- " mov r0, #0xf0\n"
- " and r0, r0, r2\n"
- " cmp r0, #0\n"
- " bne ._39 @cond_branch\n"
- " lsr r1, r2, #0x4\n"
- " add r1, r1, #0x1\n"
- " lsl r1, r1, #0x4\n"
- " add r0, r7, #0\n"
- " and r0, r0, r2\n"
- " orr r0, r0, r1\n"
- " strb r0, [r4, #0x19]\n"
- "._39:\n"
- " ldr r1, ._40 + 12 @ gUnknown_Debug_03004BC0\n"
- " ldrb r0, [r1]\n"
- " add r0, r0, #0x1\n"
- " strb r0, [r1]\n"
- " mov r0, sp\n"
- " ldrb r0, [r0]\n"
- "._36:\n"
- " add sp, sp, #0x4\n"
- " pop {r3, r4}\n"
- " mov r8, r3\n"
- " mov r9, r4\n"
- " pop {r4, r5, r6, r7}\n"
- " pop {r1}\n"
- " bx r1\n"
- "._41:\n"
- " .align 2, 0\n"
- "._40:\n"
- " .word gMapObjects\n"
- " .word gUnknown_0836DC09\n"
- " .word gUnknown_0836DBBC\n"
- " .word gUnknown_Debug_03004BC0\n"
- "\n"
- );
-}
-#else
-#ifdef NONMATCHING
+// The bitfield at 0x18 needs to be u16 for this function to match
+struct MapObjectAlt
+{
+ /*0x00*/ u32 active:1;
+ u32 mapobj_bit_1:1;
+ u32 mapobj_bit_2:1;
+ u32 mapobj_bit_3:1;
+ u32 mapobj_bit_4:1;
+ u32 mapobj_bit_5:1;
+ u32 mapobj_bit_6:1;
+ u32 mapobj_bit_7:1;
+ /*0x01*/ u32 mapobj_bit_8:1;
+ u32 mapobj_bit_9:1;
+ u32 mapobj_bit_10:1;
+ u32 mapobj_bit_11:1;
+ u32 mapobj_bit_12:1;
+ u32 mapobj_bit_13:1;
+ u32 mapobj_bit_14:1;
+ u32 mapobj_bit_15:1;
+ /*0x02*/ u32 mapobj_bit_16:1;
+ u32 mapobj_bit_17:1;
+ u32 mapobj_bit_18:1;
+ u32 mapobj_bit_19:1;
+ u32 mapobj_bit_20:1;
+ u32 mapobj_bit_21:1;
+ u32 mapobj_bit_22:1;
+ u32 mapobj_bit_23:1;
+ /*0x03*/ u32 mapobj_bit_24:1;
+ u32 mapobj_bit_25:1;
+ u32 mapobj_bit_26:1;
+ u32 mapobj_bit_27:1;
+ u32 mapobj_bit_28:1;
+ u32 mapobj_bit_29:1;
+ u32 mapobj_bit_30:1;
+ u32 mapobj_bit_31:1;
+ /*0x04*/ u8 spriteId;
+ /*0x05*/ u8 graphicsId;
+ /*0x06*/ u8 animPattern;
+ /*0x07*/ u8 trainerType;
+ /*0x08*/ u8 localId;
+ /*0x09*/ u8 mapNum;
+ /*0x0A*/ u8 mapGroup;
+ /*0x0B*/ u8 mapobj_unk_0B_0:4;
+ u8 elevation:4;
+ /*0x0C*/ struct Coords16 coords1;
+ /*0x10*/ struct Coords16 coords2;
+ /*0x14*/ struct Coords16 coords3;
+ /*0x18*/ u16 mapobj_unk_18:4; //current direction?
+ /*0x18*/ u16 placeholder18:4;
+ /*0x19*/ u16 rangeX:4;
+ /*0x19*/ u16 rangeY:4;
+ /*0x1A*/ u8 mapobj_unk_1A;
+ /*0x1B*/ u8 mapobj_unk_1B;
+ /*0x1C*/ u8 mapobj_unk_1C;
+ /*0x1D*/ u8 trainerRange_berryTreeId;
+ /*0x1E*/ u8 mapobj_unk_1E;
+ /*0x1F*/ u8 mapobj_unk_1F;
+ /*0x20*/ u8 mapobj_unk_20;
+ /*0x21*/ u8 mapobj_unk_21;
+ /*0x22*/ u8 animId;
+ /*size = 0x24*/
+};
+
u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
{
- struct MapObject *mapObj; //TODO: resolve the mapobj_unk_19b weirdness
+ struct MapObjectAlt *mapObj; //TODO: resolve the mapobj_unk_19b weirdness
u8 var;
- u16 r3;
- u16 r2;
+ s16 r3;
+ s16 r2;
- //asm("nop"::"r"(b));
if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0)
return 16;
- //_0805ACCE
- mapObj = &gMapObjects[var];
- npc_clear_ids_and_state(mapObj);
+ mapObj = (void *)&gMapObjects[var];
+ npc_clear_ids_and_state((struct MapObject *)mapObj);
r3 = template->x + 7;
r2 = template->y + 7;
mapObj->active = TRUE;
@@ -2215,6 +2105,7 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8
mapObj->animPattern = template->movementType;
mapObj->localId = template->localId;
mapObj->mapNum = b;
+ asm("":::"r6");
mapObj->mapGroup = c;
mapObj->coords1.x = r3;
mapObj->coords1.y = r2;
@@ -2224,186 +2115,26 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8
mapObj->coords3.y = r2;
mapObj->mapobj_unk_0B_0 = template->elevation;
mapObj->elevation = template->elevation;
- mapObj->range.as_nybbles.x = template->unkA_0;
- mapObj->range.as_nybbles.y = template->unkA_4;
+ mapObj->rangeX = template->unkA_0;
+ mapObj->rangeY = template->unkA_4;
mapObj->trainerType = template->unkC;
mapObj->trainerRange_berryTreeId = template->unkE;
mapObj->mapobj_unk_20 = gUnknown_0836DC09[template->movementType];
FieldObjectSetDirection((struct MapObject *)mapObj, mapObj->mapobj_unk_20);
- FieldObjectHandleDynamicGraphicsId(mapObj);
- //asm("":::"r5","r6");
+ asm("":::"r5","r6");
+ FieldObjectHandleDynamicGraphicsId((struct MapObject *)mapObj);
if (gUnknown_0836DBBC[mapObj->animPattern] != 0)
{
- if (mapObj->range.as_nybbles.x == 0)
- mapObj->range.as_nybbles.x++;
- if (mapObj->range.as_nybbles.y == 0)
- mapObj->range.as_nybbles.y++;
+ if (mapObj->rangeX == 0)
+ mapObj->rangeX++;
+ if (mapObj->rangeY == 0)
+ mapObj->rangeY++;
}
+#if DEBUG
+ gUnknown_Debug_03004BC0++;
+#endif
return var;
}
-#else
-__attribute__((naked))
-u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
-{
- asm(".syntax unified\n\
- push {r4-r7,lr}\n\
- mov r7, r9\n\
- mov r6, r8\n\
- push {r6,r7}\n\
- sub sp, 0x4\n\
- adds r5, r0, 0\n\
- lsls r1, 24\n\
- lsrs r6, r1, 24\n\
- lsls r2, 24\n\
- lsrs r7, r2, 24\n\
- ldrb r0, [r5]\n\
- adds r1, r6, 0\n\
- adds r2, r7, 0\n\
- mov r3, sp\n\
- bl GetAvailableFieldObjectSlot\n\
- lsls r0, 24\n\
- cmp r0, 0\n\
- beq _0805ACCE\n\
- movs r0, 0x10\n\
- b _0805ADC2\n\
-_0805ACCE:\n\
- mov r0, sp\n\
- ldrb r1, [r0]\n\
- lsls r0, r1, 3\n\
- adds r0, r1\n\
- lsls r0, 2\n\
- ldr r1, _0805ADD0 @ =gMapObjects\n\
- adds r4, r0, r1\n\
- adds r0, r4, 0\n\
- bl npc_clear_ids_and_state\n\
- ldrh r3, [r5, 0x4]\n\
- adds r3, 0x7\n\
- lsls r3, 16\n\
- lsrs r3, 16\n\
- ldrh r2, [r5, 0x6]\n\
- adds r2, 0x7\n\
- lsls r2, 16\n\
- lsrs r2, 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 r6, [r4, 0x9]\n\
- strb r7, [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 r7, 0xF\n\
- adds r1, r7, 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, r7\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, r7\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, _0805ADD4 @ =gUnknown_0836DC09\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 FieldObjectSetDirection\n\
- adds r0, r4, 0\n\
- bl FieldObjectHandleDynamicGraphicsId\n\
- ldr r1, _0805ADD8 @ =gUnknown_0836DBBC\n\
- ldrb r0, [r4, 0x6]\n\
- adds r0, r1\n\
- ldrb r0, [r0]\n\
- cmp r0, 0\n\
- beq _0805ADBE\n\
- ldrb r2, [r4, 0x19]\n\
- adds r0, r7, 0\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- bne _0805ADA6\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\
-_0805ADA6:\n\
- ldrb r2, [r4, 0x19]\n\
- movs r0, 0xF0\n\
- ands r0, r2\n\
- cmp r0, 0\n\
- bne _0805ADBE\n\
- lsrs r1, r2, 4\n\
- adds r1, 0x1\n\
- lsls r1, 4\n\
- adds r0, r7, 0\n\
- ands r0, r2\n\
- orrs r0, r1\n\
- strb r0, [r4, 0x19]\n\
-_0805ADBE:\n\
- mov r0, sp\n\
- ldrb r0, [r0]\n\
-_0805ADC2:\n\
- add sp, 0x4\n\
- pop {r3,r4}\n\
- mov r8, r3\n\
- mov r9, r4\n\
- pop {r4-r7}\n\
- pop {r1}\n\
- bx r1\n\
- .align 2, 0\n\
-_0805ADD0: .4byte gMapObjects\n\
-_0805ADD4: .4byte gUnknown_0836DC09\n\
-_0805ADD8: .4byte gUnknown_0836DBBC\n\
- .syntax divided\n");
-}
-#endif
-#endif
u8 sub_805ADDC(u8 localId)
{