From f9d4177ba85c702aa69fc1a895c8dc46c360d1f3 Mon Sep 17 00:00:00 2001 From: Kurokamori Date: Mon, 12 Jan 2026 11:33:24 -0600 Subject: [PATCH] unk_02067A60 -> field map change decompiled unk_02067A60 and named most everything, updated the call and include names where they appeared. Built with no issues. --- asm/include/unk_02067A60.inc | 66 ----- asm/unk_02067A60.s | 474 ---------------------------------- include/battle/battle_setup.h | 4 +- include/field_map_change.h | 24 ++ include/unk_0203BA5C.h | 3 + include/unk_0206793C.h | 7 - main.lsf | 2 +- src/battle/battle_setup.c | 6 +- src/blackout.c | 2 +- src/field_map_change.c | 254 ++++++++++++++++++ src/field_take_photo.c | 10 +- src/field_warp_tasks.c | 14 +- src/game_clear.c | 2 +- src/scrcmd_c.c | 4 +- src/start_menu.c | 6 +- 15 files changed, 306 insertions(+), 572 deletions(-) delete mode 100644 asm/include/unk_02067A60.inc delete mode 100644 asm/unk_02067A60.s create mode 100644 include/field_map_change.h create mode 100644 src/field_map_change.c diff --git a/asm/include/unk_02067A60.inc b/asm/include/unk_02067A60.inc deleted file mode 100644 index b28ce8498d..0000000000 --- a/asm/include/unk_02067A60.inc +++ /dev/null @@ -1,66 +0,0 @@ -#include -#pragma once -.public PlayCry -.public IsCryFinished -.public Heap_Alloc -.public Heap_AllocAtEnd -.public Heap_Free -.public GF_AssertFail -.public Save_Roamers_Get -.public RoamerSave_SetFlute -.public MapHeader_IsBikeAllowed -.public MapHeader_IsCave -.public LocalFieldData_GetSpecialSpawnWarpPtr -.public LocalFieldData_GetPlayer -.public Save_LocalFieldData_Get -.public GetFlyWarpData -.public GetSpecialSpawnWarpData -.public sub_0203BB50 -.public FlypointFlagAction -.public Save_VarsFlags_Get -.public TaskManager_Call -.public TaskManager_GetFieldSystem -.public TaskManager_GetEnvironment -.public sub_02053908 -.public GetIdxOfFirstAliveMonInParty_CrashIfNone -.public PlayerAvatar_GetMapObject -.public PlayerAvatar_GetState -.public PlayerAvatar_GetGender -.public EventObjectMovementMan_Create -.public EventObjectMovementMan_IsFinish -.public EventObjectMovementMan_Delete -.public Save_VarsFlags_ClearHaveFollowerFlag -.public Save_VarsFlags_ClearSafariSysFlag -.public Save_VarsFlags_CheckSafariSysFlag -.public ClearFlag972 -.public StrengthFlagAction -.public SysFlagFlashClear -.public SysFlagDefogClear -.public Save_VarsFlags_SetFollowerTrainerNum -.public Save_RandomizeRoamersLocation -.public Save_UpdateRoamersLocation -.public UpdatePlayerLocationHistoryIfAnyRoamersActive -.public sub_02067A60 -.public sub_02067A78 -.public sub_02067A80 -.public sub_02067A88 -.public sub_02067AE4 -.public sub_02067B88 -.public sub_02067BA4 -.public sub_02067BC0 -.public FieldSystem_ClearFollowingTrainer -.public sub_02067BE8 -.public sub_02067BF8 -.public sub_02067C30 -.public FollowMon_IsVisible -.public FieldSystem_UnkSub108_AddMonMood -.public GetMonData -.public SaveArray_Party_Get -.public MIi_CpuClearFast -.public ov01_02205A60 -.public ov01_02205D68 -.public ov02_02249458 -.public ov02_0224953C -.public ov02_02249548 -.public ov02_02250780 -.public ov02_022507B4 diff --git a/asm/unk_02067A60.s b/asm/unk_02067A60.s deleted file mode 100644 index ac23ac8feb..0000000000 --- a/asm/unk_02067A60.s +++ /dev/null @@ -1,474 +0,0 @@ -#include "constants/sndseq.h" -#include "constants/species.h" -#include "constants/maps.h" -#include "constants/pokemon.h" -#include "constants/flags.h" -#include "constants/vars.h" -#include "constants/items.h" -#include "constants/std_script.h" -#include "fielddata/script/scr_seq/event_D24R0204.h" -#include "constants/field_move_response.h" - .include "asm/macros.inc" - .include "unk_02067A60.inc" - .include "global.inc" - - .text - - thumb_func_start sub_02067A60 -sub_02067A60: ; 0x02067A60 - push {r4, lr} - mov r1, #0x24 - bl Heap_Alloc - add r4, r0, #0 - mov r0, #0 - add r1, r4, #0 - mov r2, #0x24 - bl MIi_CpuClearFast - add r0, r4, #0 - pop {r4, pc} - thumb_func_end sub_02067A60 - - thumb_func_start sub_02067A78 -sub_02067A78: ; 0x02067A78 - ldr r3, _02067A7C ; =Heap_Free - bx r3 - .balign 4, 0 -_02067A7C: .word Heap_Free - thumb_func_end sub_02067A78 - - thumb_func_start sub_02067A80 -sub_02067A80: ; 0x02067A80 - add r0, #0xac - str r1, [r0] - bx lr - .balign 4, 0 - thumb_func_end sub_02067A80 - - thumb_func_start sub_02067A88 -sub_02067A88: ; 0x02067A88 - push {r3, r4, r5, lr} - add r5, r0, #0 - ldr r0, [r5, #0xc] - bl Save_VarsFlags_Get - mov r1, #0 - bl StrengthFlagAction - ldr r1, [r5, #0x20] - add r0, r5, #0 - ldr r1, [r1] - bl FlypointFlagAction - ldr r0, [r5, #0xc] - bl Save_Roamers_Get - mov r1, #0 - bl RoamerSave_SetFlute - add r0, r5, #0 - mov r1, #0 - add r0, #0x7e - strh r1, [r0] - add r0, r5, #0 - add r0, #0x7c - strh r1, [r0] - ldr r0, [r5, #0xc] - bl Save_VarsFlags_Get - bl Save_VarsFlags_CheckSafariSysFlag - cmp r0, #0 - bne _02067AE0 - ldr r0, [r5, #0xc] - bl Save_Roamers_Get - ldr r1, [r5, #0x20] - add r4, r0, #0 - ldr r1, [r1] - bl UpdatePlayerLocationHistoryIfAnyRoamersActive - add r0, r4, #0 - bl Save_UpdateRoamersLocation -_02067AE0: - pop {r3, r4, r5, pc} - .balign 4, 0 - thumb_func_end sub_02067A88 - - thumb_func_start sub_02067AE4 -sub_02067AE4: ; 0x02067AE4 - push {r3, r4, r5, lr} - add r5, r0, #0 - add r0, #0xac - ldr r0, [r0] - cmp r0, #1 - beq _02067B84 - ldr r0, [r5, #0xc] - bl Save_VarsFlags_Get - bl ClearFlag972 - ldr r0, [r5, #0xc] - bl Save_VarsFlags_Get - mov r1, #0 - bl StrengthFlagAction - ldr r1, [r5, #0x20] - add r0, r5, #0 - ldr r1, [r1] - bl FlypointFlagAction - ldr r0, [r5, #0xc] - bl Save_Roamers_Get - mov r1, #0 - bl RoamerSave_SetFlute - add r0, r5, #0 - mov r1, #0 - add r0, #0x7e - strh r1, [r0] - add r0, r5, #0 - add r0, #0x7c - strh r1, [r0] - ldr r0, [r5, #0xc] - bl Save_Roamers_Get - ldr r1, [r5, #0x20] - ldr r1, [r1] - bl UpdatePlayerLocationHistoryIfAnyRoamersActive - ldr r0, [r5, #0x20] - ldr r0, [r0] - bl MapHeader_IsCave - cmp r0, #0 - bne _02067B56 - ldr r0, [r5, #0xc] - bl Save_VarsFlags_Get - add r4, r0, #0 - bl SysFlagFlashClear - add r0, r4, #0 - bl SysFlagDefogClear -_02067B56: - ldr r0, [r5, #0xc] - bl Save_LocalFieldData_Get - bl LocalFieldData_GetPlayer - add r4, r0, #0 - ldr r0, [r4, #4] - cmp r0, #1 - bne _02067B7A - ldr r0, [r5, #0x20] - ldr r0, [r0] - bl MapHeader_IsBikeAllowed - cmp r0, #0 - bne _02067B7A - mov r0, #0 - str r0, [r4, #4] - pop {r3, r4, r5, pc} -_02067B7A: - ldr r0, [r4, #4] - cmp r0, #2 - bne _02067B84 - mov r0, #0 - str r0, [r4, #4] -_02067B84: - pop {r3, r4, r5, pc} - .balign 4, 0 - thumb_func_end sub_02067AE4 - - thumb_func_start sub_02067B88 -sub_02067B88: ; 0x02067B88 - push {r4, lr} - add r4, r0, #0 - ldr r0, [r4, #0xc] - bl Save_VarsFlags_Get - bl Save_VarsFlags_ClearSafariSysFlag - ldr r0, [r4, #0xc] - bl Save_Roamers_Get - bl Save_RandomizeRoamersLocation - pop {r4, pc} - .balign 4, 0 - thumb_func_end sub_02067B88 - - thumb_func_start sub_02067BA4 -sub_02067BA4: ; 0x02067BA4 - push {r4, lr} - add r4, r0, #0 - ldr r0, [r4, #0xc] - bl Save_VarsFlags_Get - bl Save_VarsFlags_ClearSafariSysFlag - ldr r0, [r4, #0xc] - bl Save_Roamers_Get - bl Save_RandomizeRoamersLocation - pop {r4, pc} - .balign 4, 0 - thumb_func_end sub_02067BA4 - - thumb_func_start sub_02067BC0 -sub_02067BC0: ; 0x02067BC0 - push {r3, lr} - ldr r0, [r0, #0xc] - bl Save_VarsFlags_Get - bl Save_VarsFlags_ClearSafariSysFlag - pop {r3, pc} - .balign 4, 0 - thumb_func_end sub_02067BC0 - - thumb_func_start FieldSystem_ClearFollowingTrainer -FieldSystem_ClearFollowingTrainer: ; 0x02067BD0 - push {r4, lr} - ldr r0, [r0, #0xc] - bl Save_VarsFlags_Get - add r4, r0, #0 - bl Save_VarsFlags_ClearHaveFollowerFlag - add r0, r4, #0 - mov r1, #0 - bl Save_VarsFlags_SetFollowerTrainerNum - pop {r4, pc} - thumb_func_end FieldSystem_ClearFollowingTrainer - - thumb_func_start sub_02067BE8 -sub_02067BE8: ; 0x02067BE8 - push {r3, lr} - ldr r0, [r0, #0xc] - bl Save_Roamers_Get - bl Save_RandomizeRoamersLocation - pop {r3, pc} - .balign 4, 0 - thumb_func_end sub_02067BE8 - - thumb_func_start sub_02067BF8 -sub_02067BF8: ; 0x02067BF8 - push {r4, r5, r6, lr} - add r5, r1, #0 - mov r1, #0x1c - add r4, r2, #0 - add r6, r3, #0 - bl Heap_AllocAtEnd - add r3, r0, #0 - mov r2, #0x1c - mov r1, #0 -_02067C0C: - strb r1, [r3] - add r3, r3, #1 - sub r2, r2, #1 - bne _02067C0C - str r5, [r0] - str r4, [r0, #0x10] - add r2, sp, #0 - ldrh r1, [r2, #0x10] - strh r1, [r0, #8] - mov r1, #0x14 - ldrsh r1, [r2, r1] - strh r1, [r0, #0xa] - mov r1, #0x18 - ldrsh r1, [r2, r1] - strh r1, [r0, #0xc] - strh r6, [r0, #0xe] - pop {r4, r5, r6, pc} - .balign 4, 0 - thumb_func_end sub_02067BF8 - - thumb_func_start sub_02067C30 -sub_02067C30: ; 0x02067C30 - push {r4, r5, r6, r7, lr} - sub sp, #0x1c - add r6, r0, #0 - bl TaskManager_GetFieldSystem - add r5, r0, #0 - add r0, r6, #0 - bl TaskManager_GetEnvironment - add r4, r0, #0 - ldrh r0, [r4, #4] - cmp r0, #6 - bls _02067C4C - b _02067DE4 -_02067C4C: - add r0, r0, r0 - add r0, pc - ldrh r0, [r0, #6] - lsl r0, r0, #0x10 - asr r0, r0, #0x10 - add pc, r0 -_02067C58: ; jump table - .short _02067C66 - _02067C58 - 2 ; case 0 - .short _02067C78 - _02067C58 - 2 ; case 1 - .short _02067CF2 - _02067C58 - 2 ; case 2 - .short _02067D1E - _02067C58 - 2 ; case 3 - .short _02067D2E - _02067C58 - 2 ; case 4 - .short _02067D44 - _02067C58 - 2 ; case 5 - .short _02067D8C - _02067C58 - 2 ; case 6 -_02067C66: - ldr r1, _02067DEC ; =ov01_02205A60 - add r0, r6, #0 - mov r2, #0 - bl TaskManager_Call - ldrh r0, [r4, #4] - add r0, r0, #1 - strh r0, [r4, #4] - b _02067DE4 -_02067C78: - ldr r0, [r5, #0x40] - bl PlayerAvatar_GetState - sub r0, r0, #1 - cmp r0, #1 - bhi _02067C8E - mov r0, #4 - strh r0, [r4, #4] - mov r0, #0 - strh r0, [r4, #6] - b _02067DE4 -_02067C8E: - ldr r0, [r5, #0xc] - bl SaveArray_Party_Get - bl GetIdxOfFirstAliveMonInParty_CrashIfNone - ldrh r1, [r4, #0xe] - cmp r1, r0 - beq _02067CAE - ldr r0, [r4] - bl ov01_02205D68 - mov r0, #4 - strh r0, [r4, #4] - mov r0, #0 - strh r0, [r4, #6] - b _02067DE4 -_02067CAE: - add r0, r5, #0 - bl FollowMon_IsVisible - cmp r0, #0 - beq _02067CE8 - add r0, r5, #0 - mov r1, #2 - bl ov02_02250780 - cmp r0, #0 - beq _02067CD4 - mov r0, #0x42 - lsl r0, r0, #2 - ldr r0, [r5, r0] - mov r1, #1 - mov r6, #2 - bl FieldSystem_UnkSub108_AddMonMood - b _02067CD6 -_02067CD4: - mov r6, #1 -_02067CD6: - add r0, r5, #0 - add r1, r6, #0 - bl ov02_022507B4 - mov r0, #1 - strh r0, [r4, #6] - mov r0, #2 - strh r0, [r4, #4] - b _02067DE4 -_02067CE8: - mov r0, #4 - strh r0, [r4, #4] - mov r0, #0 - strh r0, [r4, #6] - b _02067DE4 -_02067CF2: - ldr r0, [r4, #0x10] - mov r1, #5 - mov r2, #0 - bl GetMonData - add r5, r0, #0 - ldr r0, [r4, #0x10] - mov r1, #0x70 - mov r2, #0 - bl GetMonData - add r1, r0, #0 - lsl r0, r5, #0x10 - lsl r1, r1, #0x18 - lsr r0, r0, #0x10 - lsr r1, r1, #0x18 - bl PlayCry - ldrh r0, [r4, #4] - add r0, r0, #1 - strh r0, [r4, #4] - b _02067DE4 -_02067D1E: - bl IsCryFinished - cmp r0, #0 - bne _02067DE4 - ldrh r0, [r4, #4] - add r0, r0, #1 - strh r0, [r4, #4] - b _02067DE4 -_02067D2E: - ldr r0, [r5, #0x40] - bl PlayerAvatar_GetMapObject - ldr r1, _02067DF0 ; =_020FE7AC - bl EventObjectMovementMan_Create - str r0, [r4, #0x18] - ldrh r0, [r4, #4] - add r0, r0, #1 - strh r0, [r4, #4] - b _02067DE4 -_02067D44: - ldr r0, [r4, #0x18] - bl EventObjectMovementMan_IsFinish - cmp r0, #0 - beq _02067DE4 - ldr r0, [r4, #0x18] - bl EventObjectMovementMan_Delete - ldrh r0, [r4, #6] - cmp r0, #0 - ldr r0, [r4] - bne _02067D70 - ldr r0, [r0, #0x40] - bl PlayerAvatar_GetGender - add r3, r0, #0 - ldr r0, [r4] - ldr r2, [r4, #0x10] - mov r1, #1 - bl ov02_02249458 - b _02067D82 -_02067D70: - ldr r0, [r0, #0x40] - bl PlayerAvatar_GetGender - add r3, r0, #0 - ldr r0, [r4] - ldr r2, [r4, #0x10] - mov r1, #2 - bl ov02_02249458 -_02067D82: - str r0, [r4, #0x14] - ldrh r0, [r4, #4] - add r0, r0, #1 - strh r0, [r4, #4] - b _02067DE4 -_02067D8C: - ldr r0, [r4, #0x14] - bl ov02_0224953C - cmp r0, #0 - beq _02067DE4 - ldr r0, [r4, #0x14] - bl ov02_02249548 - ldr r0, [r5, #0xc] - bl Save_LocalFieldData_Get - add r7, r0, #0 - ldrh r0, [r4, #8] - bl sub_0203BB50 - lsl r0, r0, #0x10 - lsr r5, r0, #0x10 - bne _02067DB4 - bl GF_AssertFail -_02067DB4: - add r0, r5, #0 - add r1, sp, #8 - bl GetFlyWarpData - add r0, r7, #0 - bl LocalFieldData_GetSpecialSpawnWarpPtr - add r1, r0, #0 - add r0, r5, #0 - bl GetSpecialSpawnWarpData - ldr r0, [sp, #0x14] - mov r2, #1 - str r0, [sp] - str r2, [sp, #4] - ldr r1, [sp, #8] - ldr r3, [sp, #0x10] - add r0, r6, #0 - sub r2, r2, #2 - bl sub_02053908 - add r0, r4, #0 - bl Heap_Free -_02067DE4: - mov r0, #0 - add sp, #0x1c - pop {r4, r5, r6, r7, pc} - nop -_02067DEC: .word ov01_02205A60 -_02067DF0: .word _020FE7AC - thumb_func_end sub_02067C30 - - .rodata - - ; Movement data -_020FE7AC: - .short 73, 1 - .short 33, 1 - .short 74, 1 - .short 254, 0 diff --git a/include/battle/battle_setup.h b/include/battle/battle_setup.h index d55582908e..708693c54f 100644 --- a/include/battle/battle_setup.h +++ b/include/battle/battle_setup.h @@ -4,6 +4,7 @@ #include "constants/battle.h" #include "bag.h" +#include "field_map_change.h" #include "field_types_def.h" #include "game_stats.h" #include "gf_rtc.h" @@ -16,7 +17,6 @@ #include "save_palpad.h" #include "save_wifi_history.h" #include "trainer_data.h" -#include "unk_02067A60.h" #include "unk_020755E8.h" struct BattleSetupSub_138 { @@ -40,7 +40,7 @@ struct BattleSetup { // declared in trainer_data.h void *unk_128; SaveWiFiHistory *wifiHistory; Options *options; // 130 - struct UnkStruct_02067A60 *unk_134; + MapChangeState *unk_134; struct BattleSetupSub_138 unk138; GameStats *gameStats; // 144 SavePalPad *palPad; // 148 diff --git a/include/field_map_change.h b/include/field_map_change.h new file mode 100644 index 0000000000..bc25cab6a4 --- /dev/null +++ b/include/field_map_change.h @@ -0,0 +1,24 @@ +#ifndef POKEHEARTGOLD_FIELD_MAP_CHANGE_H +#define POKEHEARTGOLD_FIELD_MAP_CHANGE_H + +#include "field_types_def.h" +#include "heap.h" +#include "pokemon_types_def.h" + +typedef struct MapChangeState MapChangeState; +typedef struct FlyTaskEnv FlyTaskEnv; + +MapChangeState *MapChange_AllocState(enum HeapID heapID); +void MapChange_FreeState(MapChangeState *state); +void FieldSystem_SetTeleportWarpFlag(FieldSystem *fieldSystem, u32 flag); +void FieldSystem_HandleEnterMapNonWarp(FieldSystem *fieldSystem); +void FieldSystem_HandleEnterMapWarp(FieldSystem *fieldSystem); +void FieldSystem_ExitSafariZoneWarp(FieldSystem *fieldSystem); +void FieldSystem_ExitSafariZoneNonWarp(FieldSystem *fieldSystem); +void FieldSystem_ClearSafariFlag(FieldSystem *fieldSystem); +void FieldSystem_ClearFollowingTrainer(FieldSystem *fieldSystem); +void FieldSystem_RandomizeRoamers(FieldSystem *fieldSystem); +FlyTaskEnv *FlyTask_CreateEnv(enum HeapID heapID, FieldSystem *fieldSystem, Pokemon *pokemon, u16 partySlot, u16 mapsec, s16 cursorX, s16 cursorY); +BOOL Task_Fly(TaskManager *taskManager); + +#endif // POKEHEARTGOLD_FIELD_MAP_CHANGE_H diff --git a/include/unk_0203BA5C.h b/include/unk_0203BA5C.h index c5e0c8acb6..f8e4cb22e5 100644 --- a/include/unk_0203BA5C.h +++ b/include/unk_0203BA5C.h @@ -7,5 +7,8 @@ u16 GetMomSpawnId(void); void GetDeathWarpData(u16 spawnId, Location *dest); void GetSpecialSpawnWarpData(u16 spawnId, Location *dest); u32 MapHeader_GetSpawnIdForDeathWarp(u32 mapId); +s32 sub_0203BB50(u16 mapId); +void GetFlyWarpData(u16 spawnId, Location *dest); +void FlypointFlagAction(FieldSystem *fieldSystem, u32 mapId); #endif // POKEHEARTGOLD_UNK_0203BA5C_H diff --git a/include/unk_0206793C.h b/include/unk_0206793C.h index 20d6098a77..0317b3e4f0 100644 --- a/include/unk_0206793C.h +++ b/include/unk_0206793C.h @@ -6,13 +6,6 @@ typedef struct UnkStruct_0206793C UnkStruct_0206793C; -void FieldSystem_ClearFollowingTrainer(FieldSystem *fieldSystem); -void sub_02067AE4(FieldSystem *fieldSystem); -void sub_02067A88(FieldSystem *fieldSystem); -void sub_02067B88(FieldSystem *fieldSystem); -void sub_02067BA4(FieldSystem *fieldSystem); -void sub_02067BC0(FieldSystem *fieldSystem); -void sub_02067BE8(FieldSystem *fieldSystem); BOOL sub_02068CCC(UnkStruct_0206793C *unk); void CallTask_NPCTrade(TaskManager *taskManager, NPCTradeAppData *tradeWork, u16 arg, enum HeapID heapID); diff --git a/main.lsf b/main.lsf index f5e3afcb48..f68e771a0b 100644 --- a/main.lsf +++ b/main.lsf @@ -240,7 +240,7 @@ Static main Object asm/unk_02066EDC.o Object src/field_roamer.o Object asm/unk_0206793C.o - Object asm/unk_02067A60.o + Object src/field_map_change.o Object src/field_move.o Object src/field_move_environment.o Object asm/unk_020689C8.o diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c index d2e7a3be5f..ced4a624a3 100644 --- a/src/battle/battle_setup.c +++ b/src/battle/battle_setup.c @@ -7,6 +7,7 @@ #include "msgdata/msg.naix" #include "msgdata/msg/msg_0445.h" +#include "field_map_change.h" #include "follow_mon.h" #include "metatile_behavior.h" #include "msgdata.h" @@ -23,7 +24,6 @@ #include "unk_02055418.h" #include "unk_0205B3DC.h" #include "unk_0205BB1C.h" -#include "unk_02067A60.h" #include "unk_0206D494.h" #include "unk_02088288.h" #include "unk_02092BE8.h" @@ -62,7 +62,7 @@ BattleSetup *BattleSetup_New(enum HeapID heapID, u32 battleTypeFlags) { setup->bag = Save_Bag_New(heapID); setup->pokedex = Pokedex_New(heapID); setup->options = Options_New(heapID); - setup->unk_134 = sub_02067A60(heapID); + setup->unk_134 = MapChange_AllocState(heapID); setup->bagCursor = NULL; setup->unk1B8 = NULL; setup->safariBalls = 0; @@ -161,7 +161,7 @@ void BattleSetup_Delete(BattleSetup *setup) { Heap_Free(setup->bag); Heap_Free(setup->pokedex); Heap_Free(setup->options); - sub_02067A78(setup->unk_134); + MapChange_FreeState(setup->unk_134); Heap_Free(setup->bugContestMon); Heap_Free(setup); } diff --git a/src/blackout.c b/src/blackout.c index febfbc7bd1..fe6a42b375 100644 --- a/src/blackout.c +++ b/src/blackout.c @@ -4,6 +4,7 @@ #include "msgdata/msg/msg_0203.h" #include "brightness.h" +#include "field_map_change.h" #include "field_warp_tasks.h" #include "font.h" #include "gf_gfx_loader.h" @@ -18,7 +19,6 @@ #include "unk_0203BA5C.h" #include "unk_02054E00.h" #include "unk_020552A4.h" -#include "unk_0206793C.h" #include "use_item_on_mon.h" static void Blackout_InitDisplays(BgConfig *bgConfig); diff --git a/src/field_map_change.c b/src/field_map_change.c new file mode 100644 index 0000000000..0049fe9f9c --- /dev/null +++ b/src/field_map_change.c @@ -0,0 +1,254 @@ +#include "field_map_change.h" + +#include "global.h" + +#include "field_roamer.h" +#include "field_system.h" +#include "field_warp_tasks.h" +#include "follow_mon.h" +#include "map_header.h" +#include "overlay_01.h" +#include "overlay_01_022053EC.h" +#include "overlay_02.h" +#include "party.h" +#include "player_avatar.h" +#include "pokemon.h" +#include "roamer.h" +#include "save_local_field_data.h" +#include "save_vars_flags.h" +#include "script_pokemon_util.h" +#include "sound_chatot.h" +#include "sys_flags.h" +#include "sys_vars.h" +#include "task.h" +#include "unk_02005D10.h" +#include "unk_0203BA5C.h" +#include "unk_02062108.h" + +static const MovementScriptCommand sFlyLandingMovement[] = { + { 73, 1 }, + { 33, 1 }, + { 74, 1 }, + { 254, 0 }, +}; + +struct MapChangeState { + u8 data[0x24]; +}; + +struct FlyTaskEnv { + FieldSystem *fieldSystem; + u16 state; + u16 flag; + u16 mapsec; + s16 cursorX; + s16 cursorY; + u16 partySlot; + Pokemon *pokemon; + void *flyEffect; + EventObjectMovementMan *movementMan; +}; + +MapChangeState *MapChange_AllocState(enum HeapID heapID) { + MapChangeState *ret = Heap_Alloc(heapID, sizeof(MapChangeState)); + MIi_CpuClearFast(0, (u32 *)ret, sizeof(MapChangeState)); + return ret; +} + +void MapChange_FreeState(MapChangeState *state) { + Heap_Free(state); +} + +void FieldSystem_SetTeleportWarpFlag(FieldSystem *fieldSystem, u32 flag) { + fieldSystem->unkAC = flag; +} + +void FieldSystem_HandleEnterMapNonWarp(FieldSystem *fieldSystem) { + SaveVarsFlags *varsFlags = Save_VarsFlags_Get(fieldSystem->saveData); + StrengthFlagAction(varsFlags, 0); + FlypointFlagAction(fieldSystem, fieldSystem->location->mapId); + RoamerSaveData *roamers = Save_Roamers_Get(fieldSystem->saveData); + RoamerSave_SetFlute(roamers, 0); + fieldSystem->unk7E = 0; + fieldSystem->unk7C = 0; + varsFlags = Save_VarsFlags_Get(fieldSystem->saveData); + if (!Save_VarsFlags_CheckSafariSysFlag(varsFlags)) { + roamers = Save_Roamers_Get(fieldSystem->saveData); + UpdatePlayerLocationHistoryIfAnyRoamersActive(roamers, fieldSystem->location->mapId); + Save_UpdateRoamersLocation(roamers); + } +} + +void FieldSystem_HandleEnterMapWarp(FieldSystem *fieldSystem) { + if (fieldSystem->unkAC == 1) { + return; + } + SaveVarsFlags *varsFlags = Save_VarsFlags_Get(fieldSystem->saveData); + ClearFlag972(varsFlags); + varsFlags = Save_VarsFlags_Get(fieldSystem->saveData); + StrengthFlagAction(varsFlags, 0); + FlypointFlagAction(fieldSystem, fieldSystem->location->mapId); + RoamerSaveData *roamers = Save_Roamers_Get(fieldSystem->saveData); + RoamerSave_SetFlute(roamers, 0); + fieldSystem->unk7E = 0; + fieldSystem->unk7C = 0; + roamers = Save_Roamers_Get(fieldSystem->saveData); + UpdatePlayerLocationHistoryIfAnyRoamersActive(roamers, fieldSystem->location->mapId); + if (!MapHeader_IsCave(fieldSystem->location->mapId)) { + varsFlags = Save_VarsFlags_Get(fieldSystem->saveData); + SysFlagFlashClear(varsFlags); + SysFlagDefogClear(varsFlags); + } + LocalFieldData *localFieldData = Save_LocalFieldData_Get(fieldSystem->saveData); + PlayerSaveData *playerSaveData = LocalFieldData_GetPlayer(localFieldData); + if (playerSaveData->state == 1) { + if (!MapHeader_IsBikeAllowed(fieldSystem->location->mapId)) { + playerSaveData->state = 0; + return; + } + } + if (playerSaveData->state == 2) { + playerSaveData->state = 0; + } +} + +void FieldSystem_ExitSafariZoneWarp(FieldSystem *fieldSystem) { + SaveVarsFlags *varsFlags = Save_VarsFlags_Get(fieldSystem->saveData); + Save_VarsFlags_ClearSafariSysFlag(varsFlags); + RoamerSaveData *roamers = Save_Roamers_Get(fieldSystem->saveData); + Save_RandomizeRoamersLocation(roamers); +} + +void FieldSystem_ExitSafariZoneNonWarp(FieldSystem *fieldSystem) { + SaveVarsFlags *varsFlags = Save_VarsFlags_Get(fieldSystem->saveData); + Save_VarsFlags_ClearSafariSysFlag(varsFlags); + RoamerSaveData *roamers = Save_Roamers_Get(fieldSystem->saveData); + Save_RandomizeRoamersLocation(roamers); +} + +void FieldSystem_ClearSafariFlag(FieldSystem *fieldSystem) { + SaveVarsFlags *varsFlags = Save_VarsFlags_Get(fieldSystem->saveData); + Save_VarsFlags_ClearSafariSysFlag(varsFlags); +} + +void FieldSystem_ClearFollowingTrainer(FieldSystem *fieldSystem) { + SaveVarsFlags *varsFlags = Save_VarsFlags_Get(fieldSystem->saveData); + Save_VarsFlags_ClearHaveFollowerFlag(varsFlags); + Save_VarsFlags_SetFollowerTrainerNum(varsFlags, 0); +} + +void FieldSystem_RandomizeRoamers(FieldSystem *fieldSystem) { + RoamerSaveData *roamers = Save_Roamers_Get(fieldSystem->saveData); + Save_RandomizeRoamersLocation(roamers); +} + +FlyTaskEnv *FlyTask_CreateEnv(enum HeapID heapID, FieldSystem *fieldSystem, Pokemon *pokemon, u16 partySlot, u16 mapsec, s16 cursorX, s16 cursorY) { + FlyTaskEnv *env = Heap_AllocAtEnd(heapID, sizeof(FlyTaskEnv)); + u8 *p = (u8 *)env; + u32 i = sizeof(FlyTaskEnv); + do { + *p++ = 0; + i--; + } while (i != 0); + env->fieldSystem = fieldSystem; + env->pokemon = pokemon; + env->mapsec = mapsec; + env->cursorX = cursorX; + env->cursorY = cursorY; + env->partySlot = partySlot; + return env; +} + +BOOL Task_Fly(TaskManager *taskManager) { + FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager); + FlyTaskEnv *env = TaskManager_GetEnvironment(taskManager); + + switch (env->state) { + case 0: + TaskManager_Call(taskManager, ov01_02205A60, NULL); + env->state++; + break; + case 1: { + s32 avatarState = PlayerAvatar_GetState(fieldSystem->playerAvatar); + if ((u32)(avatarState - 1) <= 1) { + env->state = 4; + env->flag = 0; + break; + } + Party *party = SaveArray_Party_Get(fieldSystem->saveData); + u8 firstAliveIdx = GetIdxOfFirstAliveMonInParty_CrashIfNone(party); + if (env->partySlot != firstAliveIdx) { + ov01_02205D68(env->fieldSystem); + env->state = 4; + env->flag = 0; + break; + } + if (FollowMon_IsVisible(fieldSystem)) { + u8 mood; + if (ov02_02250780(fieldSystem, 2)) { + mood = 2; + FieldSystem_UnkSub108_AddMonMood(fieldSystem->unk108, 1); + } else { + mood = 1; + } + ov02_022507B4(fieldSystem, mood); + env->flag = 1; + env->state = 2; + } else { + env->state = 4; + env->flag = 0; + } + break; + } + case 2: { + s32 species = GetMonData(env->pokemon, MON_DATA_SPECIES, NULL); + s32 form = GetMonData(env->pokemon, MON_DATA_FORM, NULL); + PlayCry((u16)species, (u8)form); + env->state++; + break; + } + case 3: + if (IsCryFinished()) { + break; + } + env->state++; + break; + case 4: { + LocalMapObject *playerObj = PlayerAvatar_GetMapObject(fieldSystem->playerAvatar); + env->movementMan = EventObjectMovementMan_Create(playerObj, sFlyLandingMovement); + env->state++; + break; + } + case 5: + if (!EventObjectMovementMan_IsFinish(env->movementMan)) { + break; + } + EventObjectMovementMan_Delete(env->movementMan); + if (env->flag == 0) { + int gender = PlayerAvatar_GetGender(env->fieldSystem->playerAvatar); + env->flyEffect = ov02_02249458(env->fieldSystem, 1, env->pokemon, gender); + } else { + int gender = PlayerAvatar_GetGender(env->fieldSystem->playerAvatar); + env->flyEffect = ov02_02249458(env->fieldSystem, 2, env->pokemon, gender); + } + env->state++; + break; + case 6: { + if (!ov02_0224953C(env->flyEffect)) { + break; + } + ov02_02249548(env->flyEffect); + LocalFieldData *localFieldData = Save_LocalFieldData_Get(fieldSystem->saveData); + u16 spawnId = sub_0203BB50(env->mapsec); + GF_ASSERT(spawnId != 0); + Location flyWarp; + GetFlyWarpData(spawnId, &flyWarp); + Location *specialWarp = LocalFieldData_GetSpecialSpawnWarpPtr(localFieldData); + GetSpecialSpawnWarpData(spawnId, specialWarp); + sub_02053908(taskManager, flyWarp.mapId, -1, flyWarp.x, flyWarp.y, 1); + Heap_Free(env); + break; + } + } + return FALSE; +} diff --git a/src/field_take_photo.c b/src/field_take_photo.c index ea72b1c988..a7931b3d4c 100644 --- a/src/field_take_photo.c +++ b/src/field_take_photo.c @@ -6,6 +6,7 @@ #include "graphic/camera_viewfinder.naix" +#include "field_map_change.h" #include "field_warp_tasks.h" #include "follow_mon.h" #include "gf_gfx_loader.h" @@ -24,7 +25,6 @@ #include "unk_02054E00.h" #include "unk_02055244.h" #include "unk_020552A4.h" -#include "unk_02067A80.h" typedef enum FieldViewPhotoTaskState { VIEW_PHOTO_STATE_INIT, @@ -220,7 +220,7 @@ static BOOL FieldTask_ViewPhoto(TaskManager *taskManager) { viewPhoto->state = ViewPhotoFieldTask_RestorePlayerOverworldPosition(fieldSystem, taskManager, viewPhoto); break; case VIEW_PHOTO_STATE_QUIT2: - sub_02067A80(fieldSystem, 0); + FieldSystem_SetTeleportWarpFlag(fieldSystem, 0); Heap_Free(viewPhoto); return TRUE; } @@ -352,7 +352,7 @@ static BOOL FieldTask_DoViewPhoto(TaskManager *taskManager) { switch (taskData->state) { case FIELD_PHOTO_DO_VIEW_STATE_0: - sub_02067A80(fieldSystem, 1); + FieldSystem_SetTeleportWarpFlag(fieldSystem, 1); GF_RTC_SetAndFreezeTime(photo->hour, photo->min); { Location location; @@ -595,7 +595,7 @@ static BOOL FieldTask_TakePhoto(TaskManager *taskManager) { takePhoto->state = TAKE_PHOTO_STATE_SAVE_PLAYER_STATE; break; case TAKE_PHOTO_STATE_SAVE_PLAYER_STATE: - sub_02067A80(fieldSystem, 1); + FieldSystem_SetTeleportWarpFlag(fieldSystem, 1); FieldTakePhoto_SetLocationBuf(takePhoto, DIR_SOUTH, takePhoto->pPhoto->y, takePhoto->pPhoto->x, takePhoto->pPhoto->mapId); sub_020537A8(taskManager, &takePhoto->locationBuf); takePhoto->state = TAKE_PHOTO_STATE_INIT_RESTORE_OVERWORLD; @@ -783,7 +783,7 @@ static BOOL FieldTask_TakePhoto(TaskManager *taskManager) { takePhoto->state = TAKE_PHOTO_STATE_RESTORE_PLAYER; break; case TAKE_PHOTO_STATE_RESTORE_PLAYER: - sub_02067A80(fieldSystem, 0); + FieldSystem_SetTeleportWarpFlag(fieldSystem, 0); FieldTakePhoto_SetLocationBuf(takePhoto, takePhoto->savedDirection, takePhoto->savedZ, takePhoto->savedX, takePhoto->savedMapId); sub_020537A8(taskManager, &takePhoto->locationBuf); takePhoto->state = TAKE_PHOTO_STATE_RESUME_OVERWORLD_AFTER; diff --git a/src/field_warp_tasks.c b/src/field_warp_tasks.c index b24c75e335..b53b8f7f51 100644 --- a/src/field_warp_tasks.c +++ b/src/field_warp_tasks.c @@ -2,6 +2,7 @@ #include "constants/maps.h" +#include "field_map_change.h" #include "field_system_rtc_weather.h" #include "follow_mon.h" #include "map_events.h" @@ -31,7 +32,6 @@ #include "unk_02056D7C.h" #include "unk_02058AEC.h" #include "unk_0205AC88.h" -#include "unk_0206793C.h" struct UnkTaskEnv_02053688 { int unk0; @@ -174,9 +174,9 @@ void sub_02053038(FieldSystem *fieldSystem, BOOL isConnection) { ClearTempFieldEventData(fieldSystem); } if (!isConnection) { - sub_02067AE4(fieldSystem); + FieldSystem_HandleEnterMapWarp(fieldSystem); } else { - sub_02067A88(fieldSystem); + FieldSystem_HandleEnterMapNonWarp(fieldSystem); } if (!fieldSystem->unkAC && !isConnection) { FieldSystem_StartBugContestTimer(fieldSystem); @@ -376,7 +376,7 @@ static BOOL FieldTask_ContinueGame_Normal(TaskManager *taskManager) { FieldSystem_StartBugContestTimer(fieldSystem); sub_0205323C(fieldSystem); } - sub_02067BE8(fieldSystem); + FieldSystem_RandomizeRoamers(fieldSystem); *state_p = 2; break; case 2: @@ -630,7 +630,7 @@ static BOOL sub_02053950(TaskManager *taskManager) { if (GF_SndGetFadeTimer() != 0) { break; } - sub_02067B88(fieldSystem); + FieldSystem_ExitSafariZoneWarp(fieldSystem); sub_02053A14(taskManager); env->unk0++; break; @@ -741,9 +741,9 @@ static BOOL sub_02053B3C(TaskManager *taskManager) { } sub_02055110(fieldSystem, location->mapId, 0); if (env->unk4 == 2) { - sub_02067BA4(fieldSystem); + FieldSystem_ExitSafariZoneNonWarp(fieldSystem); } else if (env->unk4 == 0 || env->unk4 == 1) { - sub_02067BC0(fieldSystem); + FieldSystem_ClearSafariFlag(fieldSystem); } else { GF_ASSERT(FALSE); } diff --git a/src/game_clear.c b/src/game_clear.c index e13533a4cf..43b8d89b41 100644 --- a/src/game_clear.c +++ b/src/game_clear.c @@ -9,6 +9,7 @@ #include "msgdata/msg/msg_0040.h" #include "bg_window.h" +#include "field_map_change.h" #include "game_stats.h" #include "hall_of_fame.h" #include "launch_application.h" @@ -30,7 +31,6 @@ #include "unk_02054E00.h" #include "unk_020552A4.h" #include "unk_02055418.h" -#include "unk_0206793C.h" #include "unk_0206D494.h" #include "use_item_on_mon.h" diff --git a/src/scrcmd_c.c b/src/scrcmd_c.c index 4411be9c91..469bc20fbc 100644 --- a/src/scrcmd_c.c +++ b/src/scrcmd_c.c @@ -22,6 +22,7 @@ #include "easy_chat.h" #include "encounter.h" #include "fashion_case.h" +#include "field_map_change.h" #include "field_roamer.h" #include "field_system.h" #include "field_take_photo.h" @@ -88,7 +89,6 @@ #include "unk_0205FD20.h" #include "unk_02062108.h" #include "unk_020658D4.h" -#include "unk_02067A80.h" #include "unk_02068FC8.h" #include "unk_0206B910.h" #include "unk_0206D494.h" @@ -4141,7 +4141,7 @@ BOOL ScrCmd_HideSaveStats(ScriptContext *ctx) { BOOL ScrCmd_595(ScriptContext *ctx) { u8 r1 = ScriptReadByte(ctx); - sub_02067A80(ctx->fieldSystem, r1); + FieldSystem_SetTeleportWarpFlag(ctx->fieldSystem, r1); return FALSE; } diff --git a/src/start_menu.c b/src/start_menu.c index adfc5c5faf..b2c0a4f980 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -10,6 +10,7 @@ #include "msgdata/msg/msg_0196.h" #include "bag_view.h" +#include "field_map_change.h" #include "field_move.h" #include "field_move_environment.h" #include "field_system.h" @@ -38,7 +39,6 @@ #include "unk_0205AC88.h" #include "unk_0205CB48.h" #include "unk_02066EDC.h" -#include "unk_02067A60.h" #include "unk_02068FC8.h" #include "unk_020755E8.h" #include "unk_02092BE8.h" @@ -1376,10 +1376,10 @@ BOOL Task_UseFlyInField(TaskManager *taskManager) { StartMenu_SetExitTaskFunc(startMenu, Task_StartMenu_HandleReturn_Pokemon); } else { Pokemon *pokemon = Party_GetMonByIndex(SaveArray_Party_Get(fieldSystem->saveData), partySlot); - struct UnkStruct_02067BF8 *r5 = sub_02067BF8(HEAP_ID_FIELD2, fieldSystem, pokemon, partySlot, pokegearArgs->selectedFlyDest, pokegearArgs->mapCursorX * 32 + 16, pokegearArgs->mapCursorY * 32 + 16); + FlyTaskEnv *r5 = FlyTask_CreateEnv(HEAP_ID_FIELD2, fieldSystem, pokemon, partySlot, pokegearArgs->selectedFlyDest, pokegearArgs->mapCursorX * 32 + 16, pokegearArgs->mapCursorY * 32 + 16); Heap_FreeExplicit(HEAP_ID_FIELD2, startMenu->exitTaskEnvironment); FieldSystem_LoadFieldOverlay(fieldSystem); - startMenu->exitTaskFunc = sub_02067C30; + startMenu->exitTaskFunc = Task_Fly; startMenu->exitTaskEnvironment = r5; startMenu->state = START_MENU_STATE_12; }