summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcamthesaxman <cameronghall@cox.net>2017-01-27 15:58:28 -0600
committercamthesaxman <cameronghall@cox.net>2017-01-27 15:58:28 -0600
commita500cfc5facbc262757b902c9b0b82a4a1821d3f (patch)
tree38259e9031b54dd3fd63babc5b2982b38c031b7c
parent9442bdcbf3abf3e44d2829ec72bfe23649c7d8ac (diff)
start decompiling more of field_map_obj
-rw-r--r--asm/field_map_obj.s359
-rw-r--r--include/global.fieldmap.h9
-rw-r--r--src/field_map_obj.c169
3 files changed, 176 insertions, 361 deletions
diff --git a/asm/field_map_obj.s b/asm/field_map_obj.s
index ae61cd100..c6386a015 100644
--- a/asm/field_map_obj.s
+++ b/asm/field_map_obj.s
@@ -6,365 +6,6 @@
.text
- thumb_func_start sub_805AB54
-sub_805AB54: @ 805AB54
- push {lr}
- movs r1, 0
- ldr r2, _0805AB60 @ =gMapObjects
- ldrb r0, [r2]
- b _0805AB78
- .align 2, 0
-_0805AB60: .4byte gMapObjects
-_0805AB64:
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0xF
- bhi _0805AB7E
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- adds r0, r2
- ldrb r0, [r0]
-_0805AB78:
- lsls r0, 31
- cmp r0, 0
- bne _0805AB64
-_0805AB7E:
- adds r0, r1, 0
- pop {r1}
- bx r1
- thumb_func_end sub_805AB54
-
- thumb_func_start GetFieldObjectIdByLocalIdAndMap
-GetFieldObjectIdByLocalIdAndMap: @ 805AB84
- push {lr}
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r1, 24
- lsls r2, 24
- lsrs r2, 24
- cmp r0, 0xFE
- bls _0805AB9C
- bl GetFieldObjectIdByLocalId
- b _0805ABA0
-_0805AB9C:
- bl GetFieldObjectIdByLocalIdAndMapInternal
-_0805ABA0:
- lsls r0, 24
- lsrs r0, 24
- pop {r1}
- bx r1
- thumb_func_end GetFieldObjectIdByLocalIdAndMap
-
- thumb_func_start TryGetFieldObjectIdByLocalIdAndMap
-TryGetFieldObjectIdByLocalIdAndMap: @ 805ABA8
- push {r4,lr}
- adds r4, r3, 0
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r1, 24
- lsls r2, 24
- lsrs r2, 24
- bl GetFieldObjectIdByLocalIdAndMap
- strb r0, [r4]
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x10
- beq _0805ABCA
- movs r0, 0
- b _0805ABCC
-_0805ABCA:
- movs r0, 0x1
-_0805ABCC:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end TryGetFieldObjectIdByLocalIdAndMap
-
- thumb_func_start GetFieldObjectIdByXY
-GetFieldObjectIdByXY: @ 805ABD4
- push {r4-r6,lr}
- movs r3, 0
- ldr r5, _0805AC14 @ =gMapObjects
- lsls r0, 16
- asrs r4, r0, 16
- lsls r1, 16
- asrs r1, 16
-_0805ABE2:
- lsls r0, r3, 3
- adds r0, r3
- lsls r0, 2
- adds r2, r0, r5
- ldrb r0, [r2]
- lsls r0, 31
- cmp r0, 0
- beq _0805AC02
- movs r6, 0x10
- ldrsh r0, [r2, r6]
- cmp r0, r4
- bne _0805AC02
- movs r6, 0x12
- ldrsh r0, [r2, r6]
- cmp r0, r1
- beq _0805AC0C
-_0805AC02:
- adds r0, r3, 0x1
- lsls r0, 24
- lsrs r3, r0, 24
- cmp r3, 0xF
- bls _0805ABE2
-_0805AC0C:
- adds r0, r3, 0
- pop {r4-r6}
- pop {r1}
- bx r1
- .align 2, 0
-_0805AC14: .4byte gMapObjects
- thumb_func_end GetFieldObjectIdByXY
-
- thumb_func_start GetFieldObjectIdByLocalIdAndMapInternal
-GetFieldObjectIdByLocalIdAndMapInternal: @ 805AC18
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r1, 24
- lsrs r4, r1, 24
- lsls r2, 24
- lsrs r2, 24
- movs r1, 0
- ldr r6, _0805AC50 @ =gMapObjects
-_0805AC2A:
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- adds r3, r0, r6
- ldrb r0, [r3]
- lsls r0, 31
- cmp r0, 0
- beq _0805AC54
- ldrb r0, [r3, 0x8]
- cmp r0, r5
- bne _0805AC54
- ldrb r0, [r3, 0x9]
- cmp r0, r4
- bne _0805AC54
- ldrb r0, [r3, 0xA]
- cmp r0, r2
- bne _0805AC54
- adds r0, r1, 0
- b _0805AC60
- .align 2, 0
-_0805AC50: .4byte gMapObjects
-_0805AC54:
- adds r0, r1, 0x1
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0xF
- bls _0805AC2A
- movs r0, 0x10
-_0805AC60:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end GetFieldObjectIdByLocalIdAndMapInternal
-
- thumb_func_start GetFieldObjectIdByLocalId
-GetFieldObjectIdByLocalId: @ 805AC68
- push {r4,lr}
- lsls r0, 24
- lsrs r3, r0, 24
- movs r2, 0
- ldr r4, _0805AC8C @ =gMapObjects
-_0805AC72:
- lsls r0, r2, 3
- adds r0, r2
- lsls r0, 2
- adds r1, r0, r4
- ldrb r0, [r1]
- lsls r0, 31
- cmp r0, 0
- beq _0805AC90
- ldrb r0, [r1, 0x8]
- cmp r0, r3
- bne _0805AC90
- adds r0, r2, 0
- b _0805AC9C
- .align 2, 0
-_0805AC8C: .4byte gMapObjects
-_0805AC90:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0xF
- bls _0805AC72
- movs r0, 0x10
-_0805AC9C:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end GetFieldObjectIdByLocalId
-
- thumb_func_start InitFieldObjectStateFromTemplate
-InitFieldObjectStateFromTemplate: @ 805ACA4
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- sub sp, 0x4
- adds r5, r0, 0
- lsls r1, 24
- lsrs r6, r1, 24
- lsls r2, 24
- lsrs r7, r2, 24
- ldrb r0, [r5]
- adds r1, r6, 0
- adds r2, r7, 0
- mov r3, sp
- bl GetAvailableFieldObjectSlot
- lsls r0, 24
- cmp r0, 0
- beq _0805ACCE
- movs r0, 0x10
- b _0805ADC2
-_0805ACCE:
- mov r0, sp
- ldrb r1, [r0]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _0805ADD0 @ =gMapObjects
- adds r4, r0, r1
- adds r0, r4, 0
- bl npc_clear_ids_and_state
- ldrh r3, [r5, 0x4]
- adds r3, 0x7
- lsls r3, 16
- lsrs r3, 16
- ldrh r2, [r5, 0x6]
- adds r2, 0x7
- lsls r2, 16
- lsrs r2, 16
- ldrb r0, [r4]
- movs r1, 0x1
- orrs r0, r1
- movs r1, 0x4
- orrs r0, r1
- strb r0, [r4]
- ldrb r0, [r5, 0x1]
- strb r0, [r4, 0x5]
- ldrb r0, [r5, 0x9]
- strb r0, [r4, 0x6]
- ldrb r0, [r5]
- strb r0, [r4, 0x8]
- strb r6, [r4, 0x9]
- strb r7, [r4, 0xA]
- strh r3, [r4, 0xC]
- strh r2, [r4, 0xE]
- strh r3, [r4, 0x10]
- strh r2, [r4, 0x12]
- strh r3, [r4, 0x14]
- strh r2, [r4, 0x16]
- ldrb r0, [r5, 0x8]
- movs r7, 0xF
- adds r1, r7, 0
- ands r1, r0
- ldrb r2, [r4, 0xB]
- movs r0, 0x10
- negs r0, r0
- mov r8, r0
- ands r0, r2
- orrs r0, r1
- strb r0, [r4, 0xB]
- ldrb r1, [r5, 0x8]
- lsls r1, 4
- ands r0, r7
- orrs r0, r1
- strb r0, [r4, 0xB]
- ldrb r1, [r5, 0xA]
- lsls r1, 28
- movs r0, 0xF
- mov r9, r0
- lsrs r1, 28
- ldrb r2, [r4, 0x19]
- mov r0, r8
- ands r0, r2
- orrs r0, r1
- strb r0, [r4, 0x19]
- ldrb r1, [r5, 0xA]
- lsrs r1, 4
- lsls r1, 4
- ands r0, r7
- orrs r0, r1
- strb r0, [r4, 0x19]
- ldrh r0, [r5, 0xC]
- strb r0, [r4, 0x7]
- ldrh r0, [r5, 0xE]
- strb r0, [r4, 0x1D]
- ldr r1, _0805ADD4 @ =gUnknown_0836DC09
- ldrb r0, [r5, 0x9]
- adds r0, r1
- ldrb r1, [r0]
- adds r0, r4, 0
- adds r0, 0x20
- strb r1, [r0]
- ldrb r1, [r0]
- adds r0, r4, 0
- bl FieldObjectSetDirection
- adds r0, r4, 0
- bl FieldObjectHandleDynamicGraphicsId
- ldr r1, _0805ADD8 @ =gUnknown_0836DBBC
- ldrb r0, [r4, 0x6]
- adds r0, r1
- ldrb r0, [r0]
- cmp r0, 0
- beq _0805ADBE
- ldrb r2, [r4, 0x19]
- adds r0, r7, 0
- ands r0, r2
- cmp r0, 0
- bne _0805ADA6
- lsls r0, r2, 28
- lsrs r0, 28
- adds r0, 0x1
- mov r1, r9
- ands r0, r1
- mov r1, r8
- ands r1, r2
- orrs r1, r0
- strb r1, [r4, 0x19]
-_0805ADA6:
- ldrb r2, [r4, 0x19]
- movs r0, 0xF0
- ands r0, r2
- cmp r0, 0
- bne _0805ADBE
- lsrs r1, r2, 4
- adds r1, 0x1
- lsls r1, 4
- adds r0, r7, 0
- ands r0, r2
- orrs r0, r1
- strb r0, [r4, 0x19]
-_0805ADBE:
- mov r0, sp
- ldrb r0, [r0]
-_0805ADC2:
- add sp, 0x4
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0805ADD0: .4byte gMapObjects
-_0805ADD4: .4byte gUnknown_0836DC09
-_0805ADD8: .4byte gUnknown_0836DBBC
- thumb_func_end InitFieldObjectStateFromTemplate
-
thumb_func_start sub_805ADDC
sub_805ADDC: @ 805ADDC
push {r4-r7,lr}
diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h
index 5c498de49..6f9ba8a94 100644
--- a/include/global.fieldmap.h
+++ b/include/global.fieldmap.h
@@ -66,12 +66,17 @@ struct MapData
struct MapObjectTemplate
{
/*0x00*/ u8 localId;
- /*0x01*/ u8 filler_1[0x3];
+ /*0x01*/ u8 graphicsId;
+ /*0x02*/ u8 filler_2[0x2];
/*0x04*/ s16 x;
/*0x06*/ s16 y;
/*0x08*/ u8 elevation;
/*0x09*/ u8 movementType;
- /*0x0A*/ u8 filler_A[0x6];
+ /*0x0A*/ u16 unkA_0:4;
+ u16 unkA_4:4;
+ ///*0x0B*/ u8 fillerB[1];
+ /*0x0C*/ u16 unkC;
+ /*0x0E*/ u16 unkE;
/*0x10*/ u8 *script;
/*0x14*/ u8 filler_14[0x4];
}; /*size = 0x18*/
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index fa09959df..b754c2616 100644
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -1,4 +1,5 @@
#include "global.h"
+#include "field_map_obj.h"
#include "sprite.h"
extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36];
@@ -7,6 +8,13 @@ extern void strange_npc_table_clear(void);
extern void ClearPlayerAvatarInfo(void);
void sub_805AAB0(void);
+u8 GetFieldObjectIdByLocalId(u8);
+u8 GetFieldObjectIdByLocalIdAndMapInternal(u8, u8, u8);
+u8 GetAvailableFieldObjectSlot(u16, u8, u8, u8 *);
+void FieldObjectHandleDynamicGraphicsId();
+
+extern const u8 gUnknown_0836DBBC[];
+extern const u8 gUnknown_0836DC09[];
void npc_clear_ids_and_state(struct MapObject *mapObj)
{
@@ -51,3 +59,164 @@ void sub_805AAB0(void)
StartSpriteAffineAnim(&gSprites[spriteId], 1);
gSprites[spriteId].invisible = 1;
}
+
+int sub_805AB54(void)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (!gMapObjects[i].active)
+ break;
+ }
+ return i;
+}
+
+u8 GetFieldObjectIdByLocalIdAndMap(u8 a, u8 b, u8 c)
+{
+ if (a <= 0xFE)
+ return GetFieldObjectIdByLocalIdAndMapInternal(a, b, c);
+ else
+ return GetFieldObjectIdByLocalId(a);
+}
+
+bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 a, u8 b, u8 c, u8 *d)
+{
+ *d = GetFieldObjectIdByLocalIdAndMap(a, b, c);
+ if (*d == 16)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+u8 GetFieldObjectIdByXY(s16 x, s16 y)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (gMapObjects[i].active && gMapObjects[i].coords2.x == x && gMapObjects[i].coords2.y == y)
+ break;
+ }
+ return i;
+}
+
+u8 GetFieldObjectIdByLocalIdAndMapInternal(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (gMapObjects[i].active && gMapObjects[i].localId == localId && gMapObjects[i].mapNum == mapNum && gMapObjects[i].mapGroup == mapGroup)
+ return i;
+ }
+ return 16;
+}
+
+u8 GetFieldObjectIdByLocalId(u8 localId)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (gMapObjects[i].active && gMapObjects[i].localId == localId)
+ return i;
+ }
+ return 16;
+}
+
+u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, s8 c)
+{
+ struct MapObject2 *mapObj; //TODO: resolve the mapobj_unk_19b weirdness
+ u8 var;
+ u16 r3;
+ u16 r2;
+
+ if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0)
+ return 16;
+ //_0805ACCE
+ mapObj = (struct MapObject2 *)&gMapObjects[var];
+ npc_clear_ids_and_state((struct MapObject *)mapObj);
+ r3 = template->x + 7;
+ r2 = template->y + 7;
+ mapObj->active = TRUE;
+ mapObj->mapobj_bit_2 = TRUE;
+ mapObj->graphicsId = template->graphicsId;
+ mapObj->animPattern = template->movementType;
+ mapObj->localId = template->localId;
+ mapObj->mapNum = b;
+ mapObj->mapGroup = c;
+ mapObj->coords1.x = r3;
+ mapObj->coords1.y = r2;
+ mapObj->coords2.x = r3;
+ mapObj->coords2.y = r2;
+ mapObj->coords3.x = r3;
+ mapObj->coords3.y = r2;
+ mapObj->mapobj_unk_0B_0 = template->elevation;
+ mapObj->elevation = template->elevation;
+ mapObj->mapobj_unk_19 = template->unkA_0;
+ mapObj->mapobj_unk_19b = 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");
+ if (gUnknown_0836DBBC[mapObj->animPattern] != 0)
+ {
+ if (mapObj->mapobj_unk_19 == 0)
+ mapObj->mapobj_unk_19++;
+ if (mapObj->mapobj_unk_19b == 0)
+ mapObj->mapobj_unk_19b++;
+ }
+ return var;
+}
+
+/*
+u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, s8 c)
+{
+ struct MapObject2 *mapObj; //TODO: resolve the mapobj_unk_19b weirdness
+ u8 var;
+ u16 r3;
+ u16 r2;
+
+ if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0)
+ return 16;
+ //_0805ACCE
+ mapObj = (struct MapObject2 *)&gMapObjects[var];
+ npc_clear_ids_and_state((struct MapObject *)mapObj);
+ r3 = template->x + 7;
+ r2 = template->y + 7;
+ mapObj->active = TRUE;
+ mapObj->mapobj_bit_2 = TRUE;
+ mapObj->graphicsId = template->graphicsId;
+ mapObj->animPattern = template->movementType;
+ mapObj->localId = template->localId;
+ mapObj->mapNum = b;
+ mapObj->mapGroup = c;
+ mapObj->coords1.x = r3;
+ mapObj->coords1.y = r2;
+ mapObj->coords2.x = r3;
+ mapObj->coords2.y = r2;
+ mapObj->coords3.x = r3;
+ mapObj->coords3.y = r2;
+ mapObj->mapobj_unk_0B_0 = template->elevation;
+ mapObj->elevation = template->elevation;
+ mapObj->mapobj_unk_19 = template->unkA_0;
+ mapObj->mapobj_unk_19b = 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");
+ if (gUnknown_0836DBBC[mapObj->animPattern] != 0)
+ {
+ if (mapObj->mapobj_unk_19 == 0)
+ mapObj->mapobj_unk_19++;
+ if (mapObj->mapobj_unk_19b == 0)
+ mapObj->mapobj_unk_19b++;
+ }
+ return var;
+}
+*/