diff --git a/progress/progress_core2.svg b/progress/progress_core2.svg index a0c48f7f..2bd4821f 100644 --- a/progress/progress_core2.svg +++ b/progress/progress_core2.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ core2 - 85.7709% - 85.7709% + 85.9898% + 85.9898% \ No newline at end of file diff --git a/progress/progress_total.svg b/progress/progress_total.svg index 94d7a6f7..639d9ccd 100644 --- a/progress/progress_total.svg +++ b/progress/progress_total.svg @@ -17,7 +17,7 @@ Banjo-Kazooie (us.v10) - 87.0074% - 87.0074% + 87.1330% + 87.1330% \ No newline at end of file diff --git a/src/core2/code_5C870.c b/src/core2/code_5C870.c index d7350ff8..4f3d74cb 100644 --- a/src/core2/code_5C870.c +++ b/src/core2/code_5C870.c @@ -579,7 +579,7 @@ s32 func_802E48D8(void){ if( !level_get() ) return NULL; - func_80343F3C(); + glspline_defrag(); func_80288470(); func_802F1320(); func_802BA128(); diff --git a/src/core2/code_6A4B0.c b/src/core2/code_6A4B0.c index c4ec9f52..b81ec722 100644 --- a/src/core2/code_6A4B0.c +++ b/src/core2/code_6A4B0.c @@ -2,23 +2,194 @@ #include "functions.h" #include "variables.h" +extern s16 D_803A5D00[2][0xF660]; + +typedef struct { + void *unk0; + void *unk4; + s32 unk8; + void (*unkC)(void); + s32 unk10; +}Struct_Core2_6A4B0_2; + +typedef struct { + s16 unk0[3]; +}Struct_Core2_6A4B0_1; + +typedef struct { + u8 pad0[0x8]; + u16 *unk8; + u8 padC[4]; + s32 unk10; +}Struct_Core2_6A4B0_0; + +s32 func_802F1804(s32 *arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4); +void func_802F18B8(Struct_Core2_6A4B0_2 *arg0); + +/* .data */ +extern Gfx D_803689D0[]; +extern s32 D_80368A10[2][3]; +extern s32 D_80368A28[2][3]; + +#ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_6A4B0/func_802F1440.s") +#else +void func_802F1440(Struct_Core2_6A4B0_0 *arg0, Gfx **gfx, Mtx **mtx, Vtx **vtx) { + Vtx *sp9C; + s32 sp54; + s32 sp50; + s32 sp4C; + Struct_Core2_6A4B0_1 *temp_v0_2; + s32 var_s3; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_6A4B0/func_802F1804.s") + if (arg0->unk10 == 0) { + func_8024C7B8(gfx, mtx); + } + gSPDisplayList((*gfx)++, D_803689D0); -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_6A4B0/func_802F1858.s") + sp9C = *vtx; + for(sp4C = 0; sp4C < 6; sp4C++){ + for(sp50 = 0; sp50 < 9; sp50++){ + for(sp54 = 0; sp54 < 2; sp54++){ + for(var_s3 = 0; var_s3 < 3; var_s3++){ + temp_v0_2 = func_802F1804(arg0, sp50, sp4C, sp54, var_s3); + sp9C->v.ob[0] = temp_v0_2->unk0[0]; + sp9C->v.ob[1] = temp_v0_2->unk0[1]; + sp9C->v.ob[2] = temp_v0_2->unk0[2]; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_6A4B0/func_802F1884.s") + sp9C->v.flag = 0; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_6A4B0/func_802F18B8.s") + sp9C->v.tc[0] = D_80368A10[sp54][var_s3]; + sp9C->v.tc[1] = D_80368A28[sp54][var_s3]; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_6A4B0/func_802F18F0.s") + sp9C->n.n[0] = -1; + sp9C->n.n[1] = -1; + sp9C->n.n[2] = -1; + sp9C->n.a = 0xFF; + sp9C++; + } + } + } + } + *vtx = sp9C; + var_s3 = 0; + gSPVertex((*gfx)++, osVirtualToPhysical(sp9C), 16, 0); + for(sp4C = 0; sp4C < 6; sp4C++){ + for(sp50 = 0; sp50 < 9; sp50++){ + gDPLoadTextureTile((*gfx)++, osVirtualToPhysical(&arg0->unk8[(sp4C*0x20 + 0xC) * D_80276588 + (sp50*0x20 + 1)]), G_IM_FMT_RGBA, G_IM_SIZ_16b, D_80276588, 0, 0, 0, 33, 33, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); + for(sp54 = 0; sp54 < 2; sp54++){ + gSP1Triangle((*gfx)++, var_s3, var_s3 + 1, var_s3 + 2, 0); + var_s3 += 3; + if (var_s3 == 0xF) { + sp9C += 0xF; + var_s3 = 0; + gSPVertex((*gfx)++, osVirtualToPhysical(sp9C), 16, 0); + } + } + } + } + if (arg0->unk10 == 0) { + func_8024C904(gfx, mtx); + } +} +#endif -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_6A4B0/func_802F1934.s") +s32 func_802F1804(s32 *arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4) { + return *arg0 + (arg1 * 0x24) + (arg2 * 0x144) + (arg3 * 0x12) + (arg4 * 6); +} -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_6A4B0/func_802F1A08.s") +void func_802F1858(Struct_Core2_6A4B0_2 *arg0){ + if(arg0->unkC != NULL){ + arg0->unkC(); + } +} + +void func_802F1884(Struct_Core2_6A4B0_2 *arg0){ + func_802F18B8(arg0); + free(arg0->unk0); + free(arg0); +} + +void func_802F18B8(Struct_Core2_6A4B0_2 *arg0){ + if(arg0->unk4 != NULL){ + free(arg0->unk4); + arg0->unk4 = NULL; + } +} + +Struct_Core2_6A4B0_2 *func_802F18F0(void){ + Struct_Core2_6A4B0_2 *self; + + self = (Struct_Core2_6A4B0_2 *) malloc(sizeof(Struct_Core2_6A4B0_2)); + self->unk0 = malloc(0x798); + self->unk4 = 0; + self->unkC = 0; + self->unk10 = 0; + return self; +} + +void func_802F1934(Struct_Core2_6A4B0_2 * arg0, s32 arg1){ + func_802F18B8(arg0); + arg0->unk4 = malloc(D_80276588*D_8027658C*sizeof(u16) + 0x10); + arg0->unk8 = arg0->unk4; + while((arg0->unk8 & 0x10) == 0){ + (arg0->unk8)++; + } + func_80253010(arg0->unk8, D_803A5D00[arg1], D_80276588*D_8027658C*sizeof(u16)); + osWriteBackDCacheAll(); +} + +void func_802F1A08(s32 arg0) { } #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_6A4B0/func_802F1A10.s") #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_6A4B0/func_802F1CAC.s") +// void func_802F1CAC(void *arg0) { +// s32 sp84[3]; +// f32 sp78[3]; +// s32 sp60; +// s32 *var_s1; +// s32 temp_lo; +// s32 temp_v0; +// s32 var_fp; +// s32 var_s0; +// s32 var_s4; +// s32 var_s5; +// s32 var_s6; +// s32 var_s7; +// void *temp_v0_2; +// void *var_s2; + +// func_8024C5CC(sp78); +// var_fp = 0; +// sp84[0] = (s32) ((1000.0f - sp78[0]) - 200.0f); +// sp84[0] = (s32) ((0.0f - sp78[1]) + 300.0f); +// sp84[2] = (s32) ((2000.0f - sp78[2]) + 0.0f); +// for(var_s7 = 0; var_s7 < 6; var_s7++){ +// var_s6 = 0; +// for(var_s5 = 0; var_s5 < 9; var_s5++){ +// sp60 = 0; +// for(var_s4 = 0; var_s4 < 2; var_s4++){ +// temp_v0 = sp60 * 4; +// var_s1 = temp_v0 + &D_80368A70; +// var_s2 = temp_v0 + &D_80368A88; +// var_s0 = 0; +// for(var_s0 = 0; var_s0 < 2; var_s0++){ +// temp_v0_2 = func_802F1804(arg0, var_s5, var_s7, var_s4, var_s0); +// temp_lo = *var_s1 * 0x32; +// var_s1 += 4; +// var_s2 += 4; +// temp_v0_2->unk0 = (s16) (temp_lo + sp84 + var_s6); +// temp_v0_2->unk2 = (s16) ((sp88 - var_fp) - (var_s2->unk-4 * 0x32)); +// temp_v0_2->unk4 = (s16) sp8C; +// } +// sp60 += 3; +// } +// var_s6 += 0x32; +// } +// var_fp += 0x32; +// } +// arg0->unkC = &func_802F1440; +// arg0->unk10 = 1; +// } \ No newline at end of file diff --git a/src/core2/code_A5BC0.c b/src/core2/code_A5BC0.c index 22347318..f7074e8b 100644 --- a/src/core2/code_A5BC0.c +++ b/src/core2/code_A5BC0.c @@ -10,6 +10,8 @@ extern f32 func_802EC920(BKVertexList *); extern void func_802C39D4(void); extern bool func_80340020(s32, f32[3], f32[3], f32, s32, BKVertexList *, f32[3], f32[3]); extern void func_80340200(s32, f32[3], f32[3], f32, s32, s32, BKVertexList *, s32); +extern s32 func_802E9DD8(BKCollisionList *collisionList, BKVertexList *vtxList, f32 arg2[3], f32 *arg3, f32 arg4, f32 arg5[3], f32 arg6, f32 arg7[3], s32 arg8); + extern f32 func_8030A590(void); @@ -942,7 +944,11 @@ void func_8032EE80(Cube *cube) { } } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_A5BC0/func_8032F170.s") +s32 func_8032F170(Cube **arg0, void **arg1){ + *arg0 = D_80383404; + *arg1 = D_80383408; + return D_8038340C; +} #ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_A5BC0/func_8032F194.s") @@ -963,7 +969,7 @@ void func_8032F194(ActorMarker *marker, s32 position[3], Cube *cube) { #ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_A5BC0/func_8032F21C.s") #else -void func_8032F21C(Cube *cube, s32 position[3], ActorMarker *marker, bool arg3) { +s32 func_8032F21C(Cube *cube, s32 position[3], ActorMarker *marker, bool arg3) { ActorProp *sp1C; u8 temp_t0; u8 temp_t2; @@ -1776,7 +1782,91 @@ s32 func_80331638(Cube *cube, f32 arg1[3], f32 arg2[3], f32 arg3, f32 arg4[3], s } #endif +#ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_A5BC0/func_803319C0.s") +#else +Struct66s *func_803319C0(Cube *arg0, f32 arg1[3], f32 arg2, s32 arg3, f32 arg4[3], u32 arg5) { + Struct66s *var_s7; + Struct66s *var_v0; + s32 var_s3; + Prop *var_s0; + + + var_s7 = NULL; + var_s0 = arg0->prop2Ptr;\ + for (var_s3 = arg0->prop2Cnt; var_s3 != 0; var_s3--, var_s0++) { + if (!var_s0->markerFlag && var_s0->unk8_1 && var_s0->unk8_4) { + ModelProp *mProp = &var_s0->modelProp; + BKModelBin *temp_v0_2; + BKCollisionList *temp_v0_3; + + temp_v0_2 = func_8030A4B4(mProp->unk0_31); + if (temp_v0_2 != NULL) { + temp_v0_3 = func_8033A084(temp_v0_2); + if (temp_v0_3 != NULL) { + f32 spAC[3]; + f32 spA0[3]; + + spAC[0] = (f32) mProp->unk4[0]; + spAC[1] = (f32) mProp->unk4[1]; + spAC[2] = (f32) mProp->unk4[2]; + spA0[0] = 0.0f; + spA0[1] = (f32) (mProp->unk0_15 * 2); + spA0[2] = (f32) (mProp->unk0_7 * 2); + var_v0 = func_802E9DD8(temp_v0_3, func_8033A148(temp_v0_2), spAC, spA0, ((f32) mProp->unkA) / 100.0, arg1, arg2, arg3, arg4); + if (var_v0 != NULL) { + var_s7 = var_v0; + } + } + } + } else if (var_s0->markerFlag && var_s0->unk8_3 && var_s0->unk8_4) { + ActorProp *aProp = &var_s0->actorProp; + BKModelBin *temp_v0_2; + BKCollisionList *temp_v0_3; + Actor *temp_v0_6; + BKVertexList *temp_a1; + + temp_v0_2 = func_80330DE4(aProp->marker); + if (temp_v0_2 != NULL) { + temp_v0_3 = func_8033A084(temp_v0_2); + if (temp_v0_3 != NULL) { + f32 sp88[3]; + f32 sp7C[3]; + + temp_v0_6 = marker_getActor(aProp->marker); + temp_a1 = func_80330C74(temp_v0_6); + sp88[0] = (f32) aProp->x; + sp88[1] = (f32) aProp->y; + sp88[2] = (f32) aProp->z; + + sp7C[0] = aProp->marker->pitch; + sp7C[1] = aProp->marker->yaw; + sp7C[2] = aProp->marker->roll; + + var_v0 = func_802E9DD8(temp_v0_3, temp_a1, sp88, sp7C, temp_v0_6->scale, arg1, arg2, arg3, arg4); + if (var_v0 != 0) { + var_s7 = var_v0; + } + } + } + } else if (var_s0->markerFlag) { + ActorProp *aProp = &var_s0->actorProp; + Struct6Cs *temp_v0_7; + + temp_v0_7 = aProp->marker->unk18; + if (temp_v0_7 != NULL) { + if (temp_v0_7->unk8 != NULL) { + var_v0 = temp_v0_7->unk8(aProp->marker, arg1, arg2, arg3, arg4); + if (var_v0 != 0) { + var_s7 = var_v0; + } + } + } + } + } + return var_s7; +} +#endif f32 func_80331D20(BKSprite *sprite) { BKSpriteFrame *frame; diff --git a/src/core2/code_B8080.c b/src/core2/code_B8080.c index 18db99d6..2d561ec6 100644 --- a/src/core2/code_B8080.c +++ b/src/core2/code_B8080.c @@ -67,16 +67,15 @@ BKMeshList *func_8033F2AC(BKModel *arg0){ return arg0->meshList_0; } -#ifndef NONMATCHING -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B8080/func_8033F2B4.s") -#else void func_8033F2B4(BKModel *model, s32 mesh_id, s16 arg2[3], s16 arg3[3]) { + s32 pad2C; + s32 pad28; BKMesh *mesh; + Vtx *vtx_pool; + Vtx *i_vtx; s16 *mesh_begin; s16 *mesh_end; s16 *phi_t4; - Vtx *i_vtx; - Vtx *vtx_pool; s32 i; mesh = func_802E9F9C(model->meshList_0, mesh_id); @@ -97,7 +96,6 @@ void func_8033F2B4(BKModel *model, s32 mesh_id, s16 arg2[3], s16 arg3[3]) { } } } -#endif //return mesh id "position" is over/under s32 func_8033F3C0(BKModel *model, f32 position[3]){ diff --git a/src/core2/code_B9770.c b/src/core2/code_B9770.c index 0a7b6e6e..3b3ead92 100644 --- a/src/core2/code_B9770.c +++ b/src/core2/code_B9770.c @@ -9,16 +9,13 @@ extern bool func_80323240(struct56s *, f32, f32[3]); extern f32 func_803234FC(struct56s *, f32, f32); extern f32 func_80323540(struct56s *, f32, f32, f32); extern f32 func_803237E8(struct56s *); +extern f32 func_80323F74(struct56s *, f32, f32); extern f32 func_80323FDC(struct56s *, f32, f32, s32 *); extern f32 func_803240E0(struct56s *, f32, f32, s32 *); extern void func_8032417C(struct56s *, f32, f32[3], f32[3]); extern void func_80328FF0(Actor *, f32); -extern struct56s **D_80371E70; -extern void **D_80371E74; -extern s32 D_80371E78; -extern s32 D_80371E7C; -extern s32 D_80371E80; + typedef struct { @@ -208,6 +205,24 @@ typedef struct{ Union_glspline spline[]; }glspline_list; +typedef struct { + s16 unk0; + s16 unk2[3]; + u16 unk8_15:1; + u16 unk8_14:1; + u16 unk8_13:1; + u16 pad8_12:13; +}Struct_glspline_803411B0; + +s32 func_80341BC8(struct56s *arg0, glspline_list * arg1); + +/* .data */ +extern struct56s **D_80371E70; +extern glspline_list **D_80371E74; +extern s32 D_80371E78; +extern s32 D_80371E7C; +extern s32 D_80371E80; + /* .rodata */ extern char D_80378FF0[]; extern f32 D_8037901C; @@ -257,20 +272,237 @@ f32 func_80340A4C(f32 arg0, s32 arg1, f32 *arg2) { void func_80340BE4(f32 arg0, s32 arg1, s32 arg2, s32 arg3, f32 * arg4, f32 arg5[3]); #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80340BE4.s") -void func_80341180(f32 arg0, s32 arg1, s32 arg2, f32 * arg3, f32 arg4[3]){ +void func_80341180(f32 arg0, s32 arg1, s32 arg2, f32 arg3[3], f32 arg4[3]){ func_80340BE4(arg0, arg1, arg2, arg2, arg3, arg4); } - +#ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_803411B0.s") +#else +void func_803411B0(void) { + s32 spE4; + s32 spE0; + Struct_glspline_803411B0 *spD8; + s32 spCC[3]; + s32 spC8; + s32 spC4; + struct56s *spB4; + glspline_list *spA8; + struct56s *spA4; + Union_glspline *sp80; + Struct_glspline_803411B0 *sp50; + Union_glspline *temp_s6; + Union_glspline *var_s0_2; + Union_glspline *var_s1_2; + s32 temp_v0_2; + s32 var_a0; + s32 var_a0_3; + s32 var_a0_4; + s32 var_a0_5; + s32 var_fp; + s32 var_s0; + s32 var_s2; + s32 var_s2_2; + s32 var_s5; + s32 var_s7; + s32 var_v1; + Union_glspline *temp_s3_2; + Union_glspline *temp_v0_16; + Struct_glspline_803411B0 *temp_v0_17; + Struct_glspline_803411B0 *var_v0_4; + s16 *i_ptr; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80341A54.s") + D_80371E80 = 0; + D_80371E70 = malloc(0); + D_80371E74 = malloc(0); + D_80371E78 = 0; + D_803858A0 = (s16 *) malloc(0x80*sizeof(s16)); + for(var_v1 = 0; var_v1 < 0x80; var_v1++){ + D_803858A0[var_v1] = 0; + } + spE4 = func_80307E1C(D_803858A0) + 1; + if (spE4 > 1) { + spD8 = (Struct_glspline_803411B0 *)malloc(spE4 * sizeof(Struct_glspline_803411B0)); + for(var_a0 = 0; var_a0 < spE4; var_a0++){ + spD8[var_a0].unk0 = -1; + } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80341BA0.s") -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80341BC8.s") + func_80307EA8(0, spCC, &spC8, &spC4); + do { + temp_v0_2 = func_80307EA8(1, spCC, &spC8, &spC4); + if (temp_v0_2 >= 0) { + spD8[temp_v0_2].unk0 = (s16) spC8; + spD8[temp_v0_2].unk2[0] = (s16) spCC[0]; + spD8[temp_v0_2].unk2[1] = (s16) spCC[1]; + spD8[temp_v0_2].unk2[2] = (s16) spCC[2]; + spD8[temp_v0_2].unk8_13 = spC4; + } + } while (temp_v0_2 >= 0); -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80341C78.s") + for(spE0 = 1; spE0 < spE4; spE0++) { + spD8[spE0].unk8_15 = 0; + if ((spD8[spE0].unk0 >= spE4) || (spD8[spE0].unk0 == -1)) { + spD8[spE0].unk0 = 0; + } + } + + for(spE0 = 1; spE0 < spE4; spE0++) { + if (spD8[spE0].unk0 > 0) { + spD8[spD8[spE0].unk0].unk8_15 = 1; + } + } + + for(spE0 = 1; spE0 < spE4; spE0++) { + if( (spD8[spE0].unk8_13 == 1) + && ((spD8[spE0].unk8_15 != 0) || (spD8[spE0].unk0 <= 0)) + && ((spD8[spE0].unk8_15 != 1) || (spD8[spE0].unk0 <= 0)) + && ((spD8[spE0].unk8_15 != 1) || (spD8[spE0].unk0 != 0)) + ) { + func_8032DC70(); + spD8[spE0].unk0 = -1; + spD8[spE0].unk8_13 = 0; + } + } + + for(spE0 = 1; spE0 < spE4; spE0++) { + if (spD8[spE0].unk0 > 0) { + if (spD8[spE0].unk8_15 == 0) { + if (!spD8[spE0].unk8_13) { + var_s7 = 1; + var_s0 = 0; + var_fp = 0; + for(var_s5 = 1; var_s5 < spE4; var_s5++){ + spD8[var_s5].unk8_14 = 0; + } + + var_v0_4 = &spD8[spE0]; + while ((var_v0_4->unk0 != 0) && !(var_v0_4->unk8_14)) { + var_v0_4->unk8_14 = 1; + var_s7 += (var_v0_4->unk8_13 == 0) ? 1 : 0; + var_s0 += (var_v0_4->unk8_13 == 0) ? 0 : 1; + var_v0_4 = &spD8[var_v0_4->unk0]; + } + + spB4 = (struct56s *) malloc(sizeof(struct56s) + (var_s7 * 3* sizeof(f32))); + spB4->unk0 = var_s7; + spB4->unk4 = 0; + spA8 = (glspline_list *)malloc(sizeof(glspline_list) + var_s0*sizeof(Union_glspline)); + spA8->unk0 = var_s0; + var_s1_2 = &spA8->spline[0]; + var_s2 = var_s0; + for(var_a0_4 = spE0; (var_s2 != 0); var_a0_4 = spD8[var_a0_4].unk0){ + if (spD8[var_a0_4].unk8_13 == 1) { + temp_v0_16 = func_803080C8(); + temp_v0_16->t1.unk8.pad_bit7 = (s8) D_80371E78; + memcpy(var_s1_2, temp_v0_16, 0x14); + var_s1_2++; + var_s2--; + } + } + temp_s6 = &spA8->spline[0]; + temp_s3_2 = &spA8->spline[spA8->unk0]; + var_s2_2 = 0; + do { + for(var_s0_2 = temp_s6; var_s0_2 < temp_s3_2; var_s0_2++){ + if ((var_s0_2 + 1)->common.unk0 < var_s0_2->common.unk0) { + memcpy(sp80, var_s0_2, sizeof(Union_glspline)); + memcpy(var_s0_2, var_s0_2 + 1, sizeof(Union_glspline)); + memcpy(var_s0_2 + 1, sp80, sizeof(Union_glspline)); + var_s2_2++; + } + } + } while (var_s2_2 != 0); + while(var_s7 != 0){ + temp_v0_17 = &spD8[spE0]; + if (!(temp_v0_17->unk8_13)) { + spB4->unk8[var_fp][0] = (f32) temp_v0_17->unk2[0]; + spB4->unk8[var_fp][1] = (f32) temp_v0_17->unk2[1]; + spB4->unk8[var_fp][2] = (f32) temp_v0_17->unk2[2]; + var_s7--; + } + } + func_80341BC8(spB4, spA8); + } + } + } + } + free(spD8); + } +} +#endif + +//glspline_free +void func_80341A54(void) { + s32 var_s0; + + for(var_s0 = 0; var_s0 < 0x40; var_s0++){ + if (D_803858A0[var_s0] != 0) { + func_8030DA44(D_803858A0[var_s0]); + } + } + + for(var_s0 = 0x40; var_s0 < 0x80; var_s0++){ + if (D_803858A0[var_s0] != 0) { + func_8025A7DC(func_80255D30(D_803858A0[var_s0])); + } + } + + for(var_s0 = 0; var_s0 < D_80371E78; var_s0++){ + free(D_80371E70[var_s0]); + free(D_80371E74[var_s0]); + } + free(D_80371E70); + free(D_80371E74); + free(D_803858A0); + D_80371E70 = NULL; + D_80371E74 = NULL; + D_80371E78 = 0; + D_803858A0 = NULL; +} + +void func_80341BA0(void){ + func_80341A54(); + func_803411B0(); +} + +s32 func_80341BC8(struct56s *arg0, glspline_list * arg1) { + s32 temp_t7; + void *temp_v0; + void *temp_v0_2; + + D_80371E78++; + D_80371E70 = (struct56s **)realloc(D_80371E70, D_80371E78 * sizeof(struct56s *)); + + D_80371E70[D_80371E78 - 1] = arg0; + D_80371E74 = (glspline_list **)realloc(D_80371E74, D_80371E78 * sizeof(glspline_list *)); + D_80371E74[D_80371E78 - 1] = arg1; + return D_80371E78 - 1; +} + + +s32 func_80341C78(s32 arg0[3]) { + struct56s *temp_a0; + s32 var_a3; + s32 var_v1; + f32 *var_a2; + f32 sp4[3]; + + sp4[0] = (f32) arg0[0]; + sp4[1] = (f32) arg0[1]; + sp4[2] = (f32) arg0[2]; + for(var_v1 = 0; var_v1 < D_80371E78; var_v1++){ + temp_a0 = D_80371E70[var_v1]; + var_a2 = temp_a0->unk8; + for (var_a3 = 0; var_a3 < temp_a0->unk0; var_a3++) { + if( (sp4[0] == var_a2[0]) && (sp4[1] == var_a2[1]) && (sp4[2] == var_a2[2])) { + return var_v1; + } + var_a2+=3; + } + } + return -1; +} #ifndef NONMATCHING #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80341D5C.s") @@ -308,15 +540,46 @@ s32 func_80341D5C(s32 arg0[3], s32 arg1[3]){ } #endif -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80341EC4.s") +s32 func_80341EC4(f32 arg0[3]){ + s32 sp1C[3]; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80341EF0.s") + ml_vec3f_to_vec3w(sp1C, arg0); + return func_80341C78(sp1C); +} -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80341F2C.s") +struct56s *func_80341EF0(f32 arg0[3]){ + s32 sp1C[3]; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80341F64.s") + ml_vec3f_to_vec3w(sp1C, arg0); + return D_80371E70[func_80341C78(sp1C)]; +} -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80341FB0.s") +s32 func_80341F2C(s32 arg0){ + s32 sp1C[3]; + if(!func_80304DD0(arg0, sp1C)){ + return -1; + } + return func_80341C78(sp1C); +} + +struct56s *func_80341F64(s32 arg0){ + s32 sp1C[3]; + if(!func_80304DD0(arg0, sp1C)){ + return NULL; + } + return D_80371E70[func_80341C78(sp1C)]; +} + +f32 func_80341FB0(s32 arg0, f32 arg1, s32 arg2, f32 arg3) { + f32 sp1C; + + if (arg0 == -1) { + return arg1; + } + sp1C = func_80323F74(D_80371E70[arg0], arg1, arg3); + func_80323240(D_80371E70[arg0], sp1C, arg2); + return sp1C; +} struct56s *func_80342038(s32 indx){ if(indx == -1) @@ -952,22 +1215,22 @@ struct56s *func_80343F00(s32 indx, f32 arg1[3]){ return out; } -void func_80343F3C(void) { +void glspline_defrag(void) { s32 i; if (D_80371E70 != 0) { - D_80371E70 = (struct56s *)defrag(D_80371E70); + D_80371E70 = (struct56s **) defrag(D_80371E70); } if (D_80371E74 != 0) { - D_80371E74 = defrag(D_80371E74); + D_80371E74 = (glspline_list **) defrag(D_80371E74); } if (D_803858A0 != 0) { - D_803858A0 = defrag(D_803858A0); + D_803858A0 = (s16 *) defrag(D_803858A0); } for(i = 0; i < D_80371E78; i++){ - D_80371E74[i] = defrag(D_80371E74[i]); - D_80371E70[i] = defrag(D_80371E70[i]); + D_80371E74[i] = (glspline_list *) defrag(D_80371E74[i]); + D_80371E70[i] = (struct56s *) defrag(D_80371E70[i]); } } diff --git a/src/core2/code_BEF20.c b/src/core2/code_BEF20.c index 277670b6..a7ed2fd0 100644 --- a/src/core2/code_BEF20.c +++ b/src/core2/code_BEF20.c @@ -21,6 +21,7 @@ u8 D_80385FF0[0xB]; f32 D_80386000[0xE]; //timescores s32 D_80386038; +/* .code */ void func_80345EB0(enum item_e item){ if(func_802FAFE8(item)){ func_803463D4(item, (s32)(-time_getDelta()*60.0f * 1.1)); @@ -60,6 +61,7 @@ s32 func_80345FB4(enum item_e item, s32 diff, s32 arg2){\ s32 sp24; //without this var newVal is too high, but sp1C is correct s32 newVal; + oldVal = D_80385F30[item]; if(func_80255D04()) @@ -127,7 +129,7 @@ s32 func_80345FB4(enum item_e item, s32 diff, s32 arg2){\ bs_checkInterrupt(BS_INTR_11_DROWN); D_80385FE4 = 1; } - if(sp2C && sp30 != sp2C ){ + if(sp2C != 0 && sp30 != sp2C ){ if(sp2C < sp30){ func_8025A6EC(SFX_AIR_METER_DROPPING, 28000); }