From 5b72d4dc01c61611e7ccf011e730c3caf2629ee4 Mon Sep 17 00:00:00 2001 From: Banjo Kazooie Date: Wed, 21 Sep 2022 00:42:06 -0500 Subject: [PATCH] core2/code_7AF80.c progress --- progress/progress_core2.svg | 6 +- progress/progress_total.svg | 6 +- src/core1/code_1D00.c | 5 +- src/core1/code_8C50.c | 8 +- src/core1/code_E360.c | 2 +- src/core2/code_7AF80.c | 480 ++++++++++++++++++++++++++++++------ 6 files changed, 421 insertions(+), 86 deletions(-) diff --git a/progress/progress_core2.svg b/progress/progress_core2.svg index 4fd1662a..97d58d89 100644 --- a/progress/progress_core2.svg +++ b/progress/progress_core2.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ core2 - 86.1156% - 86.1156% + 86.8047% + 86.8047% \ No newline at end of file diff --git a/progress/progress_total.svg b/progress/progress_total.svg index e0abe118..09aae59a 100644 --- a/progress/progress_total.svg +++ b/progress/progress_total.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ Banjo-Kazooie (us.v10) - 87.3005% - 87.3005% + 87.6959% + 87.6959% \ No newline at end of file diff --git a/src/core1/code_1D00.c b/src/core1/code_1D00.c index 8d8628f6..b856130f 100644 --- a/src/core1/code_1D00.c +++ b/src/core1/code_1D00.c @@ -60,9 +60,6 @@ void func_802403F0(void); void amgrStartThread(void); - -extern s32 D_80000300; - s32 D_80275770 = 0; s32 D_80275774 = 0; u8 D_80275778 = 0; @@ -288,7 +285,7 @@ void func_8023FB1C(void){ D_8027D000 = (u8 *) malloc(0x21000); bzero(D_8027D000, 0x21000); alHeapInit(&D_8027CFF0, D_8027D000, 0x21000); - if(D_80000300 != 1) + if(osTvType != OS_TV_NTSC) osViClock = 0x2e6025c; func_8023FBB8(); func_80335220(); diff --git a/src/core1/code_8C50.c b/src/core1/code_8C50.c index d2c76edf..1b66b983 100644 --- a/src/core1/code_8C50.c +++ b/src/core1/code_8C50.c @@ -3,8 +3,6 @@ #include "variables.h" -extern s32 D_80000300; - typedef struct { s32 unk0; s32 unk4; @@ -75,7 +73,7 @@ s32 D_8027FC18; s32 D_8027FC1C; s32 D_8027FC20; s32 D_8027FC24; -u8 pad_8027FC28[0x7F8]; +u8 pad_8027FC28[2040]; //stack for thread D_80280428; OSThread D_80280428; Struct_Core1_8C50_s * D_802805D8[20]; volatile s32 D_80280628; @@ -395,7 +393,7 @@ void func_8024730C(void){ if(!D_802806D4){ D_802806D4 = TRUE; - if(D_80000300 != TRUE){ + if(osTvType != OS_TV_NTSC){ osViSetMode(&D_802759A8); } else { osViSetMode(&D_802759F8); @@ -413,6 +411,7 @@ void func_80247380(void){ } } +//resetproc void func_802473B4(void *arg0){ OSMesg msg = NULL; do{ @@ -436,6 +435,7 @@ void func_802473B4(void *arg0){ }while(1); } +//resetThreadCreate void func_80247560(void){ u64 *tmp_v0; osCreateMesgQueue(&D_8027FB60, &D_8027FB78, 20); diff --git a/src/core1/code_E360.c b/src/core1/code_E360.c index 1c9e0305..84a9e47c 100644 --- a/src/core1/code_E360.c +++ b/src/core1/code_E360.c @@ -66,7 +66,7 @@ void func_8024BE30(void){ func_8024C428(); osCreateViManager(0xfe); - if(D_80000300 != 1) + if(osTvType != OS_TV_NTSC) osViSetMode(&D_80275CD0); //PAL else osViSetMode(&D_80275C80); //NTSC diff --git a/src/core2/code_7AF80.c b/src/core2/code_7AF80.c index 6be4420c..4de18dc3 100644 --- a/src/core2/code_7AF80.c +++ b/src/core2/code_7AF80.c @@ -44,8 +44,8 @@ void func_80308EC8(void); /* .data */ -extern void *D_8036ABA0; -extern void *D_8036ABA4; + + extern ActorInfo D_803675F0; extern ActorInfo D_80367838; @@ -69,9 +69,11 @@ extern u8 D_8036A9E4[]; extern s16 D_8036ABD4; - -extern s16 D_8036ABAC[]; -extern s16 D_8036ABC0[]; +extern s16 *D_8036ABA0; +extern s16 *D_8036ABA4; +extern s32 D_8036ABA8; //max index of D_8036ABA4 +extern s16 D_8036ABAC[]; +extern s16 D_8036ABC0[]; /* .rodata */ @@ -79,10 +81,10 @@ extern s16 D_8036ABC0[]; struct { Cube *cube_list; f32 unk4; - s32 min[3]; - s32 max[3]; - s32 stride[2]; - s32 cubeCnt; + s32 min[3]; //8 + s32 max[3]; //14 + s32 stride[2]; //20 + s32 cubeCnt; s32 unk2C; s32 width[3]; // s32 unk34; @@ -92,8 +94,11 @@ struct { s32 unk44; } D_80381FA0; + u8 D_80381FE8[0x50]; -Cube *D_80382038[0x20]; +Cube *D_80382038[0x1C]; +s32 D_803820A8[3]; +s32 D_803820B4; s32 D_803820B8[0x20]; //ActorProp *, (maybe Prop *) s32 pad_80382138; s32 D_8038213C; @@ -110,9 +115,6 @@ void func_80301F10(Cube *cube, Gfx **gfx, Mtx **mtx, Vtx **vtx){ func_8032D510(cube, gfx, mtx, vtx); } -#ifndef NONMATCHING -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80301F50.s") -#else void func_80301F50(Gfx **gfx, Mtx **mtx, Vtx **vtx, s32 arg3[3], s32 arg4[3], s32 arg5[3]) { s32 sp54; s32 sp50; @@ -121,103 +123,125 @@ void func_80301F50(Gfx **gfx, Mtx **mtx, Vtx **vtx, s32 arg3[3], s32 arg4[3], s3 Cube *sp44; Cube *var_fp; - sp44 = D_80381FA0.cube_list + arg4[1]*D_80381FA0.stride[0]; - for(sp50 = arg4[1]; sp50 < arg3[1]; sp50++) { - var_fp = sp44 + arg4[0]; - for(sp54 = arg4[0]; sp54 < arg3[0]; sp54++) { - - var_s0 = var_fp + arg4[2]*D_80381FA0.stride[1]; - for(var_s1 = arg4[2]; var_s1 < arg3[2]; var_s1++) { + sp50 = arg4[1]; + sp44 = D_80381FA0.cube_list + sp50*D_80381FA0.stride[0]; + while(sp50 < arg3[1]) { + sp54 = arg4[0]; + var_fp = sp44 + sp54; + while(sp54 < arg3[0]) { + var_s1 = arg4[2]; + var_s0 = var_fp + var_s1*D_80381FA0.stride[1]; + while(var_s1 < arg3[2]) { if ((var_s0->prop2Cnt != 0) && func_8024D9B0(var_s0) != 0) { func_80301F10(var_s0, gfx, mtx, vtx); } + var_s1++; var_s0 += D_80381FA0.stride[1]; } - var_s0 = var_fp + arg5[2]*D_80381FA0.stride[1]; - for(var_s1 = arg5[2]; var_s1 >= arg3[2]; var_s1--) { + var_s1 = arg5[2]; + var_s0 = var_fp + var_s1*D_80381FA0.stride[1]; + while( var_s1 >= arg3[2]) { if ((var_s0->prop2Cnt != 0) && func_8024D9B0(var_s0) != 0) { func_80301F10(var_s0, gfx, mtx, vtx); } + var_s1--; var_s0 -= D_80381FA0.stride[1]; } + sp54++; var_fp++; } - var_fp = sp44 + arg5[0]; - for(sp54 = arg5[0]; sp54 >= arg3[0]; sp54--) { - var_s0 = var_fp + arg4[2]*D_80381FA0.stride[1]; - for(var_s1 = arg4[2]; var_s1 < arg3[2]; var_s1++) { + sp54 = arg5[0]; + var_fp = sp44 + sp54; + while(sp54 >= arg3[0]) { + var_s1 = arg4[2]; + var_s0 = var_fp + var_s1*D_80381FA0.stride[1]; + while(var_s1 < arg3[2]) { if ((var_s0->prop2Cnt != 0) && func_8024D9B0(var_s0) != 0) { func_80301F10(var_s0, gfx, mtx, vtx); } + var_s1++; var_s0 += D_80381FA0.stride[1]; } - var_s0 = var_fp + arg5[2]*D_80381FA0.stride[1]; - for(var_s1 = arg5[2]; var_s1 >= arg3[2]; var_s1--) { + var_s1 = arg5[2]; + var_s0 = var_fp + var_s1*D_80381FA0.stride[1]; + while(var_s1 >= arg3[2]) { if ((var_s0->prop2Cnt != 0) && func_8024D9B0(var_s0) != 0) { func_80301F10(var_s0, gfx, mtx, vtx); } + var_s1--; var_s0 -= D_80381FA0.stride[1]; } + sp54--; var_fp--; } + sp50++; sp44 += D_80381FA0.stride[0]; } - sp44 = D_80381FA0.cube_list + arg5[1]*D_80381FA0.stride[0]; - for(sp50 = arg5[1]; sp50 >= arg3[1]; sp50--) { + sp50 = arg5[1]; + sp44 = D_80381FA0.cube_list + sp50*D_80381FA0.stride[0]; + while(sp50 >= arg3[1]) { - var_fp = sp44 + arg4[0]; - for(sp54 = arg4[0]; sp54 < arg3[0]; sp54++) { + sp54 = arg4[0]; + var_fp = sp44 + sp54; + while(sp54 < arg3[0]) { - var_s0 = var_fp + arg4[2]*D_80381FA0.stride[1]; - for(var_s1 = arg4[2]; var_s1 < arg3[2]; var_s1++) { + var_s1 = arg4[2]; + var_s0 = var_fp + var_s1*D_80381FA0.stride[1]; + while( var_s1 < arg3[2]) { if ((var_s0->prop2Cnt != 0) && func_8024D9B0(var_s0) != 0) { func_80301F10(var_s0, gfx, mtx, vtx); } + var_s1++; var_s0 += D_80381FA0.stride[1]; } - var_s0 = var_fp + arg5[2]*D_80381FA0.stride[1]; - for(var_s1 = arg5[2]; var_s1 >= arg3[2]; var_s1--) { + var_s1 = arg5[2]; + var_s0 = var_fp + var_s1*D_80381FA0.stride[1]; + while( var_s1 >= arg3[2]) { if ((var_s0->prop2Cnt != 0) && func_8024D9B0(var_s0) != 0) { func_80301F10(var_s0, gfx, mtx, vtx); } + var_s1--; var_s0 -= D_80381FA0.stride[1]; } + sp54++; var_fp++; } - var_fp = sp44 + arg5[0]; - for(sp54 = arg5[0]; sp54 >= arg3[0]; sp54--) { - - var_s0 = var_fp + arg4[2]*D_80381FA0.stride[1]; - for(var_s1 = arg4[2]; var_s1 < arg3[2]; var_s1++) { + sp54 = arg5[0]; + var_fp = sp44 + sp54; + while(sp54 >= arg3[0]) { + var_s1 = arg4[2]; + var_s0 = var_fp + var_s1*D_80381FA0.stride[1]; + while(var_s1 < arg3[2]) { if ((var_s0->prop2Cnt != 0) && func_8024D9B0(var_s0) != 0) { func_80301F10(var_s0, gfx, mtx, vtx); } + var_s1++; var_s0 += D_80381FA0.stride[1]; } - var_s0 = var_fp + arg5[2]*D_80381FA0.stride[1]; - for(var_s1 = arg5[2]; var_s1 >= arg3[2]; var_s1--) { + var_s1 = arg5[2]; + var_s0 = var_fp + var_s1*D_80381FA0.stride[1]; + while(var_s1 >= arg3[2]) { if ((var_s0->prop2Cnt != 0) && func_8024D9B0(var_s0) != 0) { func_80301F10(var_s0, gfx, mtx, vtx); } + var_s1--; var_s0 -= D_80381FA0.stride[1]; } + sp54--; var_fp--; } + sp50--; sp44 -= D_80381FA0.stride[0]; } } -#endif -#ifndef NONMATCHING -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80302634.s") -#else void func_80302634(Gfx **gfx, Mtx **mtx, Vtx **vtx, s32 arg3[3], s32 arg4[3], s32 arg5[3]) { s32 sp54; s32 sp50; @@ -226,9 +250,11 @@ void func_80302634(Gfx **gfx, Mtx **mtx, Vtx **vtx, s32 arg3[3], s32 arg4[3], s3 Cube *sp44; Cube *var_fp; - sp44 = D_80381FA0.cube_list + arg4[1]*D_80381FA0.stride[0]; - for(sp50 = arg4[1]; sp50 < arg3[1]; sp50++) { - var_s0 = sp44 + arg4[2]*D_80381FA0.stride[1]; + sp50 = arg4[1]; + sp44 = D_80381FA0.cube_list + sp50*D_80381FA0.stride[0]; + while(sp50 < arg3[1]) { + sp54 = arg4[2]; + var_s0 = sp44 + sp54*D_80381FA0.stride[1]; for(sp54 = arg4[2]; sp54 < arg3[2]; sp54++) { var_fp = var_s0 + arg4[0]; for(var_s1 = arg4[0]; var_s1 < arg3[0]; var_s1++) { @@ -248,7 +274,8 @@ void func_80302634(Gfx **gfx, Mtx **mtx, Vtx **vtx, s32 arg3[3], s32 arg4[3], s3 var_s0 += D_80381FA0.stride[1]; } - var_s0 = sp44 + arg5[2]*D_80381FA0.stride[1]; + sp54 = arg5[2]; + var_s0 = sp44 + sp54*D_80381FA0.stride[1]; for(sp54 = arg5[2]; sp54 >= arg3[2]; sp54--) { var_fp = var_s0 + arg4[0]; for(var_s1 = arg4[0]; var_s1 < arg3[0]; var_s1++) { @@ -267,12 +294,15 @@ void func_80302634(Gfx **gfx, Mtx **mtx, Vtx **vtx, s32 arg3[3], s32 arg4[3], s3 } var_s0 -= D_80381FA0.stride[1]; } + sp50++; sp44 += D_80381FA0.stride[0]; } - sp44 = D_80381FA0.cube_list + arg5[1]*D_80381FA0.stride[0]; - for(sp50 = arg4[1]; sp50 >= arg3[1]; sp50--) { - var_s0 = sp44 + arg4[2]*D_80381FA0.stride[1]; + sp50 = arg5[1]; + sp44 = D_80381FA0.cube_list + sp50*D_80381FA0.stride[0]; + while(sp50 >= arg3[1]) { + sp54 = arg4[2]; + var_s0 = sp44 + sp54*D_80381FA0.stride[1]; for(sp54 = arg4[2]; sp54 < arg3[2]; sp54++) { var_fp = var_s0 + arg4[0]; for(var_s1 = arg4[0]; var_s1 < arg3[0]; var_s1++) { @@ -292,7 +322,8 @@ void func_80302634(Gfx **gfx, Mtx **mtx, Vtx **vtx, s32 arg3[3], s32 arg4[3], s3 var_s0 += D_80381FA0.stride[1]; } - var_s0 = sp44 + arg5[2]*D_80381FA0.stride[1]; + sp54 = arg5[2]; + var_s0 = sp44 + sp54*D_80381FA0.stride[1]; for(sp54 = arg5[2]; sp54 >= arg3[2]; sp54--) { var_fp = var_s0 + arg4[0]; for(var_s1 = arg4[0]; var_s1 < arg3[0]; var_s1++) { @@ -311,10 +342,10 @@ void func_80302634(Gfx **gfx, Mtx **mtx, Vtx **vtx, s32 arg3[3], s32 arg4[3], s3 } var_s0 -= D_80381FA0.stride[1]; } + sp50--; sp44 -= D_80381FA0.stride[0]; } } -#endif void func_80302C94(Gfx **gfx, Mtx **mtx, Vtx **vtx) { f32 sp6C[3]; @@ -1250,21 +1281,94 @@ void func_8030578C(void){ } } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_803058C0.s") +s32 func_803058C0(f32 arg0) { + return ((arg0 >= 0.0f) ? arg0 / 1000 : (arg0 / 1000) - 1.0f) - D_80381FA0.min[1]; +} +#ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80305924.s") +#else +s16 *func_80305924(void) { + s32 var_v1; + s16 *temp_a0; + s16 *var_v0; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80305990.s") + temp_a0 = (s16*) malloc(D_8036ABA8 * sizeof(s16)); + for(var_v1 = 0; var_v1 < D_8036ABA8; var_v1++){ + var_v0 = temp_a0 + var_v1; + *var_v0 = 0; + } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80305BD4.s") + return temp_a0; +} +#endif -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80305C30.s") +void func_80305990(s32 arg0) { + s32 sp1C[3]; + s16 *temp_v0; + Cube *cube; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80305C84.s") + D_8036ABA8 = (D_80381FA0.max[1] - D_80381FA0.min[1]) + 1; + if ((arg0 == 0) && (D_8036ABA0 == NULL)) { + D_8036ABA0 = func_80305924(); + } + if ((arg0 == 1) && (D_8036ABA4 == NULL)) { + D_8036ABA4 = func_80305924(); + } + for(sp1C[1] = 0; sp1C[1] <= D_80381FA0.max[1] - D_80381FA0.min[1]; sp1C[1]++){ + for(sp1C[0] = 0; sp1C[0] <= D_80381FA0.max[0] - D_80381FA0.min[0]; sp1C[0]++){ + for(sp1C[2] = 0; sp1C[2] <= D_80381FA0.max[2] - D_80381FA0.min[2]; sp1C[2]++){ + cube = D_80381FA0.cube_list + sp1C[0] + sp1C[1]*D_80381FA0.stride[0] + sp1C[2]*D_80381FA0.stride[1]; + if ((arg0 == 0) && (cube->prop1Ptr != NULL)) { + temp_v0 = D_8036ABA0 + sp1C[1]; + *temp_v0 += cube->prop1Cnt; + } + if ((arg0 == 1) && (cube->prop2Ptr != NULL)) { + temp_v0 = D_8036ABA4 + sp1C[1]; + *temp_v0 += cube->prop2Cnt; + } + } + } + } +} -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80305CD8.s") +void func_80305BD4(void){ + if(D_8036ABA0 != NULL){ + free(D_8036ABA0); + D_8036ABA0 = NULL; + } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80305D14.s") + if(D_8036ABA4 != NULL){ + free(D_8036ABA4); + D_8036ABA4 = NULL; + } + + D_8036ABA8 = 0; +} + +bool func_80305C30(s32 arg0){ + if(!((arg0 >= 0) && (arg0 < D_8036ABA8))) + return 0; + + return ((D_8036ABA0[arg0] != 0)) ? 1 : 0; +} + +bool func_80305C84(s32 arg0){ + if(!((arg0 >= 0) && (arg0 < D_8036ABA8))) + return 0; + + return ((D_8036ABA4[arg0] != 0)) ? 1 : 0; +} + +void func_80305CD8(s32 arg0, s32 arg1){ + if((arg0 >= 0) && (arg0 < D_8036ABA8)){ + D_8036ABA4[arg0] += arg1; + } +} + +bool func_80305D14(void){ + return (D_8036ABA4 != NULL) ? TRUE : FALSE; +} void func_80305D38(void){ D_8036A9BC = malloc(0); @@ -1310,9 +1414,77 @@ void func_80305D38(void){ // } // } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80305F04.s") +void func_80305F04(s32 *arg0, Struct_core2_7AF80_1 **arg1) { + bool continue_loop; + Struct_core2_7AF80_2 *b_elem; + Struct_core2_7AF80_1 *b_list; + Struct_core2_7AF80_2 *a_elem; + Struct_core2_7AF80_1 *a_list; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_803062D0.s") + if ((D_8036A9BC != NULL) && (D_8036A9B8 != 0)) { + for(a_list = *arg1; a_list < *arg1 + *arg0; a_list++){ + for(b_list = a_list + 1; b_list < *arg1 + *arg0; b_list++) { + //same types and neither A or B are empty + if ((a_list->unk4 == b_list->unk4) && (a_list->unk0 != 0) && (b_list->unk0 != 0)) { + + continue_loop = TRUE; + for(a_elem = a_list->unk8; (a_elem < a_list->unk8 + a_list->unk0) && continue_loop; a_elem++){ + for(b_elem = b_list->unk8; (b_elem < b_list->unk8 + b_list->unk0) && continue_loop; b_elem++) { + if ((((a_elem->unk0[0] - b_elem->unk0[0]) * (a_elem->unk0[0] - b_elem->unk0[0])) + ((a_elem->unk0[2] - b_elem->unk0[2]) * (a_elem->unk0[2] - b_elem->unk0[2]))) < ((a_elem->unkC + b_elem->unkC) * (a_elem->unkC + b_elem->unkC))) { + //concat b_list to end of a_list + a_list->unk8 = (Struct_core2_7AF80_2 *) realloc(a_list->unk8, (a_list->unk0 + b_list->unk0)*sizeof(Struct_core2_7AF80_2)); + memcpy(a_list->unk8 + a_list->unk0, b_list->unk8, b_list->unk0 * sizeof(Struct_core2_7AF80_2)); + a_list->unk0 = (s32) (a_list->unk0 + b_list->unk0); + + b_list->unk0 = 0; + free(b_list->unk8); + b_list->unk8 = NULL; + + b_list = a_list; + continue_loop = FALSE; + } + } + } + } + } + } + + //remove empty lists + for(a_list = *arg1; a_list < *arg1 + *arg0; a_list++){ + if (a_list->unk0 == 0) { //A is empty + continue_loop = TRUE; + for(b_list = a_list + 1; (b_list < *arg1 + *arg0) && continue_loop; b_list++){ + if (b_list->unk0 != 0) { //B is not empty + //swap A an B + memcpy(a_list, b_list, sizeof(Struct_core2_7AF80_1)); + b_list->unk0 = 0; + b_list->unk8 = NULL; + + continue_loop = FALSE; + } + } + } + } + + //find first empty list (end) + for(a_list = *arg1; (a_list < *arg1 + *arg0) && (a_list->unk0 != 0); a_list++) { } + + *arg0 = (a_list - *arg1); //count + *arg1 = (Struct_core2_7AF80_1 *)realloc((void *) *arg1, *arg0 * sizeof(Struct_core2_7AF80_1)); //ptr + } +} + + +void func_803062D0(void) { + Cube* var_s0; + + for (var_s0 = D_80381FA0.cube_list; var_s0 < (D_80381FA0.cube_list + D_80381FA0.cubeCnt); var_s0++) { + func_803303B8(var_s0); + } + func_80305F04(&D_8036A9B8, &D_8036A9BC); + func_80305F04(&D_8036A9C4, &D_8036A9C8); + func_80305F04(&D_8036A9D0, &D_8036A9D4); +} void func_80306390(void){ D_8036A9C0 = D_8036A9BC - 1; @@ -1552,7 +1724,41 @@ s32 func_80306DDC(Struct_core2_7AF80_2 *arg0) { return -1; } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80306EF4.s") +s32 func_80306EF4(s32 arg0[3], s32 arg1, u32 arg2) { + s32 temp_s4; + s32 temp_s6; + Struct_core2_7AF80_2 *var_s0; + Struct_core2_7AF80_1 *var_s1; + + temp_s4 = arg0[1] + arg1 / 2; + temp_s6 = arg0[1] - arg1 / 2; + for(var_s1 = D_8036A9C8; var_s1 < D_8036A9C8 + D_8036A9C4; var_s1++) { + if (D_80381FE8[var_s1->unk4] != 0) { + if (arg2 & 1) { + var_s0 = var_s1->unk8; + for(var_s0 = var_s1->unk8; var_s0 < var_s1->unk8 + var_s1->unk0; var_s0++){ + if( (var_s0->unk10_3 & arg2) + && (temp_s4 >= var_s0->unk0[1]) && (temp_s6 < var_s0->unk0[1]) + && (func_80259328(arg0, (void *) var_s0, var_s0->unkC)) + ) { + return var_s1 - D_8036A9C8; + } + } + } + else{ + for(var_s0 = var_s1->unk8; var_s0 < var_s1->unk8 + var_s1->unk0; var_s0++){ + if( (var_s0->unk10_3 & arg2) + && ((var_s0->unk10_3 & 2) || ((temp_s4 >= var_s0->unk0[1]) && (temp_s6 < var_s0->unk0[1]))) + && (func_80259328(arg0, (void *) var_s0, var_s0->unkC)) + ) { + return var_s1 - D_8036A9C8; + } + } + } + } + } + return -1; +} s32 func_80307164(Struct_core2_7AF80_2 *arg0) { Struct_core2_7AF80_1 *phi_v1; @@ -1665,7 +1871,7 @@ bool func_80307390(s32 arg0, s32 arg1) { // return -1; // } -bool func_803077FC(f32 arg0[3], s32 *arg1, s32 *arg2, s32 arg3, s32 arg4) { +bool func_803077FC(f32 arg0[3], s32 *arg1, s32 *arg2, s32 arg3, u32 arg4) { s32 sp3C[3]; sp3C[0] = (s32) arg0[0]; @@ -1698,10 +1904,84 @@ bool func_803077FC(f32 arg0[3], s32 *arg1, s32 *arg2, s32 arg3, s32 arg4) { return FALSE; } - -Cube *func_80307948(s32 arg0[3]); +#ifndef NONMATCHING +Cube **func_80307948(s32 arg0[3]); #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80307948.s") +#else +Cube **func_80307948(s32 arg0[3]) { + s32 sp34[3]; + s32 sp24[3]; + // ? *var_a2; + s32 *var_a1; + Cube *var_t2; + s32 *var_v0; + s32 temp_a0; + s32 temp_a1; + s32 temp_a1_2; + s32 temp_a2; + s32 temp_a2_2; + s32 temp_lo; + s32 temp_t0; + s32 temp_t0_2; + s32 temp_t5; + s32 temp_t6; + s32 temp_t6_2; + s32 temp_t7; + s32 temp_t7_2; + s32 temp_t8; + s32 temp_t9; + s32 temp_v0; + s32 temp_v1; + s32 var_a0; + s32 var_a0_2; + s32 var_a3; + s32 var_t1; + s32 var_v0_2; + s32 var_v1; + s32 i; + for(i = 0; i < 3; i++){ + sp34[i] = ((arg0[i] >= 0) ? (arg0[i] / 1000) : ((arg0[i]/1000) - 1)) - D_80381FA0.min[i]; + } + + var_v1 = 0; + if( (sp34[0] > 0) && (sp34[0] < (D_80381FA0.width[0] - 1)) + && (sp34[1] > 0) && (sp34[1] < (D_80381FA0.width[1] - 1)) + && (sp34[2] > 0) && (sp34[2] < (D_80381FA0.width[2] - 1)) + ) { + for(sp24[0] = sp34[0] - 1; sp24[0] < sp34[0] + 2; sp24[0]++){ + for(sp24[1] = sp34[1] - 1; sp24[1] < sp34[1] + 2; sp24[1]++){ + for(sp24[2] = sp34[2] - 1; sp24[2] < sp34[2] + 2; sp24[2]++){ + temp_lo = sp24[0] + (sp24[1] * D_80381FA0.stride[0]) + (sp24[2] * D_80381FA0.stride[1]); + if (var_t2[temp_lo].unk0_4) { + D_80382038[var_v1++] = D_80381FA0.cube_list + temp_lo; + } + } + } + } + } else { + for(sp24[0] = sp34[0] - 1; sp24[0] < sp34[0] + 2; sp24[0]++){ + if ((sp24[0] >= 0) && (sp24[0] < D_80381FA0.width[0])) { + for(sp24[1] = sp34[1] - 1; sp24[1] < sp34[1] + 2; sp24[1]++){ + if ((sp24[1] >= 0) && (sp24[1] < D_80381FA0.width[1])) { + for(sp24[2] = sp34[2] - 1; sp24[2] < sp34[2] + 2; sp24[2]++){ + if ((sp24[2] >= 0) && (sp24[2] < D_80381FA0.width[2])) { + temp_lo = sp24[0] + (sp24[1] * D_80381FA0.stride[0]) + (sp24[2] * D_80381FA0.stride[1]); + if (D_80381FA0.cube_list[temp_lo].unk0_4) { + D_80382038[var_v1] = D_80381FA0.cube_list + temp_lo; + var_v1++; + } + } + } + } + } + } + } + } + D_80382038[var_v1] = NULL; + return D_80382038; +} +#endif #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80307CA0.s") // void func_80307CA0(ActorMarker *marker) { @@ -1758,7 +2038,65 @@ u32 func_80307E1C(void) { return phi_v1; } +#ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_80307EA8.s") +#else +u32 func_80307EA8(s32 arg0, s32 arg1[3], s32 *arg2, s32 *arg3) { + s32 temp_lo; + s32 temp_t1; + s32 temp_t6; + s32 temp_t6_2; + u32 var_s2; + u32 var_s4; + NodeProp *temp_a0; + Cube *temp_v0; + + var_s4 = 0; + if (arg0 == 0) { + D_803820A8[0] = (s32) D_80381FA0.min[0]; + D_803820A8[1] = (s32) D_80381FA0.min[1]; + D_803820A8[2] = (s32) D_80381FA0.min[2]; + D_803820B4 = 0; + return 0; + } + while(var_s4 == 0){ + var_s2 = D_803820B4; + if (D_80381FA0.max[0] < D_803820A8[0]) { + return -1U; + } + + temp_v0 = cube_atIndices(D_803820A8); + if ((temp_v0 != NULL) && (temp_v0->prop1Cnt != 0)) { + *arg2 = temp_v0->prop1Ptr[var_s2].unk10_19; + var_s4 = temp_v0->prop1Ptr[var_s2].unk10_31; + *arg3 = temp_v0->prop1Ptr[var_s2].unk6.bit0; + arg1[0] = temp_v0->prop1Ptr[var_s2].x; + arg1[1] = temp_v0->prop1Ptr[var_s2].y; + arg1[2] = temp_v0->prop1Ptr[var_s2].z; + var_s2++; + } + if ((temp_v0 == NULL) || (var_s2 >= temp_v0->prop1Cnt)) { + var_s2 = 0; + D_803820A8[2]++; + if (D_80381FA0.max[2] < D_803820A8[2]) { + D_803820A8[2] = D_80381FA0.min[2]; + D_803820A8[1]++; + if (D_80381FA0.max[1] < D_803820A8[1]) { + D_803820A8[1] = D_80381FA0.min[1]; + D_803820A8[0]++; + if (D_80381FA0.max[0] < D_803820A8[0]) { + D_803820B4 = 0; + return (var_s4 != 0) ? var_s4 : -1; + } + } + } + } + D_803820B4 = var_s2; + } + + return var_s4; +} +#endif #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_7AF80/func_803080C8.s") @@ -1929,11 +2267,11 @@ void func_803086B4(void) { }; if (func_8023DB5C() & 1) { if (D_8036ABA0 != NULL) { - D_8036ABA0 = defrag(D_8036ABA0); + D_8036ABA0 = (s16*) defrag(D_8036ABA0); } if (D_8036ABA4 != NULL) { - D_8036ABA4 = defrag(D_8036ABA4); + D_8036ABA4 = (s16*) defrag(D_8036ABA4); } if (D_8036A9BC != NULL) {