summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_map_obj.s167
-rw-r--r--include/asm.inc.h8
-rw-r--r--include/field_map_obj.h1
-rw-r--r--include/fieldmap.h2
-rw-r--r--src/field_map_obj.c57
5 files changed, 62 insertions, 173 deletions
diff --git a/asm/field_map_obj.s b/asm/field_map_obj.s
index 5de921af9..ee5aa61c0 100644
--- a/asm/field_map_obj.s
+++ b/asm/field_map_obj.s
@@ -3517,173 +3517,6 @@ sub_805FD08: @ 805FD08
.section .text_805fd18
- thumb_func_start sub_8060024
-sub_8060024: @ 8060024
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- adds r7, r0, 0
- lsls r1, 16
- lsls r2, 16
- lsls r3, 24
- lsrs r3, 24
- mov r8, r3
- lsrs r0, r1, 16
- mov r9, r0
- asrs r6, r1, 16
- lsrs r0, r2, 16
- mov r10, r0
- asrs r5, r2, 16
- adds r0, r7, 0
- adds r1, r6, 0
- adds r2, r5, 0
- bl IsCoordOutsideFieldObjectMovementRect
- lsls r0, 24
- lsrs r0, 24
- negs r1, r0
- orrs r1, r0
- lsrs r4, r1, 31
- adds r0, r6, 0
- adds r1, r5, 0
- bl MapGridIsImpassableAt
- lsls r0, 24
- cmp r0, 0
- bne _0806009C
- adds r0, r6, 0
- adds r1, r5, 0
- bl GetMapBorderIdAt
- movs r1, 0x1
- negs r1, r1
- cmp r0, r1
- beq _0806009C
- adds r0, r7, 0
- adds r1, r6, 0
- adds r2, r5, 0
- mov r3, r8
- bl IsMetatileDirectionallyImpassable
- lsls r0, 24
- cmp r0, 0
- bne _0806009C
- ldrb r0, [r7, 0x1]
- lsrs r0, 7
- cmp r0, 0
- beq _080600A0
- mov r0, r8
- bl CanCameraMoveInDirection
- cmp r0, 0
- bne _080600A0
-_0806009C:
- movs r0, 0x2
- orrs r4, r0
-_080600A0:
- ldrb r0, [r7, 0xB]
- lsls r0, 28
- lsrs r0, 28
- mov r2, r9
- lsls r1, r2, 16
- asrs r6, r1, 16
- mov r2, r10
- lsls r1, r2, 16
- asrs r5, r1, 16
- adds r1, r6, 0
- adds r2, r5, 0
- bl IsZCoordMismatchAt
- lsls r0, 24
- cmp r0, 0
- beq _080600C8
- movs r0, 0x4
- orrs r4, r0
- lsls r0, r4, 24
- lsrs r4, r0, 24
-_080600C8:
- adds r0, r7, 0
- adds r1, r6, 0
- adds r2, r5, 0
- bl CheckForCollisionBetweenFieldObjects
- lsls r0, 24
- cmp r0, 0
- beq _080600E0
- movs r0, 0x8
- orrs r4, r0
- lsls r0, r4, 24
- lsrs r4, r0, 24
-_080600E0:
- adds r0, r4, 0
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_8060024
-
- thumb_func_start IsCoordOutsideFieldObjectMovementRect
-IsCoordOutsideFieldObjectMovementRect: @ 80600F0
- push {r4,r5,lr}
- adds r4, r0, 0
- lsls r1, 16
- lsrs r3, r1, 16
- lsls r2, 16
- lsrs r5, r2, 16
- ldrb r1, [r4, 0x19]
- movs r0, 0xF
- ands r0, r1
- cmp r0, 0
- beq _08060128
- lsls r1, 28
- lsrs r2, r1, 28
- ldrh r0, [r4, 0xC]
- subs r2, r0, r2
- lsrs r1, 28
- adds r0, r1
- lsls r0, 16
- lsrs r1, r0, 16
- lsls r2, 16
- lsls r0, r3, 16
- asrs r3, r0, 16
- cmp r2, r0
- bgt _08060154
- lsls r0, r1, 16
- asrs r0, 16
- cmp r0, r3
- blt _08060154
-_08060128:
- ldrb r1, [r4, 0x19]
- movs r0, 0xF0
- ands r0, r1
- cmp r0, 0
- beq _08060158
- lsls r1, 24
- lsrs r2, r1, 28
- ldrh r0, [r4, 0xE]
- subs r2, r0, r2
- lsrs r1, 28
- adds r0, r1
- lsls r0, 16
- lsrs r1, r0, 16
- lsls r2, 16
- lsls r0, r5, 16
- asrs r3, r0, 16
- cmp r2, r0
- bgt _08060154
- lsls r0, r1, 16
- asrs r0, 16
- cmp r0, r3
- bge _08060158
-_08060154:
- movs r0, 0x1
- b _0806015A
-_08060158:
- movs r0, 0
-_0806015A:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end IsCoordOutsideFieldObjectMovementRect
-
thumb_func_start IsMetatileDirectionallyImpassable
IsMetatileDirectionallyImpassable: @ 8060160
push {r4-r7,lr}
diff --git a/include/asm.inc.h b/include/asm.inc.h
index 3db79b128..8921d14cd 100644
--- a/include/asm.inc.h
+++ b/include/asm.inc.h
@@ -1,6 +1,14 @@
// src/rom3.o
void sub_800C35C(void);
+struct UnkStruct8060024 {
+ u8 outsideMovementRect:1;
+ u8 tileIsImpassable:1;
+ u8 elevationMismatch:1;
+ u8 pathBlockedByObject:1;
+ u8 pad_04:4;
+};
+
// asm/battle_2.o
void sub_800E7C4(void);
u8 b_first_side(u8, u8, u8);
diff --git a/include/field_map_obj.h b/include/field_map_obj.h
index 4f611aab2..c160f1c72 100644
--- a/include/field_map_obj.h
+++ b/include/field_map_obj.h
@@ -26,7 +26,6 @@ static u8 callback(struct MapObject *mapObject, struct Sprite *sprite)\
return 0;\
}
-bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y);
void sub_805C058(struct MapObject *mapObject, s16 a, s16 b);
void FieldObjectSetDirection(struct MapObject *pObject, u8 unk_18);
diff --git a/include/fieldmap.h b/include/fieldmap.h
index 87f113122..530e15798 100644
--- a/include/fieldmap.h
+++ b/include/fieldmap.h
@@ -4,7 +4,7 @@
struct MapHeader *mapconnection_get_mapheader(struct MapConnection *connection);
int GetMapBorderIdAt(int x, int y);
-bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction);
+extern bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction);
int CanCameraMoveInDirection(int direction);
#endif
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index 7c332c505..755de7611 100644
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -2972,19 +2972,20 @@ u8 sub_805FF20(struct MapObject *mapObject, u8 direction)
return npc_block_way(mapObject, x, y, direction);
}
-bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject *mapObject, s16 x, s16 y);
+bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject2 *mapObject, s16 x, s16 y);
+bool8 CheckForCollisionBetweenFieldObjects(struct MapObject *mapObject, s16 x, s16 y);
+bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction);
u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u8 direction)
{
- if (IsCoordOutsideFieldObjectMovementRect(mapObject, x, y))
+ if (IsCoordOutsideFieldObjectMovementRect((struct MapObject2 *)mapObject, x, y))
{
return 1;
}
if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction))
{
return 2;
- }
- if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))
+ } else if (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction))
{
return 2;
}
@@ -2998,3 +2999,51 @@ u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u8 direction)
}
return 0;
}
+
+u8 sub_8060024(struct MapObject *mapObject, s16 x, s16 y, u8 direction)
+{
+ u8 flags;
+ flags = 0;
+ if (IsCoordOutsideFieldObjectMovementRect((struct MapObject2 *)mapObject, x, y))
+ {
+ flags |= 1;
+ }
+ if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction) || (mapObject->mapobj_bit_15 && !CanCameraMoveInDirection(direction)))
+ {
+ flags |= 2;
+ }
+ if (IsZCoordMismatchAt(mapObject->mapobj_unk_0B_0, x, y))
+ {
+ flags |= 4;
+ }
+ if (CheckForCollisionBetweenFieldObjects(mapObject, x, y))
+ {
+ flags |= 8;
+ }
+ return flags;
+}
+
+bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject2 *mapObject, s16 x, s16 y)
+{
+ s16 minv;
+ s16 maxv;
+ if (mapObject->mapobj_unk_19 != 0)
+ {
+ minv = mapObject->coords1.x - (mapObject->mapobj_unk_19);
+ maxv = mapObject->coords1.x + (mapObject->mapobj_unk_19);
+ if (minv > x || maxv < x)
+ {
+ return 1;
+ }
+ }
+ if (mapObject->mapobj_unk_19b != 0)
+ {
+ minv = mapObject->coords1.y - (mapObject->mapobj_unk_19b);
+ maxv = mapObject->coords1.y + (mapObject->mapobj_unk_19b);
+ if (minv > y || maxv < y)
+ {
+ return 1;
+ }
+ }
+ return 0;
+}