summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorscnorton <scnorton@biociphers.org>2017-05-23 13:18:23 -0400
committerscnorton <scnorton@biociphers.org>2017-05-24 16:15:13 -0400
commitf9c54affb68b5aa35ef97fad29db67935d2c7d8d (patch)
treebf86282873497bde6851aefbaa7ca490fbfec0d6
parent9684b862198f763e66a4f6348cc1f1cdef075ec0 (diff)
Special anims; meta_step
-rw-r--r--asm/field_map_obj.s165
-rwxr-xr-xsrc/field_map_obj.c81
2 files changed, 80 insertions, 166 deletions
diff --git a/asm/field_map_obj.s b/asm/field_map_obj.s
index 95e8c7949..039828e6d 100644
--- a/asm/field_map_obj.s
+++ b/asm/field_map_obj.s
@@ -1353,171 +1353,6 @@ sub_805FD08: @ 805FD08
.section .text_805fd18
- thumb_func_start FieldObjectForceSetSpecialAnim
-FieldObjectForceSetSpecialAnim: @ 8060598
- push {r4,r5,lr}
- adds r5, r0, 0
- lsls r4, r1, 24
- lsrs r4, 24
- bl FieldObjectClearAnimIfSpecialAnimActive
- adds r0, r5, 0
- adds r1, r4, 0
- bl FieldObjectSetSpecialAnim
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end FieldObjectForceSetSpecialAnim
-
- thumb_func_start FieldObjectClearAnimIfSpecialAnimActive
-FieldObjectClearAnimIfSpecialAnimActive: @ 80605B4
- push {lr}
- adds r1, r0, 0
- ldrb r0, [r1]
- lsls r0, 25
- cmp r0, 0
- bge _080605C6
- adds r0, r1, 0
- bl FieldObjectClearAnim
-_080605C6:
- pop {r0}
- bx r0
- thumb_func_end FieldObjectClearAnimIfSpecialAnimActive
-
- thumb_func_start FieldObjectClearAnim
-FieldObjectClearAnim: @ 80605CC
- movs r1, 0xFF
- strb r1, [r0, 0x1C]
- ldrb r2, [r0]
- movs r1, 0x41
- negs r1, r1
- ands r1, r2
- movs r2, 0x7F
- ands r1, r2
- strb r1, [r0]
- ldr r3, _080605FC @ =gSprites
- ldrb r2, [r0, 0x4]
- lsls r1, r2, 4
- adds r1, r2
- lsls r1, 2
- adds r1, r3
- movs r2, 0
- strh r2, [r1, 0x30]
- ldrb r1, [r0, 0x4]
- lsls r0, r1, 4
- adds r0, r1
- lsls r0, 2
- adds r0, r3
- strh r2, [r0, 0x32]
- bx lr
- .align 2, 0
-_080605FC: .4byte gSprites
- thumb_func_end FieldObjectClearAnim
-
- thumb_func_start FieldObjectCheckIfSpecialAnimFinishedOrInactive
-FieldObjectCheckIfSpecialAnimFinishedOrInactive: @ 8060600
- push {lr}
- ldrb r1, [r0]
- lsls r0, r1, 25
- cmp r0, 0
- blt _0806060E
- movs r0, 0x10
- b _08060610
-_0806060E:
- lsrs r0, r1, 7
-_08060610:
- pop {r1}
- bx r1
- thumb_func_end FieldObjectCheckIfSpecialAnimFinishedOrInactive
-
- thumb_func_start FieldObjectClearAnimIfSpecialAnimFinished
-FieldObjectClearAnimIfSpecialAnimFinished: @ 8060614
- push {r4,r5,lr}
- adds r5, r0, 0
- bl FieldObjectCheckIfSpecialAnimFinishedOrInactive
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0
- beq _0806062E
- cmp r4, 0x10
- beq _0806062E
- adds r0, r5, 0
- bl FieldObjectClearAnimIfSpecialAnimActive
-_0806062E:
- adds r0, r4, 0
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end FieldObjectClearAnimIfSpecialAnimFinished
-
- thumb_func_start FieldObjectGetSpecialAnim
-FieldObjectGetSpecialAnim: @ 8060638
- push {lr}
- adds r1, r0, 0
- ldrb r0, [r1]
- lsls r0, 25
- cmp r0, 0
- blt _08060648
- movs r0, 0xFF
- b _0806064A
-_08060648:
- ldrb r0, [r1, 0x1C]
-_0806064A:
- pop {r1}
- bx r1
- thumb_func_end FieldObjectGetSpecialAnim
-
- thumb_func_start meta_step
-meta_step: @ 8060650
- push {r4-r6,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- adds r6, r2, 0
- bl DoGroundEffects_OnSpawn
- adds r0, r4, 0
- adds r1, r5, 0
- bl sub_80634A0
- adds r0, r4, 0
- bl FieldObjectIsSpecialAnimActive
- lsls r0, 24
- cmp r0, 0
- beq _0806067A
- adds r0, r4, 0
- adds r1, r5, 0
- bl FieldObjectExecSpecialAnim
- b _08060690
-_0806067A:
- ldrb r0, [r4, 0x1]
- lsls r0, 31
- cmp r0, 0
- bne _08060690
-_08060682:
- adds r0, r4, 0
- adds r1, r5, 0
- bl _call_via_r6
- lsls r0, 24
- cmp r0, 0
- bne _08060682
-_08060690:
- adds r0, r4, 0
- adds r1, r5, 0
- bl DoGroundEffects_OnBeginStep
- adds r0, r4, 0
- adds r1, r5, 0
- bl DoGroundEffects_OnFinishStep
- adds r0, r4, 0
- adds r1, r5, 0
- bl npc_obj_transfer_image_anim_pause_flag
- adds r0, r4, 0
- adds r1, r5, 0
- bl sub_80634D0
- adds r0, r4, 0
- adds r1, r5, 0
- bl FieldObjectUpdateSubpriority
- pop {r4-r6}
- pop {r0}
- bx r0
- thumb_func_end meta_step
-
thumb_func_start GetFaceDirectionAnimId
GetFaceDirectionAnimId: @ 80606C0
push {r4,lr}
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index bd77ad2be..29dbc4bd0 100755
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -22,7 +22,7 @@ extern void ClearPlayerAvatarInfo(void);
extern void npc_load_two_palettes__no_record(u16, u8);
extern void npc_load_two_palettes__and_record(u16, u8);
extern void sub_8060388(s16, s16, s16 *, s16 *);
-extern void sub_80634D0();
+extern void sub_80634D0(struct MapObject *, struct Sprite *);
extern void pal_patch_for_npc(u16, u16);
extern void CameraObjectReset1(void);
@@ -3628,3 +3628,82 @@ bool8 FieldObjectSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId)
gSprites[mapObject->spriteId].data2 = 0;
return FALSE;
}
+
+void FieldObjectForceSetSpecialAnim(struct MapObject *mapObject, u8 specialAnimId)
+{
+ FieldObjectClearAnimIfSpecialAnimActive(mapObject);
+ FieldObjectSetSpecialAnim(mapObject, specialAnimId);
+}
+
+void FieldObjectClearAnimIfSpecialAnimActive(struct MapObject *mapObject)
+{
+ if (mapObject->mapobj_bit_6)
+ {
+ FieldObjectClearAnim(mapObject);
+ }
+}
+
+void FieldObjectClearAnim(struct MapObject *mapObject)
+{
+ mapObject->mapobj_unk_1C = 0xFF;
+ mapObject->mapobj_bit_6 = 0;
+ mapObject->mapobj_bit_7 = 0;
+ gSprites[mapObject->spriteId].data1 = 0;
+ gSprites[mapObject->spriteId].data2 = 0;
+}
+
+bool8 FieldObjectCheckIfSpecialAnimFinishedOrInactive(struct MapObject *mapObject)
+{
+ if (mapObject->mapobj_bit_6)
+ return mapObject->mapobj_bit_7;
+ return 0x10;
+}
+
+bool8 FieldObjectClearAnimIfSpecialAnimFinished(struct MapObject *mapObject)
+{
+ u8 specialAnimStatus;
+ specialAnimStatus = FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject);
+ if (specialAnimStatus != 0 && specialAnimStatus != 0x10)
+ {
+ FieldObjectClearAnimIfSpecialAnimActive(mapObject);
+ }
+ return specialAnimStatus;
+}
+
+u8 FieldObjectGetSpecialAnim(struct MapObject *mapObject)
+{
+ if (mapObject->mapobj_bit_6)
+ {
+ return mapObject->mapobj_unk_1C;
+ }
+ return 0xFF;
+}
+
+extern void DoGroundEffects_OnSpawn(struct MapObject *mapObject, struct Sprite *sprite);
+extern void DoGroundEffects_OnBeginStep(struct MapObject *mapObject, struct Sprite *sprite);
+extern void DoGroundEffects_OnFinishStep(struct MapObject *mapObject, struct Sprite *sprite);
+extern void npc_obj_transfer_image_anim_pause_flag(struct MapObject *mapObject, struct Sprite *sprite);
+void sub_80634A0(struct MapObject *mapObject, struct Sprite *sprite);
+void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite);
+void FieldObjectUpdateSubpriority(struct MapObject *mapObject, struct Sprite *sprite);
+
+void meta_step(struct MapObject *mapObject, struct Sprite *sprite, u8 (*callback)(struct MapObject *, struct Sprite *))
+{
+ DoGroundEffects_OnSpawn(mapObject, sprite);
+ sub_80634A0(mapObject, sprite);
+ if (FieldObjectIsSpecialAnimActive(mapObject))
+ {
+ FieldObjectExecSpecialAnim(mapObject, sprite);
+ } else
+ {
+ if (!mapObject->mapobj_bit_8)
+ {
+ while (callback(mapObject, sprite));
+ }
+ }
+ DoGroundEffects_OnBeginStep(mapObject, sprite);
+ DoGroundEffects_OnFinishStep(mapObject, sprite);
+ npc_obj_transfer_image_anim_pause_flag(mapObject, sprite);
+ sub_80634D0(mapObject, sprite);
+ FieldObjectUpdateSubpriority(mapObject, sprite);
+}