From 250bf9c5a6087087717d254615a9b7947f4d1d9c Mon Sep 17 00:00:00 2001 From: Banjo Kazooie Date: Mon, 5 Sep 2022 22:56:18 -0500 Subject: [PATCH] core2/code_5DBC0.c progress --- progress/progress_core1.svg | 6 +- progress/progress_core2.svg | 6 +- progress/progress_total.svg | 6 +- src/core1/code_9D30.c | 148 +++++++++++++++++-- src/core2/code_3BB80.c | 4 +- src/core2/code_41FB0.c | 44 ++++-- src/core2/code_5DBC0.c | 278 +++++++++++++++++++++++++++++++++--- 7 files changed, 441 insertions(+), 51 deletions(-) diff --git a/progress/progress_core1.svg b/progress/progress_core1.svg index ee95b1c9..13bb3ebd 100644 --- a/progress/progress_core1.svg +++ b/progress/progress_core1.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ core1 - 71.6821% - 71.6821% + 72.1884% + 72.1884% \ No newline at end of file diff --git a/progress/progress_core2.svg b/progress/progress_core2.svg index 7e0bc70e..d6368f96 100644 --- a/progress/progress_core2.svg +++ b/progress/progress_core2.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ core2 - 83.4994% - 83.4994% + 83.9966% + 83.9966% \ No newline at end of file diff --git a/progress/progress_total.svg b/progress/progress_total.svg index fad5c8eb..179ac3eb 100644 --- a/progress/progress_total.svg +++ b/progress/progress_total.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ Banjo-Kazooie (us.v10) - 85.5902% - 85.5902% + 85.9490% + 85.9490% \ No newline at end of file diff --git a/src/core1/code_9D30.c b/src/core1/code_9D30.c index 3d931e7f..921a09bf 100644 --- a/src/core1/code_9D30.c +++ b/src/core1/code_9D30.c @@ -12,17 +12,30 @@ void draw_prim_rect(s32 x, s32 y, s32 w, s32 h); void set_prim_color(s32 r, s32 g, s32 b); void func_8024A85C(s32 buffer_indx); -extern s32 D_80276588; //framebuffer width extern u16 D_803A5D00[2][0xF660]; //framebuffer +extern s32 D_80276588; //framebuffer width +extern s32 D_8027658C; //framebuffer height + +/* .data */ +extern u8 D_80275A50[][3]; +extern s32 D_80275A68; +extern s32 D_80275A6C; +extern s32 D_80275A70; +extern u8 D_80275A74[]; +extern u32 D_80275A7C[][2]; extern s16 D_80275BBC; extern s16 D_80275BC4; +extern s16 D_80275BC8; + extern s16 D_80275BCC; extern s16 D_80275BD0; extern s16 D_80275BD4; +extern u8 D_80275BE0; +extern s32 D_80275BE4; /* .bss */ s32 D_802806E0; @@ -30,29 +43,142 @@ s32 D_802806E4; s32 D_802806E8; s32 D_802806EC; -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80247750.s") +void func_80247750(s32 r, s32 g, s32 b){ + D_80275A68 = r; + D_80275A6C = g; + D_80275A70 = b; +} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_8024776C.s") +void func_8024776C(s32 x, s32 y) { + s32 rgba16; + if( ((x >= 0) && (x < D_80276588)) + && ((y >= 0) && (y < D_8027658C)) + ) { + D_803A5D00[0][x + y*D_80276588] = _SHIFTL(D_80275A68 >> 3, 11, 5) | _SHIFTL(D_80275A6C >> 3, 6, 5) | _SHIFTL(D_80275A70 >> 3, 1, 5) | _SHIFTL(1, 0, 1); + D_803A5D00[1][x + y*D_80276588] = _SHIFTL(D_80275A68 >> 3, 11, 5) | _SHIFTL(D_80275A6C >> 3, 6, 5) | _SHIFTL(D_80275A70 >> 3, 1, 5) | _SHIFTL(1, 0, 1); + + } +} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80247818.s") +void func_80247818(s32 x, s32 y, s32 w, s32 h) { + s32 iy; + s32 var_s1; + s32 ix; -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_802478C0.s") + for(ix = 0; ix < w; ix++){ + for(iy = 0; iy < h; iy++){ + func_8024776C(x + ix, y + iy); + } + } + osWriteBackDCacheAll(); +} + +void func_802478C0(s32 r, s32 g, s32 b) { + func_80247750(r, g, b); + func_80247818((D_80276588 - 128) / 2, (D_8027658C - 100) / 2, 128, 100); +} void func_8024792C(void){} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80247934.s") +void func_80247934(void) { + s32 var_s0; -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80247978.s") + for(var_s0 = 0; var_s0 < 2000000; var_s0++){ + func_8024792C(); + } +} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_802479E4.s") +void func_80247978(s32 arg0) { + do{ + func_802478C0(D_80275A50[arg0][0], D_80275A50[arg0][1], D_80275A50[arg0][2]); + func_80247934(); + func_802478C0(0, 0, 0); + func_80247934(); + } + while(1); +} -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80247A40.s") +void func_802479E4(s32 arg0) { + func_802478C0(D_80275A50[arg0][0], D_80275A50[arg0][1], D_80275A50[arg0][2]); + func_80247934(); + func_802478C0(0, 0, 0); + func_80247934(); +} +void func_80247A40(s32 arg0) { + func_802478C0(D_80275A50[arg0][0], D_80275A50[arg0][1], D_80275A50[arg0][2]); +} + +#ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80247A7C.s") +#else +void func_80247A7C(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 r, s32 g, s32 b) { + s32 var_s3; + s32 sp48; + u32 sp44; + u32 sp40; + s32 temp_lo; + s32 temp_s1; + s32 temp_t8; + s32 var_s0; + u32 temp_t4; + u32 var_s4; -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80247C20.s") + var_s4 = 0x10000000; + sp44 = D_80275A7C[arg1][0]; + sp40 = D_80275A7C[arg1][1]; + for(sp48 = 0; sp48 != 5; sp48++){ + temp_lo = sp48 * arg2; + temp_s1 = arg2 + arg3 + arg3; + for(var_s3 = 0; var_s3 != sp44; var_s3++){ + var_s4 >>= 1; + if (sp40 & var_s4) { + func_80247750(r, g, b); + func_80247818((D_80275BC4 + arg2*var_s3) - arg3, (D_80275BC8 + temp_lo) - arg3, temp_s1, temp_s1); + } else { + if (arg4 != 0) { + func_80247750(0, 0, 0); + } + func_80247818((D_80275BC4 + arg2*var_s3) - arg3, (D_80275BC8 + temp_lo) - arg3, temp_s1, temp_s1); + } + } + } + if (arg3 == 0) { + D_80275BC4 += (sp44 * arg2) + 2; + } +} +#endif -#pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80247CEC.s") + +void func_80247C20(void) { + s16 *var_v0; + s16 *var_v1; + s32 temp_lo; + void *temp_a0; + s32 i; + + if (D_80275BE4 == 0) { + D_80275BE4 = func_8023DB5C(); + return; + } + if (func_8023DB5C() != D_80275BE4) { + D_80275BE0 = FALSE; + D_80275BE4 = func_8023DB5C(); + } + + if (D_80275BE0) { + for(i = 0; i < D_80276588 * D_8027658C; i++){ + D_803A5D00[0][i] = 0; + D_803A5D00[1][i] = 0; + } + osWriteBackDCacheAll(); + } +} + +void func_80247CEC(s32 arg0, s32 arg1, s32 arg2) { + func_80247A7C(arg0, arg1, arg2, 1, 1, 0, 0, 0); + func_80247A7C(arg0, arg1, arg2, 0, 1, D_80275A50[D_80275A74[arg0]][0], D_80275A50[D_80275A74[arg0]][1], D_80275A50[D_80275A74[arg0]][2]); +} #pragma GLOBAL_ASM("asm/nonmatchings/core1/code_9D30/func_80247D80.s") diff --git a/src/core2/code_3BB80.c b/src/core2/code_3BB80.c index cdadd0cc..a86d1790 100644 --- a/src/core2/code_3BB80.c +++ b/src/core2/code_3BB80.c @@ -578,7 +578,7 @@ Actor *func_802C4260(enum actor_e actor_id, s32 x, s32 y, s32 z, s32 yaw){ } -s32 func_802C42B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3){ +Actor *func_802C42B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3){ s32 sp1C[3]; sp1C[0] = reinterpret_cast(s32, arg1); sp1C[1] = reinterpret_cast(s32, arg2); @@ -586,7 +586,7 @@ s32 func_802C42B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3){ return func_802C8F88(reinterpret_cast(s32, arg0), sp1C); } -s32 func_802C42F0(s32 arg0, s32 arg1, s32 arg2, s32 arg3){ +Actor * func_802C42F0(s32 arg0, s32 arg1, s32 arg2, s32 arg3){ s32 sp1C[3]; sp1C[0] = arg1; sp1C[1] = arg2; diff --git a/src/core2/code_41FB0.c b/src/core2/code_41FB0.c index d6bbaf26..ce4ece49 100644 --- a/src/core2/code_41FB0.c +++ b/src/core2/code_41FB0.c @@ -44,23 +44,43 @@ typedef struct { } struct41FB0s_1; /* .data */ +enum core2_41FB0_e{ + CORE2_41FB0_0_MM_HUT_NOTES, + CORE2_41FB0_1_MM_HUT_EGGS, + CORE2_41FB0_2_MM_HUT_GRUBLIN, + CORE2_41FB0_3_MM_HUT_JINJO, + CORE2_41FB0_4_MM_HUT_JIGGY, + + CORE2_41FB0_6_MM_HUT_EXTRA_LIFE = 0x6, + + + CORE2_41FB0_A_BGS_HUT_JUMP_PAD = 0xA, + CORE2_41FB0_B_BGS_HUT_NOTES, + CORE2_41FB0_C_BGS_HUT_JIGGY, + + CORE2_41FB0_E_YUMYUM_EGG = 0xe, + CORE2_41FB0_F_YUMYUM_RED_FEATHER, + +}; + +// #define 41FB0_FLAG_SET_YAW 0x0020 struct41FB0s D_80366460[] = { - {0x0021, ACTOR_51_MUSIC_NOTE, 5, SFX_3E9_UNKNOWN, 1, 16000, 125.0f, 25.0f, 725.0f, 125.0f, 125.0f, 25.0f, 0.6f, 0.0f}, - {0x0021, ACTOR_52_BLUE_EGG, 5, SFX_21_EGG_BOUNCE_1, 1, 16000, 100.0f, 50.0f, 500.0f, 250.0f, 100.0f, 50.0f, 0.6f, 0.0f}, - {0x0021, ACTOR_6_GRUBLIN, 1, SFX_8_BANJO_LANDING_04, 1, 20000, 0.0f, 0.0f, 550.0f, 250.0f, 200.0f, 0.0f, 0.6f, 0.0f}, - {0x0021, ACTOR_62_JINJO_GREEN, 1, SFX_8_BANJO_LANDING_04, 1, 20000, 100.0f, 50.0f, 500.0f, 250.0f, 100.0f, 50.0f, 0.6f, 0.0f}, - {0x0021, ACTOR_46_JIGGY, 1, SFX_3E9_UNKNOWN, 1, 16000, 100.0f, 50.0f, 500.0f, 250.0f, 100.0f, 50.0f, 0.6f, 0.0f}, + /*MM HUT 1*/ {0x0021, ACTOR_51_MUSIC_NOTE, 5, SFX_3E9_UNKNOWN, 1, 16000, 125.0f, 25.0f, 725.0f, 125.0f, 125.0f, 25.0f, 0.6f, 0.0f}, + /*MM HUT 2*/ {0x0021, ACTOR_52_BLUE_EGG, 5, SFX_21_EGG_BOUNCE_1, 1, 16000, 100.0f, 50.0f, 500.0f, 250.0f, 100.0f, 50.0f, 0.6f, 0.0f}, + /*MM HUT 3*/ {0x0021, ACTOR_6_GRUBLIN, 1, SFX_8_BANJO_LANDING_04, 1, 20000, 0.0f, 0.0f, 550.0f, 250.0f, 200.0f, 0.0f, 0.6f, 0.0f}, + /*MM HUT 4*/ {0x0021, ACTOR_62_JINJO_GREEN, 1, SFX_8_BANJO_LANDING_04, 1, 20000, 100.0f, 50.0f, 500.0f, 250.0f, 100.0f, 50.0f, 0.6f, 0.0f}, + /*MM HUT 6*/ {0x0021, ACTOR_46_JIGGY, 1, SFX_3E9_UNKNOWN, 1, 16000, 100.0f, 50.0f, 500.0f, 250.0f, 100.0f, 50.0f, 0.6f, 0.0f}, {0x0001, ACTOR_50_HONEYCOMB, 3, SFX_3E9_UNKNOWN, 1, 16000, 50.0f, 150.0f, 500.0f, 250.0f, 50.0f, 150.0f, 0.6f, 0.0f}, - {0x0021, ACTOR_49_EXTRA_LIFE, 1, SFX_3E9_UNKNOWN, 1, 16000, 100.0f, 50.0f, 500.0f, 250.0f, 100.0f, 50.0f, 0.6f, 0.0f}, + /*MM HUT 5*/ {0x0021, ACTOR_49_EXTRA_LIFE, 1, SFX_3E9_UNKNOWN, 1, 16000, 100.0f, 50.0f, 500.0f, 250.0f, 100.0f, 50.0f, 0.6f, 0.0f}, {0x0001, ACTOR_46_JIGGY, 1, SFX_3E9_UNKNOWN, 1, 16000, 0.0f, 0.0f, 1000.0f, 0.0f, 0.0f, 0.0f, 0.6f, 0.0f}, {0x0005, ACTOR_46_JIGGY, 1, SFX_3E9_UNKNOWN, 1, 16000, 90.0f, 0.0f, 930.0f, 0.0f, 100.0f, 0.0f, 0.6f, 0.0f}, {0x0049, ACTOR_46_JIGGY, 1, SFX_3E9_UNKNOWN, 1, 16000, 0.0f, 0.0f, 1000.0f, 0.0f, 300.0f, 0.0f, 0.5f, 0.0f}, - {0x002D, ACTOR_B_SHOCKSPRING_PAD, 1, 0, 1, 16000, 0.0f, 0.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.2f, 315.0f}, - {0x0005, ACTOR_51_MUSIC_NOTE, 5, SFX_3E9_UNKNOWN, 1, 16000, 75.0f, 0.0f, 725.0f, 0.0f, 75.0f, 0.0f, 0.6f, 0.0f}, - {0x0005, ACTOR_46_JIGGY, 1, SFX_3E9_UNKNOWN, 1, 16000, 0.0f, 0.0f, 1000.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f}, + /*BGS HUT 1,2,4,5 */{0x002D, ACTOR_B_SHOCKSPRING_PAD, 1, 0, 1, 16000, 0.0f, 0.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.2f, 315.0f}, + /*BGS HUT 3 */ {0x0005, ACTOR_51_MUSIC_NOTE, 5, SFX_3E9_UNKNOWN, 1, 16000, 75.0f, 0.0f, 725.0f, 0.0f, 75.0f, 0.0f, 0.6f, 0.0f}, + /*BGS HUT 4 */ {0x0005, ACTOR_46_JIGGY, 1, SFX_3E9_UNKNOWN, 1, 16000, 0.0f, 0.0f, 1000.0f, 0.0f, 0.0f, 0.0f, 0.5f, 0.0f}, {0x0009, ACTOR_47_EMPTY_HONEYCOMB, 1, SFX_3E9_UNKNOWN, 1, 16000, 0.0f, 0.0f, 200.0f, 0.0f, 300.0f, 0.0f, 0.6f, 0.0f}, - {0x0001, ACTOR_52_BLUE_EGG, 1, SFX_21_EGG_BOUNCE_1, 1, 16000, 0.0f, 350.0f, 500.0f, 500.0f, 0.0f, 350.0f, 0.6f, 0.0f}, - {0x0001, ACTOR_129_RED_FEATHER, 1, SFX_21_EGG_BOUNCE_1, 1, 16000, 0.0f, 350.0f, 500.0f, 500.0f, 0.0f, 350.0f, 0.6f, 0.0f}, + /*YUM YUM EGG*/ {0x0001, ACTOR_52_BLUE_EGG, 1, SFX_21_EGG_BOUNCE_1, 1, 16000, 0.0f, 350.0f, 500.0f, 500.0f, 0.0f, 350.0f, 0.6f, 0.0f}, + /*YUM YUM FEATHER*/ {0x0001, ACTOR_129_RED_FEATHER, 1, SFX_21_EGG_BOUNCE_1, 1, 16000, 0.0f, 350.0f, 500.0f, 500.0f, 0.0f, 350.0f, 0.6f, 0.0f}, {0x0005, ACTOR_46_JIGGY, 1, 0, 0, 0, 0.0f, 0.0f, 100.0f, 0.0f, 0.0f, 0.0f, 0.75f, 0.0f}, {0x0005, 0x06A, 1, 0, 0, 0, 0.0f, 0.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.6f, 0.0f}, {0x0009, ACTOR_46_JIGGY, 1, SFX_3E9_UNKNOWN, 1, 16000, 0.0f, 0.0f, 650.0f, 0.0f, 950.0f, 0.0f, 0.6f, 0.0f}, @@ -76,7 +96,7 @@ struct41FB0s D_80366460[] = { {0x00A1, ACTOR_50_HONEYCOMB, 1, SFX_8_BANJO_LANDING_04, 1, 20000, 550.0f, 0.0f, 450.0f, 0.0f, 0.0f, 0.0f, 0.6f, 0.0f}, {0x00A1, ACTOR_50_HONEYCOMB, 1, SFX_8_BANJO_LANDING_04, 1, 20000, 650.0f, 0.0f, 500.0f, 0.0f, 0.0f, 0.0f, 0.6f, 0.0f}, {0x0021, ACTOR_46_JIGGY, 1, 0, 0, 0, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, - {0x0025, ACTOR_47_EMPTY_HONEYCOMB, 1, SFX_3E9_UNKNOWN, 1, 18000, 0.0f, 0.0f, 750.0f, 500.0f, 0.0f, 0.0f, 0.6f, 0.0f}, + /* SM QUARRIES & VEGGIES*/ {0x0025, ACTOR_47_EMPTY_HONEYCOMB, 1, SFX_3E9_UNKNOWN, 1, 18000, 0.0f, 0.0f, 750.0f, 500.0f, 0.0f, 0.0f, 0.6f, 0.0f}, {0x0129, 0x352, 1, SFX_3F2_UNKNOWN, 1, 16000, 0.0f, 0.0f, 2500.0f, 0.0f, 0.0f, 0.0f, 0.4f, 0.0f}, {0x0081, ACTOR_3A0_ICECUBE_B, 1, SFX_116_DEAF_RUSTLING, 1, 32000, 220.0f, 100.0f, 350.0f, 200.0f, 220.0f, 100.0f, 0.6f, 0.0f}, {0x02A1, ACTOR_50_HONEYCOMB, 1, SFX_8_BANJO_LANDING_04, 1, 20000, 250.0f, 0.0f, 200.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}, diff --git a/src/core2/code_5DBC0.c b/src/core2/code_5DBC0.c index 11b3c041..2ccf3c19 100644 --- a/src/core2/code_5DBC0.c +++ b/src/core2/code_5DBC0.c @@ -25,8 +25,10 @@ typedef struct { s32 unk8; u16 unkC; u8 unkE; - u8 padF[1]; - u8 unk10[0xC]; + u8 unkF[3]; + u8 unk12[3]; + u8 pad15[0x3]; + s32 unk18; }struct5DBC0_1s; typedef struct { @@ -42,10 +44,19 @@ typedef struct { }struct5DBC0s; extern u8 D_80368830[3] = {0,0,0}; +extern u8 D_80368834[3]; +extern u8 D_80368838[3]; +extern u8 D_8036883C[3]; +extern u8 D_80368840[3]; +extern u8 D_80368844[3]; +extern u8 D_80368848[3]; /* .bss */ struct5DBC0s * D_8037E900; +/* public */ +void func_802E6820(s32 arg0); + /* .code */ struct5DBC0s *func_802E4B50(void){ u8 sp24[3] = D_80368830; @@ -64,7 +75,7 @@ struct5DBC0s *func_802E4B50(void){ } #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E4C0C.s") -// s32 func_802E4C0C(struct5DBC0_3s * arg0, u32 arg1){ +// s32 func_802E4C0C(struct5DBC0_2s * arg0, u32 arg1){ // u32 i, v0; // for(i = arg1; i > 0; i--){ // v0 = i - 1; @@ -163,7 +174,23 @@ s32 func_802E4F98(char *arg0) { return sp1C; } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E502C.s") +void func_802E502C(s32 arg0, s32 arg1, s32 arg2, char *arg3, u8 arg4[3]) { + s32 sp24; + + sp24 = D_8037E900->unkC++; + if (D_8037E900->unkC >= 2) { + D_8037E900->unk0 = realloc(D_8037E900->unk0, (D_8037E900->unkC * 0x1C) + 0x1C); + } + D_8037E900->unk0[sp24].unk0 = arg0; + D_8037E900->unk0[sp24].unk4 = arg1; + D_8037E900->unk0[sp24].unkE = arg2; + D_8037E900->unk0[sp24].unkC = func_802E4F98(arg3); + D_8037E900->unk0[sp24].unk8 = D_8037E900->flags; + D_8037E900->unk0[sp24].unkF[0] = arg4[0]; + D_8037E900->unk0[sp24].unkF[1] = arg4[1]; + D_8037E900->unk0[sp24].unkF[2] = arg4[2]; + D_8037E900->unk0[sp24].unk18 = -1; +} void func_802E5188(void){ D_8037E900->unkC = 0; @@ -199,9 +226,97 @@ s32 func_802E51A4(char *str, s32 arg1, s32 start, u32 flags) { } #endif -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E533C.s") +void func_802E533C(struct5DBC0_1s *arg0, char arg1, s32 *arg2, s32 *arg3, Gfx **gfx) { + s32 timg; + BKSpriteTextureBlock *chunk; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E57E0.s") + if (arg1 == ' ') { + *arg2 += D_8037E900->unk4[arg0->unkE].unkC; + } else if (arg1 == '\t') { + (*arg2)++; + while ((*arg2 % (s32) (D_8037E900->unk4[arg0->unkE].unkC * 4)) != 0) { + (*arg2)++; + } + } else{ + chunk = func_802E4D5C(arg0->unkE, arg1); + timg = (s32)(chunk + 1); + while ((timg % 8)) { + timg++; + } + + gDPSetTextureImage((*gfx)++, G_IM_FMT_I, G_IM_SIZ_8b, chunk->w, timg); + gDPSetTile((*gfx)++, G_IM_FMT_I, G_IM_SIZ_8b, (((((chunk->w - 0) + 1)*1) + 7) >> 3), 0x0000, G_TX_LOADTILE, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOLOD); + gDPLoadSync((*gfx)++); + gDPLoadTile((*gfx)++, G_TX_LOADTILE, 0, 0, (chunk->w << 2), (chunk->h << 2)); + gDPPipeSync((*gfx)++); + gDPSetTile((*gfx)++, G_IM_FMT_I, G_IM_SIZ_8b, (((((chunk->w - 0) + 1)*1) + 7) >> 3), 0x0000, G_TX_RENDERTILE, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOLOD); + gDPSetTileSize((*gfx)++, G_TX_RENDERTILE, 0, 0, chunk->w << 2, chunk->h << 2); + gSPScisTextureRectangle((*gfx)++, (*arg2 << 2), (*arg3 << 2), ((*arg2 + chunk->w) << 2), ((*arg3 + chunk->h) << 2), G_TX_RENDERTILE, 0, 0, 0x0400, 0x0400); + if (arg0->unk8 & 2) { + *arg2 += D_8037E900->unk4[arg0->unkE].unkC * 2; + } + else{ + *arg2 += chunk->x; + } + } +} + +void func_802E57E0(struct5DBC0_1s *arg0, Gfx **gfx) { + s32 temp_v0; + s32 spA8; + s32 spA4; + s32 var_s3; + char var_s2; + + + if (!(arg0->unk8 & 4)) { //draw transparent grey background + temp_v0 = func_802E51A4(&D_8037E900->string[arg0->unkC], arg0->unkE, arg0->unk0, arg0->unk8); + gDPPipeSync((*gfx)++); + gDPSetPrimColor((*gfx)++, 0, 0, 0x28, 0x28, 0x28, 0x96); + gDPSetCombineMode((*gfx)++, G_CC_PRIMITIVE, G_CC_PRIMITIVE); + gDPScisFillRectangle((*gfx)++, + (arg0->unk0 - 2), + arg0->unk4, + (arg0->unk0 + temp_v0 + 2), + (D_8037E900->unk4[arg0->unkE].unkD + arg0->unk4) + ); + gDPPipeSync((*gfx)++); + } + gDPSetCombineLERP((*gfx)++, PRIMITIVE, ENVIRONMENT, TEXEL0_ALPHA, ENVIRONMENT, 0, 0, 0, TEXEL0, PRIMITIVE, ENVIRONMENT, TEXEL0_ALPHA, ENVIRONMENT, 0, 0, 0, TEXEL0); + + if (arg0->unk18 == -1) { + gDPSetPrimColor((*gfx)++, 0, 0, arg0->unkF[0], arg0->unkF[1], arg0->unkF[2], 0); + gDPSetEnvColor((*gfx)++, arg0->unkF[0], arg0->unkF[1], arg0->unkF[2], 0); + spA8 = arg0->unk0; + spA4 = arg0->unk4; + for(var_s3 = 0; (var_s2 = D_8037E900->string[var_s3 + arg0->unkC]) != 0; var_s3++) { + func_802E533C(arg0, var_s2, &spA8, &spA4, gfx); + } + } else { + spA8 = arg0->unk0; + spA4 = arg0->unk4; + for(var_s3 = 0; (var_s2 = D_8037E900->string[var_s3 + arg0->unkC]); var_s3++) { + if (var_s3 == arg0->unk18) { + gDPSetPrimColor((*gfx)++, 0, 0, arg0->unk12[0], arg0->unk12[1], arg0->unk12[2], 0x00); + gDPSetEnvColor((*gfx)++, arg0->unk12[0], arg0->unk12[1], arg0->unk12[2], 0); + if (var_s2 == ' ') { + s32 sp70; + s32 sp6C, sp68; + s32 sp64, sp60; + sp64 = spA4 - 5;\ + sp60 = spA4 + 5; + sp68 = sp6C = spA8; + func_802E533C(arg0, '-', &sp6C, &sp64, gfx); + func_802E533C(arg0, '-', &sp68, &sp60, gfx); + } + } else { + gDPSetPrimColor((*gfx)++, 0, 0, arg0->unkF[0], arg0->unkF[1], arg0->unkF[2], 0); + gDPSetEnvColor((*gfx)++, arg0->unkF[0], arg0->unkF[1], arg0->unkF[2], 0); + } + func_802E533C(arg0, var_s2, &spA8, &spA4, gfx); + } + } +} void func_802E5C98(Gfx **gdl){ int i; @@ -242,15 +357,66 @@ void func_802E5F68(void){ func_802E4C78(); } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E5F88.s") +void func_802E5F88(s32 arg0, s32 arg1, char *arg2) { + s32 sp24; + u8 sp20[3] = D_80368834; + + sp24 = func_802E4E54(0); + func_802E502C(arg0, arg1, sp24, arg2, &sp20); +} -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E5FE4.s") +void func_802E5FE4(s32 arg0, s32 arg1, char *arg2) { + s32 sp24; + u8 sp20[3] = D_80368838; + + sp24 = func_802E4E54(0); + func_802E502C(arg0, arg1, sp24, arg2, &sp20); +} -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E6040.s") +void func_802E6040(s32 arg0, s32 arg1, char *arg2) { + s32 sp2C; + u8 sp28[3] = D_8036883C; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E60D4.s") + sp2C = func_802E4E54(0); + arg0 *= D_8037E900->unk4[sp2C].unkC; + arg1 *= D_8037E900->unk4[sp2C].unkD; + func_802E502C(arg0, arg1, sp2C, arg2, &sp28); +} -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E6270.s") +void func_802E60D4(s32 arg0, s32 arg1, s32 arg2, s32 arg3, u8 arg4[3], u8 arg5[3], s32 arg6) { + s32 sp24; + + sp24 = D_8037E900->unkC++; + if (D_8037E900->unkC >= 2) { + D_8037E900->unk0 = (struct5DBC0_1s *)realloc(D_8037E900->unk0, (D_8037E900->unkC + 1)* sizeof(struct5DBC0_1s)); + } + D_8037E900->unk0[sp24].unk0 = arg0; + D_8037E900->unk0[sp24].unk4 = arg1; + D_8037E900->unk0[sp24].unkE = arg2; + D_8037E900->unk0[sp24].unkC = func_802E4F98(arg3); + D_8037E900->unk0[sp24].unk8 = D_8037E900->flags; + \ + D_8037E900->unk0[sp24].unkF[0] = arg4[0]; + D_8037E900->unk0[sp24].unkF[1] = arg4[1]; + D_8037E900->unk0[sp24].unkF[2] = arg4[2]; + + D_8037E900->unk0[sp24].unk12[0] = arg5[0]; + D_8037E900->unk0[sp24].unk12[1] = arg5[1]; + D_8037E900->unk0[sp24].unk12[2] = arg5[2]; + + D_8037E900->unk0[sp24].unk18 = arg6; +} + +void func_802E6270(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + s32 temp_v0; + u8 sp30[3] = D_80368840; + u8 sp2C[3] = D_80368844; + + temp_v0 = func_802E4E54(0); + arg0 *= D_8037E900->unk4[temp_v0].unkC; + arg1 *= D_8037E900->unk4[temp_v0].unkD; + func_802E60D4(arg0, arg1, temp_v0, arg2, &sp30, &sp2C, arg3); +} void func_802E632C(u8 arg0, u8 arg1, u8 arg2){ D_8037E900->unk1C[0] = arg0; @@ -281,21 +447,66 @@ void func_802E63D8(u8 arg0, u8 arg1, u8 arg2, f32 arg3){ } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E6440.s") +u16 func_802E6440(void) { + return (((((s32) D_8037E900->unk1C[0] >> 3) & 0x1F) << 11) + | ((((s32) D_8037E900->unk1C[1] >> 3) & 0x1F) << 6) + | ((((s32) D_8037E900->unk1C[2] >> 3) & 0x1F) << 1) + | 1); +} -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E6488.s") +void func_802E6488(s32 arg0, s32 arg1, char *arg2) { + s32 temp_v0; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E6508.s") + temp_v0 = func_802E4E54(0); + arg0 *= D_8037E900->unk4[temp_v0].unkC; + arg1 *= D_8037E900->unk4[temp_v0].unkD; + func_802E502C(arg0, arg1, temp_v0, arg2, D_8037E900->unk1C); +} + + +void func_802E6508(s32 arg0, s32 arg1, char *arg2) { + func_802E502C(arg0, arg1, func_802E4E54(0), arg2, D_8037E900->unk1C); +} + + +void func_802E6558(s32 arg0, s32 arg1, s32 arg2) { + u8 sp1C[3]; + void *temp_v0; + + temp_v0 = D_8037E900; + sp1C[0] = D_8037E900->unk1C[0]; + sp1C[1] = D_8037E900->unk1C[1]; + sp1C[2] = D_8037E900->unk1C[2]; + func_802E632C(0xC8, 0xEB, 0xD2); + func_802E6488(arg0, arg1, arg2); + D_8037E900->unk1C[0] = sp1C[0]; + D_8037E900->unk1C[1] = sp1C[1]; + D_8037E900->unk1C[2] = sp1C[2]; +} -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E6558.s") void func_802E65E8(char *str){ func_802E51A4(str, func_802E4E54(0), 0, D_8037E900->flags); } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E6628.s") +void func_802E6628(s32 arg0, char *arg1) { + s32 sp2C; + u8 sp28[3] = D_80368848; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E66F0.s") + sp2C = func_802E4E54(0); + arg0 *= D_8037E900->unk4[sp2C].unkD; + func_802E502C((s32) (((f32) D_80276588 - (f32) func_802E51A4(arg1, sp2C, 0, D_8037E900->flags)) / 2), arg0, sp2C, arg1, &sp28); +} + +void func_802E66F0(s32 arg0, s32 arg1) { + s32 sp24; + s32 temp_v0; + void *temp_v1; + + sp24 = func_802E4E54(0); + arg0 *= D_8037E900->unk4[sp24].unkD; + func_802E502C((s32) (((f32) D_80276588 - (f32) func_802E51A4(arg1, sp24, 0, D_8037E900->flags)) / 2), arg0, sp24, arg1, D_8037E900->unk1C); +} void func_802E67AC(void){ D_8037E900->flags |= 1; @@ -313,7 +524,40 @@ void func_802E6800(s32 arg0){ D_8037E900->flags &= ~arg0 | 0x1; } +#ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E6820.s") +#else +void func_802E6820(s32 arg0) { + BKSprite *prev_sprite_ptr; + s32 chunk_count; + s32 i_chunk; + s32 var_s5; + s32 var_s6; + + if (D_8037E900 != NULL) { + for(var_s6 = 0; var_s6 < arg0; var_s6++){ + D_8037E900 = (struct5DBC0s *) defrag(D_8037E900); + D_8037E900->unk0 = (struct5DBC0_1s *)defrag(D_8037E900->unk0); + D_8037E900->unk4 = (struct5DBC0_2s *)defrag(D_8037E900->unk4); + D_8037E900->string = (char *)defrag(D_8037E900->string); + for(var_s5 = 0; var_s5 < D_8037E900->unk10; var_s5++) { + if (D_8037E900->unk4[var_s5].unk8 != NULL) { + D_8037E900->unk4[var_s5].unk8 = (BKSpriteTextureBlock **)defrag(D_8037E900->unk4[var_s5].unk8); + } + + prev_sprite_ptr = D_8037E900->unk4[var_s5].unk0; + if (D_8037E900->unk4[var_s5].unk0 != NULL) { + chunk_count = spriteGetFramePtr(prev_sprite_ptr, 0U)->chunkCnt; + D_8037E900->unk4[var_s5].unk0 = (BKSprite *)defrag_asset(D_8037E900->unk4[var_s5].unk0); + for(i_chunk = 0; i_chunk < chunk_count; i_chunk++){ + D_8037E900->unk4[var_s5].unk8[i_chunk] = (BKSpriteTextureBlock *)((s32)D_8037E900->unk4[var_s5].unk0 + ((s32)D_8037E900->unk4[var_s5].unk8[i_chunk] - (s32)prev_sprite_ptr)); + } + } + } + } + } +} +#endif #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_5DBC0/func_802E6A90.s")