summaryrefslogtreecommitdiff
path: root/src/field_map_obj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/field_map_obj.c')
-rwxr-xr-xsrc/field_map_obj.c297
1 files changed, 293 insertions, 4 deletions
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index 8c85e7b6d..ede9b2901 100755
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -3182,9 +3182,79 @@ u8 sub_805F2B4(struct MapObject *mapObject, struct Sprite *sprite)
return MoveFieldObjectInNextDirectionInSequence(mapObject, sprite, directions);
};
-void sub_805F2FC(struct Sprite *sprite);
+fieldmap_object_cb(sub_805F2FC, sub_805F320, gUnknown_08375588);
+
+u8 mss_npc_reset_oampriv3_1_unk2_unk3(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ npc_reset(mapObject, sprite);
+ if (mapObject->mapobj_unk_21 == 0)
+ {
+ mapObject->mapobj_unk_21 = player_get_direction_lower_nybble();
+ }
+ sprite->data1 = 1;
+ return 1;
+}
+
+extern u8 (*const gUnknown_08375594[])(struct MapObject *, struct Sprite *, u8, u8);
+
+u8 sub_805F364(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1C == 0xFF || gPlayerAvatar.running1 == 2)
+ {
+ return 0;
+ }
+ return gUnknown_08375594[player_get_x22()](mapObject, sprite, player_get_direction_upper_nybble(), 0);
+}
+
+u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (FieldObjectExecRegularAnim(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_1 = 0;
+ sprite->data1 = 1;
+ }
+ return 0;
+}
+
+#ifdef NONMATCHING
+
+u8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8))
+{
+ return 0;
+}
+
+u8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8))
+{
+ int direction;
+ direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2);
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction));
+ mapObject->mapobj_bit_1 = 1;
+ sprite->data1 = 2;
+ return 1;
+}
+
+u8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8))
+{
+ s16 x;
+ s16 y;
+ int direction;
+ direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2);
+ FieldObjectMoveDestCoords(mapObject, direction, &x, &y);
+ FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction));
+ if (!npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y))))
+ {
+ FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction));
+ }
+ mapObject->mapobj_bit_1 = 1;
+ sprite->data1 = 2;
+ return 1;
+}
+#endif
+
void FieldObjectCB_TreeDisguise(struct Sprite *sprite);
void FieldObjectCB_MountainDisguise(struct Sprite *sprite);
+
+asm(".section .text_fmocb2_c\n");
void sub_805F8E0(struct Sprite *sprite);
void FieldObjectCB_Hidden1(struct Sprite *sprite);
void sub_805FB20(struct Sprite *sprite);
@@ -4082,10 +4152,10 @@ int zffu_offset_calc(u8 a0, u8 a1)
}
#ifdef NONMATCHING
-u8 state_to_direction(u8 a0, u8 a1, u8 a2)
+int 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.")
+ 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;
@@ -4095,7 +4165,7 @@ u8 state_to_direction(u8 a0, u8 a1, u8 a2)
}
#else
__attribute__((naked))
-u8 state_to_direction(u8 a0, u8 a1, u8 a2)
+int state_to_direction(u8 a0, u8 a1, u8 a2)
{
asm(".syntax unified\n\
push {r4,lr}\n\
@@ -4416,3 +4486,222 @@ bool8 sub_806111C(struct MapObject *mapObject, struct Sprite *sprite)
return FALSE;
}
+extern const s16 gUnknown_08375A34[3];
+extern const s16 gUnknown_08375A3A[3];
+
+void sub_806113C(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5)
+{
+ s16 vSPp4[3];
+ s16 x;
+ s16 y;
+ memcpy(vSPp4, gUnknown_08375A34, sizeof gUnknown_08375A34);
+ x = 0;
+ y = 0;
+ FieldObjectSetDirection(mapObject, direction);
+ sub_8060320(direction, &x, &y, vSPp4[a4], vSPp4[a4]);
+ npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y);
+ sub_80646E4(sprite, direction, a4, a5);
+ sprite->data2 = 1;
+ sprite->animPaused = 0;
+ mapObject->mapobj_bit_2 = 1;
+ mapObject->mapobj_bit_4 = 1;
+}
+
+void maybe_shadow_1(struct MapObject *mapObject, struct Sprite *sprite, u8 direction, u8 a4, u8 a5)
+{
+ sub_806113C(mapObject, sprite, direction, a4, a5);
+ sub_805FE28(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18));
+ DoShadowFieldEffect(mapObject);
+}
+
+u8 sub_806123C(struct MapObject *mapObject, struct Sprite *sprite, u8 (*const callback)(struct Sprite *))
+{
+ s16 vSPp4[3];
+ s16 x;
+ s16 y;
+ u8 retval;
+ memcpy(vSPp4, gUnknown_08375A3A, sizeof gUnknown_08375A3A);
+ retval = callback(sprite);
+ if (retval == 1 && vSPp4[sprite->data4] != 0)
+ {
+ x = 0;
+ y = 0;
+ sub_8060320(mapObject->placeholder18, &x, &y, vSPp4[sprite->data4], vSPp4[sprite->data4]);
+ npc_coords_shift(mapObject, mapObject->coords2.x + x, mapObject->coords2.y + y);
+ mapObject->mapobj_bit_2 = 1;
+ mapObject->mapobj_bit_4 = 1;
+ } else if (retval == 0xff)
+ {
+ npc_coords_shift_still(mapObject);
+ mapObject->mapobj_bit_3 = 1;
+ mapObject->mapobj_bit_5 = 1;
+ sprite->animPaused = 1;
+ }
+ return retval;
+}
+
+u8 sub_8061300(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ return sub_806123C(mapObject, sprite, sub_8064704);
+}
+
+u8 sub_8061314(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ return sub_806123C(mapObject, sprite, sub_806478C);
+}
+
+bool8 sub_8061328(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061300(mapObject, sprite) == 0xFF)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061340(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061314(mapObject, sprite) == 0xFF)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061358(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ u8 retval;
+
+ retval = sub_8061300(mapObject, sprite);
+ if (retval != 1)
+ {
+ if (retval == 0xFF)
+ {
+ return TRUE;
+ }
+ return FALSE;
+ }
+ FieldObjectSetDirection(mapObject, GetOppositeDirection(mapObject->placeholder18));
+ sub_805FE64(mapObject, sprite, get_go_image_anim_num(mapObject->mapobj_unk_18));
+ return FALSE;
+}
+
+bool8 sub_80613D4(struct MapObject *, struct Sprite *);
+bool8 sub_806142C(struct MapObject *, struct Sprite *);
+bool8 sub_8061484(struct MapObject *, struct Sprite *);
+bool8 sub_80614DC(struct MapObject *, struct Sprite *);
+
+bool8 sub_80613A8(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_SOUTH, 2, 0);
+ return sub_80613D4(mapObject, sprite);
+}
+
+bool8 sub_80613D4(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061400(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_NORTH, 2, 0);
+ return sub_806142C(mapObject, sprite);
+}
+
+bool8 sub_806142C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_8061458(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_WEST, 2, 0);
+ return sub_8061484(mapObject, sprite);
+}
+
+bool8 sub_8061484(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_80614B0(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ maybe_shadow_1(mapObject, sprite, DIR_EAST, 2, 0);
+ return sub_80614DC(mapObject, sprite);
+}
+
+bool8 sub_80614DC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ if (sub_8061328(mapObject, sprite))
+ {
+ mapObject->mapobj_bit_22 = 0;
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_8061508(struct Sprite *sprite, u16 duration)
+{
+ sprite->data2 = 1;
+ sprite->data3 = duration;
+}
+
+bool8 sub_8061510(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sprite->data3--;
+ if (!sprite->data3)
+ {
+ sprite->data2 = 2;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_806152C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061508(sprite, 1);
+ return sub_8061510(mapObject, sprite);
+}
+
+bool8 sub_806154C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061508(sprite, 2);
+ return sub_8061510(mapObject, sprite);
+}
+
+bool8 sub_806156C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061508(sprite, 4);
+ return sub_8061510(mapObject, sprite);
+}
+
+bool8 sub_806158C(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061508(sprite, 8);
+ return sub_8061510(mapObject, sprite);
+}
+
+bool8 sub_80615AC(struct MapObject *mapObject, struct Sprite *sprite)
+{
+ sub_8061508(sprite, 16);
+ return sub_8061510(mapObject, sprite);
+}