diff options
| author | Synray <31429825+Synray@users.noreply.github.com> | 2020-04-18 19:56:53 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-04-18 22:56:53 -0400 |
| commit | eefbe9afe1891ea27eb39315a3c87e87abef0828 (patch) | |
| tree | 754338c5f5fea1687d4bdb0b9b6025e3311d7b95 /src | |
| parent | 21750d5aee057f5352d945b7cad3c9394efe25b7 (diff) | |
Decompile code_800D2E30 and use struct in code_800A9F30 (#80)
* Match func_800AA000
* Match z_camera/func_800437F0
* Decompile code_800D2E30, use struct in 800A9F30
* Format
* Remove 'U' from literals
* Remove bss, cleanup z_camera
* Review changes, rename temp
* Move externs to variables.h
Diffstat (limited to 'src')
| -rw-r--r-- | src/boot/z_locale.c | 3 | ||||
| -rw-r--r-- | src/code/code_800A9F30.c | 50 | ||||
| -rw-r--r-- | src/code/code_800D2E30.c | 124 | ||||
| -rw-r--r-- | src/code/z_camera.c | 17 |
4 files changed, 174 insertions, 20 deletions
diff --git a/src/boot/z_locale.c b/src/boot/z_locale.c index 10f6bb437..900a94afa 100644 --- a/src/boot/z_locale.c +++ b/src/boot/z_locale.c @@ -5,9 +5,6 @@ u32 gCurrentRegion = 0; LocaleCartInfo sCartInfo; -// temporary -extern PadMgr gPadMgr; - void Locale_Init() { osEPiReadIo(gCartHandle, 0x38, &sCartInfo.mediaFormat); osEPiReadIo(gCartHandle, 0x3C, &sCartInfo.regionInfo); diff --git a/src/code/code_800A9F30.c b/src/code/code_800A9F30.c index 15475e872..ea56f9243 100644 --- a/src/code/code_800A9F30.c +++ b/src/code/code_800A9F30.c @@ -1,12 +1,11 @@ #include <ultra64.h> #include <global.h> -extern u8 D_80160FD0[]; -extern PadMgr gPadMgr; +UnkRumbleStruct D_80160FD0; -void func_800A9F30(s32 a, s32 b) { +void func_800A9F30(PadMgr* a, s32 b) { func_800D2E30(&D_80160FD0); - PadMgr_RumbleSet(a, &D_80160FD0); + PadMgr_RumbleSet(a, D_80160FD0.rumbleEnable); } void func_800A9F6C(f32 a, u8 b, u8 c, u8 d) { @@ -21,20 +20,43 @@ void func_800A9F6C(f32 a, u8 b, u8 c, u8 d) { if ((temp1 < 1000) && (b != 0) && (d != 0)) { temp2 = b - (temp1 * 255) / 1000; if (temp2 > 0) { - D_801610DA = temp2; - D_80160FD0[0x10B] = c; - D_80160FD0[0x10C] = d; + D_80160FD0.unk_10A = temp2; + D_80160FD0.unk_10B = c; + D_80160FD0.unk_10C = d; } } } -#pragma GLOBAL_ASM("asm/non_matchings/code/code_800A9F30/func_800AA000.s") -// this function is very similar to the one above but has a loop in it I can't figure out +void func_800AA000(float a, u8 b, u8 c, u8 d) { + s32 temp1; + s32 temp2; + s32 i; + if (1000000.0f < a) { + temp1 = 1000; + } else { + temp1 = sqrtf(a); + } + + if (temp1 < 1000 && b != 0 && d != 0) { + temp2 = b - (temp1 * 255) / 1000; + + for (i = 0; i < 0x40; i++) { + if (D_80160FD0.unk_04[i] == 0) { + if (temp2 > 0) { + D_80160FD0.unk_04[i] = temp2; + D_80160FD0.unk_44[i] = c; + D_80160FD0.unk_84[i] = d; + } + break; + } + } + } +} void func_800AA0B4(void) { func_800D3140(&D_80160FD0); - gPadMgr.retraceCallback = func_800A9F30; + gPadMgr.retraceCallback = (void*)func_800A9F30; gPadMgr.retraceCallbackValue = 0; if (0) {} // Necessary to match @@ -52,17 +74,17 @@ void func_800AA0F0(void) { } u32 func_800AA148(void) { - return ((gPadMgr.pakType[0] ^ 1) == 0); + return gPadMgr.pakType[0] == 1; } void func_800AA15C(void) { - D_801610D4 = 2; + D_80160FD0.unk_104 = 2; } void func_800AA16C(void) { - D_801610D4 = 0; + D_80160FD0.unk_104 = 0; } void func_800AA178(u32 a) { - D_801610D5 = !!a; + D_80160FD0.unk_105 = !!a; } diff --git a/src/code/code_800D2E30.c b/src/code/code_800D2E30.c new file mode 100644 index 000000000..e7e67f0a0 --- /dev/null +++ b/src/code/code_800D2E30.c @@ -0,0 +1,124 @@ +#include <ultra64.h> +#include <global.h> + +void func_800D2E30(UnkRumbleStruct* arg0) { + s32 i; + s32 unk_a3; + s32 index = -1; + UnkRumbleStruct* new_var; + + for (i = 0; i < 4; i++) { + arg0->rumbleEnable[i] = 0; + } + + if (arg0->unk_105 == 0) { + new_var = arg0; + if (D_8012DBB0 != 0) { + for (i = 0; i < 4; i++) { + gPadMgr.pakType[i] = 0; + } + } + D_8012DBB0 = new_var->unk_105; + return; + } + D_8012DBB0 = arg0->unk_105; + + if (arg0->unk_104 == 2) { + for (i = 0; i < 4; ++i) { + gPadMgr.pakType[i] = 0; + } + + for (i = 0; i < 0x40; i++) { + arg0->unk_C4[i] = 0; + arg0->unk_84[i] = 0; + arg0->unk_44[i] = 0; + arg0->unk_04[i] = 0; + } + arg0->unk_106 = arg0->unk_108 = arg0->unk_10A = arg0->unk_10B = arg0->unk_10C = arg0->unk_10D = 0; + arg0->unk_104 = 1; + } + if (arg0->unk_104 != 0) { + for (i = 0; i < 0x40; i++) { + + if (arg0->unk_04[i] != 0) { + if (arg0->unk_44[i] > 0) { + arg0->unk_44[i]--; + } else { + unk_a3 = arg0->unk_04[i] - arg0->unk_84[i]; + if (unk_a3 > 0) { + arg0->unk_04[i] = unk_a3; + } else { + arg0->unk_04[i] = 0; + } + } + + unk_a3 = arg0->unk_C4[i] + arg0->unk_04[i]; + arg0->unk_C4[i] = unk_a3; + if (index == -1) { + index = i; + arg0->rumbleEnable[0] = (unk_a3 >= 0x100); + } else { + + if (arg0->unk_04[index] < arg0->unk_04[i]) { + index = i; + arg0->rumbleEnable[0] = (unk_a3 >= 0x100); + } + } + } + } + if (arg0->unk_10A != 0) { + if (arg0->unk_10B > 0) { + arg0->unk_10B--; + } else { + unk_a3 = arg0->unk_10A - arg0->unk_10C; + if (unk_a3 > 0) { + arg0->unk_10A = unk_a3; + } else { + arg0->unk_10A = 0; + } + } + unk_a3 = arg0->unk_10D + arg0->unk_10A; + arg0->unk_10D = unk_a3; + arg0->rumbleEnable[0] = (unk_a3 >= 0x100); + } + if (arg0->unk_10A != 0) { + unk_a3 = arg0->unk_10A; + } else { + if (index == -1) { + unk_a3 = 0; + } else { + unk_a3 = arg0->unk_04[index]; + } + } + if (unk_a3 == 0) { + if ((++arg0->unk_108) >= 6) { + arg0->unk_106 = 0; + arg0->unk_108 = 5; + } + } else { + arg0->unk_108 = 0; + if ((++arg0->unk_106) >= 0x1C21) { + arg0->unk_104 = 0; + } + } + } else { + for (i = 0; i < 0x40; i++) { + arg0->unk_C4[i] = 0; + arg0->unk_84[i] = 0; + arg0->unk_44[i] = 0; + arg0->unk_04[i] = 0; + } + + arg0->unk_106 = arg0->unk_108 = arg0->unk_10A = arg0->unk_10B = arg0->unk_10C = arg0->unk_10D = 0; + } +} + +void func_800D3140(UnkRumbleStruct* arg0) { + bzero(arg0, sizeof(UnkRumbleStruct)); + arg0->unk_104 = 2; + arg0->unk_105 = 1; +} + +void func_800D3178(UnkRumbleStruct* arg0) { + bzero(arg0, sizeof(UnkRumbleStruct)); +} diff --git a/src/code/z_camera.c b/src/code/z_camera.c index 6c8fa5ade..8b1fff432 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -22,9 +22,20 @@ typedef struct { Vec3s pos; } SplineData; // originally called SplinedatZ -// 47 lines -#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/func_800437F0.s") -// had an attempt at this but didn't get very close +f32 func_800437F0(f32 arg0, f32 arg1) { + f32 percent = 0.4f; + f32 ret = fabsf(arg1); + + if (arg0 < ret) { + ret = 1; + } else if (ret < (f32)arg0 * (1 - percent)) { //! float cast needed to match + ret = (SQ(arg1) * (1 - percent)) / SQ((1 - percent) * arg0); + } else { + ret = 1 - (0.4f * SQ(arg0 - ret)) / SQ(0.4f * arg0); + } + + return ret; +} f32 func_8004389C(f32 a, f32 b, f32 c, f32 d) { f32 temp1 = a - b; |
