summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_map_obj.s84
-rwxr-xr-xinclude/field_map_obj.h4
-rwxr-xr-xsrc/field_map_obj.c70
3 files changed, 74 insertions, 84 deletions
diff --git a/asm/field_map_obj.s b/asm/field_map_obj.s
index ea685d6ec..86f53d9e8 100644
--- a/asm/field_map_obj.s
+++ b/asm/field_map_obj.s
@@ -1353,90 +1353,6 @@ sub_805FD08: @ 805FD08
.section .text_805fd18
- thumb_func_start GetOppositeDirection
-GetOppositeDirection: @ 8060B90
- push {r4,lr}
- sub sp, 0x8
- lsls r0, 24
- lsrs r4, r0, 24
- ldr r1, _08060BB4 @ =gUnknown_0837574F
- mov r0, sp
- movs r2, 0x8
- bl memcpy
- subs r1, r4, 0x1
- lsls r0, r1, 24
- lsrs r0, 24
- cmp r0, 0x7
- bhi _08060BB8
- mov r2, sp
- adds r0, r2, r1
- ldrb r0, [r0]
- b _08060BBA
- .align 2, 0
-_08060BB4: .4byte gUnknown_0837574F
-_08060BB8:
- adds r0, r4, 0
-_08060BBA:
- add sp, 0x8
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end GetOppositeDirection
-
- thumb_func_start zffu_offset_calc
-zffu_offset_calc: @ 8060BC4
- lsls r0, 24
- lsls r1, 24
- lsrs r1, 24
- ldr r2, _08060BD8 @ =gUnknown_08375757
- lsrs r0, 22
- subs r0, 0x5
- adds r1, r0
- adds r1, r2
- ldrb r0, [r1]
- bx lr
- .align 2, 0
-_08060BD8: .4byte gUnknown_08375757
- thumb_func_end zffu_offset_calc
-
- thumb_func_start state_to_direction
-state_to_direction: @ 8060BDC
- push {r4,lr}
- lsls r0, 24
- lsrs r4, r0, 24
- lsls r1, 24
- lsrs r1, 24
- adds r0, r1, 0
- lsls r2, 24
- lsrs r2, 24
- cmp r1, 0
- beq _08060BFC
- cmp r2, 0
- beq _08060BFC
- cmp r1, 0x4
- bhi _08060BFC
- cmp r2, 0x4
- bls _08060C00
-_08060BFC:
- movs r0, 0
- b _08060C12
-_08060C00:
- adds r1, r2, 0
- bl zffu_offset_calc
- ldr r2, _08060C18 @ =gUnknown_08375767
- lsls r1, r4, 2
- subs r1, 0x5
- adds r0, r1
- adds r0, r2
- ldrb r0, [r0]
-_08060C12:
- pop {r4}
- pop {r1}
- bx r1
- .align 2, 0
-_08060C18: .4byte gUnknown_08375767
- thumb_func_end state_to_direction
-
thumb_func_start FieldObjectExecSpecialAnim
FieldObjectExecSpecialAnim: @ 8060C1C
push {r4,lr}
diff --git a/include/field_map_obj.h b/include/field_map_obj.h
index 44212ac47..07aba90e5 100755
--- a/include/field_map_obj.h
+++ b/include/field_map_obj.h
@@ -76,6 +76,10 @@ extern const u8 gUnknown_08375574[4];
extern const u8 gUnknown_08375584[4];
extern const u8 gUnknown_0837567B[9];
+extern const u8 gUnknown_0837574F[8];
+
+extern const u8 gUnknown_08375757[4][4];
+extern const u8 gUnknown_08375767[4][4];
extern const struct Coords16 gDirectionToVector[];
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index 211bc919f..108f9cc20 100755
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -4064,3 +4064,73 @@ u8 sub_8060B64(u8 index)
}
return directions[index];
}
+
+u8 GetOppositeDirection(u8 direction)
+{
+ u8 directions[8];
+ memcpy(directions, gUnknown_0837574F, 8);
+ if (direction == 0 || direction > 8)
+ {
+ return direction;
+ }
+ return directions[direction - 1];
+}
+
+int zffu_offset_calc(u8 a0, u8 a1)
+{
+ return gUnknown_08375757[a0 - 1][a1 - 1];
+}
+
+#ifdef NONMATCHING
+u8 state_to_direction(u8 a0, u8 a1, u8 a2)
+{
+ int zffuOffset;
+ if (a1 == 0 || a2 == 0 || a1 > 4 || a2 > 4)
+ {
+ return 0;
+ }
+ zffuOffset = zffu_offset_calc(a1, a2);
+ return gUnknown_08375767[a0 - 1][zffuOffset - 1];
+}
+#else
+__attribute__((naked))
+u8 state_to_direction(u8 a0, u8 a1, u8 a2)
+{
+ asm(".syntax unified\n\
+ push {r4,lr}\n\
+ lsls r0, 24\n\
+ lsrs r4, r0, 24\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ adds r0, r1, 0\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ cmp r1, 0\n\
+ beq _08060BFC\n\
+ cmp r2, 0\n\
+ beq _08060BFC\n\
+ cmp r1, 0x4\n\
+ bhi _08060BFC\n\
+ cmp r2, 0x4\n\
+ bls _08060C00\n\
+_08060BFC:\n\
+ movs r0, 0\n\
+ b _08060C12\n\
+_08060C00:\n\
+ adds r1, r2, 0\n\
+ bl zffu_offset_calc\n\
+ ldr r2, _08060C18 @ =gUnknown_08375767\n\
+ lsls r1, r4, 2\n\
+ subs r1, 0x5\n\
+ adds r0, r1\n\
+ adds r0, r2\n\
+ ldrb r0, [r0]\n\
+_08060C12:\n\
+ pop {r4}\n\
+ pop {r1}\n\
+ bx r1\n\
+ .align 2, 0\n\
+_08060C18: .4byte gUnknown_08375767\n\
+.syntax divided\n");
+}
+#endif