From db5213a3744451816f5eca0defe2b5fad587ce31 Mon Sep 17 00:00:00 2001 From: Max Date: Sun, 1 Nov 2020 20:44:39 -0500 Subject: decompile code_801DD5C8.o --- src/code_801DD5C8.cpp | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 src/code_801DD5C8.cpp (limited to 'src/code_801DD5C8.cpp') diff --git a/src/code_801DD5C8.cpp b/src/code_801DD5C8.cpp new file mode 100644 index 0000000..4918115 --- /dev/null +++ b/src/code_801DD5C8.cpp @@ -0,0 +1,116 @@ +#include "ctorStruct.h" + +namespace +{ + struct gUnkClass9; + + typedef void (*FuncPtr)(u32, gUnkClass9*, u32, float); + + // TODO: internal? + struct gUnkClass9 + { + u8 pad[0xC]; + FuncPtr unkC; + }; + + // TODO: internal? + struct gUnkClass8 + { + u8 pad[0x2]; + u16 unk2; + gUnkClass9* unk4; + float unk8; + }; +} + +struct gUnkClass7 +{ + gUnkClass8* unk0; + u16 unk4; + u16 unk6; + float unk8; + float unkC; +}; + +static ctorStruct gUnk8063F348(1, 4, 0); + +extern "C" { + +void func_801DD5C8(gUnkClass7* p1, float p2) +{ + if (!p1->unk0 || !(p1->unk6 & 0x1) || (p1->unk6 & 0x8)) + return; + float f3 = p1->unk8; + p1->unkC += p2 * f3; + if (p1->unkC < 0.0f) { + p1->unk6 |= 0x4; + switch (p1->unk4) { + case 1: + while (p1->unkC < 0.0f) + p1->unkC += p1->unk0->unk8; + break; + case 2: + p1->unkC = -p1->unkC; + float f2 = p1->unk0->unk8; + if ((float)p1->unkC > f2) { + float f4 = p1->unkC / f2; + s32 r5 = (s32)f4; + f4 -= r5; // get fractional part + if (((r5 & 0x1) ^ ((u32)r5 >> 31 & 0x1)) - ((u32)r5 >> 31 & 0x1) != 0) { + p1->unkC = f2 * (1.0f - f4); + } else { + p1->unkC = f2 * f4; + p1->unk8 = -f3; + } + } else { + p1->unk8 = -f3; + } + break; + default: + p1->unk6 |= 0x8; + p1->unkC = 0.0f; + break; + } + } else if (p1->unkC > p1->unk0->unk8) { + p1->unk6 |= 0x4; + switch (p1->unk4) { + case 1: + while (p1->unkC > p1->unk0->unk8) + p1->unkC -= p1->unk0->unk8; + break; + case 2: + float f2 = p1->unk0->unk8; + float f4 = p1->unkC / f2; + s32 r5 = (s32)f4; + f4 -= r5; + if (((r5 & 0x1) ^ ((u32)r5 >> 31 & 0x1)) - ((u32)r5 >> 31 & 0x1) != 0) { + float temp = f2 * (1.0f - f4); + p1->unk8 = -f3; + p1->unkC = temp; + } else { + p1->unkC = f2 * f4; + } + break; + default: + p1->unk6 |= 0x8; + p1->unkC = p1->unk0->unk8; + break; + } + } + p1->unk6 |= 0x2; +} + +void func_801DD7FC(gUnkClass7* p1, u32 p2, u32 p3) +{ + if (!p1->unk0 || !(p1->unk6 & 0x2)) + return; + gUnkClass9* ptr = p1->unk0->unk4; + s32 count = p1->unk0->unk2; + for (s32 i = 0; i < count; i++, ptr++) + if (ptr->unkC) + ptr->unkC(p2, ptr, p3, p1->unkC); + + p1->unk6 &= ~0x2; +} + +} //extern "C" -- cgit v1.2.3