From 3912a8b88bc453e18aaf4b5e8d735256fdc2220c Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 21 Jul 2024 17:12:20 -0400 Subject: [PATCH] Start decomping overlay 121 --- asm/{overlay_121.s => overlay_121_s.s} | 225 ------------------------- include/heap.h | 3 +- include/launch_application.h | 2 +- include/unk_02097D3C.h | 16 +- main.lsf | 3 +- src/launch_application.c | 2 +- src/overlay_121.c | 123 ++++++++++++++ src/save_arrays.c | 4 +- src/unk_0202E4B0.h | 12 ++ src/unk_02097D3C.c | 80 ++++----- 10 files changed, 190 insertions(+), 280 deletions(-) rename asm/{overlay_121.s => overlay_121_s.s} (92%) create mode 100644 src/overlay_121.c create mode 100644 src/unk_0202E4B0.h diff --git a/asm/overlay_121.s b/asm/overlay_121_s.s similarity index 92% rename from asm/overlay_121.s rename to asm/overlay_121_s.s index 8e86b947f..62ed342d7 100644 --- a/asm/overlay_121.s +++ b/asm/overlay_121_s.s @@ -4,231 +4,6 @@ .text - thumb_func_start ov121_021E5900 -ov121_021E5900: ; 0x021E5900 - push {r3, lr} - bl ov121_021E5AEC - mov r0, #1 - pop {r3, pc} - .balign 4, 0 - thumb_func_end ov121_021E5900 - - thumb_func_start ov121_021E590C -ov121_021E590C: ; 0x021E590C - push {r3, r4, lr} - sub sp, #0xc - bl OverlayManager_GetData - mov r1, #0x23 - add r4, r0, #0 - lsl r1, r1, #4 - ldrb r1, [r4, r1] - cmp r1, #4 - bhi _021E59B0 - add r1, r1, r1 - add r1, pc - ldrh r1, [r1, #6] - lsl r1, r1, #0x10 - asr r1, r1, #0x10 - add pc, r1 -_021E592C: ; jump table - .short _021E5936 - _021E592C - 2 ; case 0 - .short _021E5956 - _021E592C - 2 ; case 1 - .short _021E5968 - _021E592C - 2 ; case 2 - .short _021E597A - _021E592C - 2 ; case 3 - .short _021E599C - _021E592C - 2 ; case 4 -_021E5936: - mov r0, #6 - str r0, [sp] - mov r1, #1 - str r1, [sp, #4] - mov r0, #0x9e - str r0, [sp, #8] - mov r0, #0 - add r2, r1, #0 - add r3, r0, #0 - bl BeginNormalPaletteFade - mov r0, #0x23 - mov r1, #1 - lsl r0, r0, #4 - strb r1, [r4, r0] - b _021E59B0 -_021E5956: - bl IsPaletteFadeFinished - cmp r0, #0 - beq _021E59B0 - mov r0, #0x23 - mov r1, #2 - lsl r0, r0, #4 - strb r1, [r4, r0] - b _021E59B0 -_021E5968: - bl ov121_021E5C50 - cmp r0, #0 - beq _021E59B0 - mov r0, #0x23 - mov r1, #3 - lsl r0, r0, #4 - strb r1, [r4, r0] - b _021E59B0 -_021E597A: - mov r0, #6 - str r0, [sp] - mov r0, #1 - str r0, [sp, #4] - mov r0, #0x9e - str r0, [sp, #8] - mov r0, #0 - add r1, r0, #0 - add r2, r0, #0 - add r3, r0, #0 - bl BeginNormalPaletteFade - mov r0, #0x23 - mov r1, #4 - lsl r0, r0, #4 - strb r1, [r4, r0] - b _021E59B0 -_021E599C: - bl IsPaletteFadeFinished - cmp r0, #0 - beq _021E59B0 - add r0, r4, #0 - bl ov121_021E6F78 - add sp, #0xc - mov r0, #1 - pop {r3, r4, pc} -_021E59B0: - add r0, r4, #0 - bl ov121_021E5CB4 - mov r0, #0 - add sp, #0xc - pop {r3, r4, pc} - thumb_func_end ov121_021E590C - - thumb_func_start ov121_021E59BC -ov121_021E59BC: ; 0x021E59BC - push {r3, r4, r5, r6, r7, lr} - bl OverlayManager_GetData - add r4, r0, #0 - ldr r0, _021E5AE0 ; =gSystem + 0x60 - mov r1, #0 - strb r1, [r0, #9] - bl GfGfx_SwapDisplay - mov r0, #0 - add r1, r0, #0 - bl Main_SetVBlankIntrCB - ldr r0, _021E5AE4 ; =0x04000050 - mov r1, #0 - strh r1, [r0] - add r0, r4, #0 - bl ov121_021E6A4C - add r0, r4, #4 - bl RemoveWindow - add r0, r4, #0 - add r0, #0x14 - bl RemoveWindow - add r0, r4, #0 - add r0, #0x24 - bl RemoveWindow - add r0, r4, #0 - add r0, #0x34 - bl RemoveWindow - add r0, r4, #0 - add r0, #0x44 - bl RemoveWindow - add r0, r4, #0 - add r0, #0x54 - bl RemoveWindow - ldr r0, [r4] - mov r1, #0 - bl FreeBgTilemapBuffer - ldr r0, [r4] - mov r1, #1 - bl FreeBgTilemapBuffer - ldr r0, [r4] - mov r1, #2 - bl FreeBgTilemapBuffer - ldr r0, [r4] - mov r1, #3 - bl FreeBgTilemapBuffer - ldr r0, [r4] - mov r1, #4 - bl FreeBgTilemapBuffer - add r0, r4, #0 - bl ov121_021E611C - mov r0, #0x77 - lsl r0, r0, #2 - ldr r0, [r4, r0] - bl sub_0200AEB0 - mov r0, #0x1e - lsl r0, r0, #4 - ldr r0, [r4, r0] - bl sub_0200B0A8 - mov r7, #0x71 - mov r6, #0 - add r5, r4, #0 - lsl r7, r7, #2 -_021E5A5A: - ldr r0, [r5, r7] - bl Destroy2DGfxResObjMan - add r6, r6, #1 - add r5, r5, #4 - cmp r6, #6 - blt _021E5A5A - add r0, r4, #0 - add r0, #0x98 - ldr r0, [r0] - bl SpriteList_Delete - mov r0, #4 - bl FontID_Release - bl OamManager_Free - bl ObjCharTransfer_Destroy - bl sub_02022608 - add r0, r4, #0 - add r0, #0x94 - ldr r0, [r0] - bl YesNoPrompt_Destroy - mov r0, #0x8b - lsl r0, r0, #2 - ldr r0, [r4, r0] - bl FreeToHeap - ldr r0, [r4] - bl FreeToHeap - ldr r0, _021E5AE8 ; =0x0000025E - mov r5, #0 - ldrb r0, [r4, r0] - add r0, r0, #1 - cmp r0, #0 - ble _021E5AC4 - ldr r7, _021E5AE8 ; =0x0000025E - add r6, r4, #0 -_021E5AAE: - mov r0, #0x8e - lsl r0, r0, #2 - ldr r0, [r6, r0] - bl sub_0202EAFC - ldrb r0, [r4, r7] - add r5, r5, #1 - add r6, r6, #4 - add r0, r0, #1 - cmp r5, r0 - blt _021E5AAE -_021E5AC4: - mov r0, #0x95 - lsl r0, r0, #2 - ldr r0, [r4, r0] - bl FreeToHeap - add r0, r4, #0 - bl FreeToHeap - mov r0, #0x9e - bl DestroyHeap - mov r0, #1 - pop {r3, r4, r5, r6, r7, pc} - nop -_021E5AE0: .word gSystem + 0x60 -_021E5AE4: .word 0x04000050 -_021E5AE8: .word 0x0000025E - thumb_func_end ov121_021E59BC - thumb_func_start ov121_021E5AEC ov121_021E5AEC: ; 0x021E5AEC push {r3, r4, r5, lr} diff --git a/include/heap.h b/include/heap.h index 40c0e61aa..d6f139fdc 100644 --- a/include/heap.h +++ b/include/heap.h @@ -34,7 +34,8 @@ typedef enum HeapID { HEAP_ID_GAME_BOARD = 110, HEAP_ID_BERRY_POTS = 130, HEAP_ID_BERRY_POTS_APP = 131, - HEAP_ID_VOLTORB_FLIP = 160 + HEAP_ID_9E = 158, + HEAP_ID_VOLTORB_FLIP = 160, } HeapID; typedef struct HeapParam { diff --git a/include/launch_application.h b/include/launch_application.h index 8a50a2d37..b7e9982ee 100644 --- a/include/launch_application.h +++ b/include/launch_application.h @@ -146,7 +146,7 @@ void PokeathlonCourse_LaunchApp(FieldSystem *fieldSystem, PokeathlonCourseArgs * void sub_0203FC68(FieldSystem *fieldSystem, void *args); void sub_0203FC90(FieldSystem *fieldSystem, void *args); LegendaryCinematicArgs *LegendaryCinematic_LaunchApp(FieldSystem *fieldSystem, UnkStruct_0203FCC4 *a1, u16 a2, u16 a3, HeapID heapId); -void sub_0203FD08(FieldSystem *fieldSystem, UnkStruct_02097D48 *args); +void sub_0203FD08(FieldSystem *fieldSystem, UnkStruct_02097D56 *args); PartyMenuArgs *PartyMenu_LaunchApp_Unk1(FieldSystem *fieldSystem, FieldMoveCheckData *fieldMoveCheckData, u8 partySlot); void CallTask_NamingScreen(TaskManager *taskManager, NameScreenType type, int species, int maxLen, int initPos, const u16 *defaultStr, u16 *retVar); void sub_0203E960(TaskManager *a0, int a1, UnkStruct_0203E8C8 *a2, u16 *a3, u16 *a4); diff --git a/include/unk_02097D3C.h b/include/unk_02097D3C.h index 03eecf78f..3a76b26ae 100644 --- a/include/unk_02097D3C.h +++ b/include/unk_02097D3C.h @@ -1,21 +1,19 @@ #ifndef POKEHEARTGOLD_UNK_02097D3C_H #define POKEHEARTGOLD_UNK_02097D3C_H +#include "field_types_def.h" +#include "save.h" + typedef struct UnkStruct_02097D56 { - u16 unk00; - u16 unk02; + u16 unk_0; + u16 unk_2; SaveData *saveData; } UnkStruct_02097D56; typedef struct UnkStruct_02097D48 { - u32 unk00; - UnkStruct_02097D56 *unk04; -} UnkStruct_02097D48; - -typedef struct UnkStruct_02097D8E { u32 state; - UnkStruct_02097D48 *unk04; -} UnkStruct_02097D8E; + UnkStruct_02097D56 *args; +} UnkStruct_02097D48; void sub_02097D3C(FieldSystem *fieldSystem, u8 a1, u8 a2); diff --git a/main.lsf b/main.lsf index 47fa4f486..22c5f80db 100644 --- a/main.lsf +++ b/main.lsf @@ -1180,7 +1180,8 @@ Overlay OVY_120 Overlay OVY_121 { After main - Object asm/overlay_121.o + Object src/overlay_121.o + Object asm/overlay_121_s.o } Overlay voltorb_flip { diff --git a/src/launch_application.c b/src/launch_application.c index de56e83ed..431c41015 100644 --- a/src/launch_application.c +++ b/src/launch_application.c @@ -1397,7 +1397,7 @@ LegendaryCinematicArgs *LegendaryCinematic_LaunchApp(FieldSystem *fieldSystem, U return args; } -void sub_0203FD08(FieldSystem *fieldSystem, UnkStruct_02097D48 *args) { +void sub_0203FD08(FieldSystem *fieldSystem, UnkStruct_02097D56 *args) { static const OVY_MGR_TEMPLATE _020FA494 = { ov121_021E5900, ov121_021E590C, ov121_021E59BC, FS_OVERLAY_ID(OVY_121) }; FieldSystem_LaunchApplication(fieldSystem, &_020FA494, args); } diff --git a/src/overlay_121.c b/src/overlay_121.c new file mode 100644 index 000000000..5ae64ffbf --- /dev/null +++ b/src/overlay_121.c @@ -0,0 +1,123 @@ +#include "bg_window.h" +#include "font.h" +#include "global.h" +#include "overlay_121.h" +#include "obj_char_transfer.h" +#include "system.h" +#include "unk_02009D48.h" +#include "unk_0200A090.h" +#include "unk_0200ACF0.h" +#include "unk_0200B150.h" +#include "unk_0200FA24.h" +#include "unk_02022588.h" +#include "unk_02023694.h" +#include "unk_0202E4B0.h" +#include "unk_02097D3C.h" +#include "yes_no_prompt.h" + +typedef struct Overlay121Appdata { + BgConfig *unk_000; + Window unk_004[6]; + u8 filler_064[0x30]; + YesNoPrompt *unk_094; + SpriteList *unk_098; + u8 filler_09C[0x128]; + GF_2DGfxResMan *unk_1C4[6]; + GF_2DGfxResObj *unk_1DC; + GF_2DGfxResObj *unk_1E0; + u8 filler_1E4[0x48]; + void *unk_22C; + u8 unk_230; + u8 filler_231[0x7]; + UnkStruct_0202E4B0 *unk_238[7]; + void *unk_254; + u8 filler_258[6]; + u8 unk_25E; +} Overlay121AppData; + +void ov121_021E5AEC(OVY_MANAGER *man, int *pState); +BOOL ov121_021E5C50(Overlay121AppData *appData); +void ov121_021E5CB4(Overlay121AppData *appData); +void ov121_021E611C(Overlay121AppData *appData); +void ov121_021E6A4C(Overlay121AppData *appData); +BOOL ov121_021E6F78(Overlay121AppData *appData); + +BOOL ov121_021E5900(OVY_MANAGER *man, int *pState) { + ov121_021E5AEC(man, pState); + return TRUE; +} + +BOOL ov121_021E590C(OVY_MANAGER *man, int *pState) { + Overlay121AppData *appData = OverlayManager_GetData(man); + switch (appData->unk_230) { + case 0: + BeginNormalPaletteFade(0, 1, 1, RGB_BLACK, 6, 1, HEAP_ID_9E); + appData->unk_230 = 1; + break; + case 1: + if (IsPaletteFadeFinished()) { + appData->unk_230 = 2; + } + break; + case 2: + if (ov121_021E5C50(appData)) { + appData->unk_230 = 3; + } + break; + case 3: + BeginNormalPaletteFade(0, 0, 0, RGB_BLACK, 6, 1, HEAP_ID_9E); + appData->unk_230 = 4; + break; + case 4: + if (IsPaletteFadeFinished()) { + ov121_021E6F78(appData); + return TRUE; + } + break; + } + + ov121_021E5CB4(appData); + return FALSE; +} + +BOOL ov121_021E59BC(OVY_MANAGER *man, int *pState) { + Overlay121AppData *appData = OverlayManager_GetData(man); + + gSystem.screensFlipped = FALSE; + GfGfx_SwapDisplay(); + Main_SetVBlankIntrCB(NULL, NULL); + G2_BlendNone(); + ov121_021E6A4C(appData); + RemoveWindow(&appData->unk_004[0]); + RemoveWindow(&appData->unk_004[1]); + RemoveWindow(&appData->unk_004[2]); + RemoveWindow(&appData->unk_004[3]); + RemoveWindow(&appData->unk_004[4]); + RemoveWindow(&appData->unk_004[5]); + FreeBgTilemapBuffer(appData->unk_000, GF_BG_LYR_MAIN_0); + FreeBgTilemapBuffer(appData->unk_000, GF_BG_LYR_MAIN_1); + FreeBgTilemapBuffer(appData->unk_000, GF_BG_LYR_MAIN_2); + FreeBgTilemapBuffer(appData->unk_000, GF_BG_LYR_MAIN_3); + FreeBgTilemapBuffer(appData->unk_000, GF_BG_LYR_SUB_0); + ov121_021E611C(appData); + sub_0200AEB0(appData->unk_1DC); + sub_0200B0A8(appData->unk_1E0); + for (int i = 0; i < 6; ++i) { + Destroy2DGfxResObjMan(appData->unk_1C4[i]); + } + SpriteList_Delete(appData->unk_098); + FontID_Release(4); + OamManager_Free(); + ObjCharTransfer_Destroy(); + sub_02022608(); + YesNoPrompt_Destroy(appData->unk_094); + FreeToHeap(appData->unk_22C); + FreeToHeap(appData->unk_000); + for (int i = 0; i < appData->unk_25E + 1; ++i) { + sub_0202EAFC(appData->unk_238[i]); + } + FreeToHeap(appData->unk_254); + FreeToHeap(appData); + DestroyHeap(HEAP_ID_9E); + return TRUE; +} diff --git a/src/save_arrays.c b/src/save_arrays.c index 8db661780..78b834c19 100644 --- a/src/save_arrays.c +++ b/src/save_arrays.c @@ -27,17 +27,17 @@ #include "save_local_field_data.h" #include "save_trainer_house.h" #include "save_special_ribbons.h" +#include "unk_0202E4B0.h" +#include "game_stats.h" #define DECL_CHUNK(prefix) extern u32 prefix##_sizeof(void); extern void prefix##_Init(void *); #define DECL_CHUNK_EX(sizefn, initfn) extern u32 sizefn(void); extern void initfn(void *); DECL_CHUNK_EX(sub_020290B8, sub_020290C8) DECL_CHUNK(Save_FashionData) -DECL_CHUNK(GameStats) DECL_CHUNK_EX(sub_02031000, sub_02031008) DECL_CHUNK_EX(sub_0202DB40, sub_0202DB44) DECL_CHUNK_EX(sub_0202E41C, sub_0202E424) -DECL_CHUNK_EX(sub_0202E4F4, sub_0202E4FC) DECL_CHUNK_EX(sub_0202C034, sub_0202C03C) DECL_CHUNK_EX(sub_0202CA24, sub_0202CA2C) DECL_CHUNK_EX(sub_0202EB30, sub_0202EB38) diff --git a/src/unk_0202E4B0.h b/src/unk_0202E4B0.h new file mode 100644 index 000000000..4d30eb918 --- /dev/null +++ b/src/unk_0202E4B0.h @@ -0,0 +1,12 @@ +#ifndef GUARD_POKEHEARTGOLD_UNK_0202E4B0_H +#define GUARD_POKEHEARTGOLD_UNK_0202E4B0_H + +#include "global.h" + +typedef struct UnkStruct_0202E4B0 UnkStruct_0202E4B0; + +u32 sub_0202E4F4(void); // ???_sizeof +void sub_0202E4FC(UnkStruct_0202E4B0 *a0); // ???_Init +void sub_0202EAFC(UnkStruct_0202E4B0 *a0); + +#endif //GUARD_POKEHEARTGOLD_UNK_0202E4B0_H diff --git a/src/unk_02097D3C.c b/src/unk_02097D3C.c index e0224ca94..afacafbec 100644 --- a/src/unk_02097D3C.c +++ b/src/unk_02097D3C.c @@ -8,57 +8,57 @@ static BOOL sub_02097D80(TaskManager *taskManager); void sub_02097D3C(FieldSystem *fieldSystem, u8 a1, u8 a2) { - UnkStruct_02097D48 *unk0 = AllocFromHeapAtEnd(HEAP_ID_FIELD, sizeof(UnkStruct_02097D48)); - unk0->unk00 = 0; - unk0->unk04 = AllocFromHeapAtEnd(HEAP_ID_FIELD, sizeof(UnkStruct_02097D56)); - unk0->unk04->saveData = FieldSystem_GetSaveData(fieldSystem); - unk0->unk04->unk00 = a1; - unk0->unk04->unk02 = a2; - TaskManager_Call(fieldSystem->taskman, sub_02097D80, unk0); + UnkStruct_02097D48 *taskData = AllocFromHeapAtEnd(HEAP_ID_FIELD, sizeof(UnkStruct_02097D48)); + taskData->state = 0; + taskData->args = AllocFromHeapAtEnd(HEAP_ID_FIELD, sizeof(UnkStruct_02097D56)); + taskData->args->saveData = FieldSystem_GetSaveData(fieldSystem); + taskData->args->unk_0 = a1; + taskData->args->unk_2 = a2; + TaskManager_Call(fieldSystem->taskman, sub_02097D80, taskData); } static BOOL sub_02097D80(TaskManager *taskManager) { FieldSystem *fieldSystem = TaskManager_GetFieldSystem(taskManager); - UnkStruct_02097D8E *unk1 = TaskManager_GetEnvironment(taskManager); - - switch (unk1->state) { - case 0: - BeginNormalPaletteFade(0, 0, 0, RGB_BLACK, 6, 1, HEAP_ID_4); - unk1->state++; + UnkStruct_02097D48 *taskData = TaskManager_GetEnvironment(taskManager); + switch (taskData->state) { + case 0: + BeginNormalPaletteFade(0, 0, 0, RGB_BLACK, 6, 1, HEAP_ID_4); + taskData->state++; + + break; + case 1: + if (!IsPaletteFadeFinished()) { break; - case 1: - if (!IsPaletteFadeFinished()) { - break; - } + } - sub_0203FD08(fieldSystem, unk1->unk04); - sub_0203E30C(); - unk1->state++; + sub_0203FD08(fieldSystem, taskData->args); + sub_0203E30C(); + taskData->state++; + break; + case 2: + if (FieldSystem_ApplicationIsRunning(fieldSystem)) { break; - case 2: - if (FieldSystem_ApplicationIsRunning(fieldSystem)) { - break; - } + } - unk1->state++; - sub_020505C0(fieldSystem); + taskData->state++; + sub_020505C0(fieldSystem); + break; + case 3: + if (sub_020505C8(fieldSystem)) { + BeginNormalPaletteFade(0, 1, 1, RGB_BLACK, 6, 1, HEAP_ID_4); + taskData->state++; + } + + break; + case 4: + if (!IsPaletteFadeFinished()) { break; - case 3: - if (sub_020505C8(fieldSystem)) { - BeginNormalPaletteFade(0, 1, 1, RGB_BLACK, 6, 1, HEAP_ID_4); - unk1->state++; - } + } - break; - case 4: - if (!IsPaletteFadeFinished()) { - break; - } - - FreeToHeap(unk1->unk04); - FreeToHeap(unk1); - return TRUE; + FreeToHeap(taskData->args); + FreeToHeap(taskData); + return TRUE; } return FALSE;