From e6195d71aa25d935a6232ec4dd7384e73f86bd93 Mon Sep 17 00:00:00 2001 From: VicSevenT Date: Fri, 6 Feb 2026 11:43:23 -0600 Subject: [PATCH] Document Field Warp animations and transition --- include/field_map_change.h | 3 +- include/overlay006/field_warp.h | 39 +++ include/overlay006/ov6_02247100.h | 18 -- platinum.us/main.lsf | 2 +- src/field_map_change.c | 66 ++--- src/field_move_tasks.c | 12 +- src/item_use_functions.c | 12 +- src/meson.build | 2 +- src/overlay006/field_warp.c | 443 +++++++++++++++++++++++++++++ src/overlay006/ov6_02247100.c | 452 ------------------------------ 10 files changed, 531 insertions(+), 518 deletions(-) create mode 100644 include/overlay006/field_warp.h delete mode 100644 include/overlay006/ov6_02247100.h create mode 100644 src/overlay006/field_warp.c delete mode 100644 src/overlay006/ov6_02247100.c diff --git a/include/field_map_change.h b/include/field_map_change.h index cc39c2e6a8..03289762e9 100644 --- a/include/field_map_change.h +++ b/include/field_map_change.h @@ -2,6 +2,7 @@ #define POKEPLATINUM_FIELD_MAP_CHANGE_H #include "field/field_system_decl.h" +#include "overlay006/field_warp.h" #include "field_task.h" #include "location.h" @@ -19,7 +20,7 @@ void FieldTask_ChangeMapToLocation(FieldTask *task, int mapId, int warpId, int x void FieldTask_StartMapChangeFull(FieldTask *task, int mapId, int warpId, int x, int z, int dir); void FieldTask_StartMapChangeFly(FieldSystem *fieldSystem, int mapId, int warpId, int x, int z, int dir); void FieldTask_ChangeMapChangeFly(FieldTask *task, int mapId, int warpId, int x, int z, int dir); -void FieldTask_ChangeMapChangeByDig(FieldTask *task, const Location *location, u32 param2); +void FieldTask_ChangeMapChangeByFieldWarp(FieldTask *task, const Location *location, enum FieldWarpType param2); void FieldSystem_StartMapChangeWarpTask(FieldSystem *fieldSystem, int param1, int param2); void *sub_02053FAC(FieldSystem *fieldSystem); void FieldTask_SetUndergroundMapChange(FieldSystem *fieldSystem); diff --git a/include/overlay006/field_warp.h b/include/overlay006/field_warp.h new file mode 100644 index 0000000000..41ee1fd72a --- /dev/null +++ b/include/overlay006/field_warp.h @@ -0,0 +1,39 @@ +#ifndef POKEPLATINUM_FIELD_WARP_H +#define POKEPLATINUM_FIELD_WARP_H + +#include "struct_decls/struct_02061AB4_decl.h" +#include "struct_defs/pokemon.h" + +#include "field/field_system_decl.h" + +#include "field_task.h" +#include "sys_task_manager.h" + +enum FieldWarpType { + FIELD_WARP_TYPE_ESCAPE_ROPE = 0, + FIELD_WARP_TYPE_DIG, + FIELD_WARP_TYPE_TELEPORT, +}; + +typedef struct FieldWarp { + int state; + int animationDelay; + enum FieldWarpType warpType; + SysTask *animationTask; + SysTask *cutInTask; + SysTask *unk_14; + MapObject *player; + FieldSystem *fieldSystem; + Pokemon *mon; +} FieldWarp; + +FieldWarp *FieldWarp_InitEscapeRope(FieldSystem *fieldSystem, enum HeapID heapID); +BOOL FieldWarp_EscapeRopeFadeOut(FieldTask *task); +FieldWarp *FieldWarp_InitFadeIn(FieldSystem *fieldSystem, enum HeapID heapID, enum FieldWarpType warpType); +BOOL FieldWarp_FadeIn(FieldTask *task); +FieldWarp *FieldWarp_InitDig(FieldSystem *, Pokemon *, enum HeapID heapID); +BOOL FieldWarp_DigFadeOut(FieldTask *task); +FieldWarp *FieldWarp_InitTeleport(FieldSystem *fieldSystem, Pokemon *mon, enum HeapID heapID); +BOOL FieldWarp_TeleportFadeOut(FieldTask *task); + +#endif // POKEPLATINUM_FIELD_WARP_H diff --git a/include/overlay006/ov6_02247100.h b/include/overlay006/ov6_02247100.h deleted file mode 100644 index 7ee566df5a..0000000000 --- a/include/overlay006/ov6_02247100.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef POKEPLATINUM_OV6_02247100_H -#define POKEPLATINUM_OV6_02247100_H - -#include "field/field_system_decl.h" - -#include "field_task.h" -#include "pokemon.h" - -void *ov6_02247100(FieldSystem *fieldSystem, enum HeapID heapID); -BOOL ov6_02247120(FieldTask *task); -void *ov6_022472C8(FieldSystem *fieldSystem, enum HeapID heapID, int param2); -BOOL ov6_022472E8(FieldTask *task); -void *ov6_02247488(FieldSystem *, Pokemon *, enum HeapID heapID); -BOOL ov6_022474AC(FieldTask *task); -void *ov6_02247530(FieldSystem *fieldSystem, Pokemon *param1, enum HeapID heapID); -BOOL ov6_02247554(FieldTask *task); - -#endif // POKEPLATINUM_OV6_02247100_H diff --git a/platinum.us/main.lsf b/platinum.us/main.lsf index ca3d6002b9..ebd2094e19 100644 --- a/platinum.us/main.lsf +++ b/platinum.us/main.lsf @@ -580,7 +580,7 @@ Overlay overlay6 Object main.nef.p/src_overlay006_healing_machine_animation_pokecenter.c.o Object main.nef.p/src_overlay006_elevator_animation.c.o Object main.nef.p/src_overlay006_pc_animation.c.o - Object main.nef.p/src_overlay006_ov6_02247100.c.o + Object main.nef.p/src_overlay006_field_warp.c.o Object main.nef.p/src_overlay006_trophy_garden_daily_encounters.c.o Object main.nef.p/src_overlay006_feebas_fishing.c.o Object main.nef.p/src_overlay006_dual_slot_encounters.c.o diff --git a/src/field_map_change.c b/src/field_map_change.c index b3566d35f3..6b5c85a242 100644 --- a/src/field_map_change.c +++ b/src/field_map_change.c @@ -16,8 +16,8 @@ #include "overlay005/ov5_021E135C.h" #include "overlay005/save_info_window.h" #include "overlay005/struct_ov5_021D432C_decl.h" +#include "overlay006/field_warp.h" #include "overlay006/hm_cut_in.h" -#include "overlay006/ov6_02247100.h" #include "overlay023/secret_bases.h" #include "overlay023/underground_comm_manager.h" #include "overlay023/underground_top_screen.h" @@ -97,12 +97,12 @@ typedef struct MapChangeFromErrorData { Location location; } MapChangeFromErrorData; -typedef struct MapChangeDigData { +typedef struct MapChangeFieldWarpData { int state; - int unk_04; + enum FieldWarpType fieldWarpType; SysTask *task; Location location; -} MapChangeDigData; +} MapChangeFieldWarpData; typedef struct MapChangeWarpData { int state; @@ -147,12 +147,12 @@ static void FieldTransition_StartMapAndFadeInFly(FieldTask *task); static BOOL FieldTransition_StartMapAndFadeInFlySub(FieldTask *task); static void FieldTask_FadeInFly(FieldTask *task); static BOOL FieldTask_WaitFadeInFly(FieldTask *task); -static BOOL FieldTask_MapChangeByDig(FieldTask *task); -static void FieldTask_StartFinishFieldMapDig(FieldTask *task); -static BOOL FieldTransition_FinishMapDig(FieldTask *task); -static void FieldTransition_StartMapAndFadeInDig(FieldTask *task); -static BOOL FieldTask_FadeInDig(FieldTask *task); -static void sub_02053E5C(FieldTask *task); +static BOOL FieldTask_MapChangeByFieldWarp(FieldTask *task); +static void FieldTask_StartFinishFieldMapFieldWarp(FieldTask *task); +static BOOL FieldTransition_FinishMapFieldWarp(FieldTask *task); +static void FieldTransition_StartMapAndFadeInFieldWarp(FieldTask *task); +static BOOL FieldTransition_StartMapAndFadeInFieldWarpSub(FieldTask *task); +static void FieldTask_FadeInFieldWarp(FieldTask *task); static BOOL sub_0205444C(FieldTask *task, int param1); static const MapLoadMode sMapLoadMode[] = { @@ -893,28 +893,28 @@ static BOOL FieldTask_WaitFadeInFly(FieldTask *task) return FALSE; } -void FieldTask_ChangeMapChangeByDig(FieldTask *task, const Location *location, u32 param2) +void FieldTask_ChangeMapChangeByFieldWarp(FieldTask *task, const Location *location, enum FieldWarpType fieldWarpType) { - MapChangeDigData *mapChangeData = Heap_AllocAtEnd(HEAP_ID_FIELD2, sizeof(MapChangeDigData)); + MapChangeFieldWarpData *mapChangeData = Heap_AllocAtEnd(HEAP_ID_FIELD2, sizeof(MapChangeFieldWarpData)); mapChangeData->state = 0; - mapChangeData->unk_04 = param2; + mapChangeData->fieldWarpType = fieldWarpType; mapChangeData->task = NULL; mapChangeData->location = *location; - FieldTask_InitJump(task, FieldTask_MapChangeByDig, mapChangeData); + FieldTask_InitJump(task, FieldTask_MapChangeByFieldWarp, mapChangeData); } -static BOOL FieldTask_MapChangeByDig(FieldTask *task) +static BOOL FieldTask_MapChangeByFieldWarp(FieldTask *task) { FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); - MapChangeDigData *mapChangeData = FieldTask_GetEnv(task); + MapChangeFieldWarpData *mapChangeData = FieldTask_GetEnv(task); Location *location = &mapChangeData->location; switch (mapChangeData->state) { case 0: Sound_TryFadeInBGM(fieldSystem, location->mapId); - FieldTask_StartFinishFieldMapDig(task); + FieldTask_StartFinishFieldMapFieldWarp(task); mapChangeData->state++; break; case 1: @@ -929,15 +929,15 @@ static BOOL FieldTask_MapChangeByDig(FieldTask *task) Sound_PlayMapBGM(fieldSystem, location->mapId); - if (mapChangeData->unk_04 == 2) { + if (mapChangeData->fieldWarpType == FIELD_WARP_TYPE_TELEPORT) { FieldSystem_SetTeleportFlags(fieldSystem); - } else if ((mapChangeData->unk_04 == 0) || (mapChangeData->unk_04 == 1)) { + } else if ((mapChangeData->fieldWarpType == FIELD_WARP_TYPE_ESCAPE_ROPE) || (mapChangeData->fieldWarpType == FIELD_WARP_TYPE_DIG)) { FieldSystem_SetEscapeFlags(fieldSystem); } else { GF_ASSERT(FALSE); } - FieldTransition_StartMapAndFadeInDig(task); + FieldTransition_StartMapAndFadeInFieldWarp(task); mapChangeData->state++; break; case 3: @@ -948,12 +948,12 @@ static BOOL FieldTask_MapChangeByDig(FieldTask *task) return FALSE; } -static void FieldTask_StartFinishFieldMapDig(FieldTask *task) +static void FieldTask_StartFinishFieldMapFieldWarp(FieldTask *task) { - FieldTask_InitCall(task, FieldTransition_FinishMapDig, NULL); + FieldTask_InitCall(task, FieldTransition_FinishMapFieldWarp, NULL); } -static BOOL FieldTransition_FinishMapDig(FieldTask *task) +static BOOL FieldTransition_FinishMapFieldWarp(FieldTask *task) { int *state = FieldTask_GetState(task); @@ -969,17 +969,17 @@ static BOOL FieldTransition_FinishMapDig(FieldTask *task) return FALSE; } -static void FieldTransition_StartMapAndFadeInDig(FieldTask *task) +static void FieldTransition_StartMapAndFadeInFieldWarp(FieldTask *task) { - MapChangeDigData *mapChangeData = FieldTask_GetEnv(task); - FieldTask_InitCall(task, FieldTask_FadeInDig, mapChangeData); + MapChangeFieldWarpData *mapChangeData = FieldTask_GetEnv(task); + FieldTask_InitCall(task, FieldTransition_StartMapAndFadeInFieldWarpSub, mapChangeData); } -static BOOL FieldTask_FadeInDig(FieldTask *task) +static BOOL FieldTransition_StartMapAndFadeInFieldWarpSub(FieldTask *task) { int *state = FieldTask_GetState(task); FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); - MapChangeDigData *mapChangeData = FieldTask_GetEnv(task); + MapChangeFieldWarpData *mapChangeData = FieldTask_GetEnv(task); switch (*state) { case 0: @@ -988,7 +988,7 @@ static BOOL FieldTask_FadeInDig(FieldTask *task) break; case 1: FieldSystem_RequestLocationName(fieldSystem); - sub_02053E5C(task); + FieldTask_FadeInFieldWarp(task); (*state)++; break; case 2: @@ -998,18 +998,18 @@ static BOOL FieldTask_FadeInDig(FieldTask *task) return FALSE; } -static void sub_02053E5C(FieldTask *task) +static void FieldTask_FadeInFieldWarp(FieldTask *task) { FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); - MapChangeDigData *mapChangeData = FieldTask_GetEnv(task); + MapChangeFieldWarpData *mapChangeData = FieldTask_GetEnv(task); if (!FieldSystem_HasParentProcess(fieldSystem)) { GF_ASSERT(FALSE); return; } - void *v2 = ov6_022472C8(fieldSystem, HEAP_ID_FIELD1, mapChangeData->unk_04); - FieldTask_InitCall(task, ov6_022472E8, v2); + FieldWarp *fieldwarp = FieldWarp_InitFadeIn(fieldSystem, HEAP_ID_FIELD1, mapChangeData->fieldWarpType); + FieldTask_InitCall(task, FieldWarp_FadeIn, fieldwarp); } static BOOL FieldTask_MapChangeWarp(FieldTask *task) diff --git a/src/field_move_tasks.c b/src/field_move_tasks.c index 25ec31148e..36150f2261 100644 --- a/src/field_move_tasks.c +++ b/src/field_move_tasks.c @@ -17,7 +17,7 @@ #include "field/field_system.h" #include "overlay005/ov5_021DFB54.h" #include "overlay005/ov5_021F101C.h" -#include "overlay006/ov6_02247100.h" +#include "overlay006/field_warp.h" #include "field_overworld_state.h" #include "field_task.h" @@ -691,12 +691,12 @@ static BOOL FieldMoves_TeleportTask(FieldTask *param0) { FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0); UnkStruct_020711C8 *v1 = FieldTask_GetEnv(param0); - void *v2 = ov6_02247530(fieldSystem, v1->unk_00, HEAP_ID_FIELD1); + FieldWarp *fieldWarp = FieldWarp_InitTeleport(fieldSystem, v1->unk_00, HEAP_ID_FIELD1); Heap_Free(v1); - FieldTask_InitJump(param0, ov6_02247554, v2); + FieldTask_InitJump(param0, FieldWarp_TeleportFadeOut, fieldWarp); - return 0; + return FALSE; } static enum FieldMoveError FieldMoves_CheckDig(const FieldMoveContext *fieldMoveContext) @@ -734,13 +734,13 @@ static BOOL FieldMoves_DigTask(FieldTask *param0) { FieldSystem *fieldSystem = FieldTask_GetFieldSystem(param0); UnkStruct_020711C8 *v1 = FieldTask_GetEnv(param0); - void *v2 = ov6_02247488(fieldSystem, v1->unk_00, HEAP_ID_FIELD2); + FieldWarp *fieldWarp = FieldWarp_InitDig(fieldSystem, v1->unk_00, HEAP_ID_FIELD2); void *journalEntryLocationEvent = JournalEntry_CreateEventUsedMove(LOCATION_EVENT_USED_DIG - LOCATION_EVENT_USED_CUT, fieldSystem->location->mapId, HEAP_ID_FIELD1); JournalEntry_SaveData(fieldSystem->journalEntry, journalEntryLocationEvent, JOURNAL_LOCATION); Heap_Free(v1); - FieldTask_InitJump(param0, ov6_022474AC, v2); + FieldTask_InitJump(param0, FieldWarp_DigFadeOut, fieldWarp); return FALSE; } diff --git a/src/item_use_functions.c b/src/item_use_functions.c index 678536fbf2..cb68b95921 100644 --- a/src/item_use_functions.c +++ b/src/item_use_functions.c @@ -20,7 +20,7 @@ #include "overlay005/ov5_021F007C.h" #include "overlay005/save_info_window.h" #include "overlay005/struct_ov5_021F0468_decl.h" -#include "overlay006/ov6_02247100.h" +#include "overlay006/field_warp.h" #include "savedata/save_table.h" #include "bag.h" @@ -132,7 +132,7 @@ static BOOL MountOrUnmountBicycle(FieldTask *task); static BOOL PrintRegisteredKeyItemUseMessage(FieldTask *task); static void RegisteredItem_CreateGoToAppTask(ItemFieldUseContext *usageContext, void *param1); static BOOL RegisteredItem_GoToApp(FieldTask *task); -static BOOL sub_020690F0(FieldTask *task); +static BOOL WarpWithEscapeRope(FieldTask *task); static BOOL sub_020685AC(FieldTask *task); static void PrintRegisteredKeyItemError(ItemFieldUseContext *usageContext, u32 param1); @@ -938,7 +938,7 @@ static void UseEscapeRopeFromMenu(ItemMenuUseContext *usageContext, const ItemUs FieldSystem_StartFieldMap(fieldSystem); - menu->callback = sub_020690F0; + menu->callback = WarpWithEscapeRope; menu->taskData = NULL; menu->state = START_MENU_STATE_10; @@ -958,12 +958,12 @@ static enum ItemUseCheckResult CanUseEscapeRope(const ItemUseContext *usageConte return ITEM_USE_CANNOT_USE_GENERIC; } -static BOOL sub_020690F0(FieldTask *task) +static BOOL WarpWithEscapeRope(FieldTask *task) { FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); - void *v1 = ov6_02247100(fieldSystem, HEAP_ID_FIELD2); + FieldWarp *fieldWarp = FieldWarp_InitEscapeRope(fieldSystem, HEAP_ID_FIELD2); - FieldTask_InitJump(task, ov6_02247120, v1); + FieldTask_InitJump(task, FieldWarp_EscapeRopeFadeOut, fieldWarp); return FALSE; } diff --git a/src/meson.build b/src/meson.build index 3a92cf0802..11f08bfff4 100644 --- a/src/meson.build +++ b/src/meson.build @@ -468,7 +468,7 @@ pokeplatinum_c = files( 'overlay006/healing_machine_animation/pokecenter.c', 'overlay006/elevator_animation.c', 'overlay006/pc_animation.c', - 'overlay006/ov6_02247100.c', + 'overlay006/field_warp.c', 'overlay006/trophy_garden_daily_encounters.c', 'overlay006/feebas_fishing.c', 'overlay006/dual_slot_encounters.c', diff --git a/src/overlay006/field_warp.c b/src/overlay006/field_warp.c new file mode 100644 index 0000000000..afb41fd289 --- /dev/null +++ b/src/overlay006/field_warp.c @@ -0,0 +1,443 @@ +#include "overlay006/field_warp.h" + +#include +#include + +#include "generated/journal_location_events.h" + +#include "struct_decls/struct_0203A790_decl.h" + +#include "field/field_system.h" +#include "overlay005/map_object_anim_cmd.h" +#include "overlay005/ov5_021F0EB0.h" +#include "overlay006/hm_cut_in.h" + +#include "field_map_change.h" +#include "field_overworld_state.h" +#include "field_task.h" +#include "heap.h" +#include "journal.h" +#include "location.h" +#include "player_avatar.h" +#include "screen_fade.h" +#include "sound_playback.h" +#include "unk_0203A7D8.h" +#include "unk_020655F4.h" + +enum FieldWarpStateResult { + STATE_RESULT_NEXT_STATE = 0, + STATE_RESULT_REPEAT_STATE, + STATE_RESULT_END_TASK, +}; + +typedef enum FieldWarpStateResult (*FieldWarpStateFunc)(FieldTask *, FieldSystem *, FieldWarp *); + +static FieldWarp *FieldWarp_New(enum HeapID heapID, u32 size); +static void CreateJournalEntryForWarp(FieldSystem *fieldSystem, FieldWarp *fieldWarp); +static enum FieldWarpStateResult StartWarpOutSpinning(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp); +static enum FieldWarpStateResult StartFadeOut(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp); +static enum FieldWarpStateResult FinishFadeOut(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp); +static enum FieldWarpStateResult ChangeMap(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp); +static enum FieldWarpStateResult StartFadeIn(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp); +static enum FieldWarpStateResult FinishFadeIn(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp); +static enum FieldWarpStateResult SlowDownWarpInSpinning(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp); +static enum FieldWarpStateResult FinishWarpInAnimation(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp); +static enum FieldWarpStateResult StartFieldMoveCutIn(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp); +static enum FieldWarpStateResult FinishFieldMoveCutIn(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp); + +static const FieldWarpStateFunc sEscapeRopeStates[] = { + StartWarpOutSpinning, + StartFadeOut, + FinishFadeOut, + ChangeMap +}; + +static const FieldWarpStateFunc sFieldWarpFadeInStates[] = { + StartFadeIn, + FinishFadeIn, + SlowDownWarpInSpinning, + FinishWarpInAnimation +}; + +static const FieldWarpStateFunc sDigTeleportStates[] = { + StartFieldMoveCutIn, + FinishFieldMoveCutIn, + StartWarpOutSpinning, + StartFadeOut, + FinishFadeOut, + ChangeMap +}; + +static const MapObjectAnimCmd sWarpFastSpinningAnimation[] = { + { MOVEMENT_ACTION_FACE_NORTH, 1 }, + { MOVEMENT_ACTION_FACE_EAST, 1 }, + { MOVEMENT_ACTION_FACE_SOUTH, 1 }, + { MOVEMENT_ACTION_FACE_WEST, 1 }, + { MOVEMENT_ACTION_END, 0 } +}; + +static const MapObjectAnimCmd sFadeOutWarpAnimation[] = { + { MOVEMENT_ACTION_FACE_SOUTH, 1 }, + { MOVEMENT_ACTION_DELAY_1, 2 }, + { MOVEMENT_ACTION_FACE_WEST, 1 }, + { MOVEMENT_ACTION_DELAY_1, 2 }, + { MOVEMENT_ACTION_FACE_NORTH, 1 }, + { MOVEMENT_ACTION_DELAY_1, 2 }, + { MOVEMENT_ACTION_FACE_EAST, 1 }, + { MOVEMENT_ACTION_DELAY_1, 2 }, + { MOVEMENT_ACTION_FACE_SOUTH, 1 }, + { MOVEMENT_ACTION_DELAY_1, 1 }, + { MOVEMENT_ACTION_FACE_WEST, 1 }, + { MOVEMENT_ACTION_DELAY_1, 1 }, + { MOVEMENT_ACTION_FACE_NORTH, 1 }, + { MOVEMENT_ACTION_DELAY_1, 1 }, + { MOVEMENT_ACTION_FACE_EAST, 1 }, + { MOVEMENT_ACTION_DELAY_1, 1 }, + { MOVEMENT_ACTION_FACE_SOUTH, 1 }, + { MOVEMENT_ACTION_FACE_WEST, 1 }, + { MOVEMENT_ACTION_FACE_NORTH, 1 }, + { MOVEMENT_ACTION_FACE_EAST, 1 }, + { MOVEMENT_ACTION_FACE_SOUTH, 1 }, + { MOVEMENT_ACTION_FACE_WEST, 1 }, + { MOVEMENT_ACTION_FACE_NORTH, 1 }, + { MOVEMENT_ACTION_FACE_EAST, 1 }, + { MOVEMENT_ACTION_END, 0 } +}; + +static const MapObjectAnimCmd sFadeInWarpAnimation[] = { + { MOVEMENT_ACTION_FACE_SOUTH, 1 }, + { MOVEMENT_ACTION_FACE_WEST, 1 }, + { MOVEMENT_ACTION_FACE_NORTH, 1 }, + { MOVEMENT_ACTION_FACE_EAST, 1 }, + { MOVEMENT_ACTION_FACE_SOUTH, 1 }, + { MOVEMENT_ACTION_FACE_WEST, 1 }, + { MOVEMENT_ACTION_FACE_NORTH, 1 }, + { MOVEMENT_ACTION_FACE_EAST, 1 }, + { MOVEMENT_ACTION_FACE_SOUTH, 1 }, + { MOVEMENT_ACTION_DELAY_1, 1 }, + { MOVEMENT_ACTION_FACE_WEST, 1 }, + { MOVEMENT_ACTION_DELAY_1, 1 }, + { MOVEMENT_ACTION_FACE_NORTH, 1 }, + { MOVEMENT_ACTION_DELAY_1, 1 }, + { MOVEMENT_ACTION_FACE_EAST, 1 }, + { MOVEMENT_ACTION_DELAY_1, 1 }, + { MOVEMENT_ACTION_FACE_SOUTH, 1 }, + { MOVEMENT_ACTION_DELAY_1, 2 }, + { MOVEMENT_ACTION_FACE_WEST, 1 }, + { MOVEMENT_ACTION_DELAY_1, 3 }, + { MOVEMENT_ACTION_FACE_NORTH, 1 }, + { MOVEMENT_ACTION_DELAY_1, 4 }, + { MOVEMENT_ACTION_FACE_EAST, 1 }, + { MOVEMENT_ACTION_DELAY_1, 5 }, + { MOVEMENT_ACTION_FACE_SOUTH, 1 }, + { MOVEMENT_ACTION_END, 0 } +}; + +FieldWarp *FieldWarp_InitEscapeRope(FieldSystem *fieldSystem, enum HeapID heapID) +{ + FieldWarp *fieldWarp = FieldWarp_New(heapID, sizeof(FieldWarp)); + + fieldWarp->warpType = FIELD_WARP_TYPE_ESCAPE_ROPE; + fieldWarp->fieldSystem = fieldSystem; + fieldWarp->player = Player_MapObject(fieldSystem->playerAvatar); + + return fieldWarp; +} + +BOOL FieldWarp_EscapeRopeFadeOut(FieldTask *task) +{ + enum FieldWarpStateResult stateResult; + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); + FieldWarp *fieldWarp = FieldTask_GetEnv(task); + + do { + stateResult = sEscapeRopeStates[fieldWarp->state](task, fieldSystem, fieldWarp); + + if (stateResult == STATE_RESULT_END_TASK) { + Heap_Free(fieldWarp); + } + } while (stateResult == STATE_RESULT_REPEAT_STATE); + + return FALSE; +} + +static enum FieldWarpStateResult StartWarpOutSpinning(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp) +{ + fieldWarp->unk_14 = ov5_021F0EB0(fieldSystem, HEAP_ID_FIELD1); + ov5_021F0F10(fieldWarp->unk_14, 1, FX32_CONST(-150), 15); + fieldWarp->animationTask = MapObject_StartAnimation(fieldWarp->player, sFadeOutWarpAnimation); + fieldWarp->state++; + + switch (fieldWarp->warpType) { + case FIELD_WARP_TYPE_ESCAPE_ROPE: + Sound_PlayEffect(SEQ_SE_DP_KAIDAN2); + break; + case FIELD_WARP_TYPE_DIG: + Sound_PlayEffect(SEQ_SE_DP_KAIDAN2); + break; + case FIELD_WARP_TYPE_TELEPORT: + Sound_PlayEffect(SEQ_SE_DP_TELE); + break; + } + + return STATE_RESULT_NEXT_STATE; +} + +static enum FieldWarpStateResult StartFadeOut(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp) +{ + if (!MapObject_HasAnimationEnded(fieldWarp->animationTask)) { + return STATE_RESULT_NEXT_STATE; + } + + MapObject_FinishAnimation(fieldWarp->animationTask); + + fieldWarp->animationTask = MapObject_StartAnimation(fieldWarp->player, sWarpFastSpinningAnimation); + fieldWarp->animationDelay++; + + if (fieldWarp->animationDelay < 8) { + return STATE_RESULT_NEXT_STATE; + } + + if (fieldWarp->warpType == FIELD_WARP_TYPE_TELEPORT) { + StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 6, 1, HEAP_ID_FIELD1); + } else { + StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_WHITE, 6, 1, HEAP_ID_FIELD1); + } + + fieldWarp->state++; + return STATE_RESULT_NEXT_STATE; +} + +static enum FieldWarpStateResult FinishFadeOut(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp) +{ + if (MapObject_HasAnimationEnded(fieldWarp->animationTask) == TRUE) { + MapObject_FinishAnimation(fieldWarp->animationTask); + fieldWarp->animationTask = MapObject_StartAnimation(fieldWarp->player, sWarpFastSpinningAnimation); + } + + if (!IsScreenFadeDone()) { + return STATE_RESULT_NEXT_STATE; + } + + MapObject_FinishAnimation(fieldWarp->animationTask); + ov5_021F0EFC(fieldWarp->unk_14); + + fieldWarp->state++; + + return STATE_RESULT_REPEAT_STATE; +} + +static enum FieldWarpStateResult ChangeMap(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp) +{ + FieldOverworldState *fieldState = SaveData_GetFieldOverworldState(fieldSystem->saveData); + + if (fieldWarp->warpType == FIELD_WARP_TYPE_TELEPORT) { + Location location; + + u16 warpId = FieldOverworldState_GetWarpId(fieldState); + Location_InitFly(warpId, &location); + FieldTask_ChangeMapChangeByFieldWarp(task, &location, fieldWarp->warpType); + } else { + Location *location = FieldOverworldState_GetExitLocation(fieldState); + FieldTask_ChangeMapChangeByFieldWarp(task, location, fieldWarp->warpType); + } + + return STATE_RESULT_END_TASK; +} + +FieldWarp *FieldWarp_InitFadeIn(FieldSystem *fieldSystem, enum HeapID heapID, enum FieldWarpType warpType) +{ + FieldWarp *fieldWarp = FieldWarp_New(heapID, sizeof(FieldWarp)); + + fieldWarp->warpType = warpType; + fieldWarp->fieldSystem = fieldSystem; + fieldWarp->player = Player_MapObject(fieldSystem->playerAvatar); + + return fieldWarp; +} + +BOOL FieldWarp_FadeIn(FieldTask *task) +{ + enum FieldWarpStateResult stateResult; + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); + FieldWarp *fieldWarp = FieldTask_GetEnv(task); + + do { + stateResult = sFieldWarpFadeInStates[fieldWarp->state](task, fieldSystem, fieldWarp); + + if (stateResult == STATE_RESULT_END_TASK) { + CreateJournalEntryForWarp(fieldSystem, fieldWarp); + Heap_Free(fieldWarp); + return TRUE; + } + } while (stateResult == STATE_RESULT_REPEAT_STATE); + + return FALSE; +} + +static void CreateJournalEntryForWarp(FieldSystem *fieldSystem, FieldWarp *fieldWarp) +{ + if (fieldWarp->warpType != FIELD_WARP_TYPE_TELEPORT) { + return; + } + + void *journalEntryLocationEvent = JournalEntry_CreateEventUsedMove(LOCATION_EVENT_WARPED_TO_LOCATION - LOCATION_EVENT_USED_CUT, fieldSystem->location->mapId, HEAP_ID_FIELD1); + JournalEntry_SaveData(fieldSystem->journalEntry, journalEntryLocationEvent, JOURNAL_LOCATION); +} + +static enum FieldWarpStateResult StartFadeIn(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp) +{ + if (fieldWarp->warpType == FIELD_WARP_TYPE_TELEPORT) { + StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_BLACK, 6, 1, HEAP_ID_FIELD1); + } else { + StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_WHITE, 6, 1, HEAP_ID_FIELD1); + } + + fieldWarp->unk_14 = ov5_021F0EB0(fieldSystem, HEAP_ID_FIELD1); + ov5_021F0F10(fieldWarp->unk_14, 1, FX32_CONST(-150), 1); + fieldWarp->animationTask = MapObject_StartAnimation(fieldWarp->player, sWarpFastSpinningAnimation); + fieldWarp->state++; + + return STATE_RESULT_NEXT_STATE; +} + +static enum FieldWarpStateResult FinishFadeIn(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp) +{ + if (MapObject_HasAnimationEnded(fieldWarp->animationTask) == TRUE) { + MapObject_FinishAnimation(fieldWarp->animationTask); + fieldWarp->animationTask = MapObject_StartAnimation(fieldWarp->player, sWarpFastSpinningAnimation); + } + + if (!IsScreenFadeDone()) { + return STATE_RESULT_NEXT_STATE; + } + + ov5_021F0F10(fieldWarp->unk_14, 2, 0, 60); + + fieldWarp->state++; + return STATE_RESULT_REPEAT_STATE; +} + +static enum FieldWarpStateResult SlowDownWarpInSpinning(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp) +{ + if (!MapObject_HasAnimationEnded(fieldWarp->animationTask)) { + return STATE_RESULT_NEXT_STATE; + } + + MapObject_FinishAnimation(fieldWarp->animationTask); + fieldWarp->animationDelay++; + + if (fieldWarp->animationDelay < 4) { + fieldWarp->animationTask = MapObject_StartAnimation(fieldWarp->player, sWarpFastSpinningAnimation); + return STATE_RESULT_NEXT_STATE; + } + + fieldWarp->animationTask = MapObject_StartAnimation(fieldWarp->player, sFadeInWarpAnimation); + fieldWarp->state++; + + return STATE_RESULT_NEXT_STATE; +} + +static enum FieldWarpStateResult FinishWarpInAnimation(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp) +{ + if (!MapObject_HasAnimationEnded(fieldWarp->animationTask)) { + return STATE_RESULT_NEXT_STATE; + } + + if (!ov5_021F0EF0(fieldWarp->unk_14)) { + return STATE_RESULT_NEXT_STATE; + } + + ov5_021F0EFC(fieldWarp->unk_14); + MapObject_FinishAnimation(fieldWarp->animationTask); + + return STATE_RESULT_END_TASK; +} + +FieldWarp *FieldWarp_InitDig(FieldSystem *fieldSystem, Pokemon *mon, enum HeapID heapID) +{ + FieldWarp *fieldWarp = FieldWarp_New(heapID, sizeof(FieldWarp)); + + fieldWarp->warpType = FIELD_WARP_TYPE_DIG; + fieldWarp->fieldSystem = fieldSystem; + fieldWarp->player = Player_MapObject(fieldSystem->playerAvatar); + fieldWarp->mon = mon; + + return fieldWarp; +} + +BOOL FieldWarp_DigFadeOut(FieldTask *task) +{ + enum FieldWarpStateResult stateResult; + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); + FieldWarp *fieldWarp = FieldTask_GetEnv(task); + + do { + stateResult = sDigTeleportStates[fieldWarp->state](task, fieldSystem, fieldWarp); + + if (stateResult == STATE_RESULT_END_TASK) { + Heap_Free(fieldWarp); + } + } while (stateResult == STATE_RESULT_REPEAT_STATE); + + return FALSE; +} + +static enum FieldWarpStateResult StartFieldMoveCutIn(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp) +{ + int gender = PlayerAvatar_Gender(fieldSystem->playerAvatar); + + fieldWarp->cutInTask = SysTask_HMCutIn_New(fieldSystem, 0, fieldWarp->mon, gender); + fieldWarp->state++; + + return STATE_RESULT_NEXT_STATE; +} + +static enum FieldWarpStateResult FinishFieldMoveCutIn(FieldTask *task, FieldSystem *fieldSystem, FieldWarp *fieldWarp) +{ + if (CheckHMCutInFinished(fieldWarp->cutInTask) == FALSE) { + return STATE_RESULT_NEXT_STATE; + } + + SysTask_HMCutIn_SetTaskDone(fieldWarp->cutInTask); + fieldWarp->state++; + return STATE_RESULT_REPEAT_STATE; +} + +FieldWarp *FieldWarp_InitTeleport(FieldSystem *fieldSystem, Pokemon *mon, enum HeapID heapID) +{ + FieldWarp *fieldWarp = FieldWarp_New(heapID, sizeof(FieldWarp)); + + fieldWarp->warpType = FIELD_WARP_TYPE_TELEPORT; + fieldWarp->fieldSystem = fieldSystem; + fieldWarp->player = Player_MapObject(fieldSystem->playerAvatar); + fieldWarp->mon = mon; + + return fieldWarp; +} + +BOOL FieldWarp_TeleportFadeOut(FieldTask *task) +{ + enum FieldWarpStateResult stateResult; + FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); + FieldWarp *fieldWarp = FieldTask_GetEnv(task); + + do { + stateResult = sDigTeleportStates[fieldWarp->state](task, fieldSystem, fieldWarp); + + if (stateResult == STATE_RESULT_END_TASK) { + Heap_Free(fieldWarp); + } + } while (stateResult == STATE_RESULT_REPEAT_STATE); + + return FALSE; +} + +static FieldWarp *FieldWarp_New(enum HeapID heapID, u32 size) +{ + FieldWarp *fieldWarp = Heap_AllocAtEnd(heapID, size); + + GF_ASSERT(fieldWarp != NULL); + memset(fieldWarp, 0, size); + return fieldWarp; +} diff --git a/src/overlay006/ov6_02247100.c b/src/overlay006/ov6_02247100.c deleted file mode 100644 index cc3d301ba4..0000000000 --- a/src/overlay006/ov6_02247100.c +++ /dev/null @@ -1,452 +0,0 @@ -#include "overlay006/ov6_02247100.h" - -#include -#include - -#include "generated/journal_location_events.h" - -#include "struct_decls/struct_0203A790_decl.h" -#include "struct_decls/struct_02061AB4_decl.h" - -#include "field/field_system.h" -#include "overlay005/map_object_anim_cmd.h" -#include "overlay005/ov5_021F0EB0.h" -#include "overlay006/hm_cut_in.h" - -#include "field_map_change.h" -#include "field_overworld_state.h" -#include "field_task.h" -#include "heap.h" -#include "journal.h" -#include "location.h" -#include "player_avatar.h" -#include "pokemon.h" -#include "screen_fade.h" -#include "sound_playback.h" -#include "sys_task_manager.h" -#include "unk_0203A7D8.h" -#include "unk_020655F4.h" - -typedef struct { - int unk_00; - int unk_04; - int unk_08; - SysTask *unk_0C; - SysTask *unk_10; - SysTask *unk_14; - MapObject *unk_18; - FieldSystem *fieldSystem; - Pokemon *unk_20; -} UnkStruct_ov6_02247100; - -static void *ov6_02247590(enum HeapID heapID, u32 param1); -static void ov6_0224732C(FieldSystem *fieldSystem, UnkStruct_ov6_02247100 *param1); - -int (*const Unk_ov6_022495CC[])(FieldTask *, FieldSystem *, UnkStruct_ov6_02247100 *); -int (*const Unk_ov6_022495BC[])(FieldTask *, FieldSystem *, UnkStruct_ov6_02247100 *); -int (*const Unk_ov6_022495F0[])(FieldTask *, FieldSystem *, UnkStruct_ov6_02247100 *); - -const MapObjectAnimCmd Unk_ov6_02249608[]; -const MapObjectAnimCmd Unk_ov6_022495DC[]; -const MapObjectAnimCmd Unk_ov6_0224966C[]; - -void *ov6_02247100(FieldSystem *fieldSystem, enum HeapID heapID) -{ - UnkStruct_ov6_02247100 *v0 = ov6_02247590(heapID, sizeof(UnkStruct_ov6_02247100)); - - v0->unk_08 = 0; - v0->fieldSystem = fieldSystem; - v0->unk_18 = Player_MapObject(fieldSystem->playerAvatar); - - return v0; -} - -BOOL ov6_02247120(FieldTask *task) -{ - int v0; - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); - UnkStruct_ov6_02247100 *v2 = FieldTask_GetEnv(task); - - do { - v0 = Unk_ov6_022495CC[v2->unk_00](task, fieldSystem, v2); - - if (v0 == 2) { - Heap_Free(v2); - } - } while (v0 == 1); - - return 0; -} - -static int ov6_0224715C(FieldTask *task, FieldSystem *fieldSystem, UnkStruct_ov6_02247100 *param2) -{ - param2->unk_14 = ov5_021F0EB0(fieldSystem, HEAP_ID_FIELD1); - ov5_021F0F10(param2->unk_14, 1, (FX32_ONE * -150), 15); - param2->unk_0C = MapObject_StartAnimation(param2->unk_18, Unk_ov6_02249608); - param2->unk_00++; - - switch (param2->unk_08) { - case 0: - Sound_PlayEffect(SEQ_SE_DP_KAIDAN2); - break; - case 1: - Sound_PlayEffect(SEQ_SE_DP_KAIDAN2); - break; - case 2: - Sound_PlayEffect(SEQ_SE_DP_TELE); - break; - } - - return 0; -} - -static int ov6_022471C0(FieldTask *task, FieldSystem *fieldSystem, UnkStruct_ov6_02247100 *param2) -{ - if (MapObject_HasAnimationEnded(param2->unk_0C) == 0) { - return 0; - } - - MapObject_FinishAnimation(param2->unk_0C); - - param2->unk_0C = MapObject_StartAnimation(param2->unk_18, Unk_ov6_022495DC); - param2->unk_04++; - - if (param2->unk_04 < 8) { - return 0; - } - - if (param2->unk_08 == 2) { - StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_BLACK, 6, 1, HEAP_ID_FIELD1); - } else { - StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_OUT, FADE_TYPE_BRIGHTNESS_OUT, COLOR_WHITE, 6, 1, HEAP_ID_FIELD1); - } - - param2->unk_00++; - return 0; -} - -static int ov6_02247244(FieldTask *task, FieldSystem *fieldSystem, UnkStruct_ov6_02247100 *param2) -{ - if (MapObject_HasAnimationEnded(param2->unk_0C) == 1) { - MapObject_FinishAnimation(param2->unk_0C); - param2->unk_0C = MapObject_StartAnimation(param2->unk_18, Unk_ov6_022495DC); - } - - if (IsScreenFadeDone() == FALSE) { - return 0; - } - - MapObject_FinishAnimation(param2->unk_0C); - ov5_021F0EFC(param2->unk_14); - - param2->unk_00++; - - return 1; -} - -static int ov6_02247288(FieldTask *task, FieldSystem *fieldSystem, UnkStruct_ov6_02247100 *param2) -{ - FieldOverworldState *fieldState = SaveData_GetFieldOverworldState(fieldSystem->saveData); - - if (param2->unk_08 == 2) { - u16 warpId; - Location location; - - warpId = FieldOverworldState_GetWarpId(fieldState); - Location_InitFly(warpId, &location); - FieldTask_ChangeMapChangeByDig(task, &location, param2->unk_08); - } else { - Location *location = FieldOverworldState_GetExitLocation(fieldState); - FieldTask_ChangeMapChangeByDig(task, location, param2->unk_08); - } - - return 2; -} - -static int (*const Unk_ov6_022495CC[])(FieldTask *, FieldSystem *, UnkStruct_ov6_02247100 *) = { - ov6_0224715C, - ov6_022471C0, - ov6_02247244, - ov6_02247288 -}; - -void *ov6_022472C8(FieldSystem *fieldSystem, enum HeapID heapID, int param2) -{ - UnkStruct_ov6_02247100 *v0 = ov6_02247590(heapID, sizeof(UnkStruct_ov6_02247100)); - - v0->unk_08 = param2; - v0->fieldSystem = fieldSystem; - v0->unk_18 = Player_MapObject(fieldSystem->playerAvatar); - - return v0; -} - -BOOL ov6_022472E8(FieldTask *task) -{ - int v0; - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); - UnkStruct_ov6_02247100 *v2 = FieldTask_GetEnv(task); - - do { - v0 = Unk_ov6_022495BC[v2->unk_00](task, fieldSystem, v2); - - if (v0 == 2) { - ov6_0224732C(fieldSystem, v2); - Heap_Free(v2); - return 1; - } - } while (v0 == 1); - - return 0; -} - -static void ov6_0224732C(FieldSystem *fieldSystem, UnkStruct_ov6_02247100 *param1) -{ - void *journalEntryLocationEvent; - - if (param1->unk_08 == 2) { - journalEntryLocationEvent = JournalEntry_CreateEventUsedMove(LOCATION_EVENT_WARPED_TO_LOCATION - LOCATION_EVENT_USED_CUT, fieldSystem->location->mapId, HEAP_ID_FIELD1); - } else { - return; - } - - JournalEntry_SaveData(fieldSystem->journalEntry, journalEntryLocationEvent, JOURNAL_LOCATION); -} - -static int ov6_02247354(FieldTask *task, FieldSystem *fieldSystem, UnkStruct_ov6_02247100 *param2) -{ - if (param2->unk_08 == 2) { - StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_BLACK, 6, 1, HEAP_ID_FIELD1); - } else { - StartScreenFade(FADE_BOTH_SCREENS, FADE_TYPE_BRIGHTNESS_IN, FADE_TYPE_BRIGHTNESS_IN, COLOR_WHITE, 6, 1, HEAP_ID_FIELD1); - } - - param2->unk_14 = ov5_021F0EB0(fieldSystem, HEAP_ID_FIELD1); - ov5_021F0F10(param2->unk_14, 1, (FX32_ONE * -150), 1); - param2->unk_0C = MapObject_StartAnimation(param2->unk_18, Unk_ov6_022495DC); - param2->unk_00++; - - return 0; -} - -static int ov6_022473C8(FieldTask *task, FieldSystem *fieldSystem, UnkStruct_ov6_02247100 *param2) -{ - if (MapObject_HasAnimationEnded(param2->unk_0C) == 1) { - MapObject_FinishAnimation(param2->unk_0C); - param2->unk_0C = MapObject_StartAnimation(param2->unk_18, Unk_ov6_022495DC); - } - - if (IsScreenFadeDone() == FALSE) { - return 0; - } - - ov5_021F0F10(param2->unk_14, 2, 0, 60); - - param2->unk_00++; - return 1; -} - -static int ov6_0224740C(FieldTask *task, FieldSystem *fieldSystem, UnkStruct_ov6_02247100 *param2) -{ - if (MapObject_HasAnimationEnded(param2->unk_0C) == 0) { - return 0; - } - - MapObject_FinishAnimation(param2->unk_0C); - param2->unk_04++; - - if (param2->unk_04 < 4) { - param2->unk_0C = MapObject_StartAnimation(param2->unk_18, Unk_ov6_022495DC); - return 0; - } - - param2->unk_0C = MapObject_StartAnimation(param2->unk_18, Unk_ov6_0224966C); - param2->unk_00++; - - return 0; -} - -static int ov6_02247458(FieldTask *task, FieldSystem *fieldSystem, UnkStruct_ov6_02247100 *param2) -{ - if (MapObject_HasAnimationEnded(param2->unk_0C) == 0) { - return 0; - } - - if (ov5_021F0EF0(param2->unk_14) == 0) { - return 0; - } - - ov5_021F0EFC(param2->unk_14); - MapObject_FinishAnimation(param2->unk_0C); - - return 2; -} - -static int (*const Unk_ov6_022495BC[])(FieldTask *, FieldSystem *, UnkStruct_ov6_02247100 *) = { - ov6_02247354, - ov6_022473C8, - ov6_0224740C, - ov6_02247458 -}; - -void *ov6_02247488(FieldSystem *fieldSystem, Pokemon *param1, enum HeapID heapID) -{ - UnkStruct_ov6_02247100 *v0 = ov6_02247590(heapID, sizeof(UnkStruct_ov6_02247100)); - - v0->unk_08 = 1; - v0->fieldSystem = fieldSystem; - v0->unk_18 = Player_MapObject(fieldSystem->playerAvatar); - v0->unk_20 = param1; - - return v0; -} - -BOOL ov6_022474AC(FieldTask *task) -{ - int v0; - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); - UnkStruct_ov6_02247100 *v2 = FieldTask_GetEnv(task); - - do { - v0 = Unk_ov6_022495F0[v2->unk_00](task, fieldSystem, v2); - - if (v0 == 2) { - Heap_Free(v2); - } - } while (v0 == 1); - - return 0; -} - -static int ov6_022474E8(FieldTask *task, FieldSystem *fieldSystem, UnkStruct_ov6_02247100 *param2) -{ - int v0 = PlayerAvatar_Gender(fieldSystem->playerAvatar); - - param2->unk_10 = SysTask_HMCutIn_New(fieldSystem, 0, param2->unk_20, v0); - param2->unk_00++; - - return 0; -} - -static int ov6_0224750C(FieldTask *task, FieldSystem *fieldSystem, UnkStruct_ov6_02247100 *param2) -{ - if (CheckHMCutInFinished(param2->unk_10) == FALSE) { - return 0; - } - - SysTask_HMCutIn_SetTaskDone(param2->unk_10); - param2->unk_00++; - return 1; -} - -static int (*const Unk_ov6_022495F0[])(FieldTask *, FieldSystem *, UnkStruct_ov6_02247100 *) = { - ov6_022474E8, - ov6_0224750C, - ov6_0224715C, - ov6_022471C0, - ov6_02247244, - ov6_02247288 -}; - -void *ov6_02247530(FieldSystem *fieldSystem, Pokemon *param1, enum HeapID heapID) -{ - UnkStruct_ov6_02247100 *v0 = ov6_02247590(heapID, sizeof(UnkStruct_ov6_02247100)); - - v0->unk_08 = 2; - v0->fieldSystem = fieldSystem; - v0->unk_18 = Player_MapObject(fieldSystem->playerAvatar); - v0->unk_20 = param1; - - return v0; -} - -BOOL ov6_02247554(FieldTask *task) -{ - int v0; - FieldSystem *fieldSystem = FieldTask_GetFieldSystem(task); - UnkStruct_ov6_02247100 *v2 = FieldTask_GetEnv(task); - - do { - v0 = Unk_ov6_022495F0[v2->unk_00](task, fieldSystem, v2); - - if (v0 == 2) { - Heap_Free(v2); - } - } while (v0 == 1); - - return 0; -} - -static void *ov6_02247590(enum HeapID heapID, u32 param1) -{ - void *v0 = Heap_AllocAtEnd(heapID, param1); - - GF_ASSERT(v0 != NULL); - memset(v0, 0, param1); - return v0; -} - -static const MapObjectAnimCmd Unk_ov6_02249608[] = { - { 0x1, 0x1 }, - { 0x3C, 0x2 }, - { 0x2, 0x1 }, - { 0x3C, 0x2 }, - { 0x0, 0x1 }, - { 0x3C, 0x2 }, - { 0x3, 0x1 }, - { 0x3C, 0x2 }, - { 0x1, 0x1 }, - { 0x3C, 0x1 }, - { 0x2, 0x1 }, - { 0x3C, 0x1 }, - { 0x0, 0x1 }, - { 0x3C, 0x1 }, - { 0x3, 0x1 }, - { 0x3C, 0x1 }, - { 0x1, 0x1 }, - { 0x2, 0x1 }, - { 0x0, 0x1 }, - { 0x3, 0x1 }, - { 0x1, 0x1 }, - { 0x2, 0x1 }, - { 0x0, 0x1 }, - { 0x3, 0x1 }, - { 0xfe, 0x0 } -}; - -static const MapObjectAnimCmd Unk_ov6_022495DC[] = { - { 0x0, 0x1 }, - { 0x3, 0x1 }, - { 0x1, 0x1 }, - { 0x2, 0x1 }, - { 0xfe, 0x0 } -}; - -static const MapObjectAnimCmd Unk_ov6_0224966C[] = { - { 0x1, 0x1 }, - { 0x2, 0x1 }, - { 0x0, 0x1 }, - { 0x3, 0x1 }, - { 0x1, 0x1 }, - { 0x2, 0x1 }, - { 0x0, 0x1 }, - { 0x3, 0x1 }, - { 0x1, 0x1 }, - { 0x3C, 0x1 }, - { 0x2, 0x1 }, - { 0x3C, 0x1 }, - { 0x0, 0x1 }, - { 0x3C, 0x1 }, - { 0x3, 0x1 }, - { 0x3C, 0x1 }, - { 0x1, 0x1 }, - { 0x3C, 0x2 }, - { 0x2, 0x1 }, - { 0x3C, 0x3 }, - { 0x0, 0x1 }, - { 0x3C, 0x4 }, - { 0x3, 0x1 }, - { 0x3C, 0x5 }, - { 0x1, 0x1 }, - { 0xfe, 0x0 } -};