From c303c90ef68cc2a03efef0274a4e29cc29ef116b Mon Sep 17 00:00:00 2001 From: Bl00D4NGEL Date: Fri, 11 Apr 2025 23:40:35 +0200 Subject: [PATCH 1/6] match: debug_render_audio_effects --- README.md | 10 +- include/structs.h | 3 +- src/audio_spatial.c | 187 ++++++++++++++++++--------- src/audio_spatial.h | 3 +- ver/symbols/symbol_addrs.jpn.v79.txt | 2 +- ver/symbols/symbol_addrs.pal.v77.txt | 2 +- ver/symbols/symbol_addrs.pal.v80.txt | 2 +- ver/symbols/symbol_addrs.us.v77.txt | 2 +- ver/symbols/symbol_addrs.us.v80.txt | 2 +- 9 files changed, 143 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index 0434bc97..35cec32f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fd As of April 11, 2025, this is our current score: -    Decomp progress: 78.84% +    Decomp progress: 78.88%     Documentation progress: 49.86% @@ -121,11 +121,11 @@ As of April 11, 2025, this is our current score: ``` =================================================================== ADVENTURE ONE (ASM -> C Decompilation) - -------------- 78.84% Complete (81.41% NON_MATCHING) -------------- - # Decompiled functions: 1849 - # GLOBAL_ASM remaining: 102 + -------------- 78.88% Complete (81.45% NON_MATCHING) -------------- + # Decompiled functions: 1850 + # GLOBAL_ASM remaining: 101 # NON_MATCHING functions: 12 - # NON_EQUIVALENT WIP functions: 31 + # NON_EQUIVALENT WIP functions: 30 --------------------------- Game Status --------------------------- Balloons: 38/47, Keys: 4/4, Trophies: 3/5 T.T. Amulets: 4/4, Wizpig Amulets: 3/4 diff --git a/include/structs.h b/include/structs.h index 01643867..2fc746ce 100644 --- a/include/structs.h +++ b/include/structs.h @@ -8,6 +8,7 @@ #include "level_object_entries.h" #include "object_properties.h" #include "gbi.h" +#include "PR/libaudio.h" // Stolen from PD // This hacky structure allows coords to be accessed using @@ -98,7 +99,7 @@ typedef struct SoundMask { /* 0x11 */ u8 unk11; /* 0x12 */ u8 unk12; /* 0x14 */ s32 distance; - /* 0x18 */ s32 unk18; + /* 0x18 */ ALSoundState *soundPtr; /* 0x1C */ struct SoundMask **soundMask; /* 0x20 */ u8 unk20; /* 0x21 */ u8 unk21; diff --git a/src/audio_spatial.c b/src/audio_spatial.c index 0998c87c..468a2e22 100644 --- a/src/audio_spatial.c +++ b/src/audio_spatial.c @@ -57,10 +57,10 @@ void audioline_init(void) { gSoundMaskHeapUsed = mempool_alloc_safe(sizeof(uintptr_t) * SOUND_MASK_HEAP_COUNT, COLOUR_TAG_CYAN); gUsedMasks = 0; for (i = 0; i < ARRAY_COUNT(D_80119C58); i++) { - D_80119C58[i].unk178 = NULL; + D_80119C58[i].soundPtr = NULL; } for (i = 0; i < SOUND_MASK_HEAP_COUNT; i++) { - gSoundMaskHeap[i].unk18 = 0; + gSoundMaskHeap[i].soundPtr = NULL; } func_80008174(); } @@ -83,57 +83,123 @@ void audioline_on(void) { } #ifdef NON_EQUIVALENT -// extern f32 D_80119C60[672]; -// extern f32 D_8011A6E0[7][48]; -extern unk8011A6D8 **D_8011A6DC; -extern unk80119C58 **D_80119C5C; -// extern void sound_stop(u8 *arg0); +s16 D_8011AC20[128]; // audioline_reset void func_80008174(void) { s32 i; s32 j; - u8 *sound; + ALSoundState *sound; + SoundMask *heap; + // unk8011A6D8 *var_a1; + // unk8011A6D8 *var_a2; + // unk8011A6E0 *var_a3; + // unk80119C58 *var_s1; + // u32 target; + // f32 *var_v0; - for (gFreeMasks = 0; gFreeMasks < SOUND_MASK_HEAP_COUNT; gFreeMasks++) { - gSoundMaskHeapFree[gFreeMasks] = &gSoundMaskHeap[gFreeMasks]; + heap = gSoundMaskHeap; + gFreeMasks = 0; + while (gFreeMasks < SOUND_MASK_HEAP_COUNT) { + gSoundMaskHeapFree[gFreeMasks] = heap; + heap++; + gFreeMasks++; } + gFreeMasks--; for (i = 0; i < gUsedMasks; i++) { - sound = (u8 *) gSoundMaskHeapUsed[i]->unk18; + sound = gSoundMaskHeapUsed[i]->soundPtr; gSoundMaskHeapUsed[i]->unk12 = 0; if (sound != NULL) { sound_stop(sound); } } gUsedMasks = 0; + + // var_s1 = D_80119C58; + // do { + // var_s1->soundID = 0; + // sound = var_s1->soundPtr; + // if (sound != 0) { + // if (var_s1->unk0.unk0_02 == 0) { + // sound_stop(sound); + // } else if (var_s1->unk0.unk0_02 == 1) { + // music_jingle_stop(); + // } + // var_s1->soundPtr = NULL; + // var_s1->unk17C = -1; + // } + // var_s1->unk4.unk4_floats[0] = -100000.0f;; + // var_s1->unk4.unk4_floats[1] = -100000.0f; + // var_v0 = var_s1->unk4.unk4_floats; + // var_v0[4] = -100000.0f; + // var_v0[3] = -100000.0f; + // var_v0[2] = -100000.0f; + // var_v0[1] = -100000.0f; - for (i = 0; i < ARRAY_COUNT(D_80119C58); i++) { - D_80119C58[i].soundID = 0; - if (D_80119C58[i].unk178 != 0) { - if (D_80119C58[i].unk0.unk0_02 == 0) { - sound_stop(D_80119C58[i].unk178); - } else if (D_80119C58[i].unk0.unk0_02 == 1) { - music_jingle_stop(); - } - D_80119C58[i].unk178 = 0; - } - D_80119C58[i].unk17C = -1; - D_80119C5C[i]->unk0.unk0_01 = -100000.0f; + // var_v0 = &var_s1->unk4.unk4_floats[5]; + // for (j = 2; j != 30; j++, j+= 3) {// this should be j+=4 but has to be split up to match? + // // 2, 6, 10, 14, 18, 22, 26 + // var_v0[3] = -100000.0f;; + // var_v0[4] = -100000.0f; + // var_v0[5] = -100000.0f; + // var_v0[6] = -100000.0f; + // var_v0[7] = -100000.0f; + // var_v0[8] = -100000.0f; + // var_v0[9] = -100000.0f; + // var_v0[10] = -100000.0f; + // var_v0[11] = -100000.0f; + // var_v0+= 12; + // var_v0[-12] = -100000.0f; + // var_v0[-11] = -100000.0f; + // var_v0[-10] = -100000.0f; + // }; + // var_s1++; + // i++; + // } while (i != ARRAY_COUNT(D_80119C58)); - // D_80119C58[i] = -100000.0f; - } + // target = D_8011AC20; + // var_a3 = D_8011A6E0; + // var_a2 = &D_8011A6DC; + // var_a1 = D_8011A6D8; + // do { + // var_a1->unkB8 = -1; + // var_a1->unk0.unk0_02 = 0; + // var_a1->unkBC = 0.0f; + // var_a1 = var_a2; + // var_a1->unk0.unk0_01 = -100000.0f; - // for (i = 0; i < ARRAY_COUNT(D_8011A6E0); i++) { - // D_8011A6D8[i].unkB8 = -1; - // D_8011A6D8[i].unk0.unk0_01 = 0.0f; - // D_8011A6D8[i].unkBC = 0.0f; - // D_8011A6DC[i]->unk0.unk0_01 = -100000.0f; - // D_8011A6E0[i][0] = -100000.0f; - // for (j = 0; j < ARRAY_COUNT(D_8011A6E0[0]); j++) { - // D_8011A6E0[i][j] = -100000.0f; - // } - // } + // var_a3->unk0 = -100000.0f; + // var_a3->unk1C = -100000.0f; + // var_a3->unk18 = -100000.0f; + // var_a3->unk14 = -100000.0f; + // var_a3->unk10 = -100000.0f; + // var_a3->unkC = -100000.0f;; + // var_a3->unk8 = -100000.0f; + // var_a3->unk4 = -100000.0f; + + // var_v0_2 = var_a3->unk20; + // for (j = 3; j != 15; j++, j+= 3) {// this should be j+=4 but has to be split up to match? + // // 3, 7, 11 + // var_v0_2->unkC = -100000.0f;; + // var_v0_2->unk10 = -100000.0f; + // var_v0_2->unk14 = -100000.0f; + // var_v0_2->unk18 = -100000.0f; + // var_v0_2->unk1C = -100000.0f; + // var_v0_2->unk20 = -100000.0f; + // var_v0_2->unk24 = -100000.0f; + // var_v0_2->unk28 = -100000.0f; + // var_v0_2->unk2C = -100000.0f; + // var_v0_2++; + // var_v0_2[-1].unk0 = -100000.0f; + // var_v0_2[-1].unk4 = -100000.0f; + // var_v0_2[-1].unk8 = -100000.0f; + // }; + + // var_a3++; + // var_a1++; + // var_a2++; + // } while((s32)var_a3 != target); gAudioLinesOff = 0; } @@ -443,39 +509,44 @@ void func_80009B7C(s32 *soundState, f32 x, f32 y, f32 z) { #pragma GLOBAL_ASM("asm/nonmatchings/audio_spatial/func_80009D6C.s") -#ifdef NON_EQUIVALENT -// debug_render_audio_effects -void func_8000A184(Gfx **arg0, Vertex **arg1, Triangle **arg2) { +void debug_render_audio_effects(Gfx **arg0, Vertex **arg1, Triangle **arg2) { s32 i, j; - unk80119C58 *temp; - unk8011A6D8 *temp2; - - for (i = 0; i < ARRAY_COUNT(D_80119C58); i++) { - temp = &D_80119C58[i]; - if (temp->soundID != 0) { - for (j = 0; j < temp->unk17C; j++) { - debug_render_line(arg0, arg1, arg2, &temp->unk4.unk4_vec[j], 0xFF, 0xFF, 0); + f32 *var_s1; + unk80119C58 *var_s2; + unk8011A6D8 *var_s2_2; + + i = 0; + do { + var_s2 = &D_80119C58[i]; + var_s1 = var_s2->unk4.unk4_floats; + if (D_80119C58[i].soundID != 0) { + for (j = 0; j < var_s2->unk17C; j++) { + debug_render_line(arg0, arg1, arg2, var_s1, 0xFF, 0xFF, 0); + var_s1 += 3; } } - } + i++; + } while (ARRAY_COUNT(D_80119C58) > i); - for (i = 0; i < ARRAY_COUNT(D_8011A6D8); i++) { - temp2 = &D_8011A6D8[i]; - if (temp2->unk0.unk0_02 != 0) { - for (j = 0; j < temp2->unkB8; j++) { - debug_render_line(arg0, arg1, arg2, &temp->unk4.unk4_vec[j], 0xFF, 0, 0xFF); + i = 0; + do { + var_s2_2 = &D_8011A6D8[i]; + var_s1 = var_s2_2->unk4.unk4_floats; + if (D_8011A6D8[i].unk0.unk0_02 != 0) { + for (j = 0; j < var_s2_2->unkB8; j++) { + debug_render_line(arg0, arg1, arg2, var_s1, 0xFF, 0, 0xFF); + var_s1 += 3; } } - } + + i++; + } while (i != ARRAY_COUNT(D_8011A6D8)); } -#else -#pragma GLOBAL_ASM("asm/nonmatchings/audio_spatial/func_8000A184.s") -#endif void func_8000A2E8(s32 arg0) { if (gUsedMasks != 0) { - if (gSoundMaskHeapUsed[arg0]->unk18 != 0) { - sound_stop(gSoundMaskHeapUsed[arg0]->unk18); + if (gSoundMaskHeapUsed[arg0]->soundPtr != 0) { + sound_stop(gSoundMaskHeapUsed[arg0]->soundPtr); } if (gSoundMaskHeapUsed[arg0]->soundMask != NULL) { *gSoundMaskHeapUsed[arg0]->soundMask = NULL; diff --git a/src/audio_spatial.h b/src/audio_spatial.h index b4820c74..5548c69d 100644 --- a/src/audio_spatial.h +++ b/src/audio_spatial.h @@ -5,6 +5,7 @@ #include "libc/math.h" #include "structs.h" #include "PR/gbi.h" +#include "PR/libaudio.h" typedef struct floatXYZVals { f32 x1; @@ -39,7 +40,7 @@ typedef struct unk80119C58 { /* 0x175 */ u8 unk175; /* 0x176 */ u8 unk176; /* 0x177 */ u8 unk177; - /* 0x178 */ s32 unk178; + /* 0x178 */ ALSoundState *soundPtr; /* 0x17C */ s8 unk17C; /* 0x17D */ u8 unk17D; /* 0x17E */ u8 unk17E; diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index dfde387c..b7179bff 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -151,7 +151,7 @@ func_800099EC = 0x800099EC; func_80009AB4 = 0x80009AB4; func_80009B7C = 0x80009B7C; func_80009D6C = 0x80009D6C; -func_8000A184 = 0x8000A184; +debug_render_audio_effects = 0x8000A184; func_8000A2E8 = 0x8000A2E8; debug_render_line = 0x8000A414; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index fa89969a..2bb75ff1 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -151,7 +151,7 @@ func_800099EC = 0x800099EC; func_80009AB4 = 0x80009AB4; func_80009B7C = 0x80009B7C; func_80009D6C = 0x80009D6C; -func_8000A184 = 0x8000A184; +debug_render_audio_effects = 0x8000A184; func_8000A2E8 = 0x8000A2E8; debug_render_line = 0x8000A414; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index d063deae..6dad7362 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -151,7 +151,7 @@ func_800099EC = 0x800099EC; func_80009AB4 = 0x80009AB4; func_80009B7C = 0x80009B7C; func_80009D6C = 0x80009D6C; -func_8000A184 = 0x8000A184; +debug_render_audio_effects = 0x8000A184; func_8000A2E8 = 0x8000A2E8; debug_render_line = 0x8000A414; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index 0feed664..ba79a1d9 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -151,7 +151,7 @@ func_800099EC = 0x800099EC; func_80009AB4 = 0x80009AB4; func_80009B7C = 0x80009B7C; func_80009D6C = 0x80009D6C; -func_8000A184 = 0x8000A184; +debug_render_audio_effects = 0x8000A184; func_8000A2E8 = 0x8000A2E8; debug_render_line = 0x8000A414; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index 4454e41a..f869b3df 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -151,7 +151,7 @@ func_800099EC = 0x800099EC; func_80009AB4 = 0x80009AB4; func_80009B7C = 0x80009B7C; func_80009D6C = 0x80009D6C; -func_8000A184 = 0x8000A184; +debug_render_audio_effects = 0x8000A184; func_8000A2E8 = 0x8000A2E8; debug_render_line = 0x8000A414; From 639b46b69f41850e2d1834bb6bc2591e91acbeb1 Mon Sep 17 00:00:00 2001 From: Bl00D4NGEL Date: Mon, 14 Apr 2025 20:38:01 +0200 Subject: [PATCH 2/6] partial match: func_800B82B4 --- README.md | 10 +-- src/waves.c | 249 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 157 insertions(+), 102 deletions(-) diff --git a/README.md b/README.md index 35cec32f..5ea49b19 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fda38e533b9fe63bb9670) of the game is the default if not specified. -As of April 11, 2025, this is our current score: +As of April 14, 2025, this is our current score:     Decomp progress: 78.88% @@ -117,15 +117,15 @@ s32 is_drumstick_unlocked(void) { ``` -As of April 11, 2025, this is our current score: +As of April 14, 2025, this is our current score: ``` =================================================================== ADVENTURE ONE (ASM -> C Decompilation) - -------------- 78.88% Complete (81.45% NON_MATCHING) -------------- + -------------- 78.88% Complete (81.70% NON_MATCHING) -------------- # Decompiled functions: 1850 # GLOBAL_ASM remaining: 101 - # NON_MATCHING functions: 12 - # NON_EQUIVALENT WIP functions: 30 + # NON_MATCHING functions: 13 + # NON_EQUIVALENT WIP functions: 29 --------------------------- Game Status --------------------------- Balloons: 38/47, Keys: 4/4, Trophies: 3/5 T.T. Amulets: 4/4, Wizpig Amulets: 3/4 diff --git a/src/waves.c b/src/waves.c index b84b63f5..36f0b20c 100644 --- a/src/waves.c +++ b/src/waves.c @@ -18,9 +18,16 @@ f32 *D_800E304C[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; Vertex *D_800E3070[2] = { NULL, NULL }; s32 *D_800E3078[2] = { NULL, NULL }; - +typedef struct unk800E3080 { + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + u8 unk4[4]; + u8 pad8[0x10 - 0x8]; +} unk800E3080; // This could also be D_800E3080[2] + D_800E3088[2] -u8 *D_800E3080[4] = { NULL, NULL, NULL, NULL }; +unk800E3080 *D_800E3080[4] = { NULL, NULL, NULL, NULL }; /* Size: 0x10, might just be an array? */ typedef struct unk800E3090 { @@ -80,7 +87,7 @@ s32 D_8012A018; f32 D_8012A01C; f32 D_8012A020; UNUSED s32 D_8012A024; -unk8012A028 *D_8012A028[20]; +Vertex D_8012A028[2][4]; s32 D_8012A078; TriangleBatchInfo *gWaveBatch; TextureHeader *gWaveTexture; @@ -190,12 +197,12 @@ void wave_init(void) { allocSize = (D_80129FC8.unk0 * 32) * D_80129FC8.unk0; if (D_8012A078 != 2) { D_800E3080[0] = mempool_alloc_safe(allocSize << 1, COLOUR_TAG_CYAN); - D_800E3080[1] = (u8 *) (((u32) D_800E3080[0]) + allocSize); + D_800E3080[1] = (unk800E3080 *) (((u32) D_800E3080[0]) + allocSize); } else { - D_800E3080[0] = (u8 *) mempool_alloc_safe(allocSize << 2, COLOUR_TAG_CYAN); - D_800E3080[1] = (u8 *) (((u32) D_800E3080[0]) + allocSize); - D_800E3080[2] = (u8 *) (((u32) D_800E3080[1]) + allocSize); - D_800E3080[3] = (u8 *) (((u32) D_800E3080[2]) + allocSize); + D_800E3080[0] = (unk800E3080 *) mempool_alloc_safe(allocSize << 2, COLOUR_TAG_CYAN); + D_800E3080[1] = (unk800E3080 *) (((u32) D_800E3080[0]) + allocSize); + D_800E3080[2] = (unk800E3080 *) (((u32) D_800E3080[1]) + allocSize); + D_800E3080[3] = (unk800E3080 *) (((u32) D_800E3080[2]) + allocSize); } D_800E30D0 = load_texture(D_80129FC8.unk2C); } @@ -231,20 +238,29 @@ void func_800B8134(LevelHeader *header) { D_80129FC8.unk4C = header->unk70_u8; } -#ifdef NON_EQUIVALENT +#ifdef NON_MATCHING void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { - s32 temp_lo; s32 var_a0; s32 var_fp; s32 var_s0; s32 var_s3; s32 var_s5; s32 var_s6; - s32 j; s32 sp54; - s32 var_s7; - s32 sp4C; s32 i; + s32 sp4C; + s32 j; + s32 var_s7; + Vertex *temp_vtx; + Vertex *temp_vtx_2; + Vertex *temp_vtx_3; + Vertex *temp_vtx_4; + Vertex *temp_vtx_5; + s32 var_t0; + s32 var_v1; + s32 var_t7; + s32 var_a1; + s32 var_t2; D_8012A078 = arg2; func_800B8134(arg1); @@ -267,119 +283,158 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { sp4C = (D_80129FC8.unk14 << 16) / D_80129FC8.unk20; D_8012A01C = 10000.0f; D_8012A020 = -10000.0f; - for (i = 0; i < D_80129FC8.unk20; i++) { - D_800E3040[i] = (sins_f(var_s6) * D_80129FC8.unkC) + (sins_f(var_fp) * D_80129FC8.unk18); + for (var_s7 = 0; var_s7 < D_80129FC8.unk20; var_s7++) { + D_800E3040[var_s7] = (sins_f(var_s6) * D_80129FC8.unkC) + (sins_f(var_fp) * D_80129FC8.unk18); if (D_80129FC8.unk28 != 0) { - D_800E3040[i] *= 2.0f; + D_800E3040[var_s7] *= 2.0f; } - if (D_800E3040[i] < D_8012A01C) { - D_8012A01C = D_800E3040[i]; + if (D_800E3040[var_s7] < D_8012A01C) { + D_8012A01C = D_800E3040[var_s7]; } - if (D_8012A020 < D_800E3040[i]) { - D_8012A020 = D_800E3040[i]; + if (D_8012A020 < D_800E3040[var_s7]) { + D_8012A020 = D_800E3040[var_s7]; } var_s6 += sp54; var_fp += sp4C; } + ; save_rng_seed(); set_rng_seed(0x57415646); - if (D_80129FC8.unk4 > 0) { - for (i = 0; i < D_80129FC8.unk4; i++) { - for (var_s0 = 0; var_s0 < D_80129FC8.unk4; var_s0++) { - D_800E3044[var_s0].s[0] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); - D_800E3044[var_s0].s[1] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); - } + var_s5 = 0; + for (var_s7 = 0; var_s7 < D_80129FC8.unk4; var_s7++) { + for (var_s0 = 0; var_s0 < D_80129FC8.unk4; var_s0++) { + D_800E3044[var_s5].s[0] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); + D_800E3044[var_s5].s[1] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); + var_s5++; } } + var_s5 = 0; + var_s7 = 0; load_rng_seed(); if (arg2 != 2) { - var_s3 = 2; + arg2 = 2; } else { - var_s3 = 4; + arg2 = 4; } - for (arg2 = 0; arg2 < 25; arg2++) { - for (var_s7 = 0; (D_80129FC8.unk0 >= var_s7); var_s7++) { - for (var_s0 = 0; D_80129FC8.unk0 >= var_s0; var_s0++) { - for (var_a0 = 0; var_a0 < var_s3; var_a0++) { - D_800E3070[var_a0][var_s0].x = (var_s0 * D_8012A0B8) + 0.5; - D_800E3070[var_a0][var_s0].z = (var_s7 * D_8012A0BC) + 0.5; - if (D_80129FC8.unk4C == 0) { - D_800E3070[var_a0][var_s0].r = 255; - D_800E3070[var_a0][var_s0].g = 255; - D_800E3070[var_a0][var_s0].b = 255; - } else { - D_800E3070[var_a0][var_s0].r = 0; - D_800E3070[var_a0][var_s0].g = 0; - D_800E3070[var_a0][var_s0].b = 0; + for (var_s3 = 0; var_s3 < 25; var_s3++) { + if (0 <= D_80129FC8.unk0) { + do { + for (var_s0 = 0; D_80129FC8.unk0 >= var_s0; var_s0++) { + for (var_a0 = 0; var_a0 < arg2; var_a0++) { + D_800E3070[var_a0][var_s5].x = (var_s0 * D_8012A0B8) + 0.5; + D_800E3070[var_a0][var_s5].z = (var_s7 * D_8012A0BC) + 0.5; + if (D_80129FC8.unk4C == 0) { + D_800E3070[var_a0][var_s5].r = 255; + D_800E3070[var_a0][var_s5].g = 255; + D_800E3070[var_a0][var_s5].b = 255; + } else { + D_800E3070[var_a0][var_s5].r = 0; + D_800E3070[var_a0][var_s5].g = 0; + D_800E3070[var_a0][var_s5].b = 0; + } + D_800E3070[var_a0][var_s5].a = 255; } - D_800E3070[var_a0][var_s0].a = 255; + var_s5++; } - var_s0++; - } + var_s7++; + } while (D_80129FC8.unk0 >= var_s7); + var_s7 = 0; } } var_s5 = 0; for (var_s7 = 0; var_s7 < D_80129FC8.unk0; var_s7++) { for (var_s0 = 0; var_s0 < D_80129FC8.unk0; var_s0++) { - for (var_a0 = 0; var_a0 < var_s3; var_a0++) { - D_800E3080[var_s7 * 16][var_a0] = 0x40; + for (var_a0 = 0; var_a0 < arg2; var_a0++) { + D_800E3080[var_a0][var_s5].unk0 = 0x40; + D_800E3080[var_a0][var_s5].unk1 = var_s0; + D_800E3080[var_a0][var_s5].unk2 = (var_s0 + D_80129FC8.unk0) + 1; + D_800E3080[var_a0][var_s5].unk3 = var_s0 + 1; + var_s5++; + D_800E3080[var_a0][var_s5].unk0 = 0x40; + D_800E3080[var_a0][var_s5].unk1 = var_s0 + 1; + D_800E3080[var_a0][var_s5].unk2 = (var_s0 + D_80129FC8.unk0) + 1; + D_800E3080[var_a0][var_s5].unk3 = (var_s0 + D_80129FC8.unk0) + 2; + var_s5--; } + var_s5 += 2; } - var_s7++; } func_800BC6C8(); - temp_lo = D_80129FC8.unk0 * (D_80129FC8.unk0 + 1); - // var_a3 = D_800E3070; - // var_a0_3 = D_8012A028; - // do { - // temp_a1_2 = *var_a3; - // var_a3 += 4; - // // var_a0_3->unk2 = 0; - // // var_a0_3->unk0 = (s16) temp_a1_2->x; - // // temp_v0_4 = &temp_a1_2[D_80129FC8.unk0]; - // // var_a0_3->unk4 = (s16) temp_a1_2->z; - // // temp_a2 = &temp_a1_2[temp_lo]; - // // var_a0_3->unk6 = (u8) temp_a1_2->r; - // // var_a0_3 += 0x28; - // // var_a0_3->unk-21 = (u8) temp_a1_2->g; - // // var_a0_3->unk-20 = (u8) temp_a1_2->b; - // // var_a0_3->unk-1F = (u8) temp_a1_2->a; - // // var_a0_3->unk-1C = 0; - // // var_a0_3->unk-1E = (s16) temp_v0_4->x; - // // var_a0_3->unk-1A = (s16) temp_v0_4->z; - // // var_a0_3->unk-18 = (u8) temp_v0_4->r; - // // var_a0_3->unk-17 = (u8) temp_v0_4->g; - // // var_a0_3->unk-16 = (u8) temp_v0_4->b; - // // var_a0_3->unk-15 = (u8) temp_v0_4->a; - // // var_a0_3->unk-12 = 0; - // // var_a0_3->unk-14 = (s16) temp_a2->x; - // // var_a0_3->unk-10 = (s16) temp_a2->z; - // // var_a0_3->unk-E = (u8) temp_a2->r; - // // var_a0_3->unk-D = (u8) temp_a2->g; - // // temp_v0_5 = &(&temp_a1_2[temp_lo])[D_80129FC8.unk0]; - // // var_a0_3->unk-C = (u8) temp_a2->b; - // // var_a0_3->unk-B = (u8) temp_a2->a; - // // var_a0_3->unk-8 = 0; - // // var_a0_3->unk-A = (s16) temp_v0_5->x; - // // var_a0_3->unk-6 = (s16) temp_v0_5->z; - // // var_a0_3->unk-4 = (u8) temp_v0_5->r; - // // var_a0_3->unk-3 = (u8) temp_v0_5->g; - // // var_a0_3->unk-2 = (u8) temp_v0_5->b; - // // var_a0_3->unk-1 = (u8) temp_v0_5->a; - // } while ((u32)var_a3 != (u32)D_800E3078); - for (i = 0; i < ARRAY_COUNT(D_8012A028); i++) { - for (j = 0; j < ARRAY_COUNT(D_800E3070); j++) { - D_8012A028[i]->vert[temp_lo].x = D_800E3070[temp_lo + i][j].x; - D_8012A028[i]->vert[temp_lo].y = 0; - D_8012A028[i]->vert[temp_lo].z = D_800E3070[temp_lo + i][j].z; - D_8012A028[i]->vert[temp_lo].r = D_800E3070[temp_lo + i][j].r; - D_8012A028[i]->vert[temp_lo].g = D_800E3070[temp_lo + i][j].g; - D_8012A028[i]->vert[temp_lo].b = D_800E3070[temp_lo + i][j].b; - D_8012A028[i]->vert[temp_lo].a = D_800E3070[temp_lo + i][j].a; - } + var_t0 = D_80129FC8.unk0; + // a1 (D_800E3070[0]) + // v0 (a1 + var_t0) + // a2 (a1 + var_v1) + // v0 (a1 + var_v1 + var_t0) + for (i = 0; i < ARRAY_COUNT(D_800E3070); i++) { + // @note this should probably be the following for loop (or something like it, anyway) + // but the change of var_s3 does not work + + // for (j = 0; j < 4; j++) { + // if (j == 0) { + // var_s3 = 0; + // } else if (j == 1) { + // var_s3 = var_t0; + // } else if (j == 2) { + // var_s3 = var_t0 * (var_t0 + 1); + // } else { + // var_s3 = var_t0 * (var_t0 + 1) + var_t0; + // } + // temp_vtx_2 = &D_800E3070[i][var_s3]; + // temp_vtx = &D_8012A028[i][j]; + // temp_vtx->x = D_800E3070[i][var_s3].x; + // temp_vtx->y = 0; + // temp_vtx->z = D_800E3070[i][var_s3].z; + // temp_vtx->r = D_800E3070[i][var_s3].r; + // temp_vtx->g = D_800E3070[i][var_s3].g; + // temp_vtx->b = D_800E3070[i][var_s3].b; + // temp_vtx->a = D_800E3070[i][var_s3].a; + // } + + temp_vtx_2 = &D_800E3070[i][0]; + temp_vtx = &D_8012A028[i][0]; + temp_vtx->x = temp_vtx_2->x; + temp_vtx->y = 0; + temp_vtx->z = temp_vtx_2->z; + temp_vtx->r = temp_vtx_2->r; + temp_vtx->g = temp_vtx_2->g; + temp_vtx->b = temp_vtx_2->b; + temp_vtx->a = temp_vtx_2->a; + + temp_vtx_3 = &D_800E3070[i][var_t0]; + temp_vtx = &D_8012A028[i][1]; + temp_vtx->x = temp_vtx_3->x; + temp_vtx->y = 0; + temp_vtx->z = temp_vtx_3->z; + temp_vtx->r = temp_vtx_3->r; + temp_vtx->g = temp_vtx_3->g; + temp_vtx->b = temp_vtx_3->b; + temp_vtx->a = temp_vtx_3->a; + + var_t2 = var_t0 + 1; + var_v1 = (var_t0 + 1) * var_t0 ; + temp_vtx_4 = &D_800E3070[i][var_v1]; + temp_vtx = &D_8012A028[i][2]; + temp_vtx->x = temp_vtx_4->x; + temp_vtx->y = 0; + temp_vtx->z = temp_vtx_4->z; + temp_vtx->r = temp_vtx_4->r; + temp_vtx->g = temp_vtx_4->g; + temp_vtx->b = temp_vtx_4->b; + temp_vtx->a = temp_vtx_4->a; + + var_v1 = (var_t0 + 1) * var_t0 ; + temp_vtx_5 = &(&D_800E3070[i][var_v1])[var_t0]; + temp_vtx = &D_8012A028[i][3]; + temp_vtx->x = temp_vtx_5->x; + temp_vtx->y = 0; + temp_vtx->z = temp_vtx_5->z; + temp_vtx->r = temp_vtx_5->r; + temp_vtx->g = temp_vtx_5->g; + temp_vtx->b = temp_vtx_5->b; + temp_vtx->a = temp_vtx_5->a; } func_800BCC70(arg0); From dc28cc2d2bbc679f482b18713148e5254a9a7bf2 Mon Sep 17 00:00:00 2001 From: Ryan Myers Date: Mon, 14 Apr 2025 21:13:21 -0400 Subject: [PATCH 3/6] 100 funcs remaining! (#510) * Run formatter * Small documenting task * Fix some formatting * Fix size of sCorruptDataMenuText * Update requirements and subrepos to make sure we stay up to date * Do some JP font work * Small naming of things for jp font stuff * Small cleanup and documenting of debug_render_audio_effects * Match audioline_reverb * formatting * 100 funcs remaining * Match JP pakmenu_render --- README.md | 26 +++--- requirements.txt | 3 +- src/audio.c | 3 +- src/audio.h | 1 - src/audio_spatial.c | 76 ++++++++--------- src/audio_spatial.h | 2 + src/audio_vehicle.c | 16 ++-- src/font.c | 60 +++++++------- src/font.h | 4 +- src/menu.c | 119 ++++++++++++++++----------- src/menu.h | 2 + src/objects.c | 1 + src/racer.c | 4 +- src/rcp_dkr.c | 3 +- src/thread3_main.c | 7 +- src/weather.c | 3 +- tools/asm-differ | 2 +- tools/m2c | 2 +- tools/python/score.py | 4 +- ver/symbols/symbol_addrs.jpn.v79.txt | 5 +- ver/symbols/symbol_addrs.pal.v77.txt | 3 +- ver/symbols/symbol_addrs.pal.v80.txt | 3 +- ver/symbols/symbol_addrs.us.v77.txt | 3 +- ver/symbols/symbol_addrs.us.v80.txt | 3 +- 24 files changed, 186 insertions(+), 169 deletions(-) diff --git a/README.md b/README.md index 35cec32f..f8bb540b 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,11 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fda38e533b9fe63bb9670) of the game is the default if not specified. -As of April 11, 2025, this is our current score: +As of April 14, 2025, this is our current score: -    Decomp progress: 78.88% +    Decomp progress: 78.93% -    Documentation progress: 49.86% +    Documentation progress: 50.05% --- @@ -117,15 +117,15 @@ s32 is_drumstick_unlocked(void) { ``` -As of April 11, 2025, this is our current score: +As of April 14, 2025, this is our current score: ``` =================================================================== ADVENTURE ONE (ASM -> C Decompilation) - -------------- 78.88% Complete (81.45% NON_MATCHING) -------------- - # Decompiled functions: 1850 - # GLOBAL_ASM remaining: 101 + -------------- 78.93% Complete (81.50% NON_MATCHING) -------------- + # Decompiled functions: 1851 + # GLOBAL_ASM remaining: 100 # NON_MATCHING functions: 12 - # NON_EQUIVALENT WIP functions: 30 + # NON_EQUIVALENT WIP functions: 29 --------------------------- Game Status --------------------------- Balloons: 38/47, Keys: 4/4, Trophies: 3/5 T.T. Amulets: 4/4, Wizpig Amulets: 3/4 @@ -133,14 +133,14 @@ As of April 11, 2025, this is our current score: We are collecting silver coins in Haunted Woods. (0/8 silver coins) =================================================================== ADVENTURE TWO (Cleanup & Documentation) - ------------------------- 49.86% Complete ------------------------- - # Documented functions: 1089 - # Undocumented remaining: 565 + ------------------------- 50.05% Complete ------------------------- + # Documented functions: 1090 + # Undocumented remaining: 564 --------------------------- Game Status --------------------------- - Balloons: 24/47, Keys: 3/4, Trophies: 2/5 + Balloons: 25/47, Keys: 3/4, Trophies: 2/5 T.T. Amulets: 2/4, Wizpig Amulets: 2/4 ------------------------------------------------------------------- - We are racing in Pirate Lagoon. (Lap 3/3) + We are racing in Treasure Caves. (Lap 1/3) =================================================================== ``` diff --git a/requirements.txt b/requirements.txt index 5200f71d..3539fe43 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,5 @@ -splat64[mips]==0.32.3 +splat64[mips]==0.33.2 +spimdisasm==1.33.0 pycparser>=2.22 colorama>=0.4.6 watchdog>=6.0.0 diff --git a/src/audio.c b/src/audio.c index 6f2e3c8e..d3bfafa4 100644 --- a/src/audio.c +++ b/src/audio.c @@ -8,6 +8,7 @@ #include "audio_internal.h" #include "audiomgr.h" #include "audiosfx.h" +#include "audio_spatial.h" #include "sched.h" #include "libultra/src/audio/seqchannel.h" @@ -842,7 +843,7 @@ void sound_play_spatial(u16 soundID, f32 x, f32 y, f32 z, s32 **soundMask) { sound_play(soundID, (s32 *) soundMask); if (*soundMask != NULL) { - func_80009B7C(*soundMask, x, y, z); + audioline_reverb(*soundMask, x, y, z); } } diff --git a/src/audio.h b/src/audio.h index 679ca5c4..752c5e37 100644 --- a/src/audio.h +++ b/src/audio.h @@ -122,6 +122,5 @@ void sound_volume_set_relative(u16 soundID, void *soundState, u8 volume); void music_sequence_init(ALCSPlayer *seqp, void *sequence, u8 *seqID, ALCSeq *seq); void sound_play(u16 soundID, s32* soundMask); f32 music_animation_fraction(void); -void func_80009B7C(s32 *soundState, f32 x, f32 y, f32 z); #endif diff --git a/src/audio_spatial.c b/src/audio_spatial.c index 468a2e22..915d8544 100644 --- a/src/audio_spatial.c +++ b/src/audio_spatial.c @@ -115,7 +115,7 @@ void func_80008174(void) { } } gUsedMasks = 0; - + // var_s1 = D_80119C58; // do { // var_s1->soundID = 0; @@ -177,7 +177,7 @@ void func_80008174(void) { // var_a3->unkC = -100000.0f;; // var_a3->unk8 = -100000.0f; // var_a3->unk4 = -100000.0f; - + // var_v0_2 = var_a3->unk20; // for (j = 3; j != 15; j++, j+= 3) {// this should be j+=4 but has to be split up to match? // // 3, 7, 11 @@ -195,7 +195,7 @@ void func_80008174(void) { // var_v0_2[-1].unk4 = -100000.0f; // var_v0_2[-1].unk8 = -100000.0f; // }; - + // var_a3++; // var_a1++; // var_a2++; @@ -455,39 +455,38 @@ s32 func_80009AB4(u8 arg0) { return ret; } -#ifdef NON_EQUIVALENT -u8 func_80009D6C(unk8011A6D8 *, f32, f32, f32); -// audioline_reverb -void func_80009B7C(s32 *soundState, f32 x, f32 y, f32 z) { +void audioline_reverb(s32 *soundState, f32 x, f32 y, f32 z) { + s32 i; s32 j; - s32 levelSegmentIndex; - s32 numOfYVals; - s32 distBetween; + unk8011A6D8 *temp; + s32 k; f32 outX; f32 outY; f32 outZ; - u8 temp_v0_4; + s32 distBetween; + s32 maxDist; + s32 levelSegmentIndex; + s32 numOfYVals; u8 volume; - s32 var_s6; - s32 i; - s32 k; - unk8011A6D8 *temp; - f32 yVals[9]; // Not sure of the number needed + u8 temp_v0_4; + f32 *coords; + f32 yVals[10]; levelSegmentIndex = get_level_segment_index_from_position(x, y, z); volume = 0; - var_s6 = 400; + maxDist = 400; for (i = 0; i < ARRAY_COUNT(D_8011A6D8); i++) { temp = &D_8011A6D8[i]; if (temp->unk0.unk0_02 != 0) { if (func_80009AB4(i) != 0) { + coords = temp->unk4.unk4_floats; for (j = 0; j < temp->unkB8; j++) { - distBetween = audioline_distance(x, y, z, &temp->unk4.unk4_vec[j], &outX, &outY, &outZ); - if (distBetween < var_s6) { + distBetween = audioline_distance(x, y, z, coords, &outX, &outY, &outZ); + if (distBetween < maxDist) { numOfYVals = func_8002BAB0(levelSegmentIndex, x, z, yVals); for (k = 0; k < numOfYVals; k++) { if (y < yVals[k]) { - var_s6 = distBetween; + maxDist = distBetween; temp_v0_4 = func_80009D6C(&D_8011A6D8[i], outX, outY, outZ); if (volume < temp_v0_4) { volume = temp_v0_4; @@ -495,6 +494,7 @@ void func_80009B7C(s32 *soundState, f32 x, f32 y, f32 z) { } } } + coords += 3; } } } @@ -503,44 +503,36 @@ void func_80009B7C(s32 *soundState, f32 x, f32 y, f32 z) { sound_event_update((s32) soundState, AL_SNDP_FX_EVT, (u32) volume); } } -#else -#pragma GLOBAL_ASM("asm/nonmatchings/audio_spatial/func_80009B7C.s") -#endif #pragma GLOBAL_ASM("asm/nonmatchings/audio_spatial/func_80009D6C.s") -void debug_render_audio_effects(Gfx **arg0, Vertex **arg1, Triangle **arg2) { +void debug_render_audio_effects(Gfx **dList, Vertex **verts, Triangle **tris) { s32 i, j; - f32 *var_s1; + f32 *coords; unk80119C58 *var_s2; unk8011A6D8 *var_s2_2; - - i = 0; - do { + + for (i = 0; i < ARRAY_COUNT(D_80119C58); i++) { var_s2 = &D_80119C58[i]; - var_s1 = var_s2->unk4.unk4_floats; + coords = var_s2->unk4.unk4_floats; if (D_80119C58[i].soundID != 0) { for (j = 0; j < var_s2->unk17C; j++) { - debug_render_line(arg0, arg1, arg2, var_s1, 0xFF, 0xFF, 0); - var_s1 += 3; + debug_render_line(dList, verts, tris, coords, 255, 255, 0); + coords += 3; } } - i++; - } while (ARRAY_COUNT(D_80119C58) > i); + } - i = 0; - do { + for (i = 0; i < ARRAY_COUNT(D_8011A6D8); i++) { var_s2_2 = &D_8011A6D8[i]; - var_s1 = var_s2_2->unk4.unk4_floats; + coords = var_s2_2->unk4.unk4_floats; if (D_8011A6D8[i].unk0.unk0_02 != 0) { - for (j = 0; j < var_s2_2->unkB8; j++) { - debug_render_line(arg0, arg1, arg2, var_s1, 0xFF, 0, 0xFF); - var_s1 += 3; + for (j = 0; j < var_s2_2->unkB8; j++) { + debug_render_line(dList, verts, tris, coords, 255, 0, 255); + coords += 3; } } - - i++; - } while (i != ARRAY_COUNT(D_8011A6D8)); + } } void func_8000A2E8(s32 arg0) { diff --git a/src/audio_spatial.h b/src/audio_spatial.h index 5548c69d..2ceade5d 100644 --- a/src/audio_spatial.h +++ b/src/audio_spatial.h @@ -88,10 +88,12 @@ void update_spatial_audio_position(SoundMask *arg0, f32 x, f32 y, f32 z); s32 func_80009AB4(u8 arg0); void audioline_init(void); void audioline_reverb_create(f32, f32, f32, u8, u8, u8); +void audioline_reverb(s32 *soundState, f32 x, f32 y, f32 z); s32 audioline_distance(f32 inX, f32 inY, f32 inZ, f32 coords[6], f32 *outX, f32 *outY, f32 *outZ); void func_80008174(void); // Non Matching void func_80008438(Object **arg0, s32 numRacers, s32 updateRate); // Non Matching void func_80006FC8(Object **objs, s32 numRacers, ObjectSegment *segment, u8 arg3, s32 updateRate); // Non Matching +u8 func_80009D6C(unk8011A6D8 *, f32, f32, f32); #endif diff --git a/src/audio_vehicle.c b/src/audio_vehicle.c index 02a7c789..147b5704 100644 --- a/src/audio_vehicle.c +++ b/src/audio_vehicle.c @@ -340,8 +340,8 @@ void func_80005254(Object *obj, u32 buttonsPressed, u32 buttonsHeld, s32 updateR sound_event_update((s32) gRacerSound->unkA8, AL_SNDP_VOL_EVT, 0); } else { sound_event_update((s32) gRacerSound->unkA8, AL_SNDP_VOL_EVT, gRacerSound->unkAC << 8); - func_80009B7C((s32 *) gRacerSound->unkA8, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position); + audioline_reverb((s32 *) gRacerSound->unkA8, obj->segment.trans.x_position, obj->segment.trans.y_position, + obj->segment.trans.z_position); } } gRacerSound->unkA0 = var_s0; @@ -729,9 +729,9 @@ void func_80006FC8(Object **objs, s32 numRacers, ObjectSegment *segment, u8 arg3 temp_f0_3 = gRacerSound->unk38 / 100.0f; sp8C = temp_f0_3 + ((((f32) gRacerSound->unk39 / 100.0f) - temp_f0_3) * temp_f20_2); if (gRacerSound->unk50 != NULL) { - func_80009B7C((s32 *) gRacerSound->unk50, objs[loopCount1]->segment.trans.x_position, - objs[loopCount1]->segment.trans.y_position, - objs[loopCount1]->segment.trans.z_position); + audioline_reverb((s32 *) gRacerSound->unk50, objs[loopCount1]->segment.trans.x_position, + objs[loopCount1]->segment.trans.y_position, + objs[loopCount1]->segment.trans.z_position); sound_event_update((s32) gRacerSound->unk50, AL_SNDP_VOL_EVT, temp_s3 << 8); sound_event_update((s32) gRacerSound->unk50, AL_SNDP_PITCH_EVT, *((u32 *) &sp8C)); func_80004604((ALSoundState *) gRacerSound->unk50, 80); @@ -766,7 +766,7 @@ void func_80006FC8(Object **objs, s32 numRacers, ObjectSegment *segment, u8 arg3 func_80001F14(gRacerSound->unk0[loopCount2], (s32 *) &gRacerSound->unk48[loopCount2]); } if (gRacerSound->unk48[loopCount2] != NULL) { - func_80009B7C( + audioline_reverb( (s32 *) gRacerSound->unk48[loopCount2], objs[loopCount1]->segment.trans.x_position, objs[loopCount1]->segment.trans.y_position, objs[loopCount1]->segment.trans.z_position); sound_event_update((s32) gRacerSound->unk48[loopCount2], AL_SNDP_VOL_EVT, temp_s3 << 8); @@ -910,8 +910,8 @@ void func_80006FC8(Object **objs, s32 numRacers, ObjectSegment *segment, u8 arg3 func_80001F14(temp->unk0[0], (s32 *) &temp->unk48[0]); } if (temp->unk48[0] != NULL) { - func_80009B7C((s32 *) temp->unk48[0], temp->racerPos.x, temp->racerPos.y, - temp->racerPos.z); + audioline_reverb((s32 *) temp->unk48[0], temp->racerPos.x, temp->racerPos.y, + temp->racerPos.z); sound_event_update((s32) temp->unk48[0], AL_SNDP_VOL_EVT, temp->unk88 << 8); sound_event_update((s32) temp->unk48[0], AL_SNDP_PITCH_EVT, *((u32 *) &temp->unk8C)); if (arg3 != 1) { diff --git a/src/font.c b/src/font.c index 4eea2a23..58285262 100644 --- a/src/font.c +++ b/src/font.c @@ -113,9 +113,9 @@ typedef struct Unk8012C2D4_JP { Gfx *dList; } Unk8012C2D4_JP; -FontData_JP *D_8012C2A4_EE5E4; -FontJpSpacing *D_8012C2A8_EE5E8[4]; // 4 tables for spacing in different fonts? -s32 D_8012C2B8_EE5F8; +FontData_JP *D_8012C2A4_EE5E4; // Official Name: dxTable +FontJpSpacing *D_8012C2A8_EE5E8[NUMBER_OF_JP_FONTS]; // 4 tables for spacing in different fonts? +s32 fontInUse; // Official Name: fontInUse Unk8012C2D4_JP (*D_8012C2BC_EE5FC)[128]; JpCharHeader (*D_8012C2C0_EE600)[18]; Gfx *D_8012C2C4_EE604; @@ -255,7 +255,7 @@ void unload_font(s32 fontID) { */ void set_text_font(s32 fontID) { #if REGION == REGION_JP - gDialogueBoxBackground[0].font = D_8012C2B8_EE5F8 = fontID; + gDialogueBoxBackground[0].font = fontInUse = fontID; #else if (fontID < gNumberOfFonts) { gDialogueBoxBackground[0].font = fontID; @@ -550,13 +550,13 @@ void render_text_string(Gfx **dList, DialogueBoxBackground *box, char *text, Ali return; } - func_800C7864_C8464(text, otherText); - prevFont = D_8012C2B8_EE5F8; - D_8012C2B8_EE5F8 = box->font; + fontConvertString(text, otherText); + prevFont = fontInUse; + fontInUse = box->font; xpos = box->xpos; ypos = box->ypos; - fontData = (FontData_JP *) &D_8012C2A4_EE5E4[D_8012C2B8_EE5F8]; + fontData = (FontData_JP *) &D_8012C2A4_EE5E4[fontInUse]; gSPDisplayList((*dList)++, dDialogueBoxBegin); if (box != gDialogueBoxBackground) { scisOffset = (((box->y2 - box->y1) + 1) / (f32) 2) * scisScale; @@ -642,7 +642,7 @@ void render_text_string(Gfx **dList, DialogueBoxBackground *box, char *text, Ali uly = box->y1 + ypos; lrx = ulx + fontData->x; lry = uly + fontData->y; - charSpace = D_8012C2A8_EE5E8[D_8012C2B8_EE5F8]->spacing[jpCharValue]; + charSpace = D_8012C2A8_EE5E8[fontInUse]->spacing[jpCharValue]; if ((lrx > 0) && (lry > 0) && (ulx < box->x2) && (uly < box->y2)) { someIndexForJpChar = func_800C7744_C8344(dList, jpCharValue, &textureS, &textureT, &textureS2, &textureT2); @@ -698,7 +698,7 @@ void render_text_string(Gfx **dList, DialogueBoxBackground *box, char *text, Ali } box->xpos = xpos - box->textOffsetX; box->ypos = ypos - box->textOffsetY; - D_8012C2B8_EE5F8 = prevFont; // Put previous font index back. + fontInUse = prevFont; // Put previous font index back. if (box != gDialogueBoxBackground) { viewport_scissor(dList); } @@ -1306,8 +1306,7 @@ void parse_string_with_number(char *input, char *output, s32 number) { void parse_string_with_number(char *input, char *output, s32 number) { char currentChar; - currentChar = *input++; - while (currentChar) { + while ((currentChar = *input++)) { if (currentChar & 0x80) { char nextChar = *input++; if (nextChar == 0xE) { @@ -1321,8 +1320,6 @@ void parse_string_with_number(char *input, char *output, s32 number) { } else { *output++ = currentChar; } - currentChar = *input; - input++; } *output = '\0'; // null terminator } @@ -1366,7 +1363,7 @@ void func_800C6464_C7064(void) { } mempool_free(jpFontData); - D_8012C2B8_EE5F8 = 0; + fontInUse = 0; } void func_800C663C_C723C(void) { @@ -1428,8 +1425,8 @@ s32 func_800C68CC_C74CC(u16 arg0) { u16 glyphIndex; Unk8012C2D4_JP *asset; - glyphIndex = ((D_8012C2B8_EE5F8 << 12) | (arg0 & 0xFFF)); - var_a3 = (D_8012C2A4_EE5E4[D_8012C2B8_EE5F8].bytesPerCharacter + 0x11F) / 0x120; + glyphIndex = ((fontInUse << 12) | (arg0 & 0xFFF)); + var_a3 = (D_8012C2A4_EE5E4[fontInUse].bytesPerCharacter + 0x11F) / 0x120; D_8012C2BC_EE5FC = D_8012C2C8_EE608; D_8012C2C0_EE600 = D_8012C2CC_EE60C; curIndex = -1; @@ -1477,18 +1474,21 @@ s32 func_800C68CC_C74CC(u16 arg0) { } asset = &D_8012C2C0_EE600[curIndex]; load_asset_to_address(ASSET_BINARY_46, (u32) asset, - D_8012C2A4_EE5E4[D_8012C2B8_EE5F8].offsetToData + - (D_8012C2A4_EE5E4[D_8012C2B8_EE5F8].bytesPerCharacter * arg0), - D_8012C2A4_EE5E4[D_8012C2B8_EE5F8].bytesPerCharacter); - func_800C6DD4_C79D4((*D_8012C2BC_EE5FC)[curIndex].dList, asset, D_8012C2A4_EE5E4[D_8012C2B8_EE5F8].x, - D_8012C2A4_EE5E4[D_8012C2B8_EE5F8].y); + D_8012C2A4_EE5E4[fontInUse].offsetToData + + (D_8012C2A4_EE5E4[fontInUse].bytesPerCharacter * arg0), + D_8012C2A4_EE5E4[fontInUse].bytesPerCharacter); + fontCreateDisplayList((*D_8012C2BC_EE5FC)[curIndex].dList, asset, D_8012C2A4_EE5E4[fontInUse].x, + D_8012C2A4_EE5E4[fontInUse].y); } return curIndex; } } -void func_800C6DD4_C79D4(Gfx *dList, Asset46 *asset, s32 width, s32 height) { +/** + * Official Name: fontCreateDisplayList + */ +void fontCreateDisplayList(Gfx *dList, Asset46 *asset, s32 width, s32 height) { if (asset->unk0 != -1) { asset->unk0 = (s32) asset + asset->unk0; } else { @@ -1616,7 +1616,7 @@ void func_800C7804_C8404(s32 arg0) { } } -u8 D_800E5234_E5E34[] = { +u8 gFontConversionTable[] = { 0x0F, 0x34, 0x0A, 0x36, 0x02, 0x06, 0x0D, 0x37, 0x03, 0x04, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x3E, 0x05, 0x0B, 0x3F, 0x0C, 0x40, 0x41, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, @@ -1625,11 +1625,13 @@ u8 D_800E5234_E5E34[] = { 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0x03, 0x0F, 0x04, 0x0E, 0x0F, }; -void func_800C7864_C8464(char *inString, char *outString) { +/** + * Official Name: fontConvertString + */ +void fontConvertString(char *inString, char *outString) { char currentChar; - currentChar = *inString++; - while (currentChar) { + while ((currentChar = *inString++)) { if (currentChar & 0x80) { *outString++ = currentChar; *outString++ = *inString++; @@ -1637,10 +1639,8 @@ void func_800C7864_C8464(char *inString, char *outString) { *outString++ = currentChar; } else { *outString++ = 0x80; - *outString++ = D_800E5234_E5E34[currentChar - 32]; + *outString++ = gFontConversionTable[currentChar - 32]; } - currentChar = *inString; - inString++; } *outString = '\0'; } diff --git a/src/font.h b/src/font.h index 772b5e55..25faa594 100644 --- a/src/font.h +++ b/src/font.h @@ -193,10 +193,10 @@ void func_800C663C_C723C(void); void func_800C6870_C7470(void); void func_800C67F4_C73F4(void); s32 func_800C68CC_C74CC(u16 arg0); -void func_800C6DD4_C79D4(Gfx *dList, Asset46 *asset, s32 width, s32 height); +void fontCreateDisplayList(Gfx *dList, Asset46 *asset, s32 width, s32 height); s32 func_800C7744_C8344(Gfx **dList, u16 charIndex, s32 *outLeft, s32 *outTop, s32 *outRight, s32 *outBottom); void func_800C7804_C8404(s32 arg0); -void func_800C7864_C8464(char *inString, char *outString); +void fontConvertString(char *inString, char *outString); void func_800C78E0_C84E0(void); #endif diff --git a/src/menu.c b/src/menu.c index c7661253..bb5c17b9 100644 --- a/src/menu.c +++ b/src/menu.c @@ -523,7 +523,7 @@ s8 gInAdvModeTrophyRace = FALSE; // Height scale of the wooden frames in the track select menu. f32 gTrackSelectWoodFrameHeightScale = 1.0f; -s32 gResetTitleScale = 1; +s32 gResetTitleScale = TRUE; s32 gTitleScreenCurrentOption = 0; // 0 = "Start", 1 = "Options" @@ -545,11 +545,11 @@ s32 gTrackSpecifiedWithTrackIdToLoad = 0; s32 gMenuDelay = 0; s32 gNumberOfReadyPlayers = 0; s32 D_800DF484 = 0; -s32 gTitleScreenLoaded = 0; -s32 unused_800DF48C = 0; -s32 unused_800DF490 = 0; -s32 gIsInAdventureTwo = 0; -s32 gPlayerHasSeenCautionMenu = 0; +s32 gTitleScreenLoaded = FALSE; +UNUSED s32 unused_800DF48C = 0; +UNUSED s32 unused_800DF490 = 0; +s32 gIsInAdventureTwo = FALSE; +s32 gPlayerHasSeenCautionMenu = FALSE; s32 *gMenuTextLangTable = NULL; char **gMenuText = NULL; @@ -563,7 +563,7 @@ u8 sMenuGuiColourBlendFactor = 0; // Seems like it doesn't matter what you set it as? s32 gMenuSpriteFlags = 0; -s32 gIsInTracksMode = 1; +s32 gIsInTracksMode = TRUE; s32 gNumberOfActivePlayers = 1; s32 gIsInTwoPlayerAdventure = 0; s32 gTrackIdForPreview = ASSET_LEVEL_CENTRALAREAHUB; @@ -1288,9 +1288,7 @@ char *sControllerPakFullMenuText[5] = { 0, 0, 0, 0, 0 }; char *sNoControllerPakMenuText[5] = { 0, 0, 0, 0, 0 }; // CORRUPT DATA / If you wish to change / Controller Pak or Rumble Pak, / please do so now. -char *sCorruptDataMenuText[3] = { 0, 0, 0 }; // This should be 5 in size? This is unclear still. - -char *D_800E09F8[3] = { 0, 0, 0 }; +char *sCorruptDataMenuText[6] = { 0, 0, 0, 0, 0, 0 }; // If you wish to use / the Controller Pak / insert it now! char *sInsertControllerPakMenuText[3] = { 0, 0, 0 }; @@ -1408,8 +1406,8 @@ s32 gFilenameY = 120; s32 gFilenameFont = ASSET_FONTS_BIGFONT; s32 gNameEntryLength = 0; s32 D_800E0FA4 = 0; -char gCheckAdvEnterInitials[4] = "DKR"; // Default file name? -s32 D_800E0FAC = 0; +char gCheckAdvEnterInitials[] = "DKR"; // Default file name +s32 D_800E0FAC = FALSE; s32 gIndexOfCurInputCharacter = 0; s16 gAdvTrackInitObjectIndices[18] = { 0x0004, 0x0000, 0x0001, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, @@ -3307,7 +3305,7 @@ void menu_title_screen_init(void) { s32 i; s32 numberOfPlayers; - gTitleScreenLoaded = 1; + gTitleScreenLoaded = TRUE; gOptionBlinkTimer = 0; gMenuDelay = 0; reset_character_id_slots(); @@ -4142,7 +4140,7 @@ void savemenu_render_element(SaveFileData *file, s32 x, s32 y) { texture = gMenuAssets[TEXTURE_SURFACE_BUTTON_WOOD]; colour = COLOUR_RGBA32(176, 224, 192, 255); if (!gSavefileData[file->controllerIndex]->newGame) { - filename_decompress(gSavefileData[file->controllerIndex]->filename, buffer, 3); + filename_decompress(gSavefileData[file->controllerIndex]->filename, buffer, MAX_INITIALS_LENGTH); filename_trim(buffer, buffer); text2 = buffer; firstDigit = *gSavefileData[file->controllerIndex]->balloonsPtr / 10; @@ -4168,7 +4166,7 @@ void savemenu_render_element(SaveFileData *file, s32 x, s32 y) { texture = gMenuAssets[TEXTURE_UNK_44]; colour = gContPakSaveBgColours[file->controllerIndex]; text2 = buffer; - filename_decompress(file->compressedFilename, buffer, 3); + filename_decompress(file->compressedFilename, buffer, MAX_INITIALS_LENGTH); // char *gConPakAdvSavePrefix = " (ADV."; for (i = 0; gConPakAdvSavePrefix[i] != '\0'; i++) { buffer[i + 3] = gConPakAdvSavePrefix[i]; @@ -5562,13 +5560,17 @@ void bootscreen_init_cpak(void) { #endif } +#if REGION == REGION_JP +#define PAKMENU_JP_OFFSET 2 +#else +#define PAKMENU_JP_OFFSET 0 +#endif /** * Render the controller pak menu. * Lists the pak index, as well as remaining pages, then displays all known files. * Also draws the confirmation box. * Visual Aid : https://i.imgur.com/7T2Scdr.png */ -#if REGION != REGION_JP void pakmenu_render(UNUSED s32 updateRate) { s32 highlight; s32 i; @@ -5608,15 +5610,19 @@ void pakmenu_render(UNUSED s32 updateRate) { set_dialogue_font(6, ASSET_FONTS_FUNFONT); set_current_text_colour(6, 255, 255, 255, 0, 255); set_current_text_background_colour(6, 0, 0, 0, 0); - render_dialogue_text(6, POS_CENTRED, 2, gMenuText[ASSET_MENU_TEXT_CONTPAK1 + gMenuOption], 1, + render_dialogue_text(6, POS_CENTRED, 2 - PAKMENU_JP_OFFSET, gMenuText[ASSET_MENU_TEXT_CONTPAK1 + gMenuOption], 1, HORZ_ALIGN_CENTER); // CONTROLLER PAK 1 / 2 / 3 / 4 - render_dialogue_text(6, POS_CENTRED, 16, gMenuText[ASSET_MENU_TEXT_FREEPAGESX], sCurrentControllerPakFreePages, + render_dialogue_text(6, POS_CENTRED, 16 - PAKMENU_JP_OFFSET, gMenuText[ASSET_MENU_TEXT_FREEPAGESX], sCurrentControllerPakFreePages, HORZ_ALIGN_CENTER); // FREE PAGES: ~ render_dialogue_box(&sMenuCurrDisplayList, NULL, NULL, 6); yPos += 34; // To 82 +#if REGION == REGION_JP + set_dialogue_font(6, ASSET_FONTS_SUBTITLEFONT); +#else set_dialogue_font(6, ASSET_FONTS_SMALLFONT); +#endif set_current_text_background_colour(6, 0, 0, 0, 0); for (i = -1; i < sControllerPakMenuNumberOfRows; i++) { dialogue_clear(6); @@ -5642,9 +5648,19 @@ void pakmenu_render(UNUSED s32 updateRate) { fileNameText = gBootPakData[gOpacityDecayTimer + i]; numberOfPages = sCurrentControllerPakNumberOfPages[gOpacityDecayTimer + i]; } +#if REGION == REGION_JP + render_dialogue_text(6, 21, 2, noteText, gOpacityDecayTimer + i + 1, HORZ_ALIGN_CENTER); + if (i < 0) { + render_dialogue_text(6, POS_CENTRED, 2, fileNameText, 1, HORZ_ALIGN_CENTER); + } else { + render_dialogue_text(6, 44, 2, fileNameText, 1, HORZ_ALIGN_LEFT); + } + render_dialogue_text(6, 241, 2, pagesText, numberOfPages, HORZ_ALIGN_CENTER); +#else render_dialogue_text(6, 26, 2, noteText, gOpacityDecayTimer + i + 1, HORZ_ALIGN_CENTER); render_dialogue_text(6, 56, 2, fileNameText, 1, HORZ_ALIGN_LEFT); render_dialogue_text(6, 240, 2, pagesText, numberOfPages, HORZ_ALIGN_CENTER); +#endif #if VERSION >= VERSION_79 set_kerning(TRUE); #endif @@ -5677,16 +5693,29 @@ void pakmenu_render(UNUSED s32 updateRate) { yPos = SCREEN_HEIGHT_HALF; } dialogue_clear(6); +#if REGION == REGION_JP + set_dialogue_font(6, ASSET_FONTS_SMALLFONT); + set_current_dialogue_box_coords(6, 56, yPos - 28, 264, yPos + 28); +#else set_dialogue_font(6, ASSET_FONTS_FUNFONT); set_current_dialogue_box_coords(6, 76, yPos - 28, 244, yPos + 28); +#endif set_current_dialogue_background_colour(6, 0, 0, 0, 160); yPos = 4; for (i = 0; i <= 2; i++) { if (i == 0) { +#if REGION == REGION_JP + set_current_text_colour(6, 208, 128, 255, 255, 255); +#else set_current_text_colour(6, 255, 0, 255, 64, 255); +#endif } else if (i == gMenuStage) { +#if REGION == REGION_JP + set_current_text_colour(6, 255, highlight, highlight, 255, 255); +#else set_current_text_colour(6, 255, 255, 255, highlight, 255); +#endif } else { set_current_text_colour(6, 255, 255, 255, 0, 255); } @@ -5715,10 +5744,6 @@ void pakmenu_render(UNUSED s32 updateRate) { } } } -#else -// No match JPN pakmenu_render -#pragma GLOBAL_ASM("asm/nonmatchings/menu/pakmenu_render.s") -#endif /** * Handles the controller pak menu accessed from the boot screen. @@ -7089,7 +7114,7 @@ s32 menu_character_select_loop(s32 updateRate) { charselect_assign_ai(charSlot); charselect_assign_players(gActivePlayersArray); - gIsInTracksMode = 1; + gIsInTracksMode = TRUE; if (confirmOffset >= gNumberOfActivePlayers) { music_change_off(); load_level_for_menu(ASSET_LEVEL_OPTIONSBACKGROUND, -1, 0); @@ -7226,7 +7251,7 @@ void menu_caution_init(void) { load_font(ASSET_FONTS_BIGFONT); #endif transition_begin(&sMenuTransitionFadeOut); - gPlayerHasSeenCautionMenu = 1; + gPlayerHasSeenCautionMenu = TRUE; #if REGION == REGION_JP func_800C663C_C723C(); #endif @@ -7553,7 +7578,7 @@ void fileselect_render(UNUSED s32 updateRate) { menu_camera_centre(); set_ortho_matrix_view(&sMenuCurrDisplayList, &sMenuCurrHudMat); for (i = 0; i < NUMBER_OF_SAVE_FILES; i++) { - if (gSavefileInfo[i].isAdventure2 == gIsInAdventureTwo || gSavefileInfo[i].isStarted == 0) { + if (gSavefileInfo[i].isAdventure2 == gIsInAdventureTwo || gSavefileInfo[i].isStarted == FALSE) { colour = COLOUR_RGBA32(176, 224, 192, 255); } else { colour = COLOUR_RGBA32(106, 144, 115, 255); @@ -7985,7 +8010,7 @@ s32 menu_file_select_loop(s32 updateRate) { } gSavefileInfo[i].isStarted = TRUE; gSavefileInfo[i].balloonCount = *gSavefileData[i]->balloonsPtr; - filename_decompress(gSavefileData[i]->filename, gSavefileInfo[i].name, 3); + filename_decompress(gSavefileData[i]->filename, gSavefileInfo[i].name, MAX_INITIALS_LENGTH); } } gOpacityDecayTimer = 0; @@ -8020,7 +8045,7 @@ s32 menu_file_select_loop(s32 updateRate) { menu_unload_bigfont(); gFileNew = FALSE; gSavefileInfo[gSaveFileIndex].isAdventure2 = 0; - if (gIsInAdventureTwo != 0) { + if (gIsInAdventureTwo) { gSavefileInfo[gSaveFileIndex].isAdventure2 = 1; } gSavefileInfo[gSaveFileIndex].isStarted = 1; @@ -8070,7 +8095,7 @@ s32 menu_file_select_loop(s32 updateRate) { fontUseFont(); } gNumberOfActivePlayers = 1; - D_800E0FAC = 1; + D_800E0FAC = TRUE; fileselect_free(); music_change_on(); init_racer_headers(); @@ -8195,12 +8220,12 @@ void menu_track_select_init(void) { settings = get_settings(); get_number_of_levels_and_worlds(&levelCount, &worldCount); trackIds = (s8 *) get_misc_asset(ASSET_MISC_TRACKS_MENU_IDS); - if (gTitleScreenLoaded != 0) { + if (gTitleScreenLoaded != FALSE) { gTrackSelectCursorX = 0; gTrackSelectCursorY = 0; gTracksMenuTimeTrialHighlightIndex = 0; gTracksMenuAdventureHighlightIndex = 0; - gTitleScreenLoaded = 0; + gTitleScreenLoaded = FALSE; } gTrackSelectViewPortX = fb_size(); gTrackSelectViewportY = GET_VIDEO_HEIGHT(gTrackSelectViewPortX) & 0xFFFF; @@ -8689,7 +8714,7 @@ void trackmenu_render_2D(s32 x, s32 y, char *hubName, char *trackName, s32 rectO set_text_colour(255, 255, 255, 0, opacity); draw_text(&sMenuCurrDisplayList, SCREEN_WIDTH_HALF, (yTemp - sp6C) - 88, hubName, ALIGN_MIDDLE_CENTER); gTrackMenuHubName = hubName; - set_kerning(0); + set_kerning(FALSE); } #if REGION == REGION_JP set_text_colour(0, 0, 0, 255, opacity / 2); @@ -9182,14 +9207,14 @@ void trackmenu_setup_render(UNUSED s32 updateRate) { #endif set_text_colour(255, 128, 255, 96, sMenuGuiOpacity); filename_decompress(settings->courseInitialsPtr[gPlayerSelectVehicle[0]][gTrackIdForPreview], - filename.buffer, 3); + filename.buffer, MAX_INITIALS_LENGTH); #if REGION == REGION_JP draw_text(&sMenuCurrDisplayList, 249, regionOffset + 70, filename.buffer, ALIGN_MIDDLE_CENTER); #else draw_text(&sMenuCurrDisplayList, 250, regionOffset + 72, filename.buffer, ALIGN_MIDDLE_CENTER); #endif filename_decompress(settings->flapInitialsPtr[gPlayerSelectVehicle[0]][gTrackIdForPreview], filename.buffer, - 3); + MAX_INITIALS_LENGTH); #if REGION == REGION_JP draw_text(&sMenuCurrDisplayList, 249, regionOffset + 89, filename.buffer, ALIGN_MIDDLE_CENTER); #else @@ -9864,11 +9889,11 @@ void adventuretrack_render(UNUSED s32 updateRate, s32 arg1, s32 arg2) { gMenuText[ASSET_MENU_TEXT_BESTLAP], ADVENTURETRACK_ALIGN); set_text_colour(255, 128, 255, 96, 255); filename_decompress(settings->courseInitialsPtr[gPlayerSelectVehicle[0]][mapID], - (char *) &filename, 3); + (char *) &filename, MAX_INITIALS_LENGTH); draw_text(&sMenuCurrDisplayList, ADVENTURETRACK_XPOS2, yOffset + ADVENTURETRACK_YPOS3, (char *) &filename, ALIGN_MIDDLE_CENTER); filename_decompress(settings->flapInitialsPtr[gPlayerSelectVehicle[0]][mapID], - (char *) &filename, 3); + (char *) &filename, MAX_INITIALS_LENGTH); draw_text(&sMenuCurrDisplayList, ADVENTURETRACK_XPOS2, yOffset + ADVENTURETRACK_YPOS2, (char *) &filename, ALIGN_MIDDLE_CENTER); menu_timestamp_render(settings->courseTimesPtr[gPlayerSelectVehicle[0]][ADVENTURETRACK_MAPID], @@ -10309,7 +10334,7 @@ s32 menu_pause_loop(UNUSED Gfx **dl, s32 updateRate) { if (gMenuSubOption == 1) { if (gTrophyRaceWorldId != 0) { gTrophyRaceWorldId = 0; - if (gIsInTracksMode == 0) { + if (gIsInTracksMode == FALSE) { return PAUSE_QUIT_LOBBY; } return PAUSE_QUIT_TRACKS; @@ -10874,17 +10899,17 @@ s32 menu_postrace(Gfx **dList, MatrixS **matrices, Vertex **vertices, s32 update gRecordTimesMenuElements[6].t.numberU16 = &settings->flapTimesPtr[*gPlayerSelectVehicle][settings->courseId]; filename_decompress(settings->courseInitialsPtr[*gPlayerSelectVehicle][settings->courseId], - gCourseInitials, 3); + gCourseInitials, MAX_INITIALS_LENGTH); filename_decompress(settings->flapInitialsPtr[*gPlayerSelectVehicle][settings->courseId], - gFLapInitials, 3); + gFLapInitials, MAX_INITIALS_LENGTH); if (settings->racers[0].best_times != 0) { gMenuStage = POSTRACE_STAGE_ENTER_INITIALS; - if ((gIsInTracksMode == 0) && (D_800E0FAC)) { - filename_decompress(settings->filename, gCheckAdvEnterInitials, 3); - D_800E0FAC = 0; + if (gIsInTracksMode == FALSE && D_800E0FAC != FALSE) { + filename_decompress(settings->filename, gCheckAdvEnterInitials, MAX_INITIALS_LENGTH); + D_800E0FAC = FALSE; } filename_init(textOffsetY + 196, 160, textOffsetY + 120, 2, &D_800E0FA4, gCheckAdvEnterInitials, - 3); + MAX_INITIALS_LENGTH); } else { postrace_offsets(gRecordTimesMenuElements, 0.5f, 15.0f, 0.5f, textOffsetY, timeOffsetY); gMenuStage = POSTRACE_STAGE_RACE_RECORDS; @@ -10904,15 +10929,15 @@ s32 menu_postrace(Gfx **dList, MatrixS **matrices, Vertex **vertices, s32 update if (filename_enter(updateRate)) { if (settings->racers[0].best_times & 0x7F) { settings->flapInitialsPtr[*gPlayerSelectVehicle][settings->courseId] = - filename_compress(gCheckAdvEnterInitials, 3); + filename_compress(gCheckAdvEnterInitials, MAX_INITIALS_LENGTH); filename_decompress(settings->flapInitialsPtr[*gPlayerSelectVehicle][settings->courseId], - gFLapInitials, 3); + gFLapInitials, MAX_INITIALS_LENGTH); } if (settings->racers[0].best_times & 0x80) { settings->courseInitialsPtr[*gPlayerSelectVehicle][settings->courseId] = - filename_compress(gCheckAdvEnterInitials, 3); + filename_compress(gCheckAdvEnterInitials, MAX_INITIALS_LENGTH); filename_decompress(settings->courseInitialsPtr[*gPlayerSelectVehicle][settings->courseId], - gCourseInitials, 3); + gCourseInitials, MAX_INITIALS_LENGTH); } postrace_offsets(gRecordTimesMenuElements, 0.5f, 15.0f, 0.5f, textOffsetY, timeOffsetY); gMenuStage = POSTRACE_STAGE_RACE_RECORDS; @@ -12328,7 +12353,7 @@ s32 menu_trophy_race_rankings_loop(s32 updateRate) { temp6 = 0; } gRankingsPortraitIDs[temp6] = -1; - if (gIsInTracksMode == 1) { + if (gIsInTracksMode == TRUE) { if (sp34 >= 3) { menu_init(MENU_TRACK_SELECT); } else { diff --git a/src/menu.h b/src/menu.h index fc2c8213..29c62a9b 100644 --- a/src/menu.h +++ b/src/menu.h @@ -28,6 +28,8 @@ #define CINEMATIC_PLAYERS 1 #define CINEMATIC_CUTSCENE 2 +#define MAX_INITIALS_LENGTH 3 + enum PauseMenuResults { PAUSE_NONE, PAUSE_CONTINUE, diff --git a/src/objects.c b/src/objects.c index 550a434b..01df08ca 100644 --- a/src/objects.c +++ b/src/objects.c @@ -772,6 +772,7 @@ void try_free_object_header(s32 index) { * Converts the passed value into an accurate countdown value based on the systems region. * Since PAL runs at 50Hz, it therefore will reduce the timer to 5/6 to match, keeping * it consistent with non PAL timers, running 60Hz. + * Official Name: objTvTimes */ s32 normalise_time(s32 timer) { if (osTvType != OS_TV_TYPE_PAL || timer < 0) { diff --git a/src/racer.c b/src/racer.c index c1fe8597..c267d647 100644 --- a/src/racer.c +++ b/src/racer.c @@ -3518,8 +3518,8 @@ void func_80050A28(Object *obj, Object_Racer *racer, s32 updateRate, f32 updateR sound_play_spatial(SOUND_CAR_SLIDE, obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position, (s32 **) &racer->unk10); } else { - func_80009B7C((void *) racer->unk10, obj->segment.trans.x_position, obj->segment.trans.y_position, - obj->segment.trans.z_position); + audioline_reverb((void *) racer->unk10, obj->segment.trans.x_position, obj->segment.trans.y_position, + obj->segment.trans.z_position); } if (racer->unk14) { sound_stop((void *) racer->unk14); diff --git a/src/rcp_dkr.c b/src/rcp_dkr.c index f01cd5bc..c3387b51 100644 --- a/src/rcp_dkr.c +++ b/src/rcp_dkr.c @@ -175,7 +175,7 @@ s32 gfxtask_run_xbus(Gfx *dlBegin, Gfx *dlEnd, UNUSED s32 recvMesg) { dkrtask->unused58 = COLOUR_TAG_RED; dkrtask->unused5C = COLOUR_TAG_RED; dkrtask->task.data_ptr = (u64 *) dlBegin; - dkrtask->task.data_size = ((s32) dlEnd - (s32) dlBegin) >> 3; // Shifted by 3, repsenting the size of the Gfx type. + dkrtask->task.data_size = dlEnd - dlBegin; dkrtask->task.type = M_GFXTASK; dkrtask->task.flags = OS_TASK_DP_WAIT; dkrtask->task.ucode_boot = (u64 *) rspF3DDKRBootStart; @@ -510,7 +510,6 @@ void bgdraw_texture_init(TextureHeader *tex1, TextureHeader *tex2, u32 shiftX) { /** * Seems to render the background screen after a race finishes while you're at the menu deciding what to do next. - * https://i.imgur.com/MHbUD2a.png is an example. The left is correct, and the right is incorrect rendering. * Official Name: rcpMosaicClear */ void bgdraw_texture(Gfx **dList) { diff --git a/src/thread3_main.c b/src/thread3_main.c index 5010467e..c3ac700d 100644 --- a/src/thread3_main.c +++ b/src/thread3_main.c @@ -1325,13 +1325,14 @@ void force_mark_write_save_file(s32 saveFileIndex) { /** * Marks a flag to write a save file to flash as long as we're not in tracks mode, and we're in the draw game render - * context. This should prevent save data from being overwritten outside of Adventure Mode. Official Name: mainSaveGame2 + * context. This should prevent save data from being overwritten outside of Adventure Mode. + * Official Name: mainSaveGame2 */ void safe_mark_write_save_file(s32 saveFileIndex) { if (gGameMode == GAMEMODE_INGAME && !is_in_tracks_mode()) { gSaveDataFlags &= ~SAVE_DATA_FLAG_WRITE_SAVE_FILE_NUMBER_BITS; // Wipe out bits 10 and 11 - gSaveDataFlags |= (SAVE_DATA_FLAG_WRITE_SAVE_DATA | ((saveFileIndex & 3) << 10)); - ; // Set bit 6 and place saveFileIndex into bits 10 and 11 + gSaveDataFlags |= (SAVE_DATA_FLAG_WRITE_SAVE_DATA | + ((saveFileIndex & 3) << 10)); // Set bit 6 and place saveFileIndex into bits 10 and 11 } } diff --git a/src/weather.c b/src/weather.c index 69e8b8d8..81945441 100644 --- a/src/weather.c +++ b/src/weather.c @@ -1082,8 +1082,7 @@ void render_rain_overlay(RainGfxData *rainGfx, s32 time) { s32 i; f32 zSin; f32 zCos; - int unused; - int unused2; + UNUSED s32 pad[2]; TextureHeader *tex; Gfx *curDL; Triangle *tri; diff --git a/tools/asm-differ b/tools/asm-differ index 150720b8..ddb2fad1 160000 --- a/tools/asm-differ +++ b/tools/asm-differ @@ -1 +1 @@ -Subproject commit 150720b88350f7c67e1d51ecc04b7a3ebfca037e +Subproject commit ddb2fad1b73d4d7483d483fb833cad4564a5fc01 diff --git a/tools/m2c b/tools/m2c index f29e5917..4caccf86 160000 --- a/tools/m2c +++ b/tools/m2c @@ -1 +1 @@ -Subproject commit f29e59172f4b1ab6a11edbae20d6d7a3bec503f9 +Subproject commit 4caccf86a027bf52b9132a8ae9331cb3210305a8 diff --git a/tools/python/score.py b/tools/python/score.py index 032639cf..25408e40 100644 --- a/tools/python/score.py +++ b/tools/python/score.py @@ -116,8 +116,8 @@ MAP_FILE = DkrMapFile() # Adding regional and other version functions here to ignore since we're only scoring US_1.0 for now. NOT_FUNCTION_NAMES = ['if', 'else', 'switch', 'while', 'for', 'dmacopy_internal', 'func_80082BC8_837C8', 'rumble_enable', 'func_800C6464_C7064', 'func_800C663C_C723C', 'func_800C67F4_C73F4', 'func_800C6870_C7470', - 'func_800C68CC_C74CC', 'func_800C6DD4_C79D4', 'func_800C7744_C8344', 'func_800C7804_C8404', - 'func_800C7864_C8464', 'func_800C78E0_C84E0'] + 'func_800C68CC_C74CC', 'fontCreateDisplayList', 'func_800C7744_C8344', 'func_800C7804_C8404', + 'fontConvertString', 'func_800C78E0_C84E0'] class ScoreFileMatch: def __init__(self, comment, functionName): diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index b7179bff..a7538afe 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -149,7 +149,7 @@ audioline_ambient_create = 0x800098A4; audioline_reverb_create = 0x80009968; func_800099EC = 0x800099EC; func_80009AB4 = 0x80009AB4; -func_80009B7C = 0x80009B7C; +audioline_reverb = 0x80009B7C; func_80009D6C = 0x80009D6C; debug_render_audio_effects = 0x8000A184; func_8000A2E8 = 0x8000A2E8; @@ -2645,7 +2645,6 @@ sBadControllerPakMenuText = 0x800E2410; sControllerPakFullMenuText = 0x800E2424; sNoControllerPakMenuText = 0x800E2438; sCorruptDataMenuText = 0x800E244C; -D_800E09F8 = 0x800E2458; sInsertControllerPakMenuText = 0x800E2464; D_800E0A10 = 0x800E2470; sInsertRumblePakMenuText = 0x800E2474; @@ -4593,7 +4592,7 @@ gDialogueText = 0x8012C29C; gCompactKerning = 0x8012C2A0; D_8012C2A4_EE5E4 = 0x8012C2A4; D_8012C2A8_EE5E8 = 0x8012C2A8; // size:0x10 -D_8012C2B8_EE5F8 = 0x8012C2B8; +fontInUse = 0x8012C2B8; D_8012C2BC_EE5FC = 0x8012C2BC; D_8012C2C0_EE600 = 0x8012C2C0; D_8012C2C4_EE604 = 0x8012C2C4; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index 2bb75ff1..65fa914b 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -149,7 +149,7 @@ audioline_ambient_create = 0x800098A4; audioline_reverb_create = 0x80009968; func_800099EC = 0x800099EC; func_80009AB4 = 0x80009AB4; -func_80009B7C = 0x80009B7C; +audioline_reverb = 0x80009B7C; func_80009D6C = 0x80009D6C; debug_render_audio_effects = 0x8000A184; func_8000A2E8 = 0x8000A2E8; @@ -2492,7 +2492,6 @@ sBadControllerPakMenuText = 0x800E0A40; sControllerPakFullMenuText = 0x800E0A54; sNoControllerPakMenuText = 0x800E0A68; sCorruptDataMenuText = 0x800E0A7C; -D_800E09F8 = 0x800E0A88; sInsertControllerPakMenuText = 0x800E0A94; D_800E0A10 = 0x800E0AA0; sInsertRumblePakMenuText = 0x800E0AA4; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index 6dad7362..5ab35bac 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -149,7 +149,7 @@ audioline_ambient_create = 0x800098A4; audioline_reverb_create = 0x80009968; func_800099EC = 0x800099EC; func_80009AB4 = 0x80009AB4; -func_80009B7C = 0x80009B7C; +audioline_reverb = 0x80009B7C; func_80009D6C = 0x80009D6C; debug_render_audio_effects = 0x8000A184; func_8000A2E8 = 0x8000A2E8; @@ -2420,7 +2420,6 @@ sBadControllerPakMenuText = 0x800E0FC0; sControllerPakFullMenuText = 0x800E0FD4; sNoControllerPakMenuText = 0x800E0FE8; sCorruptDataMenuText = 0x800E0FFC; -D_800E09F8 = 0x800E1008; sInsertControllerPakMenuText = 0x800E1014; D_800E0A10 = 0x800E1020; sInsertRumblePakMenuText = 0x800E1024; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index ba79a1d9..f2423570 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -149,7 +149,7 @@ audioline_ambient_create = 0x800098A4; audioline_reverb_create = 0x80009968; func_800099EC = 0x800099EC; func_80009AB4 = 0x80009AB4; -func_80009B7C = 0x80009B7C; +audioline_reverb = 0x80009B7C; func_80009D6C = 0x80009D6C; debug_render_audio_effects = 0x8000A184; func_8000A2E8 = 0x8000A2E8; @@ -2637,7 +2637,6 @@ sBadControllerPakMenuText = 0x800E09B0; sControllerPakFullMenuText = 0x800E09C4; sNoControllerPakMenuText = 0x800E09D8; sCorruptDataMenuText = 0x800E09EC; -D_800E09F8 = 0x800E09F8; sInsertControllerPakMenuText = 0x800E0A04; D_800E0A10 = 0x800E0A10; sInsertRumblePakMenuText = 0x800E0A14; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index f869b3df..2cc5fae3 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -149,7 +149,7 @@ audioline_ambient_create = 0x800098A4; audioline_reverb_create = 0x80009968; func_800099EC = 0x800099EC; func_80009AB4 = 0x80009AB4; -func_80009B7C = 0x80009B7C; +audioline_reverb = 0x80009B7C; func_80009D6C = 0x80009D6C; debug_render_audio_effects = 0x8000A184; func_8000A2E8 = 0x8000A2E8; @@ -2417,7 +2417,6 @@ sBadControllerPakMenuText = 0x800E0F30; sControllerPakFullMenuText = 0x800E0F44; sNoControllerPakMenuText = 0x800E0F58; sCorruptDataMenuText = 0x800E0F6C; -D_800E09F8 = 0x800E0F78; sInsertControllerPakMenuText = 0x800E0F84; D_800E0A10 = 0x800E0F90; sInsertRumblePakMenuText = 0x800E0F94; From a2636b9708e30c1c5acc9b03b3f5b07fabf7e9d8 Mon Sep 17 00:00:00 2001 From: Fazana <52551480+FazanaJ@users.noreply.github.com> Date: Wed, 16 Apr 2025 18:09:08 +0100 Subject: [PATCH 4/6] Document shadows a bit after learning some stuff about them (#513) --- include/structs.h | 15 +- src/menu.c | 6 +- src/textures_sprites.h | 9 + src/tracks.c | 317 ++++++++++++++------------- src/tracks.h | 8 +- ver/symbols/symbol_addrs.jpn.v79.txt | 40 ++-- ver/symbols/symbol_addrs.pal.v77.txt | 40 ++-- ver/symbols/symbol_addrs.pal.v80.txt | 40 ++-- ver/symbols/symbol_addrs.us.v77.txt | 40 ++-- ver/symbols/symbol_addrs.us.v80.txt | 40 ++-- 10 files changed, 291 insertions(+), 264 deletions(-) diff --git a/include/structs.h b/include/structs.h index 2fc746ce..c7110a91 100644 --- a/include/structs.h +++ b/include/structs.h @@ -152,6 +152,13 @@ typedef struct DrawTexture { s16 yOffset; // Offset from the center of the screen. } DrawTexture; +// Probably not unique to the boot menu. +typedef struct ShadowHeapProperties { + TextureHeader *texture; // Pointer to texture to draw. + s16 triCount; // Offset from the center of the screen. + s16 vtxCount; // Offset from the center of the screen. +} ShadowHeapProperties; + typedef struct Sprite { /* 0x00 */ s16 baseTextureId; /* 0x02 */ s16 numberOfFrames; // 1 means static texture @@ -791,10 +798,10 @@ typedef struct ObjectHeader { /* 0x40 */ s16 shadeAngleZ; /* 0x42 */ s16 unk42; /* 0x44 */ s16 unk44; - /* 0x48 */ s16 unk46; - /* 0x48 */ s16 unk48; - /* 0x4A */ s16 unk4A; - /* 0x4C */ s16 unk4C; + /* 0x48 */ s16 shadowBottom; // Lower bounds for shadow + /* 0x48 */ s16 shadowTop; // Upper bounds for shadow + /* 0x4A */ s16 shadowFadeMin; // Close reference distance for shadow opacity + /* 0x4C */ s16 shadowFadeMax; // Far reference distance for shadow opacity /* 0x4E */ s16 drawDistance; /* 0x50 */ s16 unk50; /* 0x52 */ s8 unk52; diff --git a/src/menu.c b/src/menu.c index bb5c17b9..7e33a5fd 100644 --- a/src/menu.c +++ b/src/menu.c @@ -5610,9 +5610,11 @@ void pakmenu_render(UNUSED s32 updateRate) { set_dialogue_font(6, ASSET_FONTS_FUNFONT); set_current_text_colour(6, 255, 255, 255, 0, 255); set_current_text_background_colour(6, 0, 0, 0, 0); - render_dialogue_text(6, POS_CENTRED, 2 - PAKMENU_JP_OFFSET, gMenuText[ASSET_MENU_TEXT_CONTPAK1 + gMenuOption], 1, + render_dialogue_text(6, POS_CENTRED, 2 - PAKMENU_JP_OFFSET, gMenuText[ASSET_MENU_TEXT_CONTPAK1 + gMenuOption], + 1, HORZ_ALIGN_CENTER); // CONTROLLER PAK 1 / 2 / 3 / 4 - render_dialogue_text(6, POS_CENTRED, 16 - PAKMENU_JP_OFFSET, gMenuText[ASSET_MENU_TEXT_FREEPAGESX], sCurrentControllerPakFreePages, + render_dialogue_text(6, POS_CENTRED, 16 - PAKMENU_JP_OFFSET, gMenuText[ASSET_MENU_TEXT_FREEPAGESX], + sCurrentControllerPakFreePages, HORZ_ALIGN_CENTER); // FREE PAGES: ~ render_dialogue_box(&sMenuCurrDisplayList, NULL, NULL, 6); diff --git a/src/textures_sprites.h b/src/textures_sprites.h index a74c21b0..551d704b 100644 --- a/src/textures_sprites.h +++ b/src/textures_sprites.h @@ -95,6 +95,15 @@ typedef enum TransFlags { OBJ_FLAGS_DEACTIVATED = (1 << 15) // Object is invisible and inactive. } TransFlags; +typedef enum HeaderFlags { + HEADER_FLAGS_NONE, + HEADER_FLAGS_UNK_0001 = (1 << 0), + HEADER_FLAGS_UNK_0002 = (1 << 1), + HEADER_FLAGS_UNK_0004 = (1 << 2), + HEADER_FLAGS_UNK_0008 = (1 << 3), + HEADER_FLAGS_WATER_EFFECT = (1 << 4), +} HeaderFlags; + #define TEX_TABLE_2D 0 #define TEX_TABLE_3D 1 diff --git a/src/tracks.c b/src/tracks.c index dc57d646..8792558a 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -76,8 +76,8 @@ UNUSED s32 gIsNearCurrBBox; // Set to true if the current visible segment is clo UNUSED s32 D_8011B0C0; // Set to 0 then never read. UNUSED s32 gDisableShadows; // Never not 0. s32 gShadowHeapFlip; // Flips between 0 and 1 to prevent incorrect access between frames. -s32 D_8011B0CC; s32 gShadowIndex; +s32 gWaterEffectIndex; s32 gSceneStartSegment; s32 D_8011B0D8; s32 gSceneRenderSkyDome; @@ -110,16 +110,16 @@ s32 D_8011C3B8[320]; s32 D_8011C8B8[512]; s32 D_8011D0B8; Vec4f *D_8011D0BC; -TextureHeader *D_8011D0C0; -Object *D_8011D0C4; +TextureHeader *gNewShadowTexture; +Object *gNewShadowObj; f32 D_8011D0C8; -s16 D_8011D0CC; -s16 D_8011D0CE; +s16 gNewShadowY1; +s16 gNewShadowY2; s16 D_8011D0D0; f32 gShadowOpacity; -f32 D_8011D0D8; -f32 D_8011D0DC; -f32 D_8011D0E0; +f32 gNewShadowScale; +f32 gNewShadowWidth; +f32 gNewShadowLength; f32 D_8011D0E4; s32 D_8011D0E8; s32 D_8011D0EC; @@ -134,21 +134,21 @@ WaterProperties *gTrackWaves[20]; s8 D_8011D308; LevelModel *gTrackModelHeap; s32 *gLevelModelTable; -UNUSED f32 gPrevCameraX; // Set but never read -UNUSED f32 gPrevCameraY; // Set but never read -UNUSED f32 gPrevCameraZ; // Set but never read -Triangle *gShadowHeapTris[4]; -Triangle *gCurrentShadowTris; +UNUSED f32 gPrevCameraX; // Set but never read +UNUSED f32 gPrevCameraY; // Set but never read +UNUSED f32 gPrevCameraZ; // Set but never read +Triangle *gShadowHeapTris[2 * 2]; // Triangle Data for shadows +Triangle *gCurrShadowTris; UNUSED s32 D_8011D334; -Vertex *gShadowHeapVerts[4]; -Vertex *gCurrentShadowVerts; +Vertex *gShadowHeapVerts[2 * 2]; // Vertex Data for shadows +Vertex *gCurrShadowVerts; UNUSED s32 D_8011D34C; -DrawTexture *gShadowHeapTextures[4]; -DrawTexture *gCurrentShadowTexture; -s32 D_8011D364; -s32 D_8011D368; // xOffset? -s32 D_8011D36C; // yOffset? -u16 **D_8011D370; // Allocated 0x7D0 +ShadowHeapProperties *gShadowHeapData[2 * 2]; // General data for shadows. Texture and geometry size. +ShadowHeapProperties *gCurrShadowHeapData; +s32 gShadowTail; // Position in the heap the shadow data ends at. +s32 gNewShadowTriCount; // xOffset? +s32 gNewShadowVtxCount; // yOffset? +u16 **D_8011D370; // Allocated 0x7D0 s32 *D_8011D374; s32 D_8011D378; s32 gScenePlayerViewports; @@ -261,18 +261,20 @@ void init_track(u32 geometry, u32 skybox, s32 numberOfPlayers, Vehicle vehicle, numberOfPlayers = gScenePlayerViewports; gAntiAliasing = FALSE; - for (i = 0; i < ARRAY_COUNT(gShadowHeapTextures); i++) { - gShadowHeapTextures[i] = (DrawTexture *) mempool_alloc_safe(sizeof(DrawTexture) * 400, COLOUR_TAG_YELLOW); + // All shadow groups are double buffered. Environment shadows never change, so they could've single buffered them. + for (i = 0; i < ARRAY_COUNT(gShadowHeapData); i++) { + gShadowHeapData[i] = + (ShadowHeapProperties *) mempool_alloc_safe(sizeof(ShadowHeapProperties) * 400, COLOUR_TAG_YELLOW); gShadowHeapTris[i] = (Triangle *) mempool_alloc_safe(sizeof(Triangle) * 800, COLOUR_TAG_YELLOW); gShadowHeapVerts[i] = (Vertex *) mempool_alloc_safe(sizeof(Vertex) * 2000, COLOUR_TAG_YELLOW); } gShadowHeapFlip = 0; - update_shadows(SHADOW_SCENERY, SHADOW_SCENERY, LOGIC_NULL); - update_shadows(SHADOW_ACTORS, SHADOW_ACTORS, LOGIC_NULL); + shadow_update(SHADOW_SCENERY, SHADOW_SCENERY, LOGIC_NULL); + shadow_update(SHADOW_ACTORS, SHADOW_ACTORS, LOGIC_NULL); gShadowHeapFlip = 1; - update_shadows(SHADOW_SCENERY, SHADOW_SCENERY, LOGIC_NULL); - update_shadows(SHADOW_ACTORS, SHADOW_ACTORS, LOGIC_NULL); + shadow_update(SHADOW_SCENERY, SHADOW_SCENERY, LOGIC_NULL); + shadow_update(SHADOW_ACTORS, SHADOW_ACTORS, LOGIC_NULL); gShadowHeapFlip = 0; if (gCurrentLevelHeader2->unkB7) { D_8011B0E1 = gCurrentLevelHeader2->unkB4; @@ -312,7 +314,7 @@ void render_scene(Gfx **dList, MatrixS **mtx, Vertex **vtx, Triangle **tris, s32 if (gWaveBlockCount) { func_800B9C18(tempUpdateRate); } - update_shadows(SHADOW_ACTORS, SHADOW_ACTORS, updateRate); + shadow_update(SHADOW_ACTORS, SHADOW_ACTORS, updateRate); for (i = 0; i < 7; i++) { if ((s32) gCurrentLevelHeader2->unk74[i] != -1) { update_colour_cycle(gCurrentLevelHeader2->unk74[i], tempUpdateRate); @@ -1450,11 +1452,11 @@ void render_level_geometry_and_objects(void) { render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); continue; } else if (obj->shadow != NULL) { - render_object_shadow(obj, obj->shadow); + shadow_render(obj, obj->shadow); } render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); - if (obj->waterEffect != NULL && obj->segment.header->flags & 0x10) { - render_object_water_effects(obj, obj->waterEffect); + if (obj->waterEffect != NULL && obj->segment.header->flags & HEADER_FLAGS_WATER_EFFECT) { + watereffect_render(obj, obj->waterEffect); } } } @@ -1473,11 +1475,11 @@ void render_level_geometry_and_objects(void) { render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); continue; } else if (obj->shadow != NULL) { - render_object_shadow(obj, obj->shadow); + shadow_render(obj, obj->shadow); } render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); - if ((obj->waterEffect != NULL) && (obj->segment.header->flags & 0x10)) { - render_object_water_effects(obj, obj->waterEffect); + if (obj->waterEffect != NULL && obj->segment.header->flags & HEADER_FLAGS_WATER_EFFECT) { + watereffect_render(obj, obj->waterEffect); } } } @@ -1519,11 +1521,11 @@ void render_level_geometry_and_objects(void) { render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); goto skip; } else if (obj->shadow != NULL) { - render_object_shadow(obj, obj->shadow); + shadow_render(obj, obj->shadow); } render_object(&gSceneCurrDisplayList, &gSceneCurrMatrix, &gSceneCurrVertexList, obj); if ((obj->waterEffect != 0) && (obj->segment.header->flags & 0x10)) { - render_object_water_effects(obj, obj->waterEffect); + watereffect_render(obj, obj->waterEffect); } } skip: @@ -2456,8 +2458,8 @@ void free_track(void) { mempool_free(D_8011D370); mempool_free(D_8011D374); free_sprite((Sprite *) gCurrentLevelModel->minimapSpriteIndex); - for (i = 0; i < MAXCONTROLLERS; i++) { - mempool_free(gShadowHeapTextures[i]); + for (i = 0; i < ARRAY_COUNT(gShadowHeapData); i++) { + mempool_free(gShadowHeapData[i]); mempool_free(gShadowHeapTris[i]); mempool_free(gShadowHeapVerts[i]); } @@ -2581,30 +2583,30 @@ void trackMakeAbsolute(unk8002D30C_a0 *arg0, s32 arg1) { * Render the shadow of an object on the ground as a decal. * Can subdivide itself to wrap around the terrain properly, as the N64 lacks stencil buffering. */ -void render_object_shadow(Object *obj, ShadowData *shadow) { +void shadow_render(Object *obj, ShadowData *shadow) { s32 i; s32 numVerts; s32 numTris; Vertex *vtx; Triangle *tri; s32 flags; - UNUSED s32 offsetX_2; - s32 offsetY_2; - s32 offsetY; - s32 offsetX; + UNUSED s32 tri2; + s32 vtx2; + s32 vtxCount; + s32 triCount; s32 alpha; if (obj->segment.header->shadowGroup) { if (shadow->meshStart != -1 && gDisableShadows == FALSE) { - D_8011B0CC = gShadowHeapFlip; + gShadowIndex = gShadowHeapFlip; if (obj->segment.header->shadowGroup == SHADOW_SCENERY) { - D_8011B0CC += 2; + gShadowIndex += 2; } i = shadow->meshStart; - gCurrentShadowTexture = gShadowHeapTextures[D_8011B0CC]; - gCurrentShadowTris = gShadowHeapTris[D_8011B0CC]; - gCurrentShadowVerts = gShadowHeapVerts[D_8011B0CC]; - alpha = gCurrentShadowVerts[gCurrentShadowTexture[i].yOffset].a; + gCurrShadowHeapData = gShadowHeapData[gShadowIndex]; + gCurrShadowTris = gShadowHeapTris[gShadowIndex]; + gCurrShadowVerts = gShadowHeapVerts[gShadowIndex]; + alpha = gCurrShadowVerts[gCurrShadowHeapData[i].vtxCount].a; flags = RENDER_FOG_ACTIVE | RENDER_Z_COMPARE; if (alpha == 0 || obj->segment.object.opacity == 0) { i = shadow->meshEnd; // It'd be easier to just return... @@ -2614,14 +2616,14 @@ void render_object_shadow(Object *obj, ShadowData *shadow) { gDPSetPrimColor(gSceneCurrDisplayList++, 0, 0, 255, 255, 255, alpha); } while (i < shadow->meshEnd) { - load_and_set_texture_no_offset(&gSceneCurrDisplayList, gCurrentShadowTexture[i].texture, flags); + load_and_set_texture_no_offset(&gSceneCurrDisplayList, gCurrShadowHeapData[i].texture, flags); // I hope we can clean this part up. - offsetX_2 = offsetX = gCurrentShadowTexture[i].xOffset; // Fakematch - offsetY_2 = offsetY = gCurrentShadowTexture[i].yOffset; - numTris = gCurrentShadowTexture[i + 1].xOffset - offsetX; - numVerts = gCurrentShadowTexture[i + 1].yOffset - offsetY; - tri = &gCurrentShadowTris[offsetX]; - vtx = &gCurrentShadowVerts[offsetY_2]; + tri2 = triCount = gCurrShadowHeapData[i].triCount; // Fakematch + vtx2 = vtxCount = gCurrShadowHeapData[i].vtxCount; + numTris = gCurrShadowHeapData[i + 1].triCount - triCount; + numVerts = gCurrShadowHeapData[i + 1].vtxCount - vtxCount; + tri = &gCurrShadowTris[triCount]; + vtx = &gCurrShadowVerts[vtx2]; gSPVertexDKR(gSceneCurrDisplayList++, OS_K0_TO_PHYSICAL(vtx), numVerts, 0); gSPPolygon(gSceneCurrDisplayList++, OS_K0_TO_PHYSICAL(tri), numTris, 1); i++; @@ -2638,40 +2640,39 @@ void render_object_shadow(Object *obj, ShadowData *shadow) { * Used only by cars, render a texture on the surface of the water where the car is * to give the wave effect. Works almost identically to shadows, since water can be wavy. */ -void render_object_water_effects(Object *obj, WaterEffect *effect) { +void watereffect_render(Object *obj, WaterEffect *effect) { s32 i; s32 numVerts; s32 numTris; Vertex *vtx; Triangle *tri; s32 flags; - UNUSED s32 offsetX; - UNUSED s32 offsetY; + UNUSED s32 triCount; + UNUSED s32 vtxCount; if (obj->segment.header->waterEffectGroup) { if (effect->meshStart != -1 && gDisableShadows == FALSE) { - gShadowIndex = gShadowHeapFlip; + gWaterEffectIndex = gShadowHeapFlip; i = effect->meshStart; if (obj->segment.header->waterEffectGroup == SHADOW_SCENERY) { - gShadowIndex = gShadowHeapFlip; - gShadowIndex += 2; + gWaterEffectIndex += 2; if (get_distance_to_active_camera(obj->segment.trans.x_position, obj->segment.trans.y_position, obj->segment.trans.z_position) > 768.0f) { i = effect->meshEnd; // Just return. } } flags = RENDER_FOG_ACTIVE | RENDER_Z_COMPARE; - gCurrentShadowTexture = gShadowHeapTextures[gShadowIndex]; - gCurrentShadowTris = gShadowHeapTris[gShadowIndex]; - gCurrentShadowVerts = gShadowHeapVerts[gShadowIndex]; + gCurrShadowHeapData = gShadowHeapData[gWaterEffectIndex]; + gCurrShadowTris = gShadowHeapTris[gWaterEffectIndex]; + gCurrShadowVerts = gShadowHeapVerts[gWaterEffectIndex]; while (i < effect->meshEnd) { - load_and_set_texture_no_offset(&gSceneCurrDisplayList, gCurrentShadowTexture[i].texture, flags); - offsetX = gCurrentShadowTexture[i].xOffset; // Fakematch - offsetY = gCurrentShadowTexture[i].yOffset; // Fakematch - numTris = gCurrentShadowTexture[i + 1].xOffset - gCurrentShadowTexture[i].xOffset; - numVerts = gCurrentShadowTexture[i + 1].yOffset - gCurrentShadowTexture[i].yOffset; - tri = &gCurrentShadowTris[gCurrentShadowTexture[i].xOffset]; - vtx = &gCurrentShadowVerts[gCurrentShadowTexture[i].yOffset]; + load_and_set_texture_no_offset(&gSceneCurrDisplayList, gCurrShadowHeapData[i].texture, flags); + triCount = gCurrShadowHeapData[i].triCount; // Fakematch + vtxCount = gCurrShadowHeapData[i].vtxCount; // Fakematch + numTris = gCurrShadowHeapData[i + 1].triCount - gCurrShadowHeapData[i].triCount; + numVerts = gCurrShadowHeapData[i + 1].vtxCount - gCurrShadowHeapData[i].vtxCount; + tri = &gCurrShadowTris[gCurrShadowHeapData[i].triCount]; + vtx = &gCurrShadowVerts[gCurrShadowHeapData[i].vtxCount]; gSPVertexDKR(gSceneCurrDisplayList++, OS_K0_TO_PHYSICAL(vtx), numVerts, 0); gSPPolygon(gSceneCurrDisplayList++, OS_K0_TO_PHYSICAL(tri), numTris, 1); i++; @@ -2683,9 +2684,9 @@ void render_object_water_effects(Object *obj, WaterEffect *effect) { /** * Updates shadow and water effect properties for each relevant object in the scene. * The first argument decides whether to update shadows for static objects or moving objects. - * Checks how many players there are before deciding whether to cast a shadow for that object. + * In multiplayer, only important objects get shadows. */ -void update_shadows(s32 group, s32 waterGroup, s32 updateRate) { +void shadow_update(s32 group, s32 waterGroup, s32 updateRate) { s32 objIndex; s32 objectCount; Object *obj; @@ -2700,16 +2701,16 @@ void update_shadows(s32 group, s32 waterGroup, s32 updateRate) { WaterEffect *waterEffect; s32 playerIndex; - D_8011B0CC = gShadowHeapFlip; + gShadowIndex = gShadowHeapFlip; if (group == SHADOW_SCENERY) { - D_8011B0CC += 2; + gShadowIndex += 2; } - gCurrentShadowTris = (Triangle *) gShadowHeapTris[D_8011B0CC]; - gCurrentShadowVerts = (Vertex *) gShadowHeapVerts[D_8011B0CC]; - gCurrentShadowTexture = (DrawTexture *) gShadowHeapTextures[D_8011B0CC]; - D_8011D364 = 0; - D_8011D368 = 0; - D_8011D36C = 0; + gCurrShadowTris = (Triangle *) gShadowHeapTris[gShadowIndex]; + gCurrShadowVerts = (Vertex *) gShadowHeapVerts[gShadowIndex]; + gCurrShadowHeapData = (ShadowHeapProperties *) gShadowHeapData[gShadowIndex]; + gShadowTail = 0; + gNewShadowTriCount = 0; + gNewShadowVtxCount = 0; numViewports = get_viewport_count(); objects = objGetObjList(&objIndex, &objectCount); while (objIndex < objectCount) { @@ -2717,8 +2718,8 @@ void update_shadows(s32 group, s32 waterGroup, s32 updateRate) { objHeader = obj->segment.header; waterEffect = obj->waterEffect; shadow = obj->shadow; - objIndex += 1; - if ((obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED)) { + objIndex++; + if (obj->segment.trans.flags & OBJ_FLAGS_DEACTIVATED) { continue; } if (shadow != NULL && shadow->scale > 0.0f && group == objHeader->shadowGroup) { @@ -2738,24 +2739,26 @@ void update_shadows(s32 group, s32 waterGroup, s32 updateRate) { gShadowOpacity = 1.0f; shadow->meshStart = -1; skipShading = FALSE; - if (objHeader->shadowGroup == SHADOW_ACTORS && numViewports > ONE_PLAYER && numViewports <= FOUR_PLAYERS) { + // Multiplayer + if (objHeader->shadowGroup == SHADOW_ACTORS && numViewports >= TWO_PLAYERS && + numViewports <= FOUR_PLAYERS) { if (obj->behaviorId == BHV_RACER) { playerIndex = obj->unk64->racer.playerIndex; if (playerIndex != PLAYER_COMPUTER) { - func_8002E234(obj, FALSE); + shadow_generate(obj, FALSE); skipShading = TRUE; } } else if (obj->behaviorId == BHV_WEAPON) { - func_8002E234(obj, FALSE); + shadow_generate(obj, FALSE); skipShading = TRUE; } - } else { - radius = objHeader->unk4A; + } else { // Single Player + radius = objHeader->shadowFadeMin; if (dist < radius) { - if (objHeader->unk4C < dist) { - gShadowOpacity = (radius - dist) / (radius - objHeader->unk4C); + if (objHeader->shadowFadeMax < dist) { + gShadowOpacity = (radius - dist) / (radius - objHeader->shadowFadeMax); } - func_8002E234(obj, FALSE); + shadow_generate(obj, FALSE); skipShading = TRUE; } } @@ -2774,27 +2777,30 @@ void update_shadows(s32 group, s32 waterGroup, s32 updateRate) { } } - if (objHeader->shadowGroup == SHADOW_ACTORS && numViewports > ONE_PLAYER && numViewports <= FOUR_PLAYERS) { + // Multiplayer + if (objHeader->shadowGroup == SHADOW_ACTORS && numViewports >= TWO_PLAYERS && + numViewports <= FOUR_PLAYERS) { if (obj->behaviorId == BHV_RACER) { playerIndex = obj->unk64->racer.playerIndex; if (playerIndex != PLAYER_COMPUTER) { - func_8002E234(obj, TRUE); + shadow_generate(obj, TRUE); } } else if (obj->behaviorId == BHV_WEAPON) { - func_8002E234(obj, TRUE); + shadow_generate(obj, TRUE); } - } else { - if (dist < objHeader->unk4A) { - if (objHeader->unk4C < dist) { - gShadowOpacity = (objHeader->unk4A - dist) / (objHeader->unk4A - objHeader->unk4C); + } else { // Single Player + if (dist < objHeader->shadowFadeMin) { + if (objHeader->shadowFadeMax < dist) { + gShadowOpacity = + (objHeader->shadowFadeMin - dist) / (objHeader->shadowFadeMin - objHeader->shadowFadeMax); } - func_8002E234(obj, TRUE); + shadow_generate(obj, TRUE); } } } } - gCurrentShadowTexture[D_8011D364].xOffset = D_8011D368; - gCurrentShadowTexture[D_8011D364].yOffset = D_8011D36C; + gCurrShadowHeapData[gShadowTail].triCount = gNewShadowTriCount; + gCurrShadowHeapData[gShadowTail].vtxCount = gNewShadowVtxCount; } void func_8002DE30(Object *obj) { @@ -2858,9 +2864,12 @@ void func_8002DE30(Object *obj) { } } -// Generate shadow -void func_8002E234(Object *obj, s32 bool) { - f32 var_f2; +/** + * Generate shadow geometry for an object. + * Handles water effects too, isWater is true. + */ +void shadow_generate(Object *obj, s32 isWater) { + f32 dist; s32 yPos; f32 xPos; f32 zPos; @@ -2883,45 +2892,45 @@ void func_8002E234(Object *obj, s32 bool) { } } - D_8011D0C4 = obj; + gNewShadowObj = obj; D_8011D0C8 = 2.0f; - if (bool) { + if (isWater) { D_8011D0B8 = 0; - obj->waterEffect->meshStart = D_8011D364; - D_8011D0C0 = set_animated_texture_header(obj->waterEffect->texture, obj->waterEffect->textureFrame << 8); - D_8011D0CE = obj->segment.header->unk48 + yPos; - D_8011D0CC = obj->segment.header->unk46 + yPos; - if ((gWaveBlockCount == 0) || ((get_viewport_count() <= 0))) { + obj->waterEffect->meshStart = gShadowTail; + gNewShadowTexture = set_animated_texture_header(obj->waterEffect->texture, obj->waterEffect->textureFrame << 8); + gNewShadowY2 = obj->segment.header->shadowTop + yPos; + gNewShadowY1 = obj->segment.header->shadowBottom + yPos; + if (gWaveBlockCount == 0 || get_viewport_count() < VIEWPORTS_COUNT_2_PLAYERS) { D_8011D0C8 = 0; } - D_8011D0D8 = (obj->waterEffect->scale * character_scale); - D_8011D0DC = D_8011D0D8 * 10.0f; - D_8011D0E0 = D_8011D0D8 * 10.0f; + gNewShadowScale = (obj->waterEffect->scale * character_scale); + gNewShadowWidth = gNewShadowScale * 10.0f; + gNewShadowLength = gNewShadowScale * 10.0f; D_8011D0F0 = -1.0f; } else { - obj->shadow->meshStart = D_8011D364; - D_8011D0C0 = obj->shadow->texture; - D_8011D0CE = obj->segment.header->unk44 + yPos; - D_8011D0CC = obj->segment.header->unk42 + yPos; + obj->shadow->meshStart = gShadowTail; + gNewShadowTexture = obj->shadow->texture; + gNewShadowY2 = obj->segment.header->unk44 + yPos; + gNewShadowY1 = obj->segment.header->unk42 + yPos; if (obj->behaviorId != BHV_RACER) { - var_f2 = obj->segment.object.distanceToCamera; - if (var_f2 < 0.0) { - var_f2 = -var_f2; + dist = obj->segment.object.distanceToCamera; + if (dist < 0.0) { + dist = -dist; } - var_f2 -= 512.0; - if (var_f2 < 0.0) { - var_f2 = 0.0; + dist -= 512.0; + if (dist < 0.0) { + dist = 0.0; } - if (var_f2 > 1024.0) { - var_f2 = 1024.0; + if (dist > 1024.0) { + dist = 1024.0; } - D_8011D0C8 += (var_f2 * 0.005f); + D_8011D0C8 += (dist * 0.005f); } - D_8011D0D8 = (obj->shadow->scale * character_scale); - D_8011D0DC = D_8011D0D8 * 10.0f; - D_8011D0E0 = D_8011D0D8 * 10.0f; - D_8011D0E4 = 4.0f * D_8011D0DC * D_8011D0E0; + gNewShadowScale = (obj->shadow->scale * character_scale); + gNewShadowWidth = gNewShadowScale * 10.0f; + gNewShadowLength = gNewShadowScale * 10.0f; + D_8011D0E4 = 4.0f * gNewShadowWidth * gNewShadowLength; D_8011D0F0 = (obj->segment.header->unk42 * 0.125f); if (D_8011D0F0 < 0.0f) { D_8011D0F0 = -D_8011D0F0; @@ -2929,11 +2938,11 @@ void func_8002E234(Object *obj, s32 bool) { D_8011D0F4 = (7.0f * D_8011D0F0); D_8011D0D0 = -0x8000; } - D_8011D0D8 = 144.0f / D_8011D0D8; - xPos = D_8011D0C4->segment.trans.x_position; - zPos = D_8011D0C4->segment.trans.z_position; - segs = get_inside_segment_count_xyz(inSegs, (xPos - D_8011D0DC), D_8011D0CC, (zPos - D_8011D0E0), - (xPos + D_8011D0DC), D_8011D0CE, (zPos + D_8011D0E0)); + gNewShadowScale = 144.0f / gNewShadowScale; + xPos = gNewShadowObj->segment.trans.x_position; + zPos = gNewShadowObj->segment.trans.z_position; + segs = get_inside_segment_count_xyz(inSegs, (xPos - gNewShadowWidth), gNewShadowY1, (zPos - gNewShadowLength), + (xPos + gNewShadowWidth), gNewShadowY2, (zPos + gNewShadowLength)); D_8011C230 = 0; D_8011B118 = 0; for (i = 0; i < ARRAY_COUNT(D_8011B320); i++) { @@ -2943,30 +2952,30 @@ void func_8002E234(Object *obj, s32 bool) { D_8011D0EC = -1; for (i = 0; i < segs; i++) { if (inSegs[i] >= 0) { - if (bool && (gCurrentLevelModel->segments[inSegs[i]].hasWaves != 0) && (gWaveBlockCount != 0)) { + if (isWater && (gCurrentLevelModel->segments[inSegs[i]].hasWaves != 0) && (gWaveBlockCount != 0)) { func_8002EEEC(inSegs[i]); } else { test = func_800314DC(&gCurrentLevelModel->segmentsBoundingBoxes[inSegs[i]], - (obj->segment.trans.x_position - D_8011D0DC), // x1 - (obj->segment.trans.z_position - D_8011D0E0), // z1 - (obj->segment.trans.x_position + D_8011D0DC), // x2 - (obj->segment.trans.z_position + D_8011D0E0) // z2 + (obj->segment.trans.x_position - gNewShadowWidth), // x1 + (obj->segment.trans.z_position - gNewShadowLength), // z1 + (obj->segment.trans.x_position + gNewShadowWidth), // x2 + (obj->segment.trans.z_position + gNewShadowLength) // z2 ); - func_8002E904(&gCurrentLevelModel->segments[inSegs[i]], test, bool); + func_8002E904(&gCurrentLevelModel->segments[inSegs[i]], test, isWater); } } } if (D_8011C230 > 0) { - if ((obj->shading != NULL) && !bool) { + if ((obj->shading != NULL) && isWater == FALSE) { obj->shading->unk0 = func_8002FA64(); } func_8002F2AC(); func_8002F440(); } - if (!bool) { - obj->shadow->meshEnd = D_8011D364; + if (isWater == FALSE) { + obj->shadow->meshEnd = gShadowTail; } else { - obj->waterEffect->meshEnd = D_8011D364; + obj->waterEffect->meshEnd = gShadowTail; } } @@ -3107,26 +3116,26 @@ void func_800304C8(Vec4f *arg0) { temp = arg0[0].z; arg00z = temp; compare = 0.0f; - temp = (D_8011D0C4->segment.trans.z_position - arg0[1].z); + temp = (gNewShadowObj->segment.trans.z_position - arg0[1].z); - if ((((D_8011D0C4->segment.trans.x_position - arg0[0].x) * (arg0[1].z - arg00z)) - - ((arg0[1].x - arg0[0].x) * (((0, D_8011D0C4->segment.trans.z_position)) - arg00z))) >= compare) { + if ((((gNewShadowObj->segment.trans.x_position - arg0[0].x) * (arg0[1].z - arg00z)) - + ((arg0[1].x - arg0[0].x) * (((0, gNewShadowObj->segment.trans.z_position)) - arg00z))) >= compare) { found1 = TRUE; } - if ((((D_8011D0C4->segment.trans.x_position - arg0[1].x) * (arg0[2].z - arg0[1].z)) - + if ((((gNewShadowObj->segment.trans.x_position - arg0[1].x) * (arg0[2].z - arg0[1].z)) - (temp * (arg0[2].x - arg0[1].x))) >= compare) { found2 = TRUE; } arg02x = arg0[2].x; if (found1 == found2) { f32 zPosDiff = (arg00z - arg0[2].z); - if ((((D_8011D0C4->segment.trans.x_position - arg02x) * zPosDiff) - + if ((((gNewShadowObj->segment.trans.x_position - arg02x) * zPosDiff) - ((arg0[0].x - arg02x) * (arg02x - arg0[2].z))) >= compare) { found3 = TRUE; } if (found2 == found3) { - f32 test = (-(((D_8011D0BC->x * D_8011D0C4->segment.trans.x_position) + - (D_8011D0BC->z * D_8011D0C4->segment.trans.z_position)) + + f32 test = (-(((D_8011D0BC->x * gNewShadowObj->segment.trans.x_position) + + (D_8011D0BC->z * gNewShadowObj->segment.trans.z_position)) + D_8011D0BC->w)) / D_8011D0BC->y; if (D_8011D0D0 < test) { diff --git a/src/tracks.h b/src/tracks.h index f46a9621..1989eacd 100644 --- a/src/tracks.h +++ b/src/tracks.h @@ -169,13 +169,13 @@ s32 check_if_inside_segment(Object *obj, s32 segmentIndex); s32 get_level_segment_index_from_position(f32 xPos, f32 yPos, f32 zPos); void traverse_segments_bsp_tree(s32 nodeIndex, s32 segmentIndex, s32 segmentIndex2, u8 *segmentsOrder, s32 *segmentsOrderIndex); void render_level_geometry_and_objects(void); -void render_object_water_effects(Object *obj, WaterEffect *effect); -void render_object_shadow(Object *obj, ShadowData *shadow); +void watereffect_render(Object *obj, WaterEffect *effect); +void shadow_render(Object *obj, ShadowData *shadow); s32 should_segment_be_visible(LevelModelSegmentBoundingBox *bb); s32 check_if_in_draw_range(Object *obj); void func_8002C954(LevelModelSegment *segment, LevelModelSegmentBoundingBox *bbox, s32 arg2); void draw_gradient_background(void); -void update_shadows(s32 group, s32 waterGroup, s32 updateRate); +void shadow_update(s32 group, s32 waterGroup, s32 updateRate); void obj_loop_fogchanger(Object* obj); void initialise_player_viewport_vars(s32 updateRate); s32 get_wave_properties(f32 yPos, f32 *waterHeight, Vec3f *rotation); @@ -200,7 +200,7 @@ void update_colour_cycle(LevelHeader_70 *arg0, s32 updateRate); void func_800B9C18(s32); void func_800BA8E4(Gfx**, MatrixS**, s32); void func_8002DE30(Object*); -void func_8002E234(Object*, s32); +void shadow_generate(Object*, s32); void func_8002E904(LevelModelSegment *, s32, s32 bool); void func_8002EEEC(s32 arg0); void func_8002F2AC(void); diff --git a/ver/symbols/symbol_addrs.jpn.v79.txt b/ver/symbols/symbol_addrs.jpn.v79.txt index a7538afe..d4306602 100644 --- a/ver/symbols/symbol_addrs.jpn.v79.txt +++ b/ver/symbols/symbol_addrs.jpn.v79.txt @@ -450,11 +450,11 @@ free_track = 0x8002C7D4; func_8002C954 = 0x8002C954; func_8002CC30 = 0x8002CC30; trackMakeAbsolute = 0x8002D30C; -render_object_shadow = 0x8002D384; -render_object_water_effects = 0x8002D670; -update_shadows = 0x8002D8DC; +shadow_render = 0x8002D384; +watereffect_render = 0x8002D670; +shadow_update = 0x8002D8DC; func_8002DE30 = 0x8002DE30; -func_8002E234 = 0x8002E234; +shadow_generate = 0x8002E234; func_8002E904 = 0x8002E904; func_8002EEEC = 0x8002EEEC; func_8002F2AC = 0x8002F2AC; @@ -3714,8 +3714,8 @@ gIsNearCurrBBox = 0x8011CB2C; D_8011B0C0 = 0x8011CB30; gDisableShadows = 0x8011CB34; gShadowHeapFlip = 0x8011CB38; -D_8011B0CC = 0x8011CB3C; -gShadowIndex = 0x8011CB40; +gShadowIndex = 0x8011CB3C; +gWaterEffectIndex = 0x8011CB40; gSceneStartSegment = 0x8011CB44; D_8011B0D8 = 0x8011CB48; gSceneRenderSkyDome = 0x8011CB4C; @@ -3748,16 +3748,16 @@ D_8011C3B8 = 0x8011DE28; D_8011C8B8 = 0x8011E328; D_8011D0B8 = 0x8011EB28; D_8011D0BC = 0x8011EB2C; -D_8011D0C0 = 0x8011EB30; -D_8011D0C4 = 0x8011EB34; +gNewShadowTexture = 0x8011EB30; +gNewShadowObj = 0x8011EB34; D_8011D0C8 = 0x8011EB38; -D_8011D0CC = 0x8011EB3C; -D_8011D0CE = 0x8011EB3E; +gNewShadowY1 = 0x8011EB3C; +gNewShadowY2 = 0x8011EB3E; D_8011D0D0 = 0x8011EB40; gShadowOpacity = 0x8011EB44; -D_8011D0D8 = 0x8011EB48; -D_8011D0DC = 0x8011EB4C; -D_8011D0E0 = 0x8011EB50; +gNewShadowScale = 0x8011EB48; +gNewShadowWidth = 0x8011EB4C; +gNewShadowLength = 0x8011EB50; D_8011D0E4 = 0x8011EB54; D_8011D0E8 = 0x8011EB58; D_8011D0EC = 0x8011EB5C; @@ -3776,16 +3776,16 @@ gPrevCameraX = 0x8011ED84; gPrevCameraY = 0x8011ED88; gPrevCameraZ = 0x8011ED8C; gShadowHeapTris = 0x8011ED90; -gCurrentShadowTris = 0x8011EDA0; +gCurrShadowTris = 0x8011EDA0; D_8011D334 = 0x8011EDA4; gShadowHeapVerts = 0x8011EDA8; -gCurrentShadowVerts = 0x8011EDB8; +gCurrShadowVerts = 0x8011EDB8; D_8011D34C = 0x8011EDBC; -gShadowHeapTextures = 0x8011EDC0; -gCurrentShadowTexture = 0x8011EDD0; -D_8011D364 = 0x8011EDD4; -D_8011D368 = 0x8011EDD8; -D_8011D36C = 0x8011EDDC; +gShadowHeapData = 0x8011EDC0; +gCurrShadowHeapData = 0x8011EDD0; +gShadowTail = 0x8011EDD4; +gNewShadowTriCount = 0x8011EDD8; +gNewShadowVtxCount = 0x8011EDDC; D_8011D370 = 0x8011EDE0; D_8011D374 = 0x8011EDE4; D_8011D378 = 0x8011EDE8; diff --git a/ver/symbols/symbol_addrs.pal.v77.txt b/ver/symbols/symbol_addrs.pal.v77.txt index 65fa914b..baa753c3 100644 --- a/ver/symbols/symbol_addrs.pal.v77.txt +++ b/ver/symbols/symbol_addrs.pal.v77.txt @@ -450,11 +450,11 @@ free_track = 0x8002C7D4; func_8002C954 = 0x8002C954; func_8002CC30 = 0x8002CC30; trackMakeAbsolute = 0x8002D30C; -render_object_shadow = 0x8002D384; -render_object_water_effects = 0x8002D670; -update_shadows = 0x8002D8DC; +shadow_render = 0x8002D384; +watereffect_render = 0x8002D670; +shadow_update = 0x8002D8DC; func_8002DE30 = 0x8002DE30; -func_8002E234 = 0x8002E234; +shadow_generate = 0x8002E234; func_8002E904 = 0x8002E904; func_8002EEEC = 0x8002EEEC; func_8002F2AC = 0x8002F2AC; @@ -3459,8 +3459,8 @@ gIsNearCurrBBox = 0x8011B14C; D_8011B0C0 = 0x8011B150; gDisableShadows = 0x8011B154; gShadowHeapFlip = 0x8011B158; -D_8011B0CC = 0x8011B15C; -gShadowIndex = 0x8011B160; +gShadowIndex = 0x8011B15C; +gWaterEffectIndex = 0x8011B160; gSceneStartSegment = 0x8011B164; D_8011B0D8 = 0x8011B168; gSceneRenderSkyDome = 0x8011B16C; @@ -3493,16 +3493,16 @@ D_8011C3B8 = 0x8011C448; D_8011C8B8 = 0x8011C948; D_8011D0B8 = 0x8011D148; D_8011D0BC = 0x8011D14C; -D_8011D0C0 = 0x8011D150; -D_8011D0C4 = 0x8011D154; +gNewShadowTexture = 0x8011D150; +gNewShadowObj = 0x8011D154; D_8011D0C8 = 0x8011D158; -D_8011D0CC = 0x8011D15C; -D_8011D0CE = 0x8011D15E; +gNewShadowY1 = 0x8011D15C; +gNewShadowY2 = 0x8011D15E; D_8011D0D0 = 0x8011D160; gShadowOpacity = 0x8011D164; -D_8011D0D8 = 0x8011D168; -D_8011D0DC = 0x8011D16C; -D_8011D0E0 = 0x8011D170; +gNewShadowScale = 0x8011D168; +gNewShadowWidth = 0x8011D16C; +gNewShadowLength = 0x8011D170; D_8011D0E4 = 0x8011D174; D_8011D0E8 = 0x8011D178; D_8011D0EC = 0x8011D17C; @@ -3521,16 +3521,16 @@ gPrevCameraX = 0x8011D3A4; gPrevCameraY = 0x8011D3A8; gPrevCameraZ = 0x8011D3AC; gShadowHeapTris = 0x8011D3B0; -gCurrentShadowTris = 0x8011D3C0; +gCurrShadowTris = 0x8011D3C0; D_8011D334 = 0x8011D3C4; gShadowHeapVerts = 0x8011D3C8; -gCurrentShadowVerts = 0x8011D3D8; +gCurrShadowVerts = 0x8011D3D8; D_8011D34C = 0x8011D3DC; -gShadowHeapTextures = 0x8011D3E0; -gCurrentShadowTexture = 0x8011D3F0; -D_8011D364 = 0x8011D3F4; -D_8011D368 = 0x8011D3F8; -D_8011D36C = 0x8011D3FC; +gShadowHeapData = 0x8011D3E0; +gCurrShadowHeapData = 0x8011D3F0; +gShadowTail = 0x8011D3F4; +gNewShadowTriCount = 0x8011D3F8; +gNewShadowVtxCount = 0x8011D3FC; D_8011D370 = 0x8011D400; D_8011D374 = 0x8011D404; D_8011D378 = 0x8011D408; diff --git a/ver/symbols/symbol_addrs.pal.v80.txt b/ver/symbols/symbol_addrs.pal.v80.txt index 5ab35bac..8a61125b 100644 --- a/ver/symbols/symbol_addrs.pal.v80.txt +++ b/ver/symbols/symbol_addrs.pal.v80.txt @@ -446,11 +446,11 @@ free_track = 0x8002C814; func_8002C954 = 0x8002C994; func_8002CC30 = 0x8002CC70; trackMakeAbsolute = 0x8002D34C; -render_object_shadow = 0x8002D3C4; -render_object_water_effects = 0x8002D6B0; -update_shadows = 0x8002D91C; +shadow_render = 0x8002D3C4; +watereffect_render = 0x8002D6B0; +shadow_update = 0x8002D91C; func_8002DE30 = 0x8002DE70; -func_8002E234 = 0x8002E274; +shadow_generate = 0x8002E274; func_8002E904 = 0x8002E944; func_8002EEEC = 0x8002EF2C; func_8002F2AC = 0x8002F2EC; @@ -3389,8 +3389,8 @@ gIsNearCurrBBox = 0x8011B6CC; D_8011B0C0 = 0x8011B6D0; gDisableShadows = 0x8011B6D4; gShadowHeapFlip = 0x8011B6D8; -D_8011B0CC = 0x8011B6DC; -gShadowIndex = 0x8011B6E0; +gShadowIndex = 0x8011B6DC; +gWaterEffectIndex = 0x8011B6E0; gSceneStartSegment = 0x8011B6E4; D_8011B0D8 = 0x8011B6E8; gSceneRenderSkyDome = 0x8011B6EC; @@ -3423,16 +3423,16 @@ D_8011C3B8 = 0x8011C9C8; D_8011C8B8 = 0x8011CEC8; D_8011D0B8 = 0x8011D6C8; D_8011D0BC = 0x8011D6CC; -D_8011D0C0 = 0x8011D6D0; -D_8011D0C4 = 0x8011D6D4; +gNewShadowTexture = 0x8011D6D0; +gNewShadowObj = 0x8011D6D4; D_8011D0C8 = 0x8011D6D8; -D_8011D0CC = 0x8011D6DC; -D_8011D0CE = 0x8011D6DE; +gNewShadowY1 = 0x8011D6DC; +gNewShadowY2 = 0x8011D6DE; D_8011D0D0 = 0x8011D6E0; gShadowOpacity = 0x8011D6E4; -D_8011D0D8 = 0x8011D6E8; -D_8011D0DC = 0x8011D6EC; -D_8011D0E0 = 0x8011D6F0; +gNewShadowScale = 0x8011D6E8; +gNewShadowWidth = 0x8011D6EC; +gNewShadowLength = 0x8011D6F0; D_8011D0E4 = 0x8011D6F4; D_8011D0E8 = 0x8011D6F8; D_8011D0EC = 0x8011D6FC; @@ -3451,16 +3451,16 @@ gPrevCameraX = 0x8011D924; gPrevCameraY = 0x8011D928; gPrevCameraZ = 0x8011D92C; gShadowHeapTris = 0x8011D930; -gCurrentShadowTris = 0x8011D940; +gCurrShadowTris = 0x8011D940; D_8011D334 = 0x8011D944; gShadowHeapVerts = 0x8011D948; -gCurrentShadowVerts = 0x8011D958; +gCurrShadowVerts = 0x8011D958; D_8011D34C = 0x8011D95C; -gShadowHeapTextures = 0x8011D960; -gCurrentShadowTexture = 0x8011D970; -D_8011D364 = 0x8011D974; -D_8011D368 = 0x8011D978; -D_8011D36C = 0x8011D97C; +gShadowHeapData = 0x8011D960; +gCurrShadowHeapData = 0x8011D970; +gShadowTail = 0x8011D974; +gNewShadowTriCount = 0x8011D978; +gNewShadowVtxCount = 0x8011D97C; D_8011D370 = 0x8011D980; D_8011D374 = 0x8011D984; D_8011D378 = 0x8011D988; diff --git a/ver/symbols/symbol_addrs.us.v77.txt b/ver/symbols/symbol_addrs.us.v77.txt index f2423570..a35fb706 100644 --- a/ver/symbols/symbol_addrs.us.v77.txt +++ b/ver/symbols/symbol_addrs.us.v77.txt @@ -450,11 +450,11 @@ free_track = 0x8002C7D4; func_8002C954 = 0x8002C954; func_8002CC30 = 0x8002CC30; trackMakeAbsolute = 0x8002D30C; -render_object_shadow = 0x8002D384; -render_object_water_effects = 0x8002D670; -update_shadows = 0x8002D8DC; +shadow_render = 0x8002D384; +watereffect_render = 0x8002D670; +shadow_update = 0x8002D8DC; func_8002DE30 = 0x8002DE30; -func_8002E234 = 0x8002E234; +shadow_generate = 0x8002E234; func_8002E904 = 0x8002E904; func_8002EEEC = 0x8002EEEC; func_8002F2AC = 0x8002F2AC; @@ -3838,8 +3838,8 @@ gIsNearCurrBBox = 0x8011B0BC; D_8011B0C0 = 0x8011B0C0; gDisableShadows = 0x8011B0C4; gShadowHeapFlip = 0x8011B0C8; -D_8011B0CC = 0x8011B0CC; -gShadowIndex = 0x8011B0D0; +gShadowIndex = 0x8011B0CC; +gWaterEffectIndex = 0x8011B0D0; gSceneStartSegment = 0x8011B0D4; D_8011B0D8 = 0x8011B0D8; gSceneRenderSkyDome = 0x8011B0DC; @@ -3872,16 +3872,16 @@ D_8011C3B8 = 0x8011C3B8; D_8011C8B8 = 0x8011C8B8; D_8011D0B8 = 0x8011D0B8; D_8011D0BC = 0x8011D0BC; -D_8011D0C0 = 0x8011D0C0; -D_8011D0C4 = 0x8011D0C4; +gNewShadowTexture = 0x8011D0C0; +gNewShadowObj = 0x8011D0C4; D_8011D0C8 = 0x8011D0C8; -D_8011D0CC = 0x8011D0CC; -D_8011D0CE = 0x8011D0CE; +gNewShadowY1 = 0x8011D0CC; +gNewShadowY2 = 0x8011D0CE; D_8011D0D0 = 0x8011D0D0; gShadowOpacity = 0x8011D0D4; -D_8011D0D8 = 0x8011D0D8; -D_8011D0DC = 0x8011D0DC; -D_8011D0E0 = 0x8011D0E0; +gNewShadowScale = 0x8011D0D8; +gNewShadowWidth = 0x8011D0DC; +gNewShadowLength = 0x8011D0E0; D_8011D0E4 = 0x8011D0E4; D_8011D0E8 = 0x8011D0E8; D_8011D0EC = 0x8011D0EC; @@ -3900,16 +3900,16 @@ gPrevCameraX = 0x8011D314; gPrevCameraY = 0x8011D318; gPrevCameraZ = 0x8011D31C; gShadowHeapTris = 0x8011D320; -gCurrentShadowTris = 0x8011D330; +gCurrShadowTris = 0x8011D330; D_8011D334 = 0x8011D334; gShadowHeapVerts = 0x8011D338; -gCurrentShadowVerts = 0x8011D348; +gCurrShadowVerts = 0x8011D348; D_8011D34C = 0x8011D34C; -gShadowHeapTextures = 0x8011D350; -gCurrentShadowTexture = 0x8011D360; -D_8011D364 = 0x8011D364; -D_8011D368 = 0x8011D368; -D_8011D36C = 0x8011D36C; +gShadowHeapData = 0x8011D350; +gCurrShadowHeapData = 0x8011D360; +gShadowTail = 0x8011D364; +gNewShadowTriCount = 0x8011D368; +gNewShadowVtxCount = 0x8011D36C; D_8011D370 = 0x8011D370; D_8011D374 = 0x8011D374; D_8011D378 = 0x8011D378; diff --git a/ver/symbols/symbol_addrs.us.v80.txt b/ver/symbols/symbol_addrs.us.v80.txt index 2cc5fae3..7a21f51c 100644 --- a/ver/symbols/symbol_addrs.us.v80.txt +++ b/ver/symbols/symbol_addrs.us.v80.txt @@ -446,11 +446,11 @@ free_track = 0x8002C814; func_8002C954 = 0x8002C994; func_8002CC30 = 0x8002CC70; trackMakeAbsolute = 0x8002D34C; -render_object_shadow = 0x8002D3C4; -render_object_water_effects = 0x8002D6B0; -update_shadows = 0x8002D91C; +shadow_render = 0x8002D3C4; +watereffect_render = 0x8002D6B0; +shadow_update = 0x8002D91C; func_8002DE30 = 0x8002DE70; -func_8002E234 = 0x8002E274; +shadow_generate = 0x8002E274; func_8002E904 = 0x8002E944; func_8002EEEC = 0x8002EF2C; func_8002F2AC = 0x8002F2EC; @@ -3385,8 +3385,8 @@ gIsNearCurrBBox = 0x8011B63C; D_8011B0C0 = 0x8011B640; gDisableShadows = 0x8011B644; gShadowHeapFlip = 0x8011B648; -D_8011B0CC = 0x8011B64C; -gShadowIndex = 0x8011B650; +gShadowIndex = 0x8011B64C; +gWaterEffectIndex = 0x8011B650; gSceneStartSegment = 0x8011B654; D_8011B0D8 = 0x8011B658; gSceneRenderSkyDome = 0x8011B65C; @@ -3419,16 +3419,16 @@ D_8011C3B8 = 0x8011C938; D_8011C8B8 = 0x8011CE38; D_8011D0B8 = 0x8011D638; D_8011D0BC = 0x8011D63C; -D_8011D0C0 = 0x8011D640; -D_8011D0C4 = 0x8011D644; +gNewShadowTexture = 0x8011D640; +gNewShadowObj = 0x8011D644; D_8011D0C8 = 0x8011D648; -D_8011D0CC = 0x8011D64C; -D_8011D0CE = 0x8011D64E; +gNewShadowY1 = 0x8011D64C; +gNewShadowY2 = 0x8011D64E; D_8011D0D0 = 0x8011D650; gShadowOpacity = 0x8011D654; -D_8011D0D8 = 0x8011D658; -D_8011D0DC = 0x8011D65C; -D_8011D0E0 = 0x8011D660; +gNewShadowScale = 0x8011D658; +gNewShadowWidth = 0x8011D65C; +gNewShadowLength = 0x8011D660; D_8011D0E4 = 0x8011D664; D_8011D0E8 = 0x8011D668; D_8011D0EC = 0x8011D66C; @@ -3447,16 +3447,16 @@ gPrevCameraX = 0x8011D894; gPrevCameraY = 0x8011D898; gPrevCameraZ = 0x8011D89C; gShadowHeapTris = 0x8011D8A0; -gCurrentShadowTris = 0x8011D8B0; +gCurrShadowTris = 0x8011D8B0; D_8011D334 = 0x8011D8B4; gShadowHeapVerts = 0x8011D8B8; -gCurrentShadowVerts = 0x8011D8C8; +gCurrShadowVerts = 0x8011D8C8; D_8011D34C = 0x8011D8CC; -gShadowHeapTextures = 0x8011D8D0; -gCurrentShadowTexture = 0x8011D8E0; -D_8011D364 = 0x8011D8E4; -D_8011D368 = 0x8011D8E8; -D_8011D36C = 0x8011D8EC; +gShadowHeapData = 0x8011D8D0; +gCurrShadowHeapData = 0x8011D8E0; +gShadowTail = 0x8011D8E4; +gNewShadowTriCount = 0x8011D8E8; +gNewShadowVtxCount = 0x8011D8EC; D_8011D370 = 0x8011D8F0; D_8011D374 = 0x8011D8F4; D_8011D378 = 0x8011D8F8; From a298ec5b5f4b186d669233cd75206a18b0f89cb9 Mon Sep 17 00:00:00 2001 From: Ryan Myers Date: Wed, 16 Apr 2025 15:27:28 -0400 Subject: [PATCH 5/6] Match func_80026430 and fix UB in func_80026070 (#516) * Score and formatting * Fix UB for func_80026070, and get func_80026430 to NON_EQ * func_80026430 near match * documenting * Single diff for func_80026430 * Match func_80026430 * Update score and merge master * Rework func_80026430 to have an AVOID_UB. --- README.md | 20 +++--- include/structs.h | 9 ++- src/menu.c | 6 +- src/tracks.c | 158 ++++++++++++++++++++++++++++++++++++++++------ src/waves.c | 13 ++-- 5 files changed, 165 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index f8bb540b..fbe9c435 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,9 @@ This repo contains a work-in-progress decompilation of Diddy Kong Racing for the All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fda38e533b9fe63bb9670) of the game is the default if not specified. -As of April 14, 2025, this is our current score: +As of April 16, 2025, this is our current score: -    Decomp progress: 78.93% +    Decomp progress: 79.16%     Documentation progress: 50.05% @@ -117,25 +117,25 @@ s32 is_drumstick_unlocked(void) { ``` -As of April 14, 2025, this is our current score: +As of April 16, 2025, this is our current score: ``` =================================================================== ADVENTURE ONE (ASM -> C Decompilation) - -------------- 78.93% Complete (81.50% NON_MATCHING) -------------- - # Decompiled functions: 1851 - # GLOBAL_ASM remaining: 100 - # NON_MATCHING functions: 12 - # NON_EQUIVALENT WIP functions: 29 + -------------- 79.16% Complete (81.99% NON_MATCHING) -------------- + # Decompiled functions: 1852 + # GLOBAL_ASM remaining: 98 + # NON_MATCHING functions: 13 + # NON_EQUIVALENT WIP functions: 28 --------------------------- Game Status --------------------------- Balloons: 38/47, Keys: 4/4, Trophies: 3/5 T.T. Amulets: 4/4, Wizpig Amulets: 3/4 ------------------------------------------------------------------- - We are collecting silver coins in Haunted Woods. (0/8 silver coins) + We are collecting silver coins in Haunted Woods. (2/8 silver coins) =================================================================== ADVENTURE TWO (Cleanup & Documentation) ------------------------- 50.05% Complete ------------------------- # Documented functions: 1090 - # Undocumented remaining: 564 + # Undocumented remaining: 563 --------------------------- Game Status --------------------------- Balloons: 25/47, Keys: 3/4, Trophies: 2/5 T.T. Amulets: 2/4, Wizpig Amulets: 2/4 diff --git a/include/structs.h b/include/structs.h index c7110a91..93c3928c 100644 --- a/include/structs.h +++ b/include/structs.h @@ -666,6 +666,13 @@ typedef struct ObjectModel { /* 0x54 */ u8 pad[0x2C]; } ObjectModel; +typedef struct CollisionNode { + u16 triangleIndex; // This triangle index + u16 closestTri01; // The closest triangle index to the line made from indices 0 & 1. + u16 closestTri12; // The closest triangle index to the line made from indices 1 & 2. + u16 closestTri20; // The closest triangle index to the line made from indices 2 & 0. +} CollisionNode; + /* Size: 0x44 bytes */ typedef struct LevelModelSegment { /* 0x00 */ Vertex *vertices; @@ -673,7 +680,7 @@ typedef struct LevelModelSegment { /* 0x08 */ s32 unk8; /* 0x0C */ TriangleBatchInfo *batches; /* 0x10 */ s16 *unk10; -/* 0x14 */ u16 *unk14; +/* 0x14 */ CollisionNode *unk14; /* 0x18 */ f32 *unk18; /* 0x1C */ s16 numberOfVertices; /* 0x1E */ s16 numberOfTriangles; diff --git a/src/menu.c b/src/menu.c index 7e33a5fd..b27db463 100644 --- a/src/menu.c +++ b/src/menu.c @@ -5611,11 +5611,9 @@ void pakmenu_render(UNUSED s32 updateRate) { set_current_text_colour(6, 255, 255, 255, 0, 255); set_current_text_background_colour(6, 0, 0, 0, 0); render_dialogue_text(6, POS_CENTRED, 2 - PAKMENU_JP_OFFSET, gMenuText[ASSET_MENU_TEXT_CONTPAK1 + gMenuOption], - 1, - HORZ_ALIGN_CENTER); // CONTROLLER PAK 1 / 2 / 3 / 4 + 1, HORZ_ALIGN_CENTER); // CONTROLLER PAK 1 / 2 / 3 / 4 render_dialogue_text(6, POS_CENTRED, 16 - PAKMENU_JP_OFFSET, gMenuText[ASSET_MENU_TEXT_FREEPAGESX], - sCurrentControllerPakFreePages, - HORZ_ALIGN_CENTER); // FREE PAGES: ~ + sCurrentControllerPakFreePages, HORZ_ALIGN_CENTER); // FREE PAGES: ~ render_dialogue_box(&sMenuCurrDisplayList, NULL, NULL, 6); yPos += 34; // To 82 diff --git a/src/tracks.c b/src/tracks.c index 8792558a..660fb81c 100644 --- a/src/tracks.c +++ b/src/tracks.c @@ -643,16 +643,15 @@ void func_8002581C(u8 *segmentIds, s32 numberOfSegments, s32 viewportIndex) { void func_80026070(LevelModelSegmentBoundingBox *arg0, f32 arg1, f32 arg2, f32 arg3) { f32 sp80[4]; f32 sp70[4]; - s16 temp2; - s32 pad; - f32 sp60[2]; - s16 index; - s16 nextIndex; + f32 sp60[4]; + f32 temp; f32 sp54[2]; f32 sp4C[2]; - f32 temp; + s16 index; + s16 nextIndex; s16 sp40[4]; s16 var_t0; + s16 temp2; sp80[0] = arg0->x1; sp70[0] = arg0->z1; @@ -701,10 +700,8 @@ void func_80026070(LevelModelSegmentBoundingBox *arg0, f32 arg1, f32 arg2, f32 a // Returns must be on the same line. // clang-format off - if (-300.0 > sp60[1]) { return; -} - if (sp60[0] > 300.0) { return; -} + if (-300.0 > sp60[1]) { return; } + if (sp60[0] > 300.0) { return; } // clang-format on if (sp60[0] < -300.0) { @@ -718,7 +715,132 @@ void func_80026070(LevelModelSegmentBoundingBox *arg0, f32 arg1, f32 arg2, f32 a } } -#pragma GLOBAL_ASM("asm/nonmatchings/tracks/func_80026430.s") +void func_80026430(LevelModelSegment *segment, f32 arg1, f32 arg2, f32 arg3) { + s16 i; + s16 index; + s16 verticesOffset; + s16 nextFaceOffset; + s16 nextIndex; + s16 currFaceOffset; + s16 j; + Vertex *vert; + s8 spF8[3]; + f32 temp; + s16 var_s0; + s16 var_t0; +#ifdef AVOID_UB + f32 spE8[3]; // This really should be size of 3, but something is keeping it from matching that way. +#else + f32 spE8[2]; +#endif + f32 spDC[3]; + f32 spD0[3]; + f32 spC4[3]; + f32 spB8[3]; + f32 spB0[2]; + f32 spA8[2]; + f32 spA0[2]; + + if (D_8011D49E >= D_8011D4BA) { + return; + } + + for (i = 0; i < segment->numberOfBatches; i++) { + currFaceOffset = segment->batches[i].facesOffset; + verticesOffset = segment->batches[i].verticesOffset; + nextFaceOffset = segment->batches[i + 1].facesOffset; + if (segment->batches[i].flags & (BATCH_FLAGS_HIDDEN | BATCH_FLAGS_UNK00000200)) { + currFaceOffset = nextFaceOffset; + } + for (j = currFaceOffset; j < nextFaceOffset; j++) { + if ((segment->triangles[j].flags & BACKFACE_DRAW)) { + continue; + } + var_t0 = 0; + for (index = 0; index < 3; index++) { + vert = &(segment->triangles[j].verticesArray[index + 1] + verticesOffset)[segment->vertices]; + spE8[index] = vert->x; + spDC[index] = vert->y; + spD0[index] = vert->z; + spC4[index] = (arg1 * spE8[index]) + (arg2 * spD0[index]) + arg3; + + spF8[index] = (spC4[index] <= 0.0); + var_t0 += (spF8[index] <= 0.0); + } + if ((var_t0 == 1) || (var_t0 == 2)) { + for (var_s0 = 0, index = 0; index < 3; index++) { + nextIndex = index + 1; + if (nextIndex >= 3) { + nextIndex = 0; + } + if ((spF8[nextIndex] != spF8[index]) != 0) { + temp = spC4[index] / (spC4[index] - spC4[nextIndex]); + spB0[var_s0] = spE8[index] + ((spE8[nextIndex] - spE8[index]) * temp); + spB8[var_s0] = spDC[index] + ((spDC[nextIndex] - spDC[index]) * temp); + spA0[var_s0] = spB8[var_s0]; + spA8[var_s0] = spD0[index] + ((spD0[nextIndex] - spD0[index]) * temp); + var_s0++; + } + } + + var_s0 = 0; + spF8[0] = 0; + spF8[1] = 0; + spC4[0] = (D_8011D4A0 * spB0[0]) + (D_8011D4A4 * spA8[0]) + D_8011D4A8; + spC4[1] = (D_8011D4A0 * spB0[1]) + (D_8011D4A4 * spA8[1]) + D_8011D4A8; + if (spC4[0] < -300.0) { + spF8[0] = 1; + } + if (spC4[0] > 300.0) { + spF8[0] |= 2; + } + if (spC4[1] < -300.0) { + spF8[1] = 1; + } + if (spC4[1] > 300.0) { + spF8[1] |= 2; + } + // clang-format off + if ((spF8[0] | spF8[1]) == 0) { var_s0 = 1; } + // clang-format on + else if ((spF8[1] != spF8[0]) != 0) { + index = 0; + if (spC4[1] < spC4[0]) { + index = 1; + } + nextIndex = 1 - index; + if (spF8[index] == 1) { + temp = ((-spC4[index] - 300.0) / (spC4[nextIndex] - spC4[index])); + spB8[index] = spB8[index] + ((spB8[nextIndex] - spB8[index]) * temp); + spC4[index] = -300.0f; + } + if (spF8[nextIndex] == 2) { + temp = ((spC4[nextIndex] - 300.0) / (spC4[nextIndex] - spC4[index])); + spB8[nextIndex] = spB8[nextIndex] + ((spB8[index] - spB8[nextIndex]) * temp); + spC4[nextIndex] = 300.0f; + } + var_s0 = 1; + } + if (var_s0 != 0) { + var_t0 = (segment->unk14[j].triangleIndex << 2); + temp = (spB0[0] + D_8011D4A0) * segment->unk18[var_t0]; + temp += spB8[0] * segment->unk18[var_t0 + 1]; + temp += (spA8[0] + D_8011D4A4) * segment->unk18[var_t0 + 2]; + temp += segment->unk18[var_t0 + 3]; + var_s0 = (temp > 0.0) << 2; + if (segment->unk18[var_t0 + 1] < 0.0f) { + var_s0 |= 1; + } + if (spC4[0] == spC4[1]) { + var_s0 |= 8; + } + func_80026C14(spC4[0], spB8[0], var_s0); + func_80026C14(spC4[1], spB8[1], var_s0); + } + } + } + } +} void func_80026C14(s16 arg0, s16 arg1, s32 arg2) { s16 i; @@ -754,7 +876,7 @@ void func_80026C14(s16 arg0, s16 arg1, s32 arg2) { } void func_80026E54(s16 arg0, s8 *arg1, f32 arg2, f32 arg3) { - s32 pad[7]; + UNUSED s32 pad[7]; unk8011D478 *next; unk8011D478 *curr; s16 temp3; @@ -770,7 +892,7 @@ void func_80026E54(s16 arg0, s8 *arg1, f32 arg2, f32 arg3) { s8 temp; s8 temp0; s8 temp1; - f32 temp2; + UNUSED f32 temp2; f32 sp94[10]; f32 sp6C[10]; s8 sp60[10]; @@ -831,7 +953,7 @@ s32 func_80027184(f32 *arg0, f32 *arg1, f32 arg2, f32 arg3) { Vertex *verts; Triangle *tris; s32 two; - s32 test; + UNUSED s32 test; s32 vertZ1; s32 vertX2; s32 vertZ2; @@ -2209,7 +2331,6 @@ s32 func_8002BAB0(s32 levelSegmentIndex, f32 xIn, f32 zIn, f32 *yOut) { TriangleBatchInfo *currentBatch; f32 *temp_v1_4; Vec4f tempVec4f; - u16 *new_var; u16 temp; if (levelSegmentIndex < 0 || levelSegmentIndex >= gCurrentLevelModel->numberOfSegments) { @@ -2274,8 +2395,7 @@ s32 func_8002BAB0(s32 levelSegmentIndex, f32 xIn, f32 zIn, f32 *yOut) { temp_ra_3 = ((((XInInt - vert1X) * (vert3Z - vert1Z)) - ((vert3X - vert1X) * (ZInInt - vert1Z))) >= 0); var_v0 = faceNum; // fake? if (temp_ra_1 == temp_ra_2 && temp_ra_2 != temp_ra_3) { - new_var = currentSegment->unk14; - temp = new_var[faceNum * 4]; + temp = currentSegment->unk14[faceNum].triangleIndex; temp_v1_4 = (f32 *) ¤tSegment->unk18[temp * 4]; tempVec4f.x = temp_v1_4[0]; tempVec4f.y = temp_v1_4[1]; @@ -2364,7 +2484,7 @@ void func_8002C0C4(s32 modelId) { LOCAL_OFFSET_TO_RAM_ADDRESS(Vertex *, gCurrentLevelModel->segments[k].vertices); LOCAL_OFFSET_TO_RAM_ADDRESS(Triangle *, gCurrentLevelModel->segments[k].triangles); LOCAL_OFFSET_TO_RAM_ADDRESS(TriangleBatchInfo *, gCurrentLevelModel->segments[k].batches); - LOCAL_OFFSET_TO_RAM_ADDRESS(u16 *, gCurrentLevelModel->segments[k].unk14); + LOCAL_OFFSET_TO_RAM_ADDRESS(CollisionNode *, gCurrentLevelModel->segments[k].unk14); } for (k = 0; k < gCurrentLevelModel->numberOfTextures; k++) { gCurrentLevelModel->textures[k].texture = @@ -2873,7 +2993,7 @@ void shadow_generate(Object *obj, s32 isWater) { s32 yPos; f32 xPos; f32 zPos; - s32 *new_var; + UNUSED s32 *pad; s32 cheats; s32 inSegs[28]; s32 i; diff --git a/src/waves.c b/src/waves.c index 36f0b20c..bccfa96f 100644 --- a/src/waves.c +++ b/src/waves.c @@ -284,7 +284,7 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { D_8012A01C = 10000.0f; D_8012A020 = -10000.0f; for (var_s7 = 0; var_s7 < D_80129FC8.unk20; var_s7++) { - D_800E3040[var_s7] = (sins_f(var_s6) * D_80129FC8.unkC) + (sins_f(var_fp) * D_80129FC8.unk18); + D_800E3040[var_s7] = (sins_f(var_s6) * D_80129FC8.unkC) + (sins_f(var_fp) * D_80129FC8.unk18); if (D_80129FC8.unk28 != 0) { D_800E3040[var_s7] *= 2.0f; } @@ -297,7 +297,6 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { var_s6 += sp54; var_fp += sp4C; } - ; save_rng_seed(); set_rng_seed(0x57415646); @@ -352,7 +351,7 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { D_800E3080[var_a0][var_s5].unk2 = (var_s0 + D_80129FC8.unk0) + 1; D_800E3080[var_a0][var_s5].unk3 = var_s0 + 1; var_s5++; - D_800E3080[var_a0][var_s5].unk0 = 0x40; + D_800E3080[var_a0][var_s5].unk0 = 0x40; D_800E3080[var_a0][var_s5].unk1 = var_s0 + 1; D_800E3080[var_a0][var_s5].unk2 = (var_s0 + D_80129FC8.unk0) + 1; D_800E3080[var_a0][var_s5].unk3 = (var_s0 + D_80129FC8.unk0) + 2; @@ -371,7 +370,7 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { for (i = 0; i < ARRAY_COUNT(D_800E3070); i++) { // @note this should probably be the following for loop (or something like it, anyway) // but the change of var_s3 does not work - + // for (j = 0; j < 4; j++) { // if (j == 0) { // var_s3 = 0; @@ -402,7 +401,7 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { temp_vtx->g = temp_vtx_2->g; temp_vtx->b = temp_vtx_2->b; temp_vtx->a = temp_vtx_2->a; - + temp_vtx_3 = &D_800E3070[i][var_t0]; temp_vtx = &D_8012A028[i][1]; temp_vtx->x = temp_vtx_3->x; @@ -414,7 +413,7 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { temp_vtx->a = temp_vtx_3->a; var_t2 = var_t0 + 1; - var_v1 = (var_t0 + 1) * var_t0 ; + var_v1 = (var_t0 + 1) * var_t0; temp_vtx_4 = &D_800E3070[i][var_v1]; temp_vtx = &D_8012A028[i][2]; temp_vtx->x = temp_vtx_4->x; @@ -425,7 +424,7 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { temp_vtx->b = temp_vtx_4->b; temp_vtx->a = temp_vtx_4->a; - var_v1 = (var_t0 + 1) * var_t0 ; + var_v1 = (var_t0 + 1) * var_t0; temp_vtx_5 = &(&D_800E3070[i][var_v1])[var_t0]; temp_vtx = &D_8012A028[i][3]; temp_vtx->x = temp_vtx_5->x; From d7165b747aa5b00d63e7810a122b74196fd817d8 Mon Sep 17 00:00:00 2001 From: Dominik Peters Date: Wed, 16 Apr 2025 21:37:09 +0200 Subject: [PATCH 6/6] match func_800B82B4 and func_800B9C18 (#517) * match: func_800B82B4 * match: func_800B9C18 * refac: replace magic 0x40 with BACKFACE_DRAW --- README.md | 20 +-- src/waves.c | 342 ++++++++++++++++++++++++++++++---------------------- 2 files changed, 205 insertions(+), 157 deletions(-) diff --git a/README.md b/README.md index fbe9c435..5f3790ca 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ All versions are supported, and the US 1.0 version (SHA1 = 0cb115d8716dbbc2922fd As of April 16, 2025, this is our current score: -    Decomp progress: 79.16% +    Decomp progress: 79.61% -    Documentation progress: 50.05% +    Documentation progress: 50.27% --- @@ -121,21 +121,21 @@ As of April 16, 2025, this is our current score: ``` =================================================================== ADVENTURE ONE (ASM -> C Decompilation) - -------------- 79.16% Complete (81.99% NON_MATCHING) -------------- - # Decompiled functions: 1852 - # GLOBAL_ASM remaining: 98 - # NON_MATCHING functions: 13 + -------------- 79.61% Complete (82.18% NON_MATCHING) -------------- + # Decompiled functions: 1854 + # GLOBAL_ASM remaining: 96 + # NON_MATCHING functions: 12 # NON_EQUIVALENT WIP functions: 28 --------------------------- Game Status --------------------------- Balloons: 38/47, Keys: 4/4, Trophies: 3/5 T.T. Amulets: 4/4, Wizpig Amulets: 3/4 ------------------------------------------------------------------- - We are collecting silver coins in Haunted Woods. (2/8 silver coins) + We are collecting silver coins in Haunted Woods. (4/8 silver coins) =================================================================== ADVENTURE TWO (Cleanup & Documentation) - ------------------------- 50.05% Complete ------------------------- - # Documented functions: 1090 - # Undocumented remaining: 563 + ------------------------- 50.27% Complete ------------------------- + # Documented functions: 1091 + # Undocumented remaining: 562 --------------------------- Game Status --------------------------- Balloons: 25/47, Keys: 3/4, Trophies: 2/5 T.T. Amulets: 2/4, Wizpig Amulets: 2/4 diff --git a/src/waves.c b/src/waves.c index bccfa96f..0a3e943c 100644 --- a/src/waves.c +++ b/src/waves.c @@ -13,32 +13,17 @@ f32 *D_800E3040 = NULL; Vec2s *D_800E3044 = NULL; -s32 *D_800E3048 = NULL; +Vec2s *D_800E3048 = NULL; f32 *D_800E304C[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; Vertex *D_800E3070[2] = { NULL, NULL }; s32 *D_800E3078[2] = { NULL, NULL }; -typedef struct unk800E3080 { - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; - u8 unk4[4]; - u8 pad8[0x10 - 0x8]; -} unk800E3080; -// This could also be D_800E3080[2] + D_800E3088[2] -unk800E3080 *D_800E3080[4] = { NULL, NULL, NULL, NULL }; - -/* Size: 0x10, might just be an array? */ -typedef struct unk800E3090 { - s16 unk0, unk2, unk4, unk6, unk8, unkA, unkC, unkE; -} unk800E3090; - -unk800E3090 D_800E3090[4] = { - { 0x4000, 0x0201, 0, 0, 0, 0, 0, 0 }, - { 0x4001, 0x0203, 0, 0, 0, 0, 0, 0 }, - { 0x4000, 0x0201, 0, 0, 0, 0, 0, 0 }, - { 0x4001, 0x0203, 0, 0, 0, 0, 0, 0 }, +Triangle *D_800E3080[4][1] = { NULL, NULL, NULL, NULL }; +Triangle D_800E3090[4] = { + { { BACKFACE_DRAW, 0x00, 0x02, 0x01 }, 0, 0, 0, 0, 0, 0 }, + { { BACKFACE_DRAW, 0x01, 0x02, 0x03 }, 0, 0, 0, 0, 0, 0 }, + { { BACKFACE_DRAW, 0x00, 0x02, 0x01 }, 0, 0, 0, 0, 0, 0 }, + { { BACKFACE_DRAW, 0x01, 0x02, 0x03 }, 0, 0, 0, 0, 0, 0 }, }; TextureHeader *D_800E30D0 = NULL; @@ -158,7 +143,7 @@ void free_waves(void) { FREE_MEM(D_800E3048); FREE_MEM(D_800E304C[0]); FREE_MEM(D_800E3070[0]); - FREE_MEM(D_800E3080[0]); + FREE_MEM(D_800E3080[0][0]); FREE_TEX(D_800E30D0); FREE_MEM(D_800E30D4); FREE_MEM(D_800E30D8); @@ -177,7 +162,7 @@ void wave_init(void) { free_waves(); D_800E3040 = (f32 *) mempool_alloc_safe(D_80129FC8.unk20 << 2, COLOUR_TAG_CYAN); D_800E3044 = (Vec2s *) mempool_alloc_safe((D_80129FC8.unk4 << 2) * D_80129FC8.unk4, COLOUR_TAG_CYAN); - D_800E3048 = (s32 *) mempool_alloc_safe(((D_80129FC8.unk0 + 1) << 2) * (D_80129FC8.unk0 + 1), COLOUR_TAG_CYAN); + D_800E3048 = (Vec2s *) mempool_alloc_safe(((D_80129FC8.unk0 + 1) << 2) * (D_80129FC8.unk0 + 1), COLOUR_TAG_CYAN); allocSize = ((D_80129FC8.unk0 + 1) << 2) * (D_80129FC8.unk0 + 1); D_800E304C[0] = mempool_alloc_safe(allocSize * ARRAY_COUNT(D_800E304C), COLOUR_TAG_CYAN); for (i = 1; i < ARRAY_COUNT(D_800E304C); i++) { @@ -196,13 +181,13 @@ void wave_init(void) { } allocSize = (D_80129FC8.unk0 * 32) * D_80129FC8.unk0; if (D_8012A078 != 2) { - D_800E3080[0] = mempool_alloc_safe(allocSize << 1, COLOUR_TAG_CYAN); - D_800E3080[1] = (unk800E3080 *) (((u32) D_800E3080[0]) + allocSize); + D_800E3080[0][0] = mempool_alloc_safe(allocSize << 1, COLOUR_TAG_CYAN); + D_800E3080[1][0] = (Triangle *) (((u32) D_800E3080[0][0]) + allocSize); } else { - D_800E3080[0] = (unk800E3080 *) mempool_alloc_safe(allocSize << 2, COLOUR_TAG_CYAN); - D_800E3080[1] = (unk800E3080 *) (((u32) D_800E3080[0]) + allocSize); - D_800E3080[2] = (unk800E3080 *) (((u32) D_800E3080[1]) + allocSize); - D_800E3080[3] = (unk800E3080 *) (((u32) D_800E3080[2]) + allocSize); + D_800E3080[0][0] = (Triangle *) mempool_alloc_safe(allocSize << 2, COLOUR_TAG_CYAN); + D_800E3080[1][0] = (Triangle *) (((u32) D_800E3080[0][0]) + allocSize); + D_800E3080[2][0] = (Triangle *) (((u32) D_800E3080[1][0]) + allocSize); + D_800E3080[3][0] = (Triangle *) (((u32) D_800E3080[2][0]) + allocSize); } D_800E30D0 = load_texture(D_80129FC8.unk2C); } @@ -238,11 +223,10 @@ void func_800B8134(LevelHeader *header) { D_80129FC8.unk4C = header->unk70_u8; } -#ifdef NON_MATCHING void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { - s32 var_a0; + s32 k; s32 var_fp; - s32 var_s0; + s32 j_2; s32 var_s3; s32 var_s5; s32 var_s6; @@ -250,12 +234,7 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { s32 i; s32 sp4C; s32 j; - s32 var_s7; - Vertex *temp_vtx; - Vertex *temp_vtx_2; - Vertex *temp_vtx_3; - Vertex *temp_vtx_4; - Vertex *temp_vtx_5; + s32 i_2; s32 var_t0; s32 var_v1; s32 var_t7; @@ -283,33 +262,33 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { sp4C = (D_80129FC8.unk14 << 16) / D_80129FC8.unk20; D_8012A01C = 10000.0f; D_8012A020 = -10000.0f; - for (var_s7 = 0; var_s7 < D_80129FC8.unk20; var_s7++) { - D_800E3040[var_s7] = (sins_f(var_s6) * D_80129FC8.unkC) + (sins_f(var_fp) * D_80129FC8.unk18); + for (i_2 = 0; i_2 < D_80129FC8.unk20; i_2++) { + D_800E3040[i_2] = (sins_f(var_s6) * D_80129FC8.unkC) + (sins_f(var_fp) * D_80129FC8.unk18); if (D_80129FC8.unk28 != 0) { - D_800E3040[var_s7] *= 2.0f; + D_800E3040[i_2] *= 2.0f; } - if (D_800E3040[var_s7] < D_8012A01C) { - D_8012A01C = D_800E3040[var_s7]; + if (D_800E3040[i_2] < D_8012A01C) { + D_8012A01C = D_800E3040[i_2]; } - if (D_8012A020 < D_800E3040[var_s7]) { - D_8012A020 = D_800E3040[var_s7]; + if (D_8012A020 < D_800E3040[i_2]) { + D_8012A020 = D_800E3040[i_2]; } var_s6 += sp54; var_fp += sp4C; - } + }; save_rng_seed(); set_rng_seed(0x57415646); var_s5 = 0; - for (var_s7 = 0; var_s7 < D_80129FC8.unk4; var_s7++) { - for (var_s0 = 0; var_s0 < D_80129FC8.unk4; var_s0++) { + for (i_2 = 0; i_2 < D_80129FC8.unk4; i_2++) { + for (j_2 = 0; j_2 < D_80129FC8.unk4; j_2++) { D_800E3044[var_s5].s[0] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); D_800E3044[var_s5].s[1] = get_random_number_from_range(0, D_80129FC8.unk20 - 1); var_s5++; } } var_s5 = 0; - var_s7 = 0; + i_2 = 0; load_rng_seed(); if (arg2 != 2) { arg2 = 2; @@ -319,42 +298,42 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { for (var_s3 = 0; var_s3 < 25; var_s3++) { if (0 <= D_80129FC8.unk0) { do { - for (var_s0 = 0; D_80129FC8.unk0 >= var_s0; var_s0++) { - for (var_a0 = 0; var_a0 < arg2; var_a0++) { - D_800E3070[var_a0][var_s5].x = (var_s0 * D_8012A0B8) + 0.5; - D_800E3070[var_a0][var_s5].z = (var_s7 * D_8012A0BC) + 0.5; + for (j_2 = 0; D_80129FC8.unk0 >= j_2; j_2++) { + for (k = 0; k < arg2; k++) { + D_800E3070[k][var_s5].x = (j_2 * D_8012A0B8) + 0.5; + D_800E3070[k][var_s5].z = (i_2 * D_8012A0BC) + 0.5; if (D_80129FC8.unk4C == 0) { - D_800E3070[var_a0][var_s5].r = 255; - D_800E3070[var_a0][var_s5].g = 255; - D_800E3070[var_a0][var_s5].b = 255; + D_800E3070[k][var_s5].r = 255; + D_800E3070[k][var_s5].g = 255; + D_800E3070[k][var_s5].b = 255; } else { - D_800E3070[var_a0][var_s5].r = 0; - D_800E3070[var_a0][var_s5].g = 0; - D_800E3070[var_a0][var_s5].b = 0; + D_800E3070[k][var_s5].r = 0; + D_800E3070[k][var_s5].g = 0; + D_800E3070[k][var_s5].b = 0; } - D_800E3070[var_a0][var_s5].a = 255; + D_800E3070[k][var_s5].a = 255; } var_s5++; } - var_s7++; - } while (D_80129FC8.unk0 >= var_s7); - var_s7 = 0; + i_2++; + } while (D_80129FC8.unk0 >= i_2); + i_2 = 0; } } var_s5 = 0; - for (var_s7 = 0; var_s7 < D_80129FC8.unk0; var_s7++) { - for (var_s0 = 0; var_s0 < D_80129FC8.unk0; var_s0++) { - for (var_a0 = 0; var_a0 < arg2; var_a0++) { - D_800E3080[var_a0][var_s5].unk0 = 0x40; - D_800E3080[var_a0][var_s5].unk1 = var_s0; - D_800E3080[var_a0][var_s5].unk2 = (var_s0 + D_80129FC8.unk0) + 1; - D_800E3080[var_a0][var_s5].unk3 = var_s0 + 1; + for (i_2 = 0; i_2 < D_80129FC8.unk0; i_2++) { + for (j_2 = 0; j_2 < D_80129FC8.unk0; j_2++) { + for (k = 0; k < arg2; k++) { + D_800E3080[0][k][var_s5].flags = BACKFACE_DRAW; + D_800E3080[0][k][var_s5].vi0 = j_2; + D_800E3080[0][k][var_s5].vi1 = (j_2 + D_80129FC8.unk0) + 1; + D_800E3080[0][k][var_s5].vi2 = j_2 + 1; var_s5++; - D_800E3080[var_a0][var_s5].unk0 = 0x40; - D_800E3080[var_a0][var_s5].unk1 = var_s0 + 1; - D_800E3080[var_a0][var_s5].unk2 = (var_s0 + D_80129FC8.unk0) + 1; - D_800E3080[var_a0][var_s5].unk3 = (var_s0 + D_80129FC8.unk0) + 2; + D_800E3080[0][k][var_s5].flags = BACKFACE_DRAW; + D_800E3080[0][k][var_s5].vi0 = j_2 + 1; + D_800E3080[0][k][var_s5].vi1 = (j_2 + D_80129FC8.unk0) + 1; + D_800E3080[0][k][var_s5].vi2 = (j_2 + D_80129FC8.unk0) + 2; var_s5--; } var_s5 += 2; @@ -362,78 +341,39 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { } func_800BC6C8(); - var_t0 = D_80129FC8.unk0; - // a1 (D_800E3070[0]) - // v0 (a1 + var_t0) - // a2 (a1 + var_v1) - // v0 (a1 + var_v1 + var_t0) + var_s5 = (D_80129FC8.unk0 + 1) * D_80129FC8.unk0; for (i = 0; i < ARRAY_COUNT(D_800E3070); i++) { - // @note this should probably be the following for loop (or something like it, anyway) - // but the change of var_s3 does not work + D_8012A028[i][0].x = D_800E3070[i][0].x; + D_8012A028[i][0].y = 0; + D_8012A028[i][0].z = D_800E3070[i][0].z; + D_8012A028[i][0].r = D_800E3070[i][0].r; + D_8012A028[i][0].g = D_800E3070[i][0].g; + D_8012A028[i][0].b = D_800E3070[i][0].b; + D_8012A028[i][0].a = D_800E3070[i][0].a; - // for (j = 0; j < 4; j++) { - // if (j == 0) { - // var_s3 = 0; - // } else if (j == 1) { - // var_s3 = var_t0; - // } else if (j == 2) { - // var_s3 = var_t0 * (var_t0 + 1); - // } else { - // var_s3 = var_t0 * (var_t0 + 1) + var_t0; - // } - // temp_vtx_2 = &D_800E3070[i][var_s3]; - // temp_vtx = &D_8012A028[i][j]; - // temp_vtx->x = D_800E3070[i][var_s3].x; - // temp_vtx->y = 0; - // temp_vtx->z = D_800E3070[i][var_s3].z; - // temp_vtx->r = D_800E3070[i][var_s3].r; - // temp_vtx->g = D_800E3070[i][var_s3].g; - // temp_vtx->b = D_800E3070[i][var_s3].b; - // temp_vtx->a = D_800E3070[i][var_s3].a; - // } + D_8012A028[i][1].x = D_800E3070[i][D_80129FC8.unk0].x; + D_8012A028[i][1].y = 0; + D_8012A028[i][1].z = D_800E3070[i][D_80129FC8.unk0].z; + D_8012A028[i][1].r = D_800E3070[i][D_80129FC8.unk0].r; + D_8012A028[i][1].g = D_800E3070[i][D_80129FC8.unk0].g; + D_8012A028[i][1].b = D_800E3070[i][D_80129FC8.unk0].b; + D_8012A028[i][1].a = D_800E3070[i][D_80129FC8.unk0].a; - temp_vtx_2 = &D_800E3070[i][0]; - temp_vtx = &D_8012A028[i][0]; - temp_vtx->x = temp_vtx_2->x; - temp_vtx->y = 0; - temp_vtx->z = temp_vtx_2->z; - temp_vtx->r = temp_vtx_2->r; - temp_vtx->g = temp_vtx_2->g; - temp_vtx->b = temp_vtx_2->b; - temp_vtx->a = temp_vtx_2->a; + D_8012A028[i][2].x = D_800E3070[i][var_s5].x; + D_8012A028[i][2].y = 0; + D_8012A028[i][2].z = D_800E3070[i][var_s5].z; + D_8012A028[i][2].r = D_800E3070[i][var_s5].r; + D_8012A028[i][2].g = D_800E3070[i][var_s5].g; + D_8012A028[i][2].b = D_800E3070[i][var_s5].b; + D_8012A028[i][2].a = D_800E3070[i][var_s5].a; - temp_vtx_3 = &D_800E3070[i][var_t0]; - temp_vtx = &D_8012A028[i][1]; - temp_vtx->x = temp_vtx_3->x; - temp_vtx->y = 0; - temp_vtx->z = temp_vtx_3->z; - temp_vtx->r = temp_vtx_3->r; - temp_vtx->g = temp_vtx_3->g; - temp_vtx->b = temp_vtx_3->b; - temp_vtx->a = temp_vtx_3->a; - - var_t2 = var_t0 + 1; - var_v1 = (var_t0 + 1) * var_t0; - temp_vtx_4 = &D_800E3070[i][var_v1]; - temp_vtx = &D_8012A028[i][2]; - temp_vtx->x = temp_vtx_4->x; - temp_vtx->y = 0; - temp_vtx->z = temp_vtx_4->z; - temp_vtx->r = temp_vtx_4->r; - temp_vtx->g = temp_vtx_4->g; - temp_vtx->b = temp_vtx_4->b; - temp_vtx->a = temp_vtx_4->a; - - var_v1 = (var_t0 + 1) * var_t0; - temp_vtx_5 = &(&D_800E3070[i][var_v1])[var_t0]; - temp_vtx = &D_8012A028[i][3]; - temp_vtx->x = temp_vtx_5->x; - temp_vtx->y = 0; - temp_vtx->z = temp_vtx_5->z; - temp_vtx->r = temp_vtx_5->r; - temp_vtx->g = temp_vtx_5->g; - temp_vtx->b = temp_vtx_5->b; - temp_vtx->a = temp_vtx_5->a; + D_8012A028[i][3].x = D_800E3070[i][var_s5 + D_80129FC8.unk0].x; + D_8012A028[i][3].y = 0; + D_8012A028[i][3].z = D_800E3070[i][var_s5 + D_80129FC8.unk0].z; + D_8012A028[i][3].r = D_800E3070[i][var_s5 + D_80129FC8.unk0].r; + D_8012A028[i][3].g = D_800E3070[i][var_s5 + D_80129FC8.unk0].g; + D_8012A028[i][3].b = D_800E3070[i][var_s5 + D_80129FC8.unk0].b; + D_8012A028[i][3].a = D_800E3070[i][var_s5 + D_80129FC8.unk0].a; } func_800BCC70(arg0); @@ -450,9 +390,6 @@ void func_800B82B4(LevelModel *arg0, LevelHeader *arg1, s32 arg2) { gWaveGeneratorObj = NULL; D_8012A018 = 0; } -#else -#pragma GLOBAL_ASM("asm/nonmatchings/waves/func_800B82B4.s") -#endif void func_800B8B8C(void) { s32 temp_v0; @@ -825,7 +762,118 @@ void func_800B97A8(s32 arg0, s32 arg1) { } } -#pragma GLOBAL_ASM("asm/nonmatchings/waves/func_800B9C18.s") +void func_800B9C18(s32 arg0) { + s32 i; + s32 j; + s32 k; + s32 var_a2; + s32 var_ra; + s32 var_v1; + s32 var_t5; + s32 var_t2; + s32 var_s0; + s32 var_a3; + s32 pad; + s32 pad2; + + D_8012A018 = 1 - D_8012A018; + for (pad2 = 0, pad = 0; pad2 < D_80129FC8.unk4; pad2++) { + for (var_a3 = 0; var_a3 < D_80129FC8.unk4; var_a3++) { + D_800E3044[pad].s[0] += arg0; + while (D_800E3044[pad].s[0] >= D_80129FC8.unk20) { + D_800E3044[pad].s[0] -= D_80129FC8.unk20; + } + D_800E3044[pad].s[1] += arg0; + while (D_800E3044[pad].s[1] >= D_80129FC8.unk20) { + D_800E3044[pad].s[1] -= D_80129FC8.unk20; + } + pad++; + } + } + + D_8012A09C += D_800E30D0->frameAdvanceDelay * arg0; + if (D_8012A09C < 0) { + D_8012A09C = 0; + } else { + while (D_8012A09C >= D_800E30D0->numOfTextures) { + D_8012A09C -= D_800E30D0->numOfTextures; + } + } + + D_8012A084 = ((D_80129FC8.unk38 * arg0) + D_8012A084) & D_8012A094; + D_8012A088 = ((D_80129FC8.unk3C * arg0) + D_8012A088) & D_8012A098; + var_a2 = D_8012A088; + for (i = 0, var_s0 = 0; i <= D_80129FC8.unk0; i++) { + var_v1 = D_8012A084; + for (j = 0; j <= D_80129FC8.unk0; j++) { + D_800E3048[var_s0].s[0] = var_v1; + D_800E3048[var_s0].s[1] = var_a2; + var_v1 += D_8012A08C; + var_s0 += 1; + } + var_a2 += D_8012A090; + } + + if (D_8012A078 != 2) { + var_t2 = 1; + } else { + var_t2 = 2; + } + + var_s0 = 0; + var_t5 = 0; + var_ra = D_80129FC8.unk0 + 1; + for (i = 0; i < D_80129FC8.unk0; i++) { + for (j = 0; j < D_80129FC8.unk0; j++) { + for (k = 0; k < var_t2; k++) { + D_800E3080[D_8012A018][k << 1][var_s0].uv0.u = D_800E3048[var_t5].s[0]; + D_800E3080[D_8012A018][k << 1][var_s0].uv0.v = D_800E3048[var_t5 + 1].s[1]; + D_800E3080[D_8012A018][k << 1][var_s0].uv1.u = D_800E3048[var_ra].s[0]; + D_800E3080[D_8012A018][k << 1][var_s0].uv1.v = D_800E3048[var_ra].s[1]; + D_800E3080[D_8012A018][k << 1][var_s0].uv2.u = D_800E3048[var_t5 + 1].s[0]; + D_800E3080[D_8012A018][k << 1][var_s0].uv2.v = D_800E3048[var_t5 + 1].s[1]; + D_800E3080[D_8012A018][k << 1][var_s0 + 1].uv0.u = D_800E3048[var_t5 + 1].s[0]; + D_800E3080[D_8012A018][k << 1][var_s0 + 1].uv0.v = D_800E3048[var_t5 + 1].s[1]; + D_800E3080[D_8012A018][k << 1][var_s0 + 1].uv1.u = D_800E3048[var_ra].s[0]; + D_800E3080[D_8012A018][k << 1][var_s0 + 1].uv1.v = D_800E3048[var_ra + 1].s[1]; + D_800E3080[D_8012A018][k << 1][var_s0 + 1].uv2.u = D_800E3048[var_ra + 1].s[0]; + D_800E3080[D_8012A018][k << 1][var_s0 + 1].uv2.v = D_800E3048[var_ra + 1].s[1]; + } + var_t5++; + var_ra++; + var_s0 += 2; + } + var_t5++; + var_ra++; + } + + D_800E3090[2 * D_8012A018].uv0.u = D_800E3048[0].s[0]; + D_800E3090[2 * D_8012A018].uv0.v = D_800E3048[0].s[1]; + D_800E3090[2 * D_8012A018].uv1.u = D_800E3048[D_80129FC8.unk0 * (D_80129FC8.unk0 + 1)].s[0]; + D_800E3090[2 * D_8012A018].uv1.v = D_800E3048[D_80129FC8.unk0 * (D_80129FC8.unk0 + 1)].s[1]; + D_800E3090[2 * D_8012A018].uv2.u = D_800E3048[D_80129FC8.unk0].s[0]; + D_800E3090[2 * D_8012A018].uv2.v = D_800E3048[D_80129FC8.unk0].s[1]; + D_800E3090[2 * D_8012A018 + 1].uv0.u = D_800E3048[D_80129FC8.unk0].s[0]; + D_800E3090[2 * D_8012A018 + 1].uv0.v = D_800E3048[D_80129FC8.unk0].s[1]; + D_800E3090[2 * D_8012A018 + 1].uv1.u = D_800E3048[D_80129FC8.unk0 * (D_80129FC8.unk0 + 1)].s[0]; + D_800E3090[2 * D_8012A018 + 1].uv1.v = D_800E3048[D_80129FC8.unk0 * (D_80129FC8.unk0 + 1)].s[1]; + D_800E3090[2 * D_8012A018 + 1].uv2.u = D_800E3048[D_80129FC8.unk0 * (D_80129FC8.unk0 + 1) + D_80129FC8.unk0].s[0]; + D_800E3090[2 * D_8012A018 + 1].uv2.v = D_800E3048[D_80129FC8.unk0 * (D_80129FC8.unk0 + 1) + D_80129FC8.unk0].s[1]; + + if (D_800E3188 > 0) { + func_800BFE98(arg0); + } + + if (gWavePowerDivisor > 0) { + if (arg0 < gWavePowerDivisor) { + D_80129FC8.magnitude += (f32) arg0 * gWaveMagnitude; + gWavePowerDivisor -= arg0; + return; + } + D_80129FC8.magnitude = gWavePowerBase; + gWavePowerDivisor = 0; + } +} void func_800BA288(s32 arg0, s32 arg1) { s32 i;