From 2bbb35dcdcab4582c3eac5403f6787404a2e0d52 Mon Sep 17 00:00:00 2001 From: Banjo Kazooie Date: Thu, 15 Sep 2022 21:51:47 -0500 Subject: [PATCH] core2/code_B9770.c progress --- progress/progress_core2.svg | 6 +- progress/progress_total.svg | 6 +- src/core2/code_AE5D0.c | 6 +- src/core2/code_AEDA0.c | 49 ++++++- src/core2/code_B9770.c | 233 +++++++++++++++++++++++++++++++--- symbol_addrs.core2.us.v10.txt | 3 + 6 files changed, 266 insertions(+), 37 deletions(-) diff --git a/progress/progress_core2.svg b/progress/progress_core2.svg index a1daa62a..ad235435 100644 --- a/progress/progress_core2.svg +++ b/progress/progress_core2.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ core2 - 84.9582% - 84.9582% + 85.3818% + 85.3818% \ No newline at end of file diff --git a/progress/progress_total.svg b/progress/progress_total.svg index 9e6cc8a7..bc0f973f 100644 --- a/progress/progress_total.svg +++ b/progress/progress_total.svg @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ Banjo-Kazooie (us.v10) - 86.5411% - 86.5411% + 86.7842% + 86.7842% \ No newline at end of file diff --git a/src/core2/code_AE5D0.c b/src/core2/code_AE5D0.c index 3329fa91..415d4b5c 100644 --- a/src/core2/code_AE5D0.c +++ b/src/core2/code_AE5D0.c @@ -4,8 +4,8 @@ #include "animation.h" -extern void func_8033AA50(void *, f32, s32); -extern void func_8033A750(s32, s32, s32, f32); +extern void func_8033AA50(void *, f32, Struct_B1400_1 *); +extern void func_8033A750(s32, s32, Struct_B1400_1 *, f32); /* .code */ void func_80335560(Struct80s *self){ @@ -85,7 +85,7 @@ s32 func_803356A0(Struct80s *self){ } if(self->unk28 == 0){ - self->unk28 = func_8033A710(); + self->unk28 = (Struct_B1400_1 *) func_8033A710(); } func_8033AA50(self->unk4, self->unk8, self->unk28); func_8033A750(self->unk0, self->unk24, self->unk28, self->unk20); diff --git a/src/core2/code_AEDA0.c b/src/core2/code_AEDA0.c index 6f42f49c..8bd8815a 100644 --- a/src/core2/code_AEDA0.c +++ b/src/core2/code_AEDA0.c @@ -2,10 +2,19 @@ #include "functions.h" #include "variables.h" -extern u8 D_80370338[]; +extern u8 D_80370338[4]; +extern u8 D_8037033C; /* .bss */ -u8 pad_80383610[0x24]; +s32 D_80383610; +s32 D_80383614; +s32 D_80383618; +s32 D_8038361C; +s32 D_80383620; +s32 D_80383624; +s32 D_80383628; +s32 D_8038362C; +u32 D_80383630; u32 D_80383634; u32 D_80383638; s32 D_8038363C; @@ -362,11 +371,31 @@ void func_80337B68(Gfx **gfx, Vtx **vtx, Struct84s *texture_list, s32 texture_in #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_AEDA0/func_803381B4.s") -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_AEDA0/func_80338270.s") +void func_803382D8(s32 arg0); +void func_803382E4(s32 arg0); +void func_803382F0(s32 arg0); +void func_803382FC(s32 arg0); +void func_80338308(s32 arg0, s32 arg1); -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_AEDA0/func_803382B4.s") +void func_80338270(){ + func_803382D8(0xFF); + func_803382E4(0); + func_803382F0(0); + func_803382FC(0xFF); + func_80338308(100, 100); -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_AEDA0/func_803382D8.s") +} + +void func_803382B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3){ + D_80383620 = arg0; + D_80383624 = arg1; + D_80383628 = arg2; + D_8038362C = arg3; +} + +void func_803382D8(s32 arg0){ + D_80383630 = arg0; +} void func_803382E4(s32 arg0){ D_80383634 = arg0; @@ -390,10 +419,16 @@ void func_8033831C(s32 *arg0, s32 *arg1){ *arg1 = D_80383644; } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_AEDA0/func_80338338.s") +void func_80338338(s32 r, s32 g, s32 b){ + D_80383610 = r; + D_80383614 = g; + D_80383618 = b; +} #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_AEDA0/func_80338354.s") #pragma GLOBAL_ASM("asm/nonmatchings/core2/code_AEDA0/func_80338370.s") -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_AEDA0/func_8033837C.s") +void func_8033837C(s32 arg0){ + D_8037033C = arg0; +} \ No newline at end of file diff --git a/src/core2/code_B9770.c b/src/core2/code_B9770.c index e5de3da3..22fc3653 100644 --- a/src/core2/code_B9770.c +++ b/src/core2/code_B9770.c @@ -2,15 +2,17 @@ #include "functions.h" #include "variables.h" -extern f32 func_80323540(struct56s *, f32, f32, f32); +extern void func_80250530(s32, u16, f32); +extern s32 func_80255D44(s32); extern void sfxsource_setSampleRate(u8, s32); 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_80323FDC(struct56s *, f32, f32, s32 *); extern f32 func_803240E0(struct56s *, f32, f32, s32 *); -extern void func_80250530(s32, u16, f32); -extern s32 func_80255D44(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; @@ -18,6 +20,7 @@ extern s32 D_80371E78; extern s32 D_80371E7C; extern s32 D_80371E80; + typedef struct { f32 unk0; u8 pad4[0x8]; @@ -180,12 +183,16 @@ typedef struct{ }Struct_glspline_t1; typedef struct{ - u8 pad0[0xC]; + f32 unk0; + u8 pad0[0x8]; struct{ u32 pad_bit31:31; u32 bit0:1; }unkC; - u8 pad10[0x4]; + struct { + u32 pad_31:31; + u32 bit0:1; + }unk10; }Struct_glspline_common; typedef union{ @@ -205,6 +212,12 @@ typedef struct{ extern char D_80378FF0[]; extern f32 D_8037901C; +extern f64 D_80379058; +extern f64 D_80379060; +extern f64 D_80379068; +extern f64 D_80379070; + + /* .bss */ s16 *D_803858A0; @@ -315,15 +328,72 @@ int func_80342064(s32 arg0){ return 0; } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80342070.s") +s32 func_80342070(s32 arg0){ + glspline_list **temp_v0 = D_80371E74; + glspline_list *temp_v1; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_803420BC.s") + if(arg0 == -1) + return 0; -s32 func_803421A4(s32, f32); -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_803421A4.s") + temp_v1 = temp_v0[arg0]; + if (temp_v1->unk0 == 0) { + return 0; + } + return temp_v1->spline[0].t1.unk10.bit31; +} +s32 func_803420BC(s32 arg0, s32 arg1, s32 arg2){ + glspline_list **temp_v0 = D_80371E74; + glspline_list *temp_v1; + s32 temp_a1; + s32 var_a0; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80342244.s") + if(arg0 == -1) + return 0; + + temp_v1 = temp_v0[arg0]; + temp_a1 = temp_v1->unk0; + if (temp_a1 == 0) { + return 0; + } + + for(var_a0 = 0; (var_a0 < temp_a1) && arg1 != temp_v1->spline[var_a0].t1.unk10.bit31; var_a0++); + + if (var_a0 == temp_a1) { + return 0; + } + + var_a0 += arg2; + while(var_a0 < 0){ var_a0 += temp_a1; } + while(var_a0 >= temp_a1){ var_a0 -= temp_a1; } + return temp_v1->spline[var_a0].t1.unk10.bit31; +} + +s32 func_803421A4(s32 arg0, f32 arg1) { + glspline_list **temp_v0 = D_80371E74; + glspline_list *temp_v1; + s32 var_a3; + Union_glspline *i_ptr; + Union_glspline *temp_a2; + + if (arg0 == -1) { + return 0; + } + temp_v1 = temp_v0[arg0]; + if (temp_v1->unk0 == 0) { + return 0; + } + i_ptr = temp_v1->spline; + temp_a2 = i_ptr + temp_v1->unk0; + for(var_a3 = 0; (i_ptr < temp_a2) && (i_ptr->common.unk0 < arg1); i_ptr++){ + var_a3++; + } + return var_a3; +} + +s32 func_80342244(s32 arg0){ + return (arg0 < 180) ? (arg0 + 180) : (arg0 - 180); +} f32 func_80342260(s32 arg0, f32 arg1, s32 arg2){ return func_803234FC(func_80342038(arg0), arg1, 1.0f) / ((f32)arg2 /4); @@ -629,9 +699,95 @@ s32 func_803422D4(Actor *arg0, Union_glspline *arg1, glspline_list *arg2) { } #endif -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_803430B4.s") +void func_803430B4(Actor *arg0) { + f32 d_yaw; -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_803431D0.s") + if ((arg0->marker->unk14_20 == 0x12) && (arg0->unk138_30 == 1)) { + d_yaw = arg0->yaw_moving - arg0->yaw; + while (d_yaw >= 360.0f) { d_yaw -= 360.0f; } + while (d_yaw < 0.0f) { d_yaw += 360.0f; } + + if (d_yaw >= 180.0f) { + d_yaw = 360.0f - d_yaw; + } + arg0->unk10_3 = (d_yaw < D_80379058) ? 3 + : (d_yaw < D_80379060) ? 2 + : 1; + } +} + +void func_803431D0(Actor *arg0, s32 arg1, s32 arg2, s32 arg3) { + f32 sp64[3]; + f32 sp58[3]; + f32 sp4C[3]; + f32 sp40[3]; + f32 sp3C; + s32 pad38; + f32 var_f2; + + if (arg1 & 0x300) { + func_8032417C(func_80342038(arg0->unk44_14), arg0->unk48, sp64, sp58); + if (arg1 & 1) { + if (arg1 & 0x100) { + arg0->yaw_moving = sp58[1]; + } + if (arg1 & 0x200) { + arg0->unk6C = sp58[0]; + } + } else { + if (arg1 & 0x100) { + if (sp58[1] >= 180.0f) { + arg0->yaw_moving = sp58[1] - 180.0f; + } else { + arg0->yaw_moving = sp58[1] + 180.0f; + } + } + if (arg1 & 0x200) { + arg0->unk6C = (D_80379068 - sp58[0]); + } + } + } + if (arg0->unk10_4) { + player_getPosition(sp4C); + func_802BC434(sp40, sp4C, arg0->position); + if (arg0->marker->unk14_20 != 0x12) { + sp40[1] += 180.0f; + while (sp40[1] >= 360.0f) { + sp40[1] -= 360.0f; + } + sp40[0] = 360.0f - sp40[0]; + } + arg0->yaw_moving = sp40[1]; + arg0->unk6C = sp40[0]; + } else { + if ((arg0->unk70 <= arg0->unk48) && (arg0->unk48 < arg0->unk74)) { + sp3C = (arg0->unk48 - arg0->unk70) / (arg0->unk74 - arg0->unk70); + if (arg0->unkF4_24 & 1) { + if (arg1 & 0x800) { + var_f2 = mlDiffDegF(arg0->unk38_21, arg0->unk38_13) * sp3C + arg0->unk38_13; + while (var_f2 >= 360.0f) { var_f2 -= 360.0f; } + while (var_f2 < 0.0f) { var_f2 += 360.0f; } + arg0->yaw_moving = var_f2; + } + if (arg1 & 0x1000) { + var_f2 = mlDiffDegF(arg0->unk78_22, arg0->unk78_31) * sp3C + arg0->unk78_31; + while (var_f2 >= 360.0f) { var_f2 -= 360.0f; } + while (var_f2 < 0.0f) { var_f2 += 360.0f; } + arg0->unk6C = var_f2; + } + } + if (arg0->unkF4_24 & 2) { + arg0->unk4C = ((arg0->unk144 - arg0->unk140) * sp3C) + arg0->unk140; + } + } else if ((arg0->unk70 != 0.0f) || (arg0->unk74 != 0.0f)) { + arg0->unk70 = 0.0f; + arg0->unk74 = 0.0f; + } + } + func_803430B4(arg0); + func_80328FB0(arg0, (f32) arg2); + func_80328FF0(arg0, (f32) arg3); +} s32 func_80343654(Actor *this){ s32 tmp_v1; @@ -641,11 +797,49 @@ s32 func_80343654(Actor *this){ return tmp_a0 + tmp_v1; } -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_80343694.s") +s32 func_80343694(Actor *actor, s32 indx, s32 begin, s32 end, s32 count, s32 stride) { + glspline_list **temp_v0; + glspline_list *temp_s5; + Union_glspline *start_ptr; + Union_glspline *end_ptr; + bool var_v1; + f32 sp48; + Union_glspline *i_ptr; + + temp_v0 = D_80371E74; + temp_s5 = temp_v0[indx]; + var_v1 = 0; + if (temp_s5->unk0 == 0) { + return 0; + } + start_ptr = temp_s5->spline; + i_ptr = temp_s5->spline + ((begin == -9999) ? temp_s5->unk0 - 1 : begin); + end_ptr = temp_s5->spline + ((end == -9999) ? temp_s5->unk0 + count : end); + for(; (i_ptr != end_ptr) && (var_v1 != 1); i_ptr += stride){ + if( ((stride >= 1) && (i_ptr->common.unk10.bit0 == 0)) + || ((stride < 0) && (i_ptr->common.unk10.bit0 == 1)) + ) { + if (D_80371E80 == 1) { + sp48 = i_ptr->common.unk0; + } + var_v1 = func_803422D4(actor, i_ptr, temp_s5); + if( ((actor->unk70 != 0.0f) || (actor->unk74 != 0.0f)) + && (!(actor->unk70 <= actor->unk48) || !(actor->unk48 < actor->unk74)) + ) { + actor->unk70 = 0.0f; + actor->unk74 = 0.0f; + } + if ((var_v1 == 1) && (actor->modelCacheIndex == 0x66) && (actor->unk70 != actor->unk74)) { + var_v1 = 0; + } + } + } + if ((D_80371E80 == 1) && (var_v1 == 1)) { + actor->unk48 = sp48 + D_80379070; + } + return var_v1; +} -#ifndef NONMATCHING -#pragma GLOBAL_ASM("asm/nonmatchings/core2/code_B9770/func_803438E0.s") -#else s32 func_803438E0(Actor *actor, s32 arg1, s32 arg2, s32 arg3) { s32 sp4C; s32 sp48; @@ -653,15 +847,13 @@ s32 func_803438E0(Actor *actor, s32 arg1, s32 arg2, s32 arg3) { f32 sp40; s32 sp3C; s32 temp_v0; - s32 sp28; sp44 = 0; sp40 = actor->unk4C; - sp28 = actor->unk44_14; - if (sp28 == -1) { + if (actor->unk44_14 == -1) { return 0; } - sp4C = func_803421A4(sp28, actor->unk48); + sp4C = func_803421A4(actor->unk44_14, actor->unk48); if ((actor->unk54 == 0.0f) && (actor->unk138_3 == 0)) { if (actor->marker->unk14_20 == 0xB0) { actor->unk48 = func_803240E0(D_80371E70[actor->unk44_14], actor->unk48, sp40, &sp44); @@ -715,7 +907,6 @@ s32 func_803438E0(Actor *actor, s32 arg1, s32 arg2, s32 arg3) { } return 1; } -#endif int func_80343D50(Actor *this, s32 arg1, s32 arg2, s32 arg3){ s32 s0; diff --git a/symbol_addrs.core2.us.v10.txt b/symbol_addrs.core2.us.v10.txt index dd4f10ff..c5d8a792 100644 --- a/symbol_addrs.core2.us.v10.txt +++ b/symbol_addrs.core2.us.v10.txt @@ -368,6 +368,7 @@ set_model_render_mode = 0x8033A4CC; assetcache_release = 0x8033B3D8; assetcache_update_ptr = 0x8033B574; assetcache_get = 0x8033B798; +assetCache_init = 0x8033bb84; savedata_update_crc = 0x8033BFD0; strcat = 0x8033D660; strcatc = 0x8033D6A8; @@ -518,6 +519,8 @@ D_80378F68 = 0x80378F68; D_80378FC8 = 0x80378FC8; D_80378FCC = 0x80378FCC; D_8037901C = 0x8037901C; +D_80379058 = 0x80379058; +D_80379060 = 0x80379060; D_80379080 = 0x80379080; D_80379084 = 0x80379084; D_80379088 = 0x80379088;