summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_map_obj.s272
-rw-r--r--include/global.fieldmap.h7
-rw-r--r--src/field_map_obj.c296
3 files changed, 249 insertions, 326 deletions
diff --git a/asm/field_map_obj.s b/asm/field_map_obj.s
index c6386a015..8d0520bb1 100644
--- a/asm/field_map_obj.s
+++ b/asm/field_map_obj.s
@@ -6,278 +6,6 @@
.text
- thumb_func_start sub_805ADDC
-sub_805ADDC: @ 805ADDC
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- lsls r0, 24
- lsrs r0, 24
- mov r8, r0
- ldr r0, _0805ADF4 @ =gMapHeader
- ldr r0, [r0, 0x4]
- cmp r0, 0
- bne _0805AE10
- b _0805AE3E
- .align 2, 0
-_0805ADF4: .4byte gMapHeader
-_0805ADF8:
- ldr r1, _0805AE0C @ =0xfffff3e0
- adds r0, r7, r1
- ldrb r1, [r0, 0x5]
- ldrb r2, [r0, 0x4]
- adds r0, r4, 0
- bl InitFieldObjectStateFromTemplate
- lsls r0, 24
- lsrs r0, 24
- b _0805AE40
- .align 2, 0
-_0805AE0C: .4byte 0xfffff3e0
-_0805AE10:
- ldrb r6, [r0]
- movs r5, 0
- cmp r5, r6
- bcs _0805AE3E
- ldr r7, _0805AE4C @ =gSaveBlock1 + 0xC20
-_0805AE1A:
- lsls r0, r5, 1
- adds r0, r5
- lsls r0, 3
- adds r4, r0, r7
- ldrb r0, [r4]
- cmp r0, r8
- bne _0805AE34
- ldrh r0, [r4, 0x14]
- bl FlagGet
- lsls r0, 24
- cmp r0, 0
- beq _0805ADF8
-_0805AE34:
- adds r0, r5, 0x1
- lsls r0, 24
- lsrs r5, r0, 24
- cmp r5, r6
- bcc _0805AE1A
-_0805AE3E:
- movs r0, 0x10
-_0805AE40:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0805AE4C: .4byte gSaveBlock1 + 0xC20
- thumb_func_end sub_805ADDC
-
- thumb_func_start GetAvailableFieldObjectSlot
-GetAvailableFieldObjectSlot: @ 805AE50
- push {r4-r7,lr}
- mov r12, r3
- lsls r0, 16
- lsrs r6, r0, 16
- lsls r1, 24
- lsrs r5, r1, 24
- lsls r2, 24
- lsrs r4, r2, 24
- movs r2, 0
- ldr r1, _0805AEAC @ =gMapObjects
- ldrb r0, [r1]
- lsls r0, 31
- adds r7, r1, 0
- cmp r0, 0
- beq _0805AEA4
- adds r3, r1, 0
-_0805AE70:
- lsls r0, r2, 3
- adds r0, r2
- lsls r0, 2
- adds r1, r0, r3
- ldrb r0, [r1, 0x8]
- cmp r0, r6
- bne _0805AE8A
- ldrb r0, [r1, 0x9]
- cmp r0, r5
- bne _0805AE8A
- ldrb r0, [r1, 0xA]
- cmp r0, r4
- beq _0805AEA8
-_0805AE8A:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0xF
- bhi _0805AEA8
- lsls r0, r2, 3
- adds r0, r2
- lsls r0, 2
- adds r0, r7
- ldrb r0, [r0]
- lsls r0, 31
- cmp r0, 0
- bne _0805AE70
-_0805AEA4:
- cmp r2, 0xF
- bls _0805AEB0
-_0805AEA8:
- movs r0, 0x1
- b _0805AEE4
- .align 2, 0
-_0805AEAC: .4byte gMapObjects
-_0805AEB0:
- mov r0, r12
- strb r2, [r0]
- ldr r1, _0805AEEC @ =gMapObjects
-_0805AEB6:
- lsls r0, r2, 3
- adds r0, r2
- lsls r0, 2
- adds r3, r0, r1
- ldrb r0, [r3]
- lsls r0, 31
- cmp r0, 0
- beq _0805AED8
- ldrb r0, [r3, 0x8]
- cmp r0, r6
- bne _0805AED8
- ldrb r0, [r3, 0x9]
- cmp r0, r5
- bne _0805AED8
- ldrb r0, [r3, 0xA]
- cmp r0, r4
- beq _0805AEA8
-_0805AED8:
- adds r0, r2, 0x1
- lsls r0, 24
- lsrs r2, r0, 24
- cmp r2, 0xF
- bls _0805AEB6
- movs r0, 0
-_0805AEE4:
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_0805AEEC: .4byte gMapObjects
- thumb_func_end GetAvailableFieldObjectSlot
-
- thumb_func_start RemoveFieldObject
-RemoveFieldObject: @ 805AEF0
- push {lr}
- ldrb r2, [r0]
- movs r1, 0x2
- negs r1, r1
- ands r1, r2
- strb r1, [r0]
- bl RemoveFieldObjectInternal
- pop {r0}
- bx r0
- thumb_func_end RemoveFieldObject
-
- thumb_func_start RemoveFieldObjectByLocalIdAndMap
-RemoveFieldObjectByLocalIdAndMap: @ 805AF04
- push {lr}
- sub sp, 0x4
- lsls r0, 24
- lsrs r0, 24
- lsls r1, 24
- lsrs r1, 24
- lsls r2, 24
- lsrs r2, 24
- mov r3, sp
- bl TryGetFieldObjectIdByLocalIdAndMap
- lsls r0, 24
- cmp r0, 0
- bne _0805AF42
- mov r0, sp
- ldrb r0, [r0]
- bl GetFieldObjectFlagIdByFieldObjectId
- lsls r0, 16
- lsrs r0, 16
- bl FlagSet
- mov r0, sp
- ldrb r1, [r0]
- lsls r0, r1, 3
- adds r0, r1
- lsls r0, 2
- ldr r1, _0805AF48 @ =gMapObjects
- adds r0, r1
- bl RemoveFieldObject
-_0805AF42:
- add sp, 0x4
- pop {r0}
- bx r0
- .align 2, 0
-_0805AF48: .4byte gMapObjects
- thumb_func_end RemoveFieldObjectByLocalIdAndMap
-
- thumb_func_start RemoveFieldObjectInternal
-RemoveFieldObjectInternal: @ 805AF4C
- push {r4,lr}
- sub sp, 0x8
- adds r4, r0, 0
- ldrb r0, [r4, 0x5]
- bl GetFieldObjectGraphicsInfo
- ldrh r2, [r0, 0x6]
- ldr r1, _0805AF90 @ =0xffff0000
- ldr r0, [sp, 0x4]
- ands r0, r1
- orrs r0, r2
- str r0, [sp, 0x4]
- ldr r2, _0805AF94 @ =gSprites
- ldrb r1, [r4, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r1, r2, 0
- adds r1, 0xC
- adds r0, r1
- mov r1, sp
- str r1, [r0]
- ldrb r1, [r4, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r2
- bl DestroySprite
- add sp, 0x8
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0805AF90: .4byte 0xffff0000
-_0805AF94: .4byte gSprites
- thumb_func_end RemoveFieldObjectInternal
-
- thumb_func_start npc_hide_all_but_player
-npc_hide_all_but_player: @ 805AF98
- push {r4,lr}
- movs r4, 0
-_0805AF9C:
- ldr r0, _0805AFC4 @ =gPlayerAvatar
- ldrb r0, [r0, 0x5]
- cmp r4, r0
- beq _0805AFB2
- lsls r0, r4, 3
- adds r0, r4
- lsls r0, 2
- ldr r1, _0805AFC8 @ =gMapObjects
- adds r0, r1
- bl RemoveFieldObject
-_0805AFB2:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0xF
- bls _0805AF9C
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0805AFC4: .4byte gPlayerAvatar
-_0805AFC8: .4byte gMapObjects
- thumb_func_end npc_hide_all_but_player
-
thumb_func_start sub_805AFCC
sub_805AFCC: @ 805AFCC
push {r4-r7,lr}
diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h
index 6f9ba8a94..536e08cb3 100644
--- a/include/global.fieldmap.h
+++ b/include/global.fieldmap.h
@@ -72,13 +72,14 @@ struct MapObjectTemplate
/*0x06*/ s16 y;
/*0x08*/ u8 elevation;
/*0x09*/ u8 movementType;
- /*0x0A*/ u16 unkA_0:4;
- u16 unkA_4:4;
+ /*0x0A*/ u8 unkA_0:4;
+ u8 unkA_4:4;
///*0x0B*/ u8 fillerB[1];
/*0x0C*/ u16 unkC;
/*0x0E*/ u16 unkE;
/*0x10*/ u8 *script;
- /*0x14*/ u8 filler_14[0x4];
+ /*0x14*/ u16 unk14;
+ /*0x16*/ u8 filler_16[2];
}; /*size = 0x18*/
struct WarpEvent
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index b754c2616..20c56a122 100644
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -1,4 +1,6 @@
#include "global.h"
+#include "asm.h"
+#include "event_data.h"
#include "field_map_obj.h"
#include "sprite.h"
@@ -12,6 +14,8 @@ u8 GetFieldObjectIdByLocalId(u8);
u8 GetFieldObjectIdByLocalIdAndMapInternal(u8, u8, u8);
u8 GetAvailableFieldObjectSlot(u16, u8, u8, u8 *);
void FieldObjectHandleDynamicGraphicsId();
+void RemoveFieldObjectInternal(struct MapObject *);
+u16 GetFieldObjectFlagIdByFieldObjectId();
extern const u8 gUnknown_0836DBBC[];
extern const u8 gUnknown_0836DC09[];
@@ -60,7 +64,7 @@ void sub_805AAB0(void)
gSprites[spriteId].invisible = 1;
}
-int sub_805AB54(void)
+u8 sub_805AB54(void)
{
u8 i;
@@ -72,18 +76,18 @@ int sub_805AB54(void)
return i;
}
-u8 GetFieldObjectIdByLocalIdAndMap(u8 a, u8 b, u8 c)
+u8 GetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
{
- if (a <= 0xFE)
- return GetFieldObjectIdByLocalIdAndMapInternal(a, b, c);
+ if (localId <= 0xFE)
+ return GetFieldObjectIdByLocalIdAndMapInternal(localId, mapNum, mapGroup);
else
- return GetFieldObjectIdByLocalId(a);
+ return GetFieldObjectIdByLocalId(localId);
}
-bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 a, u8 b, u8 c, u8 *d)
+bool8 TryGetFieldObjectIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 *mapObjectId)
{
- *d = GetFieldObjectIdByLocalIdAndMap(a, b, c);
- if (*d == 16)
+ *mapObjectId = GetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup);
+ if (*mapObjectId == 16)
return TRUE;
else
return FALSE;
@@ -125,13 +129,15 @@ u8 GetFieldObjectIdByLocalId(u8 localId)
return 16;
}
-u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, s8 c)
+#ifdef NONMATCHING
+u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, u8 c)
{
struct MapObject2 *mapObj; //TODO: resolve the mapobj_unk_19b weirdness
u8 var;
u16 r3;
u16 r2;
+ //asm("nop"::"r"(b));
if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0)
return 16;
//_0805ACCE
@@ -171,52 +177,240 @@ u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, s8
}
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
-/*
-u8 InitFieldObjectStateFromTemplate(struct MapObjectTemplate *template, u8 b, s8 c)
+u8 sub_805ADDC(u8 localId)
{
- struct MapObject2 *mapObj; //TODO: resolve the mapobj_unk_19b weirdness
- u8 var;
- u16 r3;
- u16 r2;
+ u8 objectCount;
+ u8 i;
- if (GetAvailableFieldObjectSlot(template->localId, b, c, &var) != 0)
+ if (gMapHeader.events == NULL)
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)
+ objectCount = gMapHeader.events->mapObjectCount;
+ for (i = 0; i < objectCount; i++)
{
- if (mapObj->mapobj_unk_19 == 0)
- mapObj->mapobj_unk_19++;
- if (mapObj->mapobj_unk_19b == 0)
- mapObj->mapobj_unk_19b++;
+ struct MapObjectTemplate *template = &gSaveBlock1.mapObjectTemplates[i];
+
+ if (template->localId == localId && !FlagGet(template->unk14))
+ return InitFieldObjectStateFromTemplate(template, gSaveBlock1.location.mapNum, gSaveBlock1.location.mapGroup);
+ }
+ return 16;
+}
+
+u8 GetAvailableFieldObjectSlot(u16 a, u8 b, u8 c, u8 *d)
+{
+ u8 i = 0;
+
+ for (i = 0; i < 16 && gMapObjects[i].active; i++)
+ {
+ if (gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c)
+ return 1;
+ }
+ if (i >= 16)
+ return 1;
+ *d = i;
+ for (; i < 16; i++)
+ {
+ if (gMapObjects[i].active && gMapObjects[i].localId == a && gMapObjects[i].mapNum == b && gMapObjects[i].mapGroup == c)
+ return 1;
+ }
+ return 0;
+}
+
+void RemoveFieldObject(struct MapObject *mapObject)
+{
+ mapObject->active = FALSE;
+ RemoveFieldObjectInternal(mapObject);
+}
+
+void RemoveFieldObjectByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup)
+{
+ u8 mapObjectId;
+
+ if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId))
+ return;
+ FlagSet(GetFieldObjectFlagIdByFieldObjectId(mapObjectId));
+ RemoveFieldObject(&gMapObjects[mapObjectId]);
+}
+
+void RemoveFieldObjectInternal(struct MapObject *mapObject)
+{
+ struct SpriteFrameImage image;
+ struct MapObjectGraphicsInfo *gfxInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId);
+
+ image.size = gfxInfo->size;
+ gSprites[mapObject->spriteId].images = &image;
+ DestroySprite(&gSprites[mapObject->spriteId]);
+}
+
+void npc_hide_all_but_player(void)
+{
+ u8 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ if (i != gPlayerAvatar.mapObjectId)
+ RemoveFieldObject(&gFieldObjects[i]);
}
- return var;
}
-*/