diff --git a/asm/include/overlay_01_02204004.inc b/asm/include/overlay_01_02204004.inc index 3f15d87d8..a8ad276fa 100644 --- a/asm/include/overlay_01_02204004.inc +++ b/asm/include/overlay_01_02204004.inc @@ -55,3 +55,5 @@ .public ov01_0220476C .public ov01_022047DC .public ov01_02204834 +.public ov01_022040C0 +.public ov01_022040E4 \ No newline at end of file diff --git a/asm/overlay_01_02204004.s b/asm/overlay_01_02204004.s index 7d8070620..d08c2aeb7 100644 --- a/asm/overlay_01_02204004.s +++ b/asm/overlay_01_02204004.s @@ -14,283 +14,6 @@ .text - thumb_func_start ov01_02204004 -ov01_02204004: ; 0x02204004 - push {r3, r4, r5, r6, r7, lr} - add r6, r1, #0 - mov r1, #0x1c - add r7, r0, #0 - add r5, r2, #0 - str r3, [sp] - bl Heap_Alloc - add r4, r0, #0 - mov r0, #0 - str r0, [r4, #0x10] - str r6, [r4, #0x14] - ldr r0, [sp] - str r5, [r4, #0x18] - str r0, [r4, #4] - add r0, r7, #0 - add r1, r6, #0 - bl Heap_Alloc - mov r2, #0 - str r0, [r4] - cmp r6, #0 - ble _0220403E - mov r1, #0xff -_02204034: - ldr r0, [r4] - strb r1, [r0, r2] - add r2, r2, #1 - cmp r2, r6 - blt _02204034 -_0220403E: - mov r0, #0x5c - add r6, r5, #0 - mul r6, r0 - add r0, r7, #0 - add r1, r6, #0 - bl Heap_Alloc - str r0, [r4, #8] - ldr r1, [r4, #8] - mov r0, #0 - add r2, r6, #0 - bl MIi_CpuClearFast - add r0, r7, #0 - lsl r1, r5, #2 - bl Heap_Alloc - mov r6, #0 - str r0, [r4, #0xc] - cmp r5, #0 - ble _0220407E - add r2, r6, #0 - add r3, r6, #0 -_0220406C: - ldr r0, [r4, #8] - add r6, r6, #1 - add r1, r0, r2 - ldr r0, [r4, #0xc] - add r2, #0x5c - str r1, [r0, r3] - add r3, r3, #4 - cmp r6, r5 - blt _0220406C -_0220407E: - add r0, r4, #0 - pop {r3, r4, r5, r6, r7, pc} - .balign 4, 0 - thumb_func_end ov01_02204004 - - thumb_func_start ov01_02204084 -ov01_02204084: ; 0x02204084 - push {r4, lr} - add r4, r0, #0 - ldr r0, [r4] - bl Heap_Free - ldr r0, [r4, #8] - bl Heap_Free - ldr r0, [r4, #0xc] - bl Heap_Free - add r0, r4, #0 - bl Heap_Free - pop {r4, pc} - .balign 4, 0 - thumb_func_end ov01_02204084 - - thumb_func_start ov01_022040A4 -ov01_022040A4: ; 0x022040A4 - push {r3, lr} - add r2, r1, #0 - ldr r3, [r0, #0x10] - ldr r1, [r0] - strb r3, [r1, r2] - ldr r3, [r0, #4] - lsl r1, r2, #2 - ldr r1, [r3, r1] - str r1, [sp] - add r1, sp, #0 - bl ov01_02204168 - pop {r3, pc} - .balign 4, 0 - thumb_func_end ov01_022040A4 - - thumb_func_start ov01_022040C0 -ov01_022040C0: ; 0x022040C0 - ldr r2, [r0, #0x10] - sub r3, r2, #1 - str r3, [r0, #0x10] - ldr r2, [r0, #0xc] - lsl r0, r3, #2 - str r1, [r2, r0] - bx lr - .balign 4, 0 - thumb_func_end ov01_022040C0 - - thumb_func_start Field3dObjectList_GetRenderObjectByID -Field3dObjectList_GetRenderObjectByID: ; 0x022040D0 - ldr r2, [r0] - ldrb r2, [r2, r1] - cmp r2, #0xff - beq _022040E0 - ldr r1, [r0, #0xc] - lsl r0, r2, #2 - ldr r0, [r1, r0] - bx lr -_022040E0: - mov r0, #0 - bx lr - thumb_func_end Field3dObjectList_GetRenderObjectByID - - thumb_func_start ov01_022040E4 -ov01_022040E4: ; 0x022040E4 - push {r3, lr} - add r2, r1, #0 - ldr r3, [r0, #4] - lsl r1, r2, #2 - ldr r1, [r3, r1] - str r1, [sp] - add r1, sp, #0 - bl ov01_02204168 - pop {r3, pc} - thumb_func_end ov01_022040E4 - - thumb_func_start ov01_022040F8 -ov01_022040F8: ; 0x022040F8 - push {r3, r4, r5, lr} - add r5, r0, #0 - add r4, r1, #0 - bl ov01_02204144 - cmp r0, #0 - beq _02204110 - add r0, r5, #0 - add r1, r4, #0 - bl Field3dObjectList_GetRenderObjectByID - pop {r3, r4, r5, pc} -_02204110: - add r0, r5, #0 - add r1, r4, #0 - bl ov01_022040E4 - pop {r3, r4, r5, pc} - .balign 4, 0 - thumb_func_end ov01_022040F8 - - thumb_func_start ov01_0220411C -ov01_0220411C: ; 0x0220411C - push {r3, r4, r5, lr} - add r5, r0, #0 - add r4, r1, #0 - bne _02204128 - mov r0, #0 - pop {r3, r4, r5, pc} -_02204128: - ldr r1, [r4, #0x58] - bl ov01_02204144 - cmp r0, #0 - bne _0220413E - add r0, r5, #0 - add r1, r4, #0 - bl ov01_022040C0 - mov r0, #1 - pop {r3, r4, r5, pc} -_0220413E: - mov r0, #0 - pop {r3, r4, r5, pc} - .balign 4, 0 - thumb_func_end ov01_0220411C - - thumb_func_start ov01_02204144 -ov01_02204144: ; 0x02204144 - ldr r0, [r0] - ldrb r0, [r0, r1] - cmp r0, #0xff - beq _02204150 - mov r0, #1 - bx lr -_02204150: - mov r0, #0 - bx lr - thumb_func_end ov01_02204144 - - thumb_func_start ov01_02204154 -ov01_02204154: ; 0x02204154 - ldr r2, [r0, #4] - lsl r0, r1, #2 - ldr r0, [r2, r0] - cmp r0, #0 - beq _02204162 - mov r0, #1 - bx lr -_02204162: - mov r0, #0 - bx lr - .balign 4, 0 - thumb_func_end ov01_02204154 - - thumb_func_start ov01_02204168 -ov01_02204168: ; 0x02204168 - push {r3, r4, r5, lr} - add r5, r0, #0 - ldr r0, [r1] - add r4, r2, #0 - bl NNS_G3dGetMdlSet - cmp r0, #0 - beq _02204198 - add r2, r0, #0 - add r2, #8 - beq _0220418C - ldrb r1, [r0, #9] - cmp r1, #0 - bls _0220418C - ldrh r1, [r0, #0xe] - add r1, r2, r1 - add r1, r1, #4 - b _0220418E -_0220418C: - mov r1, #0 -_0220418E: - cmp r1, #0 - beq _02204198 - ldr r1, [r1] - add r2, r0, r1 - b _0220419A -_02204198: - mov r2, #0 -_0220419A: - ldr r0, [r5, #0x10] - ldr r1, [r5, #0xc] - lsl r0, r0, #2 - ldr r0, [r1, r0] - str r2, [r0, #0x54] - ldr r0, [r5, #0x10] - ldr r1, [r5, #0xc] - lsl r0, r0, #2 - ldr r0, [r1, r0] - ldr r1, [r0, #0x54] - bl NNS_G3dRenderObjInit - ldr r1, [r5, #0x10] - ldr r2, [r5, #0xc] - lsl r0, r1, #2 - ldr r0, [r2, r0] - add r1, r1, #1 - str r1, [r5, #0x10] - str r4, [r0, #0x58] - pop {r3, r4, r5, pc} - .balign 4, 0 - thumb_func_end ov01_02204168 - - thumb_func_start ov01_022041C4 -ov01_022041C4: ; 0x022041C4 - push {r3, lr} - mov r1, #0x10 - bl Heap_Alloc - mov r1, #0 - str r1, [r0, #0xc] - str r1, [r0] - str r1, [r0, #4] - str r1, [r0, #8] - pop {r3, pc} - thumb_func_end ov01_022041C4 - thumb_func_start ov01_022041D8 ov01_022041D8: ; 0x022041D8 push {r3, r4, r5, r6, r7, lr} diff --git a/include/field/overlay_01_021E8744.h b/include/field/overlay_01_021E8744.h index 480babf50..a150e9e1b 100644 --- a/include/field/overlay_01_021E8744.h +++ b/include/field/overlay_01_021E8744.h @@ -2,15 +2,10 @@ #define POKEHEARTGOLD_FIELD_OVERLAY_01_021E8744_H #include +#include "field/overlay_01_02204004.h" typedef struct UnkStruct_ov01_021E8B04 UnkStruct_ov01_021E8B04; -typedef struct UnkStruct_FieldSysC0_SubC { - NNSG3dRenderObj renderObj; - NNSG3dResMdl *model; - NNSG3dResFileHeader *resFileHeader; -} UnkStruct_FieldSysC0_SubC; - void ov01_021E8970(int modelNum, int animNum, int a2, UnkStruct_FieldSysC0_SubC *renderObj, void *fsysUnk54); UnkStruct_ov01_021E8B04 *ov01_021E8B04(int modelNum, int animNum, void *fsysUnk54); void ov01_021E8B84(UnkStruct_ov01_021E8B04 *anim, int a1); diff --git a/include/field/overlay_01_02204004.h b/include/field/overlay_01_02204004.h index ad8e2f1e0..811e99e6f 100644 --- a/include/field/overlay_01_02204004.h +++ b/include/field/overlay_01_02204004.h @@ -3,13 +3,24 @@ #include -#include "field/overlay_01_021E8744.h" - #include "heap.h" +typedef struct FieldSystemUnkSubC8 { + u32 unk0; + u32 unk4; + u32 unk8; + u32 unkC; +} FieldSystemUnkSubC8; + +typedef struct UnkStruct_FieldSysC0_SubC { + NNSG3dRenderObj renderObj; + NNSG3dResMdl *model; + int index; +} UnkStruct_FieldSysC0_SubC; + typedef struct UnkStruct_FieldSysC0 { u8 *modelNumToLoadedSlot; - NNSG3dResFileHeader *resFileHeader; + NNSG3dResFileHeader **resFileHeaders; UnkStruct_FieldSysC0_SubC *objectHeap; UnkStruct_FieldSysC0_SubC **objects; int numObjects; @@ -17,7 +28,22 @@ typedef struct UnkStruct_FieldSysC0 { int objectMax; } UnkStruct_FieldSysC0; -UnkStruct_FieldSysC0 ov01_02204004(enum HeapID heapID, int indexMax, int objectMax, NNSG3dResFileHeader *a3); -UnkStruct_FieldSysC0_SubC *Field3dObjectList_GetRenderObjectByID(UnkStruct_FieldSysC0 *a0, int a1); +UnkStruct_FieldSysC0 *ov01_02204004(enum HeapID heapID, int indexMax, int objectMax, NNSG3dResFileHeader **fileResHeader); // FieldSysC0_New +void ov01_02204084(UnkStruct_FieldSysC0 *unkC0); // FieldSysC0_Free +UnkStruct_FieldSysC0_SubC *ov01_022040A4(UnkStruct_FieldSysC0 *unkC0, int index); +UnkStruct_FieldSysC0_SubC *Field3dObjectList_GetRenderObjectByID(UnkStruct_FieldSysC0 *unkC0, int index); +UnkStruct_FieldSysC0_SubC *ov01_022040F8(UnkStruct_FieldSysC0 *unkC0, int index); +BOOL ov01_0220411C(UnkStruct_FieldSysC0 *unkC0, UnkStruct_FieldSysC0_SubC *object); +BOOL ov01_02204154(UnkStruct_FieldSysC0 *unkC0, int index); +FieldSystemUnkSubC8 *ov01_022041C4(enum HeapID heapID); +void ov01_02204278(FieldSystemUnkSubC8 *unkSubC8); +void ov01_02204350(FieldSystemUnkSubC8 *unkSubC8); +void ov01_022043D8(FieldSystemUnkSubC8 *unkSubC8); +void ov01_02204424(FieldSystemUnkSubC8 *unkSubC8); +void *ov01_0220460C(FieldSystemUnkSubC8 *unkSubC8); +void ov01_02204634(void *unkCC); +void *ov01_02204744(enum HeapID heapID); +void ov01_02204764(void *unk104); +void ov01_022047DC(void *unk104); #endif // POKEHEARTGOLD_FIELD_OVERLAY_01_02204004_H diff --git a/include/field_system.h b/include/field_system.h index cb7946998..61e78c2a7 100644 --- a/include/field_system.h +++ b/include/field_system.h @@ -3,6 +3,7 @@ #include "field/draw_map_name.h" #include "field/overlay_01_021E66E4.h" +#include "field/overlay_01_02204004.h" #include "bag_cursor.h" #include "battle_regulation.h" @@ -16,7 +17,6 @@ #include "map_matrix.h" #include "menu_input_state.h" #include "overlay_01_021EB1E8.h" -#include "overlay_01_02204004.h" #include "overlay_manager.h" #include "photo_types_def.h" #include "save_pokegear.h" @@ -157,7 +157,7 @@ struct FieldSystem { u8 unkBC[4]; void *unkC0; int unkC4; - FieldSystemUnkC8 *unk_C8; + FieldSystemUnkSubC8 *unk_C8; u8 filler_CC[0x4]; u16 lastTouchMenuInput; u8 unkD2_0 : 6; diff --git a/include/overlay_01_02204004.h b/include/overlay_01_02204004.h deleted file mode 100644 index cf8de28d5..000000000 --- a/include/overlay_01_02204004.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef POKEHEARTGOLD_OVERLAY_01_02204004_H -#define POKEHEARTGOLD_OVERLAY_01_02204004_H - -typedef struct FieldSystemUnkC8 FieldSystemUnkC8; - -void ov01_022043D8(FieldSystemUnkC8 *a0); -void ov01_02204424(FieldSystemUnkC8 *a0); - -#endif // POKEHEARTGOLD_OVERLAY_01_02204004_H diff --git a/main.lsf b/main.lsf index 78846df19..6a52155a4 100644 --- a/main.lsf +++ b/main.lsf @@ -557,6 +557,7 @@ Overlay field Object asm/overlay_01_022031C0.o Object asm/overlay_01_02203A18.o Object asm/overlay_01_02203E40.o + Object src/field/overlay_01_02204004_thumb.o Object asm/overlay_01_02204004.o Object src/field/overlay_01_apricorn_tree_anim.o Object src/field/overlay_01_rock_smash_item.o diff --git a/src/field/legend_cutscene_camera.c b/src/field/legend_cutscene_camera.c index 2fc1243bb..a0de78ff9 100644 --- a/src/field/legend_cutscene_camera.c +++ b/src/field/legend_cutscene_camera.c @@ -4,6 +4,7 @@ #include "demo/legend.naix" #include "field/overlay_01_021E66E4.h" +#include "field/overlay_01_021E8744.h" #include "field/overlay_01_021FB878.h" #include "field/overlay_01_02204004.h" #include "fielddata/script/scr_seq/event_D17R0110.h" diff --git a/src/field/overlay_01_02204004_thumb.c b/src/field/overlay_01_02204004_thumb.c new file mode 100644 index 000000000..7172b48eb --- /dev/null +++ b/src/field/overlay_01_02204004_thumb.c @@ -0,0 +1,103 @@ +#include "field/overlay_01_02204004.h" + +#include "global.h" + +static BOOL ov01_02204144(UnkStruct_FieldSysC0 *unkC0, int index); +static UnkStruct_FieldSysC0_SubC *ov01_02204168(UnkStruct_FieldSysC0 *unkC0, NNSG3dResFileHeader **resFileHeader, int index); + +UnkStruct_FieldSysC0 *ov01_02204004(enum HeapID heapID, int indexMax, int objectMax, NNSG3dResFileHeader **resFileHeaders) { // FieldSysC0_New + UnkStruct_FieldSysC0 *unkC0 = Heap_Alloc(heapID, sizeof(UnkStruct_FieldSysC0)); + unkC0->numObjects = 0; + unkC0->indexMax = indexMax; + unkC0->objectMax = objectMax; + unkC0->resFileHeaders = resFileHeaders; + unkC0->modelNumToLoadedSlot = Heap_Alloc(heapID, indexMax); + int i; + for (i = 0; i < indexMax; i++) { + unkC0->modelNumToLoadedSlot[i] = 0xFF; + } + int size = objectMax * 0x5C; + unkC0->objectHeap = Heap_Alloc(heapID, size); + MIi_CpuClearFast(0, (u32*)unkC0->objectHeap, size); + unkC0->objects = Heap_Alloc(heapID, objectMax * 4); + for (i = 0; i < objectMax; i++) { + unkC0->objects[i] = &unkC0->objectHeap[i]; + } + return unkC0; +} + +void ov01_02204084(UnkStruct_FieldSysC0 *unkC0) { // FieldSysC0_Free + Heap_Free(unkC0->modelNumToLoadedSlot); + Heap_Free(unkC0->objectHeap); + Heap_Free(unkC0->objects); + Heap_Free(unkC0); +} + +UnkStruct_FieldSysC0_SubC *ov01_022040A4(UnkStruct_FieldSysC0 *unkC0, int index) { + unkC0->modelNumToLoadedSlot[index] = unkC0->numObjects; + NNSG3dResFileHeader *resFileHeader = unkC0->resFileHeaders[index]; + return ov01_02204168(unkC0, &resFileHeader, index); +} + +static void ov01_022040C0(UnkStruct_FieldSysC0 *unkC0, UnkStruct_FieldSysC0_SubC *object) { + unkC0->numObjects--; + unkC0->objects[unkC0->numObjects] = object; +} + +UnkStruct_FieldSysC0_SubC *Field3dObjectList_GetRenderObjectByID(UnkStruct_FieldSysC0 *unkC0, int id) { + u8 index = unkC0->modelNumToLoadedSlot[id]; + if (index != 0xFF) { + return unkC0->objects[index]; + } + return NULL; +} + +static UnkStruct_FieldSysC0_SubC *ov01_022040E4(UnkStruct_FieldSysC0 *unkC0, int index) { + NNSG3dResFileHeader *resFileHeader = unkC0->resFileHeaders[index]; + return ov01_02204168(unkC0, &resFileHeader, index); +} + +UnkStruct_FieldSysC0_SubC *ov01_022040F8(UnkStruct_FieldSysC0 *unkC0, int index) { + if (ov01_02204144(unkC0, index)) { + return Field3dObjectList_GetRenderObjectByID(unkC0, index); + } + return ov01_022040E4(unkC0, index); +} + +BOOL ov01_0220411C(UnkStruct_FieldSysC0 *unkC0, UnkStruct_FieldSysC0_SubC *object) { + if (object == NULL) { + return FALSE; + } + + if (ov01_02204144(unkC0, object->index) == FALSE) { + ov01_022040C0(unkC0, object); + return TRUE; + } + return FALSE; +} + +static BOOL ov01_02204144(UnkStruct_FieldSysC0 *unkC0, int index) { + return unkC0->modelNumToLoadedSlot[index] != 0xFF; +} + +BOOL ov01_02204154(UnkStruct_FieldSysC0 *unkC0, int index) { + return unkC0->resFileHeaders[index] != NULL; +} + +static UnkStruct_FieldSysC0_SubC *ov01_02204168(UnkStruct_FieldSysC0 *unkC0, NNSG3dResFileHeader **resFileHeader, int index) { + unkC0->objects[unkC0->numObjects]->model = NNS_G3dGetMdlByIdx(NNS_G3dGetMdlSet(*resFileHeader), 0); + + NNS_G3dRenderObjInit(&unkC0->objects[unkC0->numObjects]->renderObj, unkC0->objects[unkC0->numObjects]->model); + UnkStruct_FieldSysC0_SubC *object = unkC0->objects[unkC0->numObjects]; + unkC0->numObjects++; + object->index = index; + return object; +} + +FieldSystemUnkSubC8 *ov01_022041C4(enum HeapID heapID) { // FieldSystemUnkSubC8_New + FieldSystemUnkSubC8 *unkC8 = Heap_Alloc(heapID, sizeof(FieldSystemUnkSubC8)); + unkC8->unkC = 0; + unkC8->unk0 = 0; + unkC8->unk4 = 0; + unkC8->unk8 = 0; +}