summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorscnorton <scnorton@biociphers.org>2017-05-23 15:26:25 -0400
committerscnorton <scnorton@biociphers.org>2017-05-24 16:15:14 -0400
commitd44cefb06d4d2e160db450a27b74a739753d24dd (patch)
tree3712401be6c379ffaac74dff4c403ec8d610d144
parent39e0ce9f6d6dab0f9d72f967ba6fef23398bb342 (diff)
Some more field map object functions; asm/field_map_obj.s down to 7k lines
-rw-r--r--asm/field_map_obj.s318
-rwxr-xr-xinclude/field_map_obj.h2
-rw-r--r--include/field_map_obj_helpers.h1
-rwxr-xr-xsrc/field_map_obj.c104
4 files changed, 107 insertions, 318 deletions
diff --git a/asm/field_map_obj.s b/asm/field_map_obj.s
index 86f53d9e8..167a5cd13 100644
--- a/asm/field_map_obj.s
+++ b/asm/field_map_obj.s
@@ -1353,324 +1353,6 @@ sub_805FD08: @ 805FD08
.section .text_805fd18
- thumb_func_start FieldObjectExecSpecialAnim
-FieldObjectExecSpecialAnim: @ 8060C1C
- push {r4,lr}
- adds r4, r0, 0
- ldr r2, _08060C50 @ =gUnknown_08375778
- ldrb r0, [r4, 0x1C]
- lsls r0, 2
- adds r0, r2
- movs r3, 0x32
- ldrsh r2, [r1, r3]
- ldr r0, [r0]
- lsls r2, 2
- adds r2, r0
- ldr r2, [r2]
- adds r0, r4, 0
- bl _call_via_r2
- lsls r0, 24
- cmp r0, 0
- beq _08060C48
- ldrb r0, [r4]
- movs r1, 0x80
- orrs r0, r1
- strb r0, [r4]
-_08060C48:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_08060C50: .4byte gUnknown_08375778
- thumb_func_end FieldObjectExecSpecialAnim
-
- thumb_func_start FieldObjectExecRegularAnim
-FieldObjectExecRegularAnim: @ 8060C54
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- ldr r1, _08060C80 @ =gUnknown_08375778
- ldrb r0, [r4, 0x1C]
- lsls r0, 2
- adds r0, r1
- movs r2, 0x32
- ldrsh r1, [r5, r2]
- ldr r0, [r0]
- lsls r1, 2
- adds r1, r0
- ldr r2, [r1]
- adds r0, r4, 0
- adds r1, r5, 0
- bl _call_via_r2
- lsls r0, 24
- cmp r0, 0
- bne _08060C84
- movs r0, 0
- b _08060C8E
- .align 2, 0
-_08060C80: .4byte gUnknown_08375778
-_08060C84:
- movs r0, 0xFF
- strb r0, [r4, 0x1C]
- movs r0, 0
- strh r0, [r5, 0x32]
- movs r0, 0x1
-_08060C8E:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end FieldObjectExecRegularAnim
-
- thumb_func_start FieldObjectSetRegularAnim
-FieldObjectSetRegularAnim: @ 8060C94
- movs r3, 0
- strb r2, [r0, 0x1C]
- strh r3, [r1, 0x32]
- bx lr
- thumb_func_end FieldObjectSetRegularAnim
-
- thumb_func_start an_look_any
-an_look_any: @ 8060C9C
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- lsls r1, r2, 24
- lsrs r1, 24
- bl FieldObjectSetDirection
- adds r0, r4, 0
- bl npc_coords_shift_still
- ldrb r0, [r4, 0x18]
- lsls r0, 28
- lsrs r0, 28
- bl get_go_image_anim_num
- adds r2, r0, 0
- lsls r2, 24
- lsrs r2, 24
- adds r0, r4, 0
- adds r1, r5, 0
- bl sub_805FE64
- adds r2, r5, 0
- adds r2, 0x2C
- ldrb r0, [r2]
- movs r1, 0x40
- orrs r0, r1
- strb r0, [r2]
- movs r0, 0x1
- strh r0, [r5, 0x32]
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end an_look_any
-
- thumb_func_start sub_8060CE0
-sub_8060CE0: @ 8060CE0
- push {lr}
- movs r2, 0x1
- bl an_look_any
- movs r0, 0x1
- pop {r1}
- bx r1
- thumb_func_end sub_8060CE0
-
- thumb_func_start sub_8060CF0
-sub_8060CF0: @ 8060CF0
- push {lr}
- movs r2, 0x2
- bl an_look_any
- movs r0, 0x1
- pop {r1}
- bx r1
- thumb_func_end sub_8060CF0
-
- thumb_func_start sub_8060D00
-sub_8060D00: @ 8060D00
- push {lr}
- movs r2, 0x3
- bl an_look_any
- movs r0, 0x1
- pop {r1}
- bx r1
- thumb_func_end sub_8060D00
-
- thumb_func_start sub_8060D10
-sub_8060D10: @ 8060D10
- push {lr}
- movs r2, 0x4
- bl an_look_any
- movs r0, 0x1
- pop {r1}
- bx r1
- thumb_func_end sub_8060D10
-
- thumb_func_start sub_8060D20
-sub_8060D20: @ 8060D20
- push {r4-r6,lr}
- mov r6, r9
- mov r5, r8
- push {r5,r6}
- sub sp, 0x4
- mov r8, r0
- mov r9, r1
- adds r4, r2, 0
- adds r6, r3, 0
- lsls r4, 24
- lsrs r4, 24
- lsls r6, 24
- lsrs r6, 24
- ldrh r1, [r0, 0x10]
- mov r0, sp
- strh r1, [r0]
- mov r1, r8
- ldrh r0, [r1, 0x12]
- mov r5, sp
- adds r5, 0x2
- strh r0, [r5]
- mov r0, r8
- adds r1, r4, 0
- bl FieldObjectSetDirection
- adds r0, r4, 0
- mov r1, sp
- adds r2, r5, 0
- bl MoveCoords
- mov r0, sp
- movs r2, 0
- ldrsh r1, [r0, r2]
- movs r0, 0
- ldrsh r2, [r5, r0]
- mov r0, r8
- bl npc_coords_shift
- mov r0, r9
- adds r1, r4, 0
- adds r2, r6, 0
- bl oamt_npc_ministep_reset
- mov r2, r9
- adds r2, 0x2C
- ldrb r1, [r2]
- movs r0, 0x41
- negs r0, r0
- ands r0, r1
- strb r0, [r2]
- mov r1, r8
- ldrb r0, [r1]
- movs r1, 0x4
- orrs r0, r1
- mov r2, r8
- strb r0, [r2]
- movs r0, 0x1
- mov r1, r9
- strh r0, [r1, 0x32]
- add sp, 0x4
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end sub_8060D20
-
- thumb_func_start do_go_anim
-do_go_anim: @ 8060DA4
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0x14
- adds r5, r0, 0
- mov r8, r1
- adds r4, r3, 0
- lsls r2, 24
- lsrs r2, 24
- lsls r4, 24
- lsrs r4, 24
- mov r1, sp
- ldr r0, _08060DFC @ =gUnknown_083759C0
- ldm r0!, {r3,r6,r7}
- stm r1!, {r3,r6,r7}
- ldm r0!, {r3,r6}
- stm r1!, {r3,r6}
- adds r0, r5, 0
- mov r1, r8
- adds r3, r4, 0
- bl sub_8060D20
- lsls r4, 2
- mov r7, sp
- adds r1, r7, r4
- ldrb r0, [r5, 0x18]
- lsls r0, 28
- lsrs r0, 28
- ldr r1, [r1]
- bl _call_via_r1
- adds r2, r0, 0
- lsls r2, 24
- lsrs r2, 24
- adds r0, r5, 0
- mov r1, r8
- bl sub_805FE28
- add sp, 0x14
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_08060DFC: .4byte gUnknown_083759C0
- thumb_func_end do_go_anim
-
- thumb_func_start do_run_anim
-do_run_anim: @ 8060E00
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- lsls r2, 24
- lsrs r2, 24
- movs r3, 0x1
- bl sub_8060D20
- ldrb r0, [r4, 0x18]
- lsls r0, 28
- lsrs r0, 28
- bl get_run_image_anim_num
- adds r2, r0, 0
- lsls r2, 24
- lsrs r2, 24
- adds r0, r4, 0
- adds r1, r5, 0
- bl sub_805FE28
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end do_run_anim
-
- thumb_func_start npc_obj_ministep_stop_on_arrival
-npc_obj_ministep_stop_on_arrival: @ 8060E30
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- adds r0, r5, 0
- bl obj_npc_ministep
- lsls r0, 24
- cmp r0, 0
- bne _08060E46
- movs r0, 0
- b _08060E62
-_08060E46:
- adds r0, r4, 0
- bl npc_coords_shift_still
- ldrb r0, [r4]
- movs r1, 0x8
- orrs r0, r1
- strb r0, [r4]
- adds r2, r5, 0
- adds r2, 0x2C
- ldrb r0, [r2]
- movs r1, 0x40
- orrs r0, r1
- strb r0, [r2]
- movs r0, 0x1
-_08060E62:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end npc_obj_ministep_stop_on_arrival
-
thumb_func_start sub_8060E68
sub_8060E68: @ 8060E68
push {r4-r6,lr}
diff --git a/include/field_map_obj.h b/include/field_map_obj.h
index 07aba90e5..8b8ef78ea 100755
--- a/include/field_map_obj.h
+++ b/include/field_map_obj.h
@@ -83,6 +83,8 @@ extern const u8 gUnknown_08375767[4][4];
extern const struct Coords16 gDirectionToVector[];
+extern u8 (**const gUnknown_08375778[])(struct MapObject *, struct Sprite *);
+
extern struct CameraSomething gUnknown_03004880;
extern s16 gUnknown_03004898;
extern s16 gUnknown_0300489C;
diff --git a/include/field_map_obj_helpers.h b/include/field_map_obj_helpers.h
index daae74ae9..2481e143d 100644
--- a/include/field_map_obj_helpers.h
+++ b/include/field_map_obj_helpers.h
@@ -8,5 +8,6 @@ void UnfreezeMapObjects(void);
void sub_806487C(struct Sprite *sprite, bool8 invisible);
void sub_8064990(u8, u8);
void UnfreezeMapObject(struct MapObject *mapObject);
+void oamt_npc_ministep_reset(struct Sprite *sprite, u8 a2, u8 a3);
#endif
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index 108f9cc20..ae5d65ce2 100755
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -4085,6 +4085,7 @@ int zffu_offset_calc(u8 a0, u8 a1)
u8 state_to_direction(u8 a0, u8 a1, u8 a2)
{
int zffuOffset;
+ asm_comment("For some reason, r2 is being backed up to r3 and restored ahead of the zffu call.")
if (a1 == 0 || a2 == 0 || a1 > 4 || a2 > 4)
{
return 0;
@@ -4134,3 +4135,106 @@ _08060C18: .4byte gUnknown_08375767\n\
.syntax divided\n");
}
#endif
+
+void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite))
+ {
+ mapObject->mapobj_bit_7 = 1;
+ }
+}
+
+bool8 FieldObjectExecRegularAnim(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (gUnknown_08375778[mapObject->mapobj_unk_1C][sprite->data2](mapObject, sprite))
+ {
+ mapObject->mapobj_unk_1C = 0xFF;
+ sprite->data2 = 0;
+ return 1;
+ }
+ return 0;
+}
+
+void FieldObjectSetRegularAnim(struct MapObject *mapObject, struct Sprite *sprite, u8 animId)
+{
+ mapObject->mapobj_unk_1C = animId;
+ sprite->data2 = 0;
+}
+
+void an_look_any(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
+{
+ FieldObjectSetDirection(mapObject, direction);
+ npc_coords_shift_still(mapObject);
+ sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18));
+ sprite->animPaused = 1;
+ sprite->data2 = 1;
+}
+
+u8 sub_8060CE0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ an_look_any(mapObject, sprite, DIR_SOUTH);
+ return 1;
+}
+
+u8 sub_8060CF0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ an_look_any(mapObject, sprite, DIR_NORTH);
+ return 1;
+}
+
+u8 sub_8060D00(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ an_look_any(mapObject, sprite, DIR_WEST);
+ return 1;
+}
+
+u8 sub_8060D10(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ an_look_any(mapObject, sprite, DIR_EAST);
+ return 1;
+}
+
+void sub_8060D20(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a2)
+{
+ s16 x;
+ s16 y;
+ x = mapObject->coords2.x;
+ y = mapObject->coords2.y;
+ FieldObjectSetDirection(mapObject, direction);
+ MoveCoords(direction, &x, &y);
+ npc_coords_shift(mapObject, x, y);
+ oamt_npc_ministep_reset(sprite, direction, a2);
+ sprite->animPaused = 0;
+ mapObject->mapobj_bit_2 = 1;
+ sprite->data2 = 1;
+}
+
+extern u8 (*const gUnknown_083759C0[5])(u8);
+
+void do_go_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a2)
+{
+ u8 (*functions[5])(u8);
+ memcpy(functions, gUnknown_083759C0, sizeof(gUnknown_083759C0));
+ sub_8060D20(mapObject, sprite, direction, a2);
+ sub_805FE28(mapObject, sprite, functions[a2](mapObject->mapobj_unk_18));
+}
+
+void do_run_anim(struct MapObject *mapObject, struct Sprite *sprite, u8 direction)
+{
+ sub_8060D20(mapObject, sprite, direction, 1);
+ sub_805FE28(mapObject, sprite, get_run_image_anim_num(mapObject->mapobj_unk_18));
+}
+
+bool8 obj_npc_ministep(struct Sprite *);
+
+bool8 npc_obj_ministep_stop_on_arrival(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (obj_npc_ministep(sprite))
+ {
+ npc_coords_shift_still(mapObject);
+ mapObject->mapobj_bit_3 = 1;
+ sprite->animPaused = 1;
+ return 1;
+ }
+ return 0;
+}