diff --git a/generate_function_stats.py b/generate_function_stats.py index 2548bf8..2d5fc53 100755 --- a/generate_function_stats.py +++ b/generate_function_stats.py @@ -134,6 +134,7 @@ standardSearchColumns = { print( "file", "function", + "scratch", "bytes", "worth", end=" " @@ -163,11 +164,14 @@ for root, dirs, files in os.walk(searchPath): if sum(excludePath in fullFile for excludePath in excludePaths) == 0 and file.endswith('.c'): with open(fullFile, "r") as fh_c: comments = {} + scratch = '' for comment in commentSearch: comments[comment] = False for line in fh_c: if line.startswith("//"): + if line.startswith('// https://decomp.me/scratch/'): + scratch = line.replace('// ', '').replace('\n', '') lowerCaseComment = line.lower() for comment in commentSearch: check = sum(searchTerm in lowerCaseComment for searchTerm in commentSearch[comment]) @@ -181,8 +185,13 @@ for root, dirs, files in os.walk(searchPath): with open(ASMFile, "r") as fh_asm: # Reset function stats size = 0 + countingSize = False jals = 0 labels = 0 + + ASMFilePath = ASMFile.split("/") + functionName = ASMFilePath[-1].replace(".s", "") + columns = {} for column in standardSearchColumns: columns[column] = 0 @@ -190,18 +199,19 @@ for root, dirs, files in os.walk(searchPath): for line in fh_asm: for column in standardSearchColumns: columns[column] += sum(searchTerm in line for searchTerm in standardSearchColumns[column]) + if line.startswith(f"glabel {functionName}"): + countingSize = True if "jal" in line: jals += 1 - if line.startswith("/* "): + if countingSize and line.startswith("/* "): size += 4 if line.startswith(".L"): labels += 1 - ASMFilePath = ASMFile.split("/") - print( ASMFile.replace(ASMFilePath[-1], ""), - ASMFilePath[-1].replace(".s", ""), + functionName, + scratch, size, f"{str(round(size / totalCodeBytes * 100, precision)).ljust(precision + 2, '0')}%", end=" ") @@ -225,5 +235,6 @@ for root, dirs, files in os.walk(searchPath): print() continue + scratch = '' for comment in commentSearch: comments[comment] = False diff --git a/include/structs.h b/include/structs.h index ff3feb8..2679875 100644 --- a/include/structs.h +++ b/include/structs.h @@ -329,7 +329,7 @@ typedef struct actor_animation_state { s16 unk12; void *bone_array_1; // at 0x14, camera, update bone positions // TODO: Proper type void *bone_array_2; // at 0x18, camera, update bone positions // TODO: Proper type - AnimationStateUnk1C *unk1C; // TODO: Used in func_global_asm_80724CA4 and func_global_asm_8068FF40, pretty easy match, array of 0x8 structs? // malloc(0x100) in func_global_asm_80683158 + AnimationStateUnk1C *unk1C; // malloc(0x100) in func_global_asm_80683158 AnimationStateUnk20 *unk20; // See boss func_dk64_boot_8002FB7C AnimationStateUnk24 *unk24; s32 unk28; @@ -1205,8 +1205,14 @@ typedef struct { s32 unk14; } FloorTriangle; +typedef struct { + // Small header on top of DisplayList Pointer + u8 unk0[0x20 - 0x0]; + Mtx *unk20; +} Actor_unk0; + struct actor { - u32 *unk0; // Small header on top of DisplayList Pointer // TODO: Proper type + Actor_unk0 *unk0; ActorAnimationState *animation_state; u32 *unk8; // Current bone array Pointer // TODO: Proper type s16 unkC; diff --git a/src/critter/code_3340.c b/src/critter/code_3340.c index e3b8bfa..5800038 100644 --- a/src/critter/code_3340.c +++ b/src/critter/code_3340.c @@ -316,6 +316,7 @@ void func_critter_80027DC0(void) { } // Jumptable, doable, float, regalloc, close +// https://decomp.me/scratch/YxzWl #pragma GLOBAL_ASM("asm/nonmatchings/critter/code_3340/func_critter_80028120.s") s32 func_global_asm_8072881C(s32, f64 *); diff --git a/src/global_asm/code_103AB0.c b/src/global_asm/code_103AB0.c index deb078f..ba05a5c 100644 --- a/src/global_asm/code_103AB0.c +++ b/src/global_asm/code_103AB0.c @@ -563,6 +563,72 @@ Gfx *func_global_asm_80705F5C(Gfx *dl, s16 arg1, s16 arg2, u8 arg3) { // Jumptable, doable #pragma GLOBAL_ASM("asm/nonmatchings/global_asm/code_103AB0/func_global_asm_807065F8.s") +typedef struct { + s16 unk0; + s16 unk2; + s16 unk4; +} Struct80754F58; + +extern Struct80754F58 D_global_asm_80754F58[]; + +/* +void func_global_asm_807065F8(s16 arg0, u8 *arg1, u8 *arg2, u8 *arg3) { + f32 temp_f0; + f32 var_f16; + f32 var_f6; + f32 var_f8; + s16 temp_a1; + u8 i; + u8 temp_a3; + u8 temp_t0; + u8 temp_t1; + Struct80754F58 *temp_a2; + Struct80754F58 *temp_v1; + + switch (current_map) { + case MAP_AZTEC_BEETLE_RACE: + for (i = 0; arg0 < D_global_asm_80754F58[i].unk0;) { + i++; + } + temp_a2 = &D_global_asm_80754F58[i]; + temp_v1 = &D_global_asm_80754F58[i]; + temp_a1 = temp_v1[1].unk0; + temp_a3 = temp_v1[1].unk2; + temp_f0 = (arg0 - temp_a1) / (temp_a2->unk0 - temp_a1); + var_f6 = temp_a3; + *arg1 = ((temp_a2->unk2 - temp_a3) * temp_f0) + var_f6; + temp_t0 = temp_v1[1].unk2; + var_f16 = temp_t0; + *arg2 = ((temp_a2->unk2 - temp_t0) * temp_f0) + var_f16; + temp_t1 = temp_v1[2].unk0; + var_f8 = temp_t1; + *arg3 = ((temp_a2->unk4 - temp_t1) * temp_f0) + var_f8; + break; + case MAP_STEALTHY_SNOOP_NORMAL: + case MAP_MAD_MAZE_MAUL_HARD: + case MAP_STASH_SNATCH_NORMAL: + case MAP_MAD_MAZE_MAUL_EASY: + case MAP_MAD_MAZE_MAUL_NORMAL: + case MAP_STASH_SNATCH_EASY: + case MAP_STASH_SNATCH_HARD: + case MAP_MAD_MAZE_MAUL_INSANE: + case MAP_STASH_SNATCH_INSANE: + case MAP_STEALTHY_SNOOP_VERY_EASY: + case MAP_STEALTHY_SNOOP_EASY: + case MAP_STEALTHY_SNOOP_HARD: + *arg1 = 0x3F; + *arg2 = 0x3F; + *arg3 = 0x3F; + break; + default: + *arg1 = 0xFF; + *arg2 = 0xFF; + *arg3 = 0xFF; + break; + } +} +*/ + // Displaylist stuff #pragma GLOBAL_ASM("asm/nonmatchings/global_asm/code_103AB0/func_global_asm_807069A4.s") diff --git a/src/global_asm/code_A2F10.c b/src/global_asm/code_A2F10.c index da60356..ba675ca 100644 --- a/src/global_asm/code_A2F10.c +++ b/src/global_asm/code_A2F10.c @@ -161,6 +161,7 @@ s32 func_global_asm_8069E724(s32 arg0) { } // Doable, close +// https://decomp.me/scratch/yDXeC #pragma GLOBAL_ASM("asm/nonmatchings/global_asm/code_A2F10/func_global_asm_8069E774.s") // TODO: Add to aaD union diff --git a/src/global_asm/code_A8400.c b/src/global_asm/code_A8400.c index 630bf81..ea3c6bd 100644 --- a/src/global_asm/code_A8400.c +++ b/src/global_asm/code_A8400.c @@ -31,6 +31,80 @@ void func_global_asm_806A3700(s32 arg0, s32 arg1) { // Displaylist stuff (matrix), doable #pragma GLOBAL_ASM("asm/nonmatchings/global_asm/code_A8400/func_global_asm_806A370C.s") +/* +void func_global_asm_806A370C(Gfx **arg0, AAD_global_asm_806A4DDC *arg1, Struct806A57C0_2 *arg2, Struct806A57C0_3 *arg3) { + u16 spE8; // compiler-managed + f32 sp60; + f32 sp5C; + f32 sp4C; + f32 sp38; + Gfx *temp_s3; + f32 temp_f0; + f32 temp_f0_2; + f32 temp_f12; + f32 temp_f14; + f32 var_f2; + void *temp_s1; + void *temp_t0; + void *temp_v1; + + temp_s3 = *arg0; + spE8 = D_global_asm_8075A740; + guMtxIdentF(&spA8[0]); + temp_s1 = arg3 + 0x10; + if ((temp_s1->unk0 != 0) && (arg3->unk2 != 0)) { + temp_f12 = arg3->unk0 * 0.5f * 4.0f; + sp60 = temp_f12; + temp_f14 = arg2->unk18 * 0.5f * 4.0f; + sp5C = temp_f14; + guTranslateF(&sp68[0], -temp_f12, -temp_f14, 0.0f); + guMtxCatF(&spA8[0], &sp68[0], &spA8[0]); + temp_s1->unk88 = temp_s1->unk88 + 0.41887903213500977; + if (temp_s1->unk0 & 8) { + temp_f0 = temp_s1->unk88 * 0.5; + if (temp_f0 <= 6.2831855f) { + guRotateF(&sp68[0], temp_f0 * 57.295776f, 0.0f, 0.0f, 1.0f); + guMtxCatF(&spA8[0], &sp68[0], &spA8[0]); + } + } + if (temp_s1->unk0 & 4) { + temp_f0_2 = temp_s1->unk88; + if (temp_f0_2 <= 6.2831855f) { + var_f2 = (0.25f * (func_global_asm_80612D1C(temp_f0_2 - 1.5707964f) + 1.0f)) + 1.0f; + } else { + var_f2 = 1.0f; + } + guScaleF(&sp68[0], var_f2, var_f2, 1.0f); + guMtxCatF(&spA8[0], &sp68[0], &spA8[0]); + } + if (temp_s1->unk0 & 2) { + sp38 = func_global_asm_80612D1C(temp_s1->unk88); + sp4C = ((20.0f - ((rand() >> 0xF) % 40)) / 20.0f) * (4.0f * sp38); + sp38 = func_global_asm_80612D1C(temp_s1->unk88); + guTranslateF(&sp68[0], sp4C, ((20.0f - ((rand() >> 0xF) % 40)) / 20.0f) * (4.0f * sp38), 0.0f); + guMtxCatF(&spA8[0], &sp68[0], &spA8[0]); + } + guTranslateF(&sp68[0], sp60, sp5C, 0.0f); + guMtxCatF(&spA8[0], &sp68[0], &spA8[0]); + } + guScaleF(&sp68[0], 1.0f, 1.0f, 1.0f); + guMtxCatF(&spA8[0], &sp68[0], &spA8[0]); + guTranslateF(&sp68[0], (arg1->unk44 + arg3->unk4) * 4.0, (arg1->unk48 + arg3->unk8) * 4.0, 0.0f); + guMtxCatF(&spA8[0], &sp68[0], &spA8[0]); + guMtxF2L(&spA8[0], temp_s1 + (D_global_asm_807444FC << 6) + 8); + temp_s3->words.w0 = 0xDA380003; + temp_v1 = temp_s3 + 8; + temp_s3->words.w1 = temp_s1 + (D_global_asm_807444FC << 6) + 8; + temp_v1->unk4 = 0; + temp_v1->unk0 = 0xE7000000; + temp_t0 = temp_v1 + 8; + temp_t0->unk0 = 0xFA000000; + temp_t0->unk4 = arg3->unk3 | 0x2828FF00; + spE8 = temp_s1->unk2; + *arg0 = printStyledText(temp_t0 + 8, 6, 0, 0, &spE8, 0); +} +*/ + void func_global_asm_806A3B78(s32 *arg0, AAD_global_asm_806A4DDC *arg1, Struct806A57C0_2 *arg2, u8 arg3, u8 *arg4) { s32 sp44; s32 i; diff --git a/src/global_asm/code_B5EC0.c b/src/global_asm/code_B5EC0.c index d8fdb45..7b101ed 100644 --- a/src/global_asm/code_B5EC0.c +++ b/src/global_asm/code_B5EC0.c @@ -36,6 +36,7 @@ void func_global_asm_806B1348(void) { } // Jumptable, close, doable +// https://decomp.me/scratch/ryD0r #pragma GLOBAL_ASM("asm/nonmatchings/global_asm/code_B5EC0/func_global_asm_806B13B4.s") void func_global_asm_8072C918(s16, s16, s16); diff --git a/src/menu/code_1AF0.c b/src/menu/code_1AF0.c index 4e3eae2..25f3a26 100644 --- a/src/menu/code_1AF0.c +++ b/src/menu/code_1AF0.c @@ -8,10 +8,20 @@ typedef struct menu_struct_1 { u16 unk8; u8 unkA; s8 unkB; - u8 unkC; - u8 unkD; - u8 unkE; - u8 unkF; + union { + struct { + u8 unkC; + u8 unkD; + }; + s16 unkC_s16; + }; + union { + struct { + u8 unkE; + u8 unkF; + }; + s16 unkE_s16; + }; u8 unk10; u8 unk11; u8 unk12; @@ -179,7 +189,7 @@ void func_menu_80025E04(MenuStruct1 *arg0, CharacterProgress *arg1) { // It checks whether levels have been entered and does stuff with actor behaviour index #pragma GLOBAL_ASM("asm/nonmatchings/menu/code_1AF0/func_menu_80025FB4.s") -extern u8 D_global_asm_807FCC4C; +extern u8 D_807FCC4C; /* void func_menu_80025FB4(MenuStruct1 *arg0, CharacterProgress *arg1, ? arg2) { @@ -257,7 +267,7 @@ block_18: arg0->unkB = -2; } } - arg0->unk10 = D_global_asm_807FCC4C; + arg0->unk10 = D_807FCC4C; } */ @@ -302,26 +312,23 @@ extern MenuStruct1 D_menu_80033514; extern u16 D_menu_80033528; extern u16 D_global_asm_80750AC8; -extern u8 D_global_asm_807FCC4C; extern u8 D_menu_800334DD[]; +void func_menu_800262A8(MenuStruct1*, CharacterProgress*, s32); + /* -void func_menu_800262A8(MenuStruct1 *arg0, u8 *arg1, s32 arg2) { +void func_menu_800262A8(MenuStruct1 *arg0, CharacterProgress *arg1, s32 arg2) { MenuStruct1 *sp44; u16 sp42; s32 sp3C; - u16 sp3A; - u16 sp38; - u16 sp36; - u16 sp34; + u16 var_v1; + u16 var_a2; + u16 var_t0; + u16 var_t1; u16 sp2C; s32 sp28; s16 var_a0; s32 temp_v0_2; - u16 var_a2; - u16 var_t0; - u16 var_t1; - u16 var_v1; if (func_global_asm_80629148()) { sp44 = NULL; @@ -336,19 +343,11 @@ void func_menu_800262A8(MenuStruct1 *arg0, u8 *arg1, s32 arg2) { var_t0 = 0xC; var_t1 = 0xE; if (arg0->unkB >= 0) { - sp3A = 3; - sp38 = 7; - sp36 = 0xC; - sp34 = 0xE; - var_v1 = 3; - var_a2 = 7; - var_t0 = 0xC; - var_t1 = 0xE; - temp_v0_2 = func_menu_80025AF0(arg0, 1, 7, arg0); - if (arg1[arg0->unkB] & 1) { + temp_v0_2 = func_menu_80025AF0(arg0, 1); + if (((u8*)arg1)[arg0->unkB] & 1) { var_a2 = 9; var_v1 = 5; - if (D_global_asm_807FCC4C < D_menu_800334DD[arg1[arg0->unkB]]) { + if (D_807FCC4C < D_menu_800334DD[((u8*)arg1)[arg0->unkB]]) { var_v1 = 6; var_t0 = 0xD; var_t1 = 0xF; @@ -362,8 +361,8 @@ void func_menu_800262A8(MenuStruct1 *arg0, u8 *arg1, s32 arg2) { } D_menu_80033500.unk4 = var_v1; D_menu_80033500.unk6 = var_a2; - D_menu_80033500.unkC = var_t0; - D_menu_80033500.unkE = var_t1; + D_menu_80033500.unkC_s16 = var_t0; + D_menu_80033500.unkE_s16 = var_t1; sp44 = &D_menu_80033500; sp42 = 9; break; @@ -391,7 +390,7 @@ void func_menu_800262A8(MenuStruct1 *arg0, u8 *arg1, s32 arg2) { var_v1 = 0x21; } } else { - sp28 = countSetFlags(0x225, 0x28, 0); + sp28 = countSetFlags(0x225, 0x28, FLAG_TYPE_PERMANENT); if (sp28 >= 0xF) { func_menu_80026290(arg0, &sp3C); if (isFlagSet(0x17B, FLAG_TYPE_PERMANENT)) { @@ -413,7 +412,7 @@ void func_menu_800262A8(MenuStruct1 *arg0, u8 *arg1, s32 arg2) { sp44 = &D_menu_80033528; } else { var_a0 = 4; - if ((arg0->unkB >= 0) && (arg1[arg0->unkB] & 1)) { + if ((arg0->unkB >= 0) && (((u8*)arg1)[arg0->unkB] & 1)) { var_v1 = 5; var_a0 = 6; } @@ -436,8 +435,6 @@ void func_menu_800262A8(MenuStruct1 *arg0, u8 *arg1, s32 arg2) { } */ -void func_menu_800262A8(MenuStruct1*, CharacterProgress*, s32); - void func_menu_80026684(MenuStruct1 *arg0, CharacterProgress *arg1, s32 arg2) { switch (arg0->unkE) { case 0: