diff --git a/asm/include/unk_0200CF18.inc b/asm/include/unk_0200CF18.inc index 1afbcc4d2..89a453b6d 100644 --- a/asm/include/unk_0200CF18.inc +++ b/asm/include/unk_0200CF18.inc @@ -219,3 +219,4 @@ .public sub_0200D060 .public sub_0200D0B4 .public sub_0200D0D4 +.public sub_0200D124 diff --git a/asm/unk_0200CF18.s b/asm/unk_0200CF18.s index ba37f2aeb..cf2ce3515 100644 --- a/asm/unk_0200CF18.s +++ b/asm/unk_0200CF18.s @@ -4,202 +4,6 @@ .text - thumb_func_start sub_0200D108 -sub_0200D108: ; 0x0200D108 - push {r4, lr} - add r4, r0, #0 - ldr r0, [r4, #4] - cmp r0, #0 - beq _0200D116 - bl GF_AssertFail -_0200D116: - add r0, r4, #0 - bl sub_0200D0B4 - add r0, r4, #0 - bl FreeToHeap - pop {r4, pc} - thumb_func_end sub_0200D108 - - thumb_func_start sub_0200D124 -sub_0200D124: ; 0x0200D124 - push {r4, r5, r6, r7, lr} - sub sp, #0x34 - add r5, r0, #0 - add r4, r1, #0 - mov r7, #6 - str r2, [sp, #0x10] - str r3, [sp, #0x14] - cmp r5, #0 - beq _0200D13A - cmp r4, #0 - bne _0200D140 -_0200D13A: - add sp, #0x34 - mov r0, #0 - pop {r4, r5, r6, r7, pc} -_0200D140: - add r0, r2, #0 - ldrh r1, [r0, #8] - ldr r0, _0200D290 ; =0x0000FFFF - cmp r1, r0 - bne _0200D14C - mov r7, #4 -_0200D14C: - str r7, [r4, #0x54] - bl sub_0200A8FC - add r2, r0, #0 - add r1, r2, #0 - ldr r0, [r5] - mul r1, r7 - bl AllocFromHeap - str r0, [r4, #8] - ldr r1, [r5] - mov r0, #0xaf - bl NARC_New - str r0, [sp, #0x20] - mov r0, #0 - str r0, [sp, #0x24] - cmp r7, #0 - ble _0200D1AA - ldr r6, [sp, #0x10] -_0200D174: - ldr r0, [r4, #8] - ldr r1, [sp, #0x24] - bl sub_0200A900 - str r0, [sp, #0x28] - mov r0, #1 - str r0, [sp] - ldrh r1, [r6] - ldr r0, [sp, #0x20] - ldr r3, [r5] - mov r2, #0 - bl GfGfxLoader_LoadFromOpenNarc - ldr r1, [sp, #0x28] - ldr r2, [r5] - str r0, [sp, #0x2c] - bl sub_0200A908 - ldr r0, [sp, #0x2c] - bl FreeToHeap - ldr r0, [sp, #0x24] - add r6, r6, #2 - add r0, r0, #1 - str r0, [sp, #0x24] - cmp r0, r7 - blt _0200D174 -_0200D1AA: - mov r6, #0 - cmp r7, #0 - ble _0200D1D6 - str r4, [sp, #0x1c] -_0200D1B2: - ldr r0, [r4, #8] - add r1, r6, #0 - bl sub_0200A900 - bl sub_0200A96C - ldr r2, [r5] - add r1, r6, #0 - bl Create2DGfxResObjMan - ldr r1, [sp, #0x1c] - add r6, r6, #1 - str r0, [r1, #0xc] - add r0, r1, #0 - add r0, r0, #4 - str r0, [sp, #0x1c] - cmp r6, r7 - blt _0200D1B2 -_0200D1D6: - mov r0, #0 - str r0, [sp, #0x18] - cmp r7, #0 - ble _0200D210 - add r6, r4, #0 -_0200D1E0: - ldr r0, [r4, #8] - ldr r1, [sp, #0x18] - bl sub_0200A900 - str r0, [sp, #0x30] - bl sub_0200A96C - ldr r1, [r5] - bl Create2DGfxResObjList - add r2, r0, #0 - str r2, [r6, #0x24] - ldr r0, [r6, #0xc] - ldr r1, [sp, #0x30] - ldr r3, [r5] - bl LoadAll2DGfxResObjsFromHeader - str r0, [r6, #0x3c] - ldr r0, [sp, #0x18] - add r6, r6, #4 - add r0, r0, #1 - str r0, [sp, #0x18] - cmp r0, r7 - blt _0200D1E0 -_0200D210: - ldr r0, [sp, #0x14] - cmp r0, #0 - beq _0200D21E - cmp r0, #1 - beq _0200D226 - cmp r0, #2 - b _0200D22E -_0200D21E: - ldr r0, [r4, #0x24] - bl sub_0200ADE4 - b _0200D234 -_0200D226: - ldr r0, [r4, #0x24] - bl sub_0200AE58 - b _0200D234 -_0200D22E: - ldr r0, [r4, #0x24] - bl sub_0200AD30 -_0200D234: - ldr r0, [sp, #0x48] - cmp r0, #0 - beq _0200D23E - cmp r0, #1 - b _0200D246 -_0200D23E: - ldr r0, [r4, #0x28] - bl sub_0200B050 - b _0200D24C -_0200D246: - ldr r0, [r4, #0x28] - bl sub_0200AFD8 -_0200D24C: - mov r0, #1 - str r0, [sp] - ldr r1, [sp, #0x10] - ldr r0, [sp, #0x20] - ldrh r1, [r1, #0xc] - ldr r3, [r5] - mov r2, #0 - bl GfGfxLoader_LoadFromOpenNarc - ldr r1, [r4, #0x14] - add r6, r0, #0 - str r1, [sp] - ldr r1, [r4, #0x18] - str r1, [sp, #4] - ldr r1, [r4, #0x1c] - str r1, [sp, #8] - ldr r1, [r4, #0x20] - str r1, [sp, #0xc] - ldr r1, [r5] - ldr r2, [r4, #0xc] - ldr r3, [r4, #0x10] - bl sub_02009E84 - str r0, [r4, #4] - add r0, r6, #0 - bl FreeToHeap - ldr r0, [sp, #0x20] - bl NARC_Delete - mov r0, #1 - add sp, #0x34 - pop {r4, r5, r6, r7, pc} - nop -_0200D290: .word 0x0000FFFF - thumb_func_end sub_0200D124 - thumb_func_start sub_0200D294 sub_0200D294: ; 0x0200D294 push {r3, lr} diff --git a/include/unk_0200ACF0.h b/include/unk_0200ACF0.h index f2fab6635..e9f76625e 100644 --- a/include/unk_0200ACF0.h +++ b/include/unk_0200ACF0.h @@ -3,16 +3,21 @@ #include "unk_0200A090.h" +void sub_0200ACF0(struct _2DGfxResObj *obj); +void sub_0200AD30(struct _2DGfxResObjList *charResObjList); +void sub_0200ADA4(struct _2DGfxResObj *charResObj); +void sub_0200ADE4(struct _2DGfxResObjList *charResObjList); +void sub_0200AE58(struct _2DGfxResObjList *charResObjList); void sub_0200AEB0(struct _2DGfxResObj *charResObj); void sub_0200AED4(struct _2DGfxResObjList *charResObjList); -void sub_0200B0A8(struct _2DGfxResObj *plttResObj); -void sub_0200B0CC(struct _2DGfxResObjList *plttResObjList); -void sub_0200ADA4(struct _2DGfxResObj *charResObj); -void sub_0200B00C(struct _2DGfxResObj *plttResObj); -void sub_0200ACF0(struct _2DGfxResObj *obj); -void sub_0200AF94(struct _2DGfxResObj *obj); NNSG2dImageProxy *sub_0200AF00(struct _2DGfxResObj *charResObj); NNSG2dImageProxy *sub_0200AF24(struct _2DGfxResObj *charResObj, struct _2DGfxResObj *cellResObj); +void sub_0200AF94(struct _2DGfxResObj *obj); +void sub_0200AFD8(struct _2DGfxResObjList *plttResObjList); +void sub_0200B00C(struct _2DGfxResObj *plttResObj); +void sub_0200B050(struct _2DGfxResObjList *plttResObjList); +void sub_0200B0A8(struct _2DGfxResObj *plttResObj); +void sub_0200B0CC(struct _2DGfxResObjList *plttResObjList); NNSG2dImagePaletteProxy *sub_0200B0F8(struct _2DGfxResObj *plttResObj, NNSG2dImageProxy *imageProxy); #endif //POKEHEARTGOLD_UNK_0200ACF0_H diff --git a/include/unk_0200CF18.h b/include/unk_0200CF18.h index cafd2a327..345fa2631 100644 --- a/include/unk_0200CF18.h +++ b/include/unk_0200CF18.h @@ -41,7 +41,7 @@ typedef struct UnkStruct_0200CF38 { struct _2DGfxResHeader* unk_08; struct _2DGfxResMan* unk_0C[6]; struct _2DGfxResObjList* unk_24[6]; - void* unk_3C[6]; + int unk_3C[6]; int unk_54; } UnkStruct_0200CF38; // size: 0x58 diff --git a/src/unk_0200CF18_c.c b/src/unk_0200CF18_c.c index 4423f1f6a..5b463574e 100644 --- a/src/unk_0200CF18_c.c +++ b/src/unk_0200CF18_c.c @@ -1,6 +1,7 @@ #include "assert.h" #include "global.h" #include "heap.h" +#include "gf_gfx_loader.h" #include "unk_02009D48.h" #include "unk_020215A0.h" #include "unk_02022588.h" @@ -15,6 +16,7 @@ void sub_0200D050(UnkStruct_0200CF38* a0); void sub_0200D060(UnkStruct_0200CF38* a0); void sub_0200D0B4(UnkStruct_0200CF18* a0); void sub_0200D0D4(UnkStruct_0200CF18* a0, UnkStruct_0200CF38* a1); +BOOL sub_0200D124(UnkStruct_0200CF18* a0, UnkStruct_0200CF38* a1, u16* a2, int a3, int a4, int a5); UnkStruct_0200CF18* sub_0200CF18(HeapID heapId) { UnkStruct_0200CF18* ret = AllocFromHeap(heapId, sizeof(UnkStruct_0200CF18)); @@ -134,3 +136,75 @@ void sub_0200D0E4(UnkStruct_0200CF18* a0, UnkStruct_0200CF38* a1) { sub_0200D060(a1); sub_0200D0D4(a0, a1); } + +void sub_0200D108(UnkStruct_0200CF18* a0) { + GF_ASSERT(a0->unk_004 == 0); + sub_0200D0B4(a0); + FreeToHeap(a0); +} + +BOOL sub_0200D124(UnkStruct_0200CF18* a0, UnkStruct_0200CF38* a1, u16* a2, int a3, int a4, int a5) { + int i; + int r7; + int size; + struct _2DGfxResHeader* header; + void* data; + NARC* narc; + + r7 = 6; + + if (a0 == NULL || a1 == NULL) { + return FALSE; + } + if (a2[4] == 0xFFFF) { + r7 = 4; + } + a1->unk_54 = r7; + size = sub_0200A8FC(); + a1->unk_08 = AllocFromHeap(a0->heapId, size * r7); + narc = NARC_New(NARC_a_1_7_5, a0->heapId); + + for (i = 0; i < r7; ++i) { + header = sub_0200A900(a1->unk_08, i); + data = GfGfxLoader_LoadFromOpenNarc(narc, a2[i], FALSE, a0->heapId, TRUE); + sub_0200A908(data, header, a0->heapId); + FreeToHeap(data); + } + for (i = 0; i < r7; ++i) { + header = sub_0200A900(a1->unk_08, i); + size = sub_0200A96C(header); + a1->unk_0C[i] = Create2DGfxResObjMan(size, (GfGfxResType)i, a0->heapId); + } + for (i = 0; i < r7; ++i) { + header = sub_0200A900(a1->unk_08, i); + size = sub_0200A96C(header); + a1->unk_24[i] = Create2DGfxResObjList(size, a0->heapId); + a1->unk_3C[i] = LoadAll2DGfxResObjsFromHeader(a1->unk_0C[i], header, a1->unk_24[i], a0->heapId); + } + switch (a3) { + case 0: + sub_0200ADE4(a1->unk_24[0]); + break; + case 1: + sub_0200AE58(a1->unk_24[0]); + break; + case 2: + default: + sub_0200AD30(a1->unk_24[0]); + break; + } + switch (a4) { + case 0: + sub_0200B050(a1->unk_24[1]); + break; + case 1: + default: + sub_0200AFD8(a1->unk_24[1]); + break; + } + data = GfGfxLoader_LoadFromOpenNarc(narc, a2[6], FALSE, a0->heapId, TRUE); + a1->unk_04 = sub_02009E84(data, a0->heapId, a1->unk_0C[0], a1->unk_0C[1], a1->unk_0C[2], a1->unk_0C[3], a1->unk_0C[4], a1->unk_0C[5]); + FreeToHeap(data); + NARC_Delete(narc); + return TRUE; +}