From edbf03101a64b05e9d20cdf53ec2ca4888a2effa Mon Sep 17 00:00:00 2001 From: theo3 Date: Mon, 23 Nov 2020 22:18:34 -0800 Subject: done --- src/code_0805F9A0.c | 169 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 src/code_0805F9A0.c (limited to 'src/code_0805F9A0.c') diff --git a/src/code_0805F9A0.c b/src/code_0805F9A0.c new file mode 100644 index 00000000..1514df6a --- /dev/null +++ b/src/code_0805F9A0.c @@ -0,0 +1,169 @@ +#include "global.h" +#include "functions.h" +#include "structures.h" + +extern u16 gUnk_081092D4; +extern u8 gUnk_02036AD8; +extern u8 gUnk_081094CE; +extern u8 gUnk_02036A58; +extern void* gUnk_081092AC[]; + +typedef struct { + u8 filler0[12][16]; +} VStruct; + +extern VStruct gUnk_0810942E[]; +extern u32 gUnk_0810926C[]; + +typedef struct { + u8 unk0; + u8 unk1; +} UStruct; + +typedef struct { + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + u16 unk4; + u16 unk6; + void* unk8; +} WStruct; + +void sub_0805F820(WStruct* r0, u32* r1); + +u32 sub_0805F7DC(u32 r0, WStruct* r1) { + u32 temp; + u32 temp2; + u32* offset; + + if (r1->unk4 <= r1->unk6) + return 0; + + offset = sub_0805F25C(r0); + temp = r1->unk6; + if ((r0 >> 8) > 4) { + sub_0805F820(r1, offset); + offset += 0x10; + } + + sub_0805F820(r1, offset); + if (r1->unk6 > r1->unk4) { + r1->unk6 = r1->unk4; + } + return r1->unk6 - temp; +} + +void sub_0805F820(WStruct* r0, u32* r1) { + u32 bVar1; + u32 bVar2; + s32 uVar3; + s32 uVar4; + void* uVar5; + u32 uVar6; + u32 uVar7; + u8* puVar8; + u8* temp; + void* temp2; + VStruct* temp3; + + if (r0->unk4 - r0->unk6 > 0) { + sub_08002724(r1, &gUnk_02036A58); + if (r0->unk1 == 0) { + u32 tmp = sub_0805F7A0(*r1); + uVar6 = tmp & 0xf; + uVar3 = tmp >> 8; + } else { + uVar6 = 0; + uVar3 = 8; + } + + uVar4 = r0->unk4 - r0->unk6; + if (uVar4 > 8) { + uVar4 = 8; + } + if (uVar4 < uVar3) { + uVar3 = uVar4; + } + + puVar8 = &gUnk_02036A58 + uVar6; + temp2 = r0->unk8; + temp = gUnk_0810942E[r0->unk3].filler0[r0->unk2 * 2]; + uVar7 = r0->unk6; + r0->unk6 += uVar3; + + if (r0->unk0 / 16 != 1) { + while (uVar3-- > 0) { + sub_080026C4(puVar8, temp2, temp, uVar7); + puVar8++; + uVar7++; + } + } else { + while (uVar3-- > 0) { + sub_080026F2(puVar8, temp2, temp, uVar7); + puVar8++; + uVar7++; + } + } + } +} + +void sub_0805F8E4(u32 r0, WStruct* r1) { + u32 old = r1->unk1; + r1->unk1 = 1; + sub_0805F7DC(r0, r1); + r1->unk1 = old; +} + +u32 sub_0805F8F8(u32 idx) { + u8* temp = &gUnk_0810942E[idx].filler0[10][10]; + return gUnk_0810926C[*temp]; +} + +void sub_0805F918(u32 idx, u32 idx2, void* dest) { + u32 i; + void* puVar1; + u8* puVar2; + u32 j; + u32 idx3; + u8* temp; + u8* temp2; + + _DmaFill32(sub_0805F8F8(idx2), &gUnk_02036AD8, 0xe0); + puVar1 = gUnk_081092AC[idx]; + + temp = &gUnk_081094CE + idx2 * 0xc0; + idx3 = 0; + for (i = 0; i < 3; i++) { + puVar2 = &gUnk_02036A58; + sub_08002724(puVar1, &gUnk_02036A58); + puVar1 += 0x40; + + for (j = 0; j < 8; j++) { + sub_080026C4(puVar2, &gUnk_02036AD8, temp, idx3); + puVar2++; + idx3++; + } + } + LoadAssetAsync((const void*)&gUnk_02036AD8, (u32)dest, 0xe0); +} + +u32 sub_0805F9A0(u32 r0) { + + if (gUnk_02000000->gameLanguage == 0) { + u16* val = &gUnk_081092D4; + u32 i = 0; + + do { + if (*val == r0) { + return i + 0x800; + } + i++; + val++; + } while (*val != 0); + } else if (r0 == 0x31a) { + r0 = 1; + r0 &= 0xff; + } + return (r0 & 0xff) + 0x800; +} -- cgit v1.2.3