Special anims; meta_step

This commit is contained in:
scnorton
2017-05-23 13:18:23 -04:00
parent 9684b86219
commit f9c54affb6
2 changed files with 80 additions and 166 deletions

View File

@@ -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}

View File

@@ -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);
}