diff options
Diffstat (limited to 'arm9/src')
-rw-r--r-- | arm9/src/render_window.c | 7 | ||||
-rw-r--r-- | arm9/src/unk_02006D98.c | 2294 |
2 files changed, 2297 insertions, 4 deletions
diff --git a/arm9/src/render_window.c b/arm9/src/render_window.c index 33682cc0..95edb982 100644 --- a/arm9/src/render_window.c +++ b/arm9/src/render_window.c @@ -9,6 +9,7 @@ #include "unk_020061E8.h" #include "unk_0200BB14.h" #include "unk_0200CA44.h" +#include "unk_02006D98.h" const struct UnkStruct_0200CABC_3 UNK_020ECE88 = { 10, @@ -50,8 +51,6 @@ extern void MOD05_021D971C(struct UnkStruct_0200CABC_2 *param0, u32 param4, u32 param5); extern u32 *MOD05_021D9820(struct UnkStruct_0200CABC_2 *param0, void *); -extern struct UnkStruct63_021DB450 *FUN_02006D98(u32); -extern void FUN_020072E8(struct UnkStruct63_021DB450 *param0); extern void FUN_02012400(u16, u16, u16, void *, void *); extern u32 NNS_G2dGetImageLocation(u32, u32); extern void *FUN_02012470(u16, u16, u16); @@ -898,7 +897,7 @@ THUMB_FUNC void FUN_0200DE30(struct UnkStruct_0200CABC_2 *param0, u8 param1, u8 THUMB_FUNC void FUN_0200DE80(struct UnkStruct_0200CABC_2 *param0, u16 param1, u8 param2) { - struct UnkStruct63_021DB450 *r7 = FUN_02006D98(param0->unk162); + struct UnkStruct_02006D98 *r7 = FUN_02006D98(param0->unk162); struct SomeDrawPokemonStruct stc; FUN_02068C00(&stc, param1, param2, 2, 0, 0, 0); FUN_0200DEF4(param0, &stc); @@ -907,7 +906,7 @@ THUMB_FUNC void FUN_0200DE80(struct UnkStruct_0200CABC_2 *param0, u16 param1, u8 THUMB_FUNC void FUN_0200DEC0(struct UnkStruct_0200CABC_2 *param0, struct Pokemon *param1) { - struct UnkStruct63_021DB450 *r6 = FUN_02006D98(param0->unk162); + struct UnkStruct_02006D98 *r6 = FUN_02006D98(param0->unk162); struct SomeDrawPokemonStruct st0; FUN_02068B68(&st0, param1, 2); FUN_0200DEF4(param0, &st0); diff --git a/arm9/src/unk_02006D98.c b/arm9/src/unk_02006D98.c new file mode 100644 index 00000000..9c3d766d --- /dev/null +++ b/arm9/src/unk_02006D98.c @@ -0,0 +1,2294 @@ +#include "unk_02006D98.h" + +#include "MI_memory.h" +#include "NNS_g2d.h" +#include "filesystem.h" +#include "global.h" +#include "heap.h" +#include "mod63_021DB450.h" +#include "palette.h" +#include "poketool/pokegra/otherpoke.naix" +#include "registers.h" + +const struct UnkStruct_02006D98_3 UNK_020ECCE2[] = { + {0x1B, 0x0F}, + {0x1C, 0x0F}, + {0x1D, 0x0F}, + {0x1E, 0x0F}, + {0x1A, 0x10}, + {0x1B, 0x10}, + {0x1C, 0x10}, + {0x1D, 0x10}, + {0x1E, 0x10}, + {0x1F, 0x10}, + {0x19, 0x11}, + {0x1A, 0x11}, + {0x1B, 0x11}, + {0x1C, 0x11}, + {0x1D, 0x11}, + {0x1E, 0x11}, + {0x1F, 0x11}, + {0x20, 0x11}, + {0x19, 0x12}, + {0x1A, 0x12}, + {0x1B, 0x12}, + {0x1C, 0x12}, + {0x1D, 0x12}, + {0x1E, 0x12}, + {0x1F, 0x12}, + {0x20, 0x12}, + {0x19, 0x13}, + {0x1A, 0x13}, + {0x1B, 0x13}, + {0x1C, 0x13}, + {0x1D, 0x13}, + {0x1E, 0x13}, + {0x1F, 0x13}, + {0x20, 0x13}, + {0x19, 0x14}, + {0x1A, 0x14}, + {0x1B, 0x14}, + {0x1C, 0x14}, + {0x1D, 0x14}, + {0x1E, 0x14}, + {0x1F, 0x14}, + {0x20, 0x14}, + {0x1A, 0x15}, + {0x1B, 0x15}, + {0x1C, 0x15}, + {0x1D, 0x15}, + {0x1E, 0x15}, + {0x1F, 0x15}, + {0x1B, 0x16}, + {0x1C, 0x16}, + {0x1D, 0x16}, + {0x1E, 0x16}, + {0xFF, 0xFF}, +}; + +const struct UnkStruct_02006D98_3 UNK_020ECC78[] = { + {0x33, 0x11}, + {0x34, 0x11}, + {0x35, 0x11}, + {0x36, 0x11}, + {0x32, 0x12}, + {0x33, 0x12}, + {0x34, 0x12}, + {0x35, 0x12}, + {0x36, 0x12}, + {0x37, 0x12}, + {0x31, 0x13}, + {0x32, 0x13}, + {0x33, 0x13}, + {0x34, 0x13}, + {0x35, 0x13}, + {0x36, 0x13}, + {0x37, 0x13}, + {0x38, 0x13}, + {0x31, 0x14}, + {0x32, 0x14}, + {0x33, 0x14}, + {0x34, 0x14}, + {0x35, 0x14}, + {0x36, 0x14}, + {0x37, 0x14}, + {0x38, 0x14}, + {0x31, 0x15}, + {0x32, 0x15}, + {0x33, 0x15}, + {0x34, 0x15}, + {0x35, 0x15}, + {0x36, 0x15}, + {0x37, 0x15}, + {0x38, 0x15}, + {0x31, 0x16}, + {0x32, 0x16}, + {0x33, 0x16}, + {0x34, 0x16}, + {0x35, 0x16}, + {0x36, 0x16}, + {0x37, 0x16}, + {0x38, 0x16}, + {0x32, 0x17}, + {0x33, 0x17}, + {0x34, 0x17}, + {0x35, 0x17}, + {0x36, 0x17}, + {0x37, 0x17}, + {0x33, 0x18}, + {0x34, 0x18}, + {0x35, 0x18}, + {0x36, 0x18}, + {0xFF, 0xFF}, +}; + +const struct UnkStruct_02006D98_3 UNK_020ECC10[] = { + {0x1E, 0x21}, + {0x1F, 0x21}, + {0x20, 0x21}, + {0x1D, 0x22}, + {0x1E, 0x22}, + {0x1F, 0x22}, + {0x20, 0x22}, + {0x21, 0x22}, + {0x1C, 0x23}, + {0x1D, 0x23}, + {0x1E, 0x23}, + {0x1F, 0x23}, + {0x20, 0x23}, + {0x21, 0x23}, + {0x22, 0x23}, + {0x1C, 0x24}, + {0x1D, 0x24}, + {0x1E, 0x24}, + {0x1F, 0x24}, + {0x20, 0x24}, + {0x21, 0x24}, + {0x22, 0x24}, + {0x1C, 0x25}, + {0x1D, 0x25}, + {0x1E, 0x25}, + {0x1F, 0x25}, + {0x20, 0x25}, + {0x21, 0x25}, + {0x22, 0x25}, + {0x1C, 0x26}, + {0x1D, 0x26}, + {0x1E, 0x26}, + {0x1F, 0x26}, + {0x20, 0x26}, + {0x21, 0x26}, + {0x22, 0x26}, + {0x1C, 0x27}, + {0x1D, 0x27}, + {0x1E, 0x27}, + {0x1F, 0x27}, + {0x20, 0x27}, + {0x21, 0x27}, + {0x22, 0x27}, + {0x1D, 0x28}, + {0x1E, 0x28}, + {0x1F, 0x28}, + {0x20, 0x28}, + {0x21, 0x28}, + {0x1E, 0x29}, + {0x1F, 0x29}, + {0x20, 0x29}, + {0xFF, 0xFF}, +}; + +const struct UnkStruct_02006D98_3 UNK_020ECDCC[] = { + {0x2B, 0x21}, + {0x2C, 0x21}, + {0x2D, 0x21}, + {0x29, 0x22}, + {0x2A, 0x22}, + {0x2B, 0x22}, + {0x2C, 0x22}, + {0x2D, 0x22}, + {0x2E, 0x22}, + {0x2F, 0x22}, + {0x28, 0x23}, + {0x29, 0x23}, + {0x2A, 0x23}, + {0x2B, 0x23}, + {0x2C, 0x23}, + {0x2D, 0x23}, + {0x2E, 0x23}, + {0x2F, 0x23}, + {0x30, 0x23}, + {0x28, 0x24}, + {0x29, 0x24}, + {0x2A, 0x24}, + {0x2B, 0x24}, + {0x2C, 0x24}, + {0x2D, 0x24}, + {0x2E, 0x24}, + {0x2F, 0x24}, + {0x30, 0x24}, + {0x28, 0x25}, + {0x29, 0x25}, + {0x2A, 0x25}, + {0x2B, 0x25}, + {0x2C, 0x25}, + {0x2D, 0x25}, + {0x2E, 0x25}, + {0x2F, 0x25}, + {0x30, 0x25}, + {0x28, 0x26}, + {0x29, 0x26}, + {0x2A, 0x26}, + {0x2B, 0x26}, + {0x2C, 0x26}, + {0x2D, 0x26}, + {0x2E, 0x26}, + {0x2F, 0x26}, + {0x30, 0x26}, + {0x28, 0x27}, + {0x29, 0x27}, + {0x2A, 0x27}, + {0x2B, 0x27}, + {0x2C, 0x27}, + {0x2D, 0x27}, + {0x2E, 0x27}, + {0x2F, 0x27}, + {0x30, 0x27}, + {0x28, 0x28}, + {0x29, 0x28}, + {0x2A, 0x28}, + {0x2B, 0x28}, + {0x2C, 0x28}, + {0x2D, 0x28}, + {0x2E, 0x28}, + {0x2F, 0x28}, + {0x30, 0x28}, + {0x29, 0x29}, + {0x2A, 0x29}, + {0x2B, 0x29}, + {0x2C, 0x29}, + {0x2D, 0x29}, + {0x2E, 0x29}, + {0x2F, 0x29}, + {0x2B, 0x2A}, + {0x2C, 0x2A}, + {0x2D, 0x2A}, + {0xFF, 0xFF}, +}; + +const int UNK_020ECBD0[4][4] = { + {160, 160, 224, 176}, {160, 160, 224, 176}, {160, 176, 224, 192}, {160, 192, 224, 208}}; + +const int UNK_020ECD4C[4][2][4] = { + {{0, 0, 0x50, 0x50}, {0x50, 0, 0xA0, 0x50}}, { + + {0, 0x50, 0x50, 0xA0}, {0x50, 0x50, 0xA0, 0xA0} + + }, + { + + {0, 0xA0, 0x50, 0xF0}, {0x50, 0xA0, 0xA0, 0xF0} + + }, + { + + {0xA0, 0, 0xF0, 0x50}, {0xA0, 0x50, 0xF0, 0xA0} + + }}; + +struct UnkStruct_02006D98_3 *UNK_02105AE8[] = { + UNK_020ECCE2, + UNK_020ECC78, + UNK_020ECC10, + UNK_020ECDCC, +}; + +extern void NNS_G2dSetupSoftwareSpriteCamera(void); +extern void NNS_G3dGeFlushBuffer(); +extern void NNS_G2dDrawSpriteFast(s16 param0, + s16 param1, + int param2, + int param3, + int param4, + int param5, + int param6, + int param7, + int param8); + +THUMB_FUNC struct UnkStruct_02006D98 *FUN_02006D98(u32 heap_id) { + struct UnkStruct_02006D98 *ptr = AllocFromHeap(heap_id, sizeof(struct UnkStruct_02006D98)); + ptr->unk298 = heap_id; + ptr->unk2E0 = 0; + ptr->unk29C = 0; + ptr->unk2A0 = 0x8000; + ptr->unk2A4 = 0; + ptr->unk2A8 = 0x80; + + ptr->unk2AC = AllocFromHeap(heap_id, 0x8000); + + ptr->unk2B0 = AllocFromHeap(heap_id, 0xc0); + MIi_CpuClearFast(0, ptr->unk2B0, 4); + + ptr->unk2B4 = AllocFromHeap(heap_id, 0xc0); + MIi_CpuClearFast(0, ptr->unk2B4, 4); + + for (int i = 0; i < 4; i++) { + MIi_CpuClearFast(0, &ptr->unk000[i], sizeof(struct UnkStruct_02006D98_2)); + } + + NNS_G2dSetupSoftwareSpriteCamera(); + ptr->unk2E3 = 0; + + u8 *st8; + void *st4 = AllocAndReadWholeNarcMemberByIdPair( + NARC_POKETOOL_POKEGRA_OTHERPOKE, NARC_otherpoke_narc_0211_NCGR, ptr->unk298); + NNSG2dCharacterData *stc; + NNS_G2dGetUnpackedCharacterData(st4, &stc); + + ptr->unk2B8.pixelFmt = stc->pixelFmt; + ptr->unk2B8.mapingType = stc->mapingType; + ptr->unk2B8.characterFmt = stc->characterFmt; + st8 = stc->pRawData; + + FUN_02008A74(st8); + MI_CpuFill8(ptr->unk2AC, *st8, 0x8000); + + for (int i = 0; i < 0x50; i++) { + for (int j = 0; j < 0x28; j++) { + ((u8 *)ptr->unk2AC)[0x5050 + i * 0x80 + j] = st8[i * 0x50 + j]; + } + } + + FreeToHeap(st4); + ptr->unk2E1 = 1; + ptr->unk2E2 = 1; + + return ptr; +} + +#ifdef NONMATCHING + +// mostly matching, only 2 register writes messed up +THUMB_FUNC void FUN_02006ED4(struct UnkStruct_02006D98 *param0) { + s32 arg3; + s32 arg4; + + FUN_020082A8(param0); + FUN_020086F4(param0); + + NNS_G3dGeFlushBuffer(); + + reg_G3_MTX_PUSH = 0; + + // this is all shuffled however I try + reg_G3_TEXIMAGE_PARAM = (param0->unk29C >> 3) | (param0->unk260.attr.fmt << 26) | (1 << 30) | + (param0->unk260.attr.sizeS << 20) | (param0->unk260.attr.sizeT << 23) | + (param0->unk260.attr.plttUse << 29); + + for (int st18 = 0; st18 < 4; st18++) { + if (param0->unk000[st18].unk00_0 == 0 || param0->unk000[st18].unk54_0 != 0 || + param0->unk000[st18].unk54_B != 0) { + continue; + } + + if (param0->unk000[st18].unk68 != NULL) { + param0->unk000[st18].unk68(¶m0->unk000[st18], ¶m0->unk000[st18].unk24); + } + + NNS_G3dGeFlushBuffer(); + + if (param0->unk2E3 != 1) { + reg_G3_MTX_IDENTITY = 0; + } + + FUN_02007F48(¶m0->unk000[st18]); + + u32 shift; + if (param0->unk260.attr.fmt == 2) { + shift = 1; + } else { + shift = 0; + } + + reg_G3_TEXPLTT_BASE = (param0->unk2A4 + st18 * 0x20) >> (4 - shift); + + u32 r1 = param0->unk000[st18].unk28 << 0xc; + u32 r0 = (param0->unk000[st18].unk26 + param0->unk000[st18].unk42) << 0xc; + u32 r3 = (param0->unk000[st18].unk24 + param0->unk000[st18].unk40) << 0xc; + + reg_G3_MTX_TRANS = r3; + reg_G3_MTX_TRANS = r0; + reg_G3_MTX_TRANS = r1; + + s32 idx = ((s32)param0->unk000[st18].unk38) >> 4; + G3_RotX(FX_SinCosTable_[idx * 2], FX_SinCosTable_[idx * 2 + 1]); + + s32 idy = ((s32)param0->unk000[st18].unk3A) >> 4; + G3_RotY(FX_SinCosTable_[idy * 2], FX_SinCosTable_[idy * 2 + 1]); + + s32 idz = ((s32)param0->unk000[st18].unk3C) >> 4; + G3_RotZ(FX_SinCosTable_[idz * 2], FX_SinCosTable_[idz * 2 + 1]); + + r1 = -(param0->unk000[st18].unk28 << 0xc); + r0 = -((param0->unk000[st18].unk26 + param0->unk000[st18].unk42) << 0xc); + r3 = -((param0->unk000[st18].unk24 + param0->unk000[st18].unk40) << 0xc); + + reg_G3_MTX_TRANS = r3; + reg_G3_MTX_TRANS = r0; + reg_G3_MTX_TRANS = r1; + + reg_G3_DIF_AMB = + ((u16)(param0->unk000[st18].unk50_0 | (param0->unk000[st18].unk50_5 << 5) | + (param0->unk000[st18].unk50_a << 10))) | + (((u16)(param0->unk000[st18].unk50_f | (param0->unk000[st18].unk50_14 << 5) | + (param0->unk000[st18].unk50_19 << 10))) + << 16) | + 0x8000; + + reg_G3_SPE_EMI = 0x4210; + + { + // shuffled there as well + u32 r1 = param0->unk000[st18].unk00_1; + u32 r0 = param0->unk000[st18].unk54_2; + reg_G3_POLYGON_ATTR = 0xc0 | (r1 << 24) | (r0 << 16); + } + + if (param0->unk000[st18].unk54_1 != 0) { + u32 r6 = param0->unk000[st18].unk44 + + UNK_020ECD4C[st18][param0->unk000[st18].unk5B][0]; + u32 r12 = param0->unk000[st18].unk46; + u32 r1 = param0->unk000[st18].unk45 + + UNK_020ECD4C[st18][param0->unk000[st18].unk5B][1]; + u32 r7 = param0->unk000[st18].unk47; + u32 r0 = r12 + r6; + + NNS_G2dDrawSpriteFast(param0->unk000[st18].unk24 - 40 + param0->unk000[st18].unk44 + + param0->unk000[st18].unk2C, + param0->unk000[st18].unk26 - 40 + param0->unk000[st18].unk45 + + param0->unk000[st18].unk2E - param0->unk000[st18].unk6C.unk2, + param0->unk000[st18].unk28 + param0->unk000[st18].unk30, + r12, + r7, + r6, + r1, + r0, + r7 + r1); + } else { + arg3 = (param0->unk000[st18].unk34 * 80) >> 8; + arg4 = (param0->unk000[st18].unk36 * 80) >> 8; + + NNS_G2dDrawSpriteFast( + param0->unk000[st18].unk24 - (arg3 / 2) + param0->unk000[st18].unk2C, + param0->unk000[st18].unk26 - (arg4 / 2) + param0->unk000[st18].unk2E - + param0->unk000[st18].unk6C.unk2, + param0->unk000[st18].unk28 + param0->unk000[st18].unk30, + arg3, + arg4, + UNK_020ECD4C[st18][param0->unk000[st18].unk5B][0], + UNK_020ECD4C[st18][param0->unk000[st18].unk5B][1], + UNK_020ECD4C[st18][param0->unk000[st18].unk5B][2], + UNK_020ECD4C[st18][param0->unk000[st18].unk5B][3]); + } + + if (param0->unk000[st18].unk6C.unk0_0 == 0 || param0->unk000[st18].unk6C.unk0_5 == 0 || + param0->unk000[st18].unk54_1 != 0 || (param0->unk2E4 & 1) != 0) { + continue; + } + + if (param0->unk2E3 != 1) { + reg_G3_MTX_IDENTITY = 0; + } + + u32 shift2; + if (param0->unk260.attr.fmt == 2) { + shift2 = 1; + } else { + shift2 = 0; + } + reg_G3_TEXPLTT_BASE = + (param0->unk2A4 + ((param0->unk000[st18].unk6C.unk0_0 + 3) << 5)) >> (4 - shift2); + + if (param0->unk000[st18].unk6C.unk0_4 != 0) { + arg3 = (param0->unk000[st18].unk34 * 64) >> 8; + arg4 = (param0->unk000[st18].unk36 * 16) >> 8; + } else { + arg3 = 64; + arg4 = 16; + } + + if (param0->unk000[st18].unk6C.unk0_2 != 0) { + param0->unk000[st18].unk6C.unk4 = param0->unk000[st18].unk24 + + param0->unk000[st18].unk2C + + param0->unk000[st18].unk6C.unk8; + } + + if (param0->unk000[st18].unk6C.unk0_3 != 0) { + param0->unk000[st18].unk6C.unk6 = param0->unk000[st18].unk26 + + param0->unk000[st18].unk2E + + param0->unk000[st18].unk6C.unka; + } + + NNS_G2dDrawSpriteFast(param0->unk000[st18].unk6C.unk4 - (arg3 / 2), + param0->unk000[st18].unk6C.unk4 - (arg4 / 2), + 0xFFFFFC18, + arg3, + arg4, + UNK_020ECBD0[param0->unk000[st18].unk6C.unk0_5][0], + UNK_020ECBD0[param0->unk000[st18].unk6C.unk0_5][1], + UNK_020ECBD0[param0->unk000[st18].unk6C.unk0_5][2], + UNK_020ECBD0[param0->unk000[st18].unk6C.unk0_5][3]); + } + + reg_G3_MTX_POP = 1; +} +#else +asm void FUN_02006ED4(struct UnkStruct_02006D98 *param0) { + // clang-format off + push {r3-r7, lr} + sub sp, #0x20 + add r5, r0, #0x0 + bl FUN_020082A8 + add r0, r5, #0x0 + bl FUN_020086F4 + bl NNS_G3dGeFlushBuffer + mov r6, #0x9f + mov r0, #0x0 + ldr r4, =0x04000444 + lsl r6, r6, #0x2 + str r0, [r4, #0x0] + str r0, [sp, #0x18] + add r0, r6, #0x0 + sub r0, #0xc + ldr r1, [r5, r0] + add r3, r6, #0x0 + ldr r2, [r5, r6] + add r0, r6, #0x0 + sub r3, #0x8 + add r6, #0x20 + ldr r3, [r5, r3] + ldr r6, [r5, r6] + sub r0, #0x10 + ldr r0, [r5, r0] + lsr r6, r6, #0x3 + lsl r3, r3, #0x1a + orr r6, r3 + mov r3, #0x1 + lsl r3, r3, #0x1e + lsl r0, r0, #0x14 + orr r3, r6 + lsl r1, r1, #0x17 + orr r0, r3 + lsl r2, r2, #0x1d + orr r0, r1 + orr r0, r2 + str r0, [r4, #0x64] + ldr r0, [sp, #0x18] + add r4, r5, #0x0 + str r0, [sp, #0x14] + ldr r0, =UNK_020ECD4C + str r0, [sp, #0x1c] +_02006F30: + ldr r0, [r4, #0x0] + lsl r0, r0, #0x1f + lsr r0, r0, #0x1f + beq _02006F46 + ldr r0, [r4, #0x54] + lsl r1, r0, #0x1f + lsr r1, r1, #0x1f + bne _02006F46 + lsl r0, r0, #0x14 + lsr r0, r0, #0x1f + beq _02006F48 +_02006F46: + b _020072BC +_02006F48: + ldr r2, [r4, #0x68] + cmp r2, #0x0 + beq _02006F56 + add r1, r4, #0x0 + add r0, r4, #0x0 + add r1, #0x24 + blx r2 +_02006F56: + bl NNS_G3dGeFlushBuffer + ldr r0, =0x000002E3 + ldrb r0, [r5, r0] + cmp r0, #0x1 + beq _02006F68 + ldr r0, =0x04000454 + mov r1, #0x0 + str r1, [r0, #0x0] +_02006F68: + add r0, r4, #0x0 + bl FUN_02007F48 + mov r0, #0x9d + lsl r0, r0, #0x2 + ldr r0, [r5, r0] + cmp r0, #0x2 + bne _02006F7C + mov r0, #0x1 + b _02006F7E +_02006F7C: + mov r0, #0x0 +_02006F7E: + mov r1, #0xa9 + lsl r1, r1, #0x2 + ldr r2, [r5, r1] + ldr r1, [sp, #0x14] + add r2, r2, r1 + mov r1, #0x4 + sub r0, r1, r0 + add r1, r2, #0x0 + lsr r1, r0 + ldr r0, =0x040004AC + str r1, [r0, #0x0] + ldr r0, [r4, #0x28] + lsl r1, r0, #0xc + mov r0, #0x26 + ldrsh r2, [r4, r0] + mov r0, #0x42 + ldrsh r0, [r4, r0] + add r0, r2, r0 + mov r2, #0x24 + ldrsh r3, [r4, r2] + mov r2, #0x40 + ldrsh r2, [r4, r2] + lsl r0, r0, #0xc + add r2, r3, r2 + lsl r3, r2, #0xc + ldr r2, =0x04000470 + str r3, [r2, #0x0] + str r0, [r2, #0x0] + add r0, r2, #0x0 + str r1, [r0, #0x0] + ldrh r0, [r4, #0x38] + asr r0, r0, #0x4 + lsl r1, r0, #0x2 + ldr r0, =FX_SinCosTable_ + add r2, r0, r1 + ldrsh r0, [r0, r1] + mov r1, #0x2 + ldrsh r1, [r2, r1] + bl G3_RotX + ldrh r0, [r4, #0x3a] + asr r0, r0, #0x4 + lsl r1, r0, #0x2 + ldr r0, =FX_SinCosTable_ + add r2, r0, r1 + ldrsh r0, [r0, r1] + mov r1, #0x2 + ldrsh r1, [r2, r1] + bl G3_RotY + ldrh r0, [r4, #0x3c] + asr r0, r0, #0x4 + lsl r1, r0, #0x2 + ldr r0, =FX_SinCosTable_ + add r2, r0, r1 + ldrsh r0, [r0, r1] + mov r1, #0x2 + ldrsh r1, [r2, r1] + bl G3_RotZ + ldr r0, [r4, #0x28] + lsl r0, r0, #0xc + neg r1, r0 + mov r0, #0x26 + ldrsh r2, [r4, r0] + mov r0, #0x42 + ldrsh r0, [r4, r0] + add r0, r2, r0 + mov r2, #0x24 + ldrsh r3, [r4, r2] + mov r2, #0x40 + ldrsh r2, [r4, r2] + lsl r0, r0, #0xc + neg r0, r0 + add r2, r3, r2 + lsl r2, r2, #0xc + neg r3, r2 + ldr r2, =0x04000470 + str r3, [r2, #0x0] + str r0, [r2, #0x0] + add r0, r2, #0x0 + str r1, [r0, #0x0] + ldr r3, [r4, #0x50] + lsl r0, r3, #0x11 + lsr r0, r0, #0x1b + lsl r2, r3, #0x16 + lsl r1, r0, #0xa + lsl r0, r3, #0x1b + lsr r2, r2, #0x1b + lsr r0, r0, #0x1b + lsl r2, r2, #0x5 + orr r0, r2 + orr r0, r1 + lsl r0, r0, #0x10 + lsr r2, r0, #0x10 + lsl r0, r3, #0x2 + lsr r0, r0, #0x1b + lsl r1, r0, #0xa + lsl r0, r3, #0xc + lsl r3, r3, #0x7 + lsr r3, r3, #0x1b + lsr r0, r0, #0x1b + lsl r3, r3, #0x5 + orr r0, r3 + orr r0, r1 + lsl r0, r0, #0x10 + lsr r0, r0, #0x10 + lsl r0, r0, #0x10 + add r1, r2, #0x0 + orr r1, r0 + mov r0, #0x2 + lsl r0, r0, #0xe + orr r1, r0 + ldr r0, =0x040004C0 + str r1, [r0, #0x0] + ldr r1, =0x00004210 + add r0, r0, #0x4 + str r1, [r0, #0x0] + ldr r1, [r4, #0x0] + ldr r0, [r4, #0x54] + lsl r1, r1, #0x19 + lsl r0, r0, #0x19 + lsr r1, r1, #0x1a + lsr r0, r0, #0x1b + lsl r2, r1, #0x18 + mov r1, #0xc0 + lsl r0, r0, #0x10 + orr r1, r2 + orr r1, r0 + ldr r0, =0x040004A4 + str r1, [r0, #0x0] + ldr r0, [r4, #0x54] + lsl r0, r0, #0x1e + lsr r0, r0, #0x1f + beq _02007104 + add r0, r4, #0x0 + add r0, #0x5b + ldrb r0, [r0, #0x0] + add r2, r4, #0x0 + add r2, #0x44 + lsl r1, r0, #0x4 + ldr r0, [sp, #0x1c] + ldrb r3, [r2, #0x0] + add r0, r0, r1 + ldr r2, [sp, #0x1c] + ldr r0, [r0, #0x4] + ldr r1, [r2, r1] + add r6, r3, r1 + add r1, r4, #0x0 + add r1, #0x46 + ldrb r1, [r1, #0x0] + mov r12, r1 + add r1, r4, #0x0 + add r1, #0x45 + ldrb r2, [r1, #0x0] + add r1, r2, r0 + add r0, r4, #0x0 + add r0, #0x47 + ldrb r7, [r0, #0x0] + mov r0, r12 + add r0, r0, r6 + str r7, [sp, #0x0] + str r6, [sp, #0x4] + str r1, [sp, #0x8] + str r0, [sp, #0xc] + add r0, r7, r1 + str r0, [sp, #0x10] + mov r1, #0x24 + ldrsh r1, [r4, r1] + mov r0, #0x2c + ldrsh r0, [r4, r0] + sub r1, #0x28 + add r1, r1, r3 + add r0, r0, r1 + mov r3, #0x26 + ldrsh r3, [r4, r3] + mov r1, #0x2e + lsl r0, r0, #0x10 + sub r3, #0x28 + add r2, r3, r2 + ldrsh r1, [r4, r1] + ldr r3, [r4, #0x28] + asr r0, r0, #0x10 + add r2, r1, r2 + mov r1, #0x6e + ldrsb r1, [r4, r1] + sub r1, r2, r1 + ldr r2, [r4, #0x30] + lsl r1, r1, #0x10 + add r2, r3, r2 + asr r1, r1, #0x10 + mov r3, r12 + bl NNS_G2dDrawSpriteFast + b _02007174 +_02007104: + mov r0, #0x34 + ldrsh r1, [r4, r0] + mov r0, #0x50 + ldr r2, [sp, #0x1c] + mul r0, r1 + asr r3, r0, #0x8 + mov r0, #0x36 + ldrsh r1, [r4, r0] + mov r0, #0x50 + ldr r6, [sp, #0x1c] + mul r0, r1 + asr r1, r0, #0x8 + add r0, r4, #0x0 + add r0, #0x5b + ldrb r0, [r0, #0x0] + lsl r0, r0, #0x4 + str r1, [sp, #0x0] + add r2, r2, r0 + ldr r0, [r6, r0] + lsr r6, r1, #0x1f + str r0, [sp, #0x4] + ldr r0, [r2, #0x4] + add r6, r1, r6 + str r0, [sp, #0x8] + ldr r0, [r2, #0x8] + asr r1, r6, #0x1 + str r0, [sp, #0xc] + ldr r0, [r2, #0xc] + str r0, [sp, #0x10] + mov r0, #0x24 + ldrsh r2, [r4, r0] + lsr r0, r3, #0x1f + add r0, r3, r0 + asr r0, r0, #0x1 + sub r2, r2, r0 + mov r0, #0x2c + ldrsh r0, [r4, r0] + ldr r6, [r4, #0x28] + add r0, r2, r0 + mov r2, #0x26 + ldrsh r2, [r4, r2] + lsl r0, r0, #0x10 + asr r0, r0, #0x10 + sub r2, r2, r1 + mov r1, #0x2e + ldrsh r1, [r4, r1] + add r2, r2, r1 + mov r1, #0x6e + ldrsb r1, [r4, r1] + sub r1, r2, r1 + ldr r2, [r4, #0x30] + lsl r1, r1, #0x10 + asr r1, r1, #0x10 + add r2, r6, r2 + bl NNS_G2dDrawSpriteFast +_02007174: + add r0, r4, #0x0 + add r0, #0x6c + ldrh r0, [r0, #0x0] + lsl r1, r0, #0x1e + lsr r1, r1, #0x1e + beq _0200719A + lsl r0, r0, #0x19 + lsr r0, r0, #0x1e + beq _0200719A + ldr r0, [r4, #0x54] + lsl r0, r0, #0x1e + lsr r0, r0, #0x1f + bne _0200719A + mov r0, #0xb9 + lsl r0, r0, #0x2 + ldr r1, [r5, r0] + mov r0, #0x1 + tst r0, r1 + beq _0200719C +_0200719A: + b _020072BC +_0200719C: + ldr r0, =0x000002E3 + ldrb r0, [r5, r0] + cmp r0, #0x1 + beq _020071AA + ldr r0, =0x04000454 + mov r1, #0x0 + str r1, [r0, #0x0] +_020071AA: + mov r0, #0x9d + lsl r0, r0, #0x2 + ldr r0, [r5, r0] + cmp r0, #0x2 + bne _020071B8 + mov r1, #0x1 + b _020071BA +_020071B8: + mov r1, #0x0 +_020071BA: + add r2, r4, #0x0 + add r2, #0x6c + ldrh r2, [r2, #0x0] + mov r0, #0xa9 + lsl r0, r0, #0x2 + lsl r2, r2, #0x1e + lsr r2, r2, #0x1e + add r2, r2, #0x3 + ldr r0, [r5, r0] + lsl r2, r2, #0x5 + add r2, r0, r2 + mov r0, #0x4 + sub r0, r0, r1 + add r1, r2, #0x0 + lsr r1, r0 + ldr r0, =0x040004AC + str r1, [r0, #0x0] + add r0, r4, #0x0 + add r0, #0x6c + ldrh r0, [r0, #0x0] + lsl r0, r0, #0x1b + lsr r0, r0, #0x1f + beq _020071FA + mov r0, #0x34 + ldrsh r0, [r4, r0] + lsl r0, r0, #0x6 + asr r3, r0, #0x8 + mov r0, #0x36 + ldrsh r0, [r4, r0] + lsl r0, r0, #0x4 + asr r1, r0, #0x8 + b _020071FE +_020071FA: + mov r3, #0x40 + mov r1, #0x10 +_020071FE: + add r0, r4, #0x0 + add r0, #0x6c + ldrh r0, [r0, #0x0] + lsl r0, r0, #0x1d + lsr r0, r0, #0x1f + beq _02007220 + mov r0, #0x74 + ldrsh r2, [r4, r0] + mov r0, #0x24 + mov r6, #0x2c + ldrsh r0, [r4, r0] + ldrsh r6, [r4, r6] + add r0, r0, r6 + add r2, r2, r0 + add r0, r4, #0x0 + add r0, #0x70 + strh r2, [r0, #0x0] +_02007220: + add r0, r4, #0x0 + add r0, #0x6c + ldrh r0, [r0, #0x0] + lsl r0, r0, #0x1c + lsr r0, r0, #0x1f + beq _02007242 + mov r0, #0x76 + ldrsh r2, [r4, r0] + mov r0, #0x26 + mov r6, #0x2e + ldrsh r0, [r4, r0] + ldrsh r6, [r4, r6] + add r0, r0, r6 + add r2, r2, r0 + add r0, r4, #0x0 + add r0, #0x72 + strh r2, [r0, #0x0] +_02007242: + add r0, r4, #0x0 + add r0, #0x6c + ldrh r0, [r0, #0x0] + ldr r2, =UNK_020ECBD0 + ldr r6, =UNK_020ECBD0 + lsl r0, r0, #0x19 + lsr r0, r0, #0x1e + lsl r0, r0, #0x4 + str r1, [sp, #0x0] + add r2, r2, r0 + ldr r0, [r6, r0] + lsr r6, r1, #0x1f + str r0, [sp, #0x4] + ldr r0, [r2, #0x4] + add r6, r1, r6 + str r0, [sp, #0x8] + ldr r0, [r2, #0x8] + asr r1, r6, #0x1 + str r0, [sp, #0xc] + ldr r0, [r2, #0xc] + str r0, [sp, #0x10] + mov r0, #0x70 + ldrsh r2, [r4, r0] + lsr r0, r3, #0x1f + add r0, r3, r0 + asr r0, r0, #0x1 + sub r0, r2, r0 + mov r2, #0x72 + ldrsh r2, [r4, r2] + lsl r0, r0, #0x10 + asr r0, r0, #0x10 + sub r1, r2, r1 + lsl r1, r1, #0x10 + ldr r2, =0xFFFFFC18 + asr r1, r1, #0x10 + bl NNS_G2dDrawSpriteFast +_020072BC: + ldr r0, [sp, #0x14] + add r4, #0x98 + add r0, #0x20 + str r0, [sp, #0x14] + ldr r0, [sp, #0x1c] + add r0, #0x20 + str r0, [sp, #0x1c] + ldr r0, [sp, #0x18] + add r0, r0, #0x1 + str r0, [sp, #0x18] + cmp r0, #0x4 + bge _020072D6 + b _02006F30 +_020072D6: + ldr r0, =0x04000448 + mov r1, #0x1 + str r1, [r0, #0x0] + add sp, #0x20 + pop {r3-r7, pc} + // clang-format on +} +#endif + +THUMB_FUNC void FUN_020072E8(struct UnkStruct_02006D98 *param0) { + FreeToHeap(param0->unk2AC); + FreeToHeap(param0->unk2B0); + FreeToHeap(param0->unk2B4); + FreeToHeap(param0); +} + +THUMB_FUNC void FUN_02007314(struct UnkStruct_02006D98_2 *param0) { + param0->unk59 = 0; + for (s32 i = 0; i < 10; i++) { + param0->unk5C[i] = 0; + } + if (param0->unk84[param0->unk59].unk0 == -1) { + param0->unk5B = 0; + return; + } + + param0->unk58 = 1; + param0->unk5B = (u8)param0->unk84[param0->unk59].unk0; + param0->unk5A = param0->unk84[param0->unk59].unk1; +} + +THUMB_FUNC void FUN_0200737C(struct UnkStruct_02006D98_2 *param0, struct UnkStruct_02006D98_sub *param1) { + MI_CpuCopy8(param1, param0->unk84, sizeof(struct UnkStruct_02006D98_sub) * 10); +} + +THUMB_FUNC BOOL FUN_02007390(struct UnkStruct_02006D98_2 *param0) { + if (param0->unk58 != 0) { + return TRUE; + } + return FALSE; +} + +THUMB_FUNC struct UnkStruct_02006D98_2 *FUN_020073A0(struct UnkStruct_02006D98 *param0, + struct UnkStruct_02006D98_4 *param1, + u32 param2, + u32 param3, + u32 param4, + u32 param5, + const void *param6, + void (*param7)(struct UnkStruct_02006D98_2 *, void *)) { + s32 i; + for (i = 0; i < 4; i++) { + if (param0->unk000[i].unk00_0 == 0) { + break; + } + } + GF_ASSERT(i != 4); + + return FUN_020073E8(param0, param1, param2, param3, param4, param5, i, param6, param7); +} + +THUMB_FUNC struct UnkStruct_02006D98_2 *FUN_020073E8(struct UnkStruct_02006D98 *param0, + struct UnkStruct_02006D98_4 *param1, + u32 param2, + u32 param3, + u32 param4, + u32 param5, + s32 param6, + const void *param7, + void (*param8)(struct UnkStruct_02006D98_2 *, void *)) { + GF_ASSERT(param0->unk000[param6].unk00_0 == 0); + + MIi_CpuClearFast(0, ¶m0->unk000[param6], sizeof(struct UnkStruct_02006D98_2)); + param0->unk000[param6].unk00_0 = 1; + param0->unk000[param6].unk00_7 = 1; + param0->unk000[param6].unk00_8 = 1; + param0->unk000[param6].unk00_1 = param5; + + param0->unk000[param6].unk04 = *param1; + param0->unk000[param6].unk14 = *param1; + param0->unk000[param6].unk24 = (s16)param2; + param0->unk000[param6].unk26 = (s16)param3; + param0->unk000[param6].unk28 = param4; + param0->unk000[param6].unk34 = 0x100; + param0->unk000[param6].unk36 = 0x100; + param0->unk000[param6].unk54_2 = 0x1f; + param0->unk000[param6].unk50_0 = 0x1f; + param0->unk000[param6].unk50_5 = 0x1f; + param0->unk000[param6].unk50_a = 0x1f; + param0->unk000[param6].unk50_f = 0x10; + param0->unk000[param6].unk50_14 = 0x10; + param0->unk000[param6].unk50_19 = 0x10; + param0->unk000[param6].unk68 = param8; + param0->unk000[param6].unk6C.unk4 = (s16)param2; + param0->unk000[param6].unk6C.unk6 = (s16)param3; + param0->unk000[param6].unk6C.unk0_2 = 1; + param0->unk000[param6].unk6C.unk0_3 = 1; + param0->unk000[param6].unk6C.unk0_4 = 1; + + if (param7 != NULL) { + MI_CpuCopy8(param7, param0->unk000[param6].unk84, 0x14); + } + + return ¶m0->unk000[param6]; +} + +THUMB_FUNC void FUN_02007534(struct UnkStruct_02006D98_2 *param0) { + param0->unk00_0 = 0; +} + +THUMB_FUNC void FUN_02007540(struct UnkStruct_02006D98 *param0) { + for (s32 i = 0; i < 4; i++) { + FUN_02007534(¶m0->unk000[i]); + } +} + +THUMB_FUNC void FUN_02007558(struct UnkStruct_02006D98_2 *param0, u32 param1, u32 param2) { + switch (param1) { + case 0: + param0->unk24 = (s16)param2; + break; + case 1: + param0->unk26 = (s16)param2; + break; + case 2: + param0->unk28 = param2; + break; + case 3: + param0->unk2C = (s16)param2; + break; + case 4: + param0->unk2E = (s16)param2; + break; + case 5: + param0->unk30 = param2; + break; + case 6: + param0->unk54_0 = param2; + break; + case 7: + param0->unk38 = (u16)param2; + break; + case 8: + param0->unk3A = (u16)param2; + break; + case 9: + param0->unk3C = (u16)param2; + break; + case 10: + param0->unk40 = (s16)param2; + break; + case 11: + param0->unk42 = (s16)param2; + break; + case 12: + param0->unk34 = (s16)param2; + break; + case 13: + param0->unk36 = (s16)param2; + break; + case 14: + param0->unk54_1 = param2; + break; + case 15: + param0->unk44 = (u8)param2; + break; + case 16: + param0->unk45 = (u8)param2; + break; + case 17: + param0->unk46 = (u8)param2; + break; + case 18: + param0->unk47 = (u8)param2; + break; + case 19: + param0->unk6C.unk4 = (s16)param2; + break; + case 20: + param0->unk6C.unk6 = (s16)param2; + break; + case 21: + param0->unk6C.unk8 = (s16)param2; + break; + case 22: + param0->unk6C.unka = (s16)param2; + break; + case 23: + param0->unk54_2 = param2; + break; + case 24: + param0->unk50_0 = param2; + break; + case 25: + param0->unk50_5 = param2; + break; + case 26: + param0->unk50_a = param2; + break; + case 27: + param0->unk50_f = param2; + break; + case 28: + param0->unk50_14 = param2; + break; + case 29: + param0->unk50_19 = param2; + break; + case 30: + param0->unk54_C = param2; + param0->unk00_8 = 1; + break; + case 31: + param0->unk4C = param2; + param0->unk00_8 = 1; + break; + case 32: + param0->unk48 = (u8)param2; + param0->unk00_8 = 1; + break; + case 33: + param0->unk49 = (u8)param2; + param0->unk00_8 = 1; + break; + case 34: + param0->unk4A = (u8)param2; + break; + case 35: + param0->unk54_9 = param2; + param0->unk00_7 = 1; + break; + case 36: + param0->unk54_A = param2; + param0->unk00_7 = 1; + break; + case 37: + param0->unk54_B = param2; + break; + case 38: + param0->unk5B = (u8)param2; + break; + case 40: + param0->unk54_D = param2; + param0->unk00_7 = 1; + break; + case 41: + param0->unk6C.unk2 = (s8)param2; + break; + case 42: + param0->unk6C.unk0_0 = (u16)param2; + param0->unk00_8 = 1; + break; + case 43: + param0->unk6C.unk0_2 = (u16)param2; + break; + case 44: + param0->unk6C.unk0_3 = (u16)param2; + break; + case 45: + param0->unk6C.unk0_4 = (u16)param2; + break; + case 46: + param0->unk6C.unk0_5 = (u16)param2; + break; + } +} + +THUMB_FUNC u32 FUN_0200782C(struct UnkStruct_02006D98_2 *param0, u32 param1) { + switch (param1) { + case 0: + return param0->unk24; + + case 1: + return param0->unk26; + + case 2: + return param0->unk28; + + case 3: + return param0->unk2C; + + case 4: + return param0->unk2E; + + case 5: + return param0->unk30; + + case 6: + return param0->unk54_0; + + case 7: + return param0->unk38; + + case 8: + return param0->unk3A; + + case 9: + return param0->unk3C; + + case 10: + return param0->unk40; + + case 11: + return param0->unk42; + + case 12: + return param0->unk34; + + case 13: + return param0->unk36; + + case 14: + return param0->unk54_1; + + case 15: + return param0->unk44; + + case 16: + return param0->unk45; + + case 17: + return param0->unk46; + + case 18: + return param0->unk47; + + case 19: + return param0->unk6C.unk4; + + case 20: + return param0->unk6C.unk6; + + case 21: + return param0->unk6C.unk8; + + case 22: + return param0->unk6C.unka; + + case 23: + return param0->unk54_2; + + case 24: + return param0->unk50_0; + + case 25: + return param0->unk50_5; + + case 26: + return param0->unk50_a; + + case 27: + return param0->unk50_f; + + case 28: + return param0->unk50_14; + + case 29: + return param0->unk50_19; + + case 30: + return param0->unk54_C; + + case 31: + return param0->unk4C; + + case 32: + return param0->unk48; + + case 33: + return param0->unk49; + + case 34: + return param0->unk4A; + + case 35: + return param0->unk54_9; + + case 36: + return param0->unk54_A; + + case 37: + return param0->unk54_B; + + case 38: + return param0->unk5B; + + case 40: + return param0->unk54_D; + + case 41: + return param0->unk6C.unk2; + + case 42: + return param0->unk6C.unk0_0; + + case 43: + return param0->unk6C.unk0_2; + + case 44: + return param0->unk6C.unk0_3; + + case 45: + return param0->unk6C.unk0_4; + + case 46: + return param0->unk6C.unk0_5; + } + + GF_AssertFail(); + + return 0; +} + +THUMB_FUNC void FUN_020079E0(struct UnkStruct_02006D98_2 *param0, u32 param1, u32 param2) { + switch (param1) { + case 0: + param0->unk24 += param2; + break; + case 1: + param0->unk26 += param2; + break; + case 2: + param0->unk28 += param2; + break; + case 3: + param0->unk2C += param2; + break; + case 4: + param0->unk2E += param2; + break; + case 5: + param0->unk30 += param2; + break; + case 6: + param0->unk54_0 += param2; + break; + case 7: + param0->unk38 += param2; + break; + case 8: + param0->unk3A += param2; + break; + case 9: + param0->unk3C += param2; + break; + case 10: + param0->unk40 += param2; + break; + case 11: + param0->unk42 += param2; + break; + case 12: + param0->unk34 += param2; + break; + case 13: + param0->unk36 += param2; + break; + case 14: + param0->unk54_1 += param2; + break; + case 15: + param0->unk44 += param2; + break; + case 16: + param0->unk45 += param2; + break; + case 17: + param0->unk46 += param2; + break; + case 18: + param0->unk47 += param2; + break; + case 19: + param0->unk6C.unk4 += param2; + break; + case 20: + param0->unk6C.unk6 += param2; + break; + case 21: + param0->unk6C.unk8 += param2; + break; + case 22: + param0->unk6C.unka += param2; + break; + case 23: + param0->unk54_2 += param2; + break; + case 24: + param0->unk50_0 += param2; + break; + case 25: + param0->unk50_5 += param2; + break; + case 26: + param0->unk50_a += param2; + break; + case 27: + param0->unk50_f += param2; + break; + case 28: + param0->unk50_14 += param2; + break; + case 29: + param0->unk50_19 += param2; + break; + case 30: + param0->unk54_C += param2; + param0->unk00_8 = 1; + break; + case 31: + param0->unk4C += param2; + param0->unk00_8 = 1; + break; + case 32: + param0->unk48 += param2; + param0->unk00_8 = 1; + break; + case 33: + param0->unk49 += param2; + param0->unk00_8 = 1; + break; + case 34: + param0->unk4A += param2; + break; + case 35: + param0->unk54_9 += param2; + param0->unk00_7 = 1; + break; + case 36: + param0->unk54_A += param2; + param0->unk00_7 = 1; + break; + case 37: + param0->unk54_B += param2; + break; + case 38: + param0->unk5B += param2; + break; + case 40: + param0->unk54_D += param2; + param0->unk00_7 = 1; + break; + case 41: + param0->unk6C.unk2 += param2; + break; + case 42: + param0->unk6C.unk0_0 += param2; + param0->unk00_8 = 1; + break; + case 43: + param0->unk6C.unk0_2 += param2; + break; + case 44: + param0->unk6C.unk0_3 += param2; + break; + case 45: + param0->unk6C.unk0_4 += param2; + break; + case 46: + param0->unk6C.unk0_5 += param2; + break; + } +} + +THUMB_FUNC void FUN_02007E40( + struct UnkStruct_02006D98_2 *param0, u32 param1, u32 param2, u32 param3, u32 param4) { + param0->unk54_1 = 1; + param0->unk44 = (u8)param1; + param0->unk45 = (u8)param2; + param0->unk46 = (u8)param3; + param0->unk47 = (u8)param4; +} + +THUMB_FUNC void FUN_02007E68( + struct UnkStruct_02006D98_2 *param0, u32 param1, u32 param2, u32 param3, u32 param4) { + param0->unk54_C = 1; + param0->unk48 = (u8)param1; + param0->unk49 = (u8)param2; + param0->unk4A = 0; + param0->unk4B = (u8)param3; + param0->unk4C = param4; +} + +THUMB_FUNC void FUN_02007E98( + struct UnkStruct_02006D98 *param0, u32 param1, u32 param2, u32 param3, u32 param4) { + for (s32 i = 0; i < 4; i++) { + if (param0->unk000[i].unk00_0 == 0) { + continue; + } + + param0->unk000[i].unk54_C = 1; + param0->unk000[i].unk48 = (u8)param1; + param0->unk000[i].unk49 = (u8)param2; + param0->unk000[i].unk4A = 0; + param0->unk000[i].unk4B = (u8)param3; + param0->unk000[i].unk4C = param4; + } +} + +THUMB_FUNC void FUN_02007EEC(struct UnkStruct_02006D98_2 *param0) { + param0->unk54_C = 0; + param0->unk48 = 0; + param0->unk49 = 0; + param0->unk4A = 0; + param0->unk4B = 0; + param0->unk4C = 0; + param0->unk00_8 = 1; +} + +THUMB_FUNC BOOL FUN_02007F20(struct UnkStruct_02006D98_2 *param0) { + return param0->unk54_C == 1; +} + +THUMB_FUNC void FUN_02007F34(struct UnkStruct_02006D98_2 *param0, s32 param1) { + param0->unk2E = (s16)((40 - param1) - (((40 - param1) * param0->unk36) >> 8)); +} + +#ifdef NONMATCHING +THUMB_FUNC void FUN_02007F48(struct UnkStruct_02006D98_2 *param0) { + u8 *r6 = ¶m0->unk59; + if (param0->unk58 == 0) { + return; + } + + if (param0->unk5A == 0) { + (*r6)++; + + while (param0->unk84[*r6].unk0 < -1) { + param0->unk5C[*r6]++; + + if (param0->unk84[*r6].unk1 == param0->unk5C[*r6] || param0->unk84[*r6].unk1 == 0) { + param0->unk5C[*r6] = 0; + r6++; + } else { + *r6 = -2 - param0->unk84[*r6].unk0; + } + } + + if (param0->unk84[*r6].unk0 == -1 || *r6 >= 10) { + param0->unk5B = 0; + param0->unk58 = 0; + + return; + } + + param0->unk5B = param0->unk84[*r6].unk0; + param0->unk5A = param0->unk84[*r6].unk1; + } else { + param0->unk5A--; + } +} +#else +asm void FUN_02007F48(struct UnkStruct_02006D98_2 *param0) { + // clang-format off + push {r4-r7} + add r1, r0, #0x0 + add r1, #0x58 + ldrb r1, [r1, #0x0] + add r6, r0, #0x0 + add r6, #0x59 + cmp r1, #0x0 + beq _0200800A + add r1, r0, #0x0 + add r1, #0x5a + ldrb r1, [r1, #0x0] + cmp r1, #0x0 + bne _02007FFE + ldrb r1, [r6, #0x0] + add r1, r1, #0x1 + strb r1, [r6, #0x0] + ldrb r3, [r6, #0x0] + mov r1, #0x84 + lsl r4, r3, #0x1 + add r2, r0, r4 + ldrsb r2, [r2, r1] + sub r1, #0x85 + cmp r2, r1 + bge _02007FC6 + mov r2, #0x0 + sub r1, r2, #0x2 +_02007F7C: + add r4, r0, r3 + add r4, #0x5c + ldrb r4, [r4, #0x0] + add r3, r0, r3 + add r3, #0x5c + add r4, r4, #0x1 + strb r4, [r3, #0x0] + ldrb r5, [r6, #0x0] + lsl r3, r5, #0x1 + add r4, r0, r3 + add r3, r4, #0x0 + add r7, r0, r5 + add r3, #0x85 + add r7, #0x5c + ldrb r3, [r3, #0x0] + ldrb r7, [r7, #0x0] + cmp r3, r7 + beq _02007FA4 + cmp r3, #0x0 + bne _02007FAE +_02007FA4: + add r3, r0, r5 + add r3, #0x5c + strb r2, [r3, #0x0] + add r6, r6, #0x1 + b _02007FB6 +_02007FAE: + mov r3, #0x84 + ldrsb r3, [r4, r3] + sub r3, r1, r3 + strb r3, [r6, #0x0] +_02007FB6: + ldrb r3, [r6, #0x0] + mov r5, #0x84 + lsl r4, r3, #0x1 + add r7, r0, r4 + ldrsb r7, [r7, r5] + sub r5, #0x85 + cmp r7, r5 + blt _02007F7C +_02007FC6: + add r2, r0, r4 + mov r1, #0x84 + ldrsb r2, [r2, r1] + sub r1, #0x85 + cmp r2, r1 + beq _02007FD6 + cmp r3, #0xa + blo _02007FE6 +_02007FD6: + add r1, r0, #0x0 + mov r2, #0x0 + add r1, #0x5b + strb r2, [r1, #0x0] + add r0, #0x58 + strb r2, [r0, #0x0] + pop {r4-r7} + bx lr +_02007FE6: + add r1, r0, #0x0 + add r1, #0x5b + strb r2, [r1, #0x0] + ldrb r1, [r6, #0x0] + lsl r1, r1, #0x1 + add r1, r0, r1 + add r1, #0x85 + ldrb r1, [r1, #0x0] + add r0, #0x5a + strb r1, [r0, #0x0] + pop {r4-r7} + bx lr +_02007FFE: + add r1, r0, #0x0 + add r1, #0x5a + ldrb r1, [r1, #0x0] + add r0, #0x5a + sub r1, r1, #0x1 + strb r1, [r0, #0x0] +_0200800A: + pop {r4-r7} + bx lr + // clang-format on +} +#endif + +THUMB_FUNC void FUN_02008010(u8 *param0, struct UnkStruct_02006D98_sub *param1) { + param0[0] = 1; + param0[2] = 0; + param0[1] = (u8)param1->unk0; + param0[3] = param1->unk1; + ((struct UnkStruct_02006D98_sub **)param0)[4] = param1; + + for (s32 i = 0; i < 10; i++) { + param0[i + 4] = 0; + } +} + +#ifdef NONMATCHING +THUMB_FUNC s32 FUN_02008030(u8 *param0) { + if (*param0 != 0) { + u8 *r3 = param0 + 2; + struct UnkStruct_02006D98_sub *r4 = ((struct UnkStruct_02006D98_sub **)param0)[4]; + if (*param0 != 0) { + if (param0[3] == 0) { + (*r3)++; + + while (r4[*r3].unk0 < -1) { + param0[*r3 + 4]++; + if (r4[*r3].unk1 == param0[*r3 + 4] || r4[*r3].unk1 == 0) { + param0[*r3 + 4] = 0; + r3++; + } else { + *r3 = -2 - r4[*r3].unk0; + } + } + + if (r4[*r3].unk0 == -1 || *r3 >= 10) { + param0[0] = 0; + param0[1] = 0; + } else { + param0[1] = r4[*r3].unk0; + param0[3] = r4[*r3].unk1; + } + } else { + param0[3]--; + } + } + + return param0[1]; + } + + return -1; +} +#else +asm s32 FUN_02008030(u8 *param0) { + // clang-format off + push {r4-r7} + ldrb r1, [r0, #0x0] + cmp r1, #0x0 + beq _020080C6 + add r3, r0, #0x2 + ldr r4, [r0, #0x10] + cmp r1, #0x0 + beq _020080C0 + ldrb r1, [r0, #0x3] + cmp r1, #0x0 + bne _020080BC + ldrb r1, [r3, #0x0] + add r1, r1, #0x1 + strb r1, [r3, #0x0] + ldrb r2, [r3, #0x0] + mov r1, #0x0 + mvn r1, r1 + lsl r5, r2, #0x1 + ldrsb r6, [r4, r5] + cmp r6, r1 + bge _02008098 + mov r1, #0x0 +_0200805C: + add r5, r0, r2 + ldrb r2, [r5, #0x4] + add r2, r2, #0x1 + strb r2, [r5, #0x4] + ldrb r2, [r3, #0x0] + add r5, r0, r2 + lsl r2, r2, #0x1 + add r2, r4, r2 + ldrb r7, [r2, #0x1] + ldrb r6, [r5, #0x4] + cmp r7, r6 + beq _02008078 + cmp r7, #0x0 + bne _0200807E +_02008078: + strb r1, [r5, #0x4] + add r3, r3, #0x1 + b _0200808A +_0200807E: + mov r5, #0x0 + ldrsb r5, [r2, r5] + mov r2, #0x1 + mvn r2, r2 + sub r2, r2, r5 + strb r2, [r3, #0x0] +_0200808A: + ldrb r2, [r3, #0x0] + mov r6, #0x0 + mvn r6, r6 + lsl r5, r2, #0x1 + ldrsb r7, [r4, r5] + cmp r7, r6 + blt _0200805C +_02008098: + ldrsb r5, [r4, r5] + mov r1, #0x0 + mvn r1, r1 + cmp r5, r1 + beq _020080A6 + cmp r2, #0xa + blo _020080AE +_020080A6: + mov r1, #0x0 + strb r1, [r0, #0x1] + strb r1, [r0, #0x0] + b _020080C0 +_020080AE: + strb r5, [r0, #0x1] + ldrb r1, [r3, #0x0] + lsl r1, r1, #0x1 + add r1, r4, r1 + ldrb r1, [r1, #0x1] + strb r1, [r0, #0x3] + b _020080C0 +_020080BC: + sub r1, r1, #0x1 + strb r1, [r0, #0x3] +_020080C0: + ldrb r0, [r0, #0x1] + pop {r4-r7} + bx lr +_020080C6: + mov r0, #0x0 + mvn r0, r0 + pop {r4-r7} + bx lr + // clang-format on +} +#endif + +THUMB_FUNC void FUN_020080D0(struct UnkStruct_02006D98_2 *param0) { + param0->unk00_7 = 1; + param0->unk00_8 = 1; +} + +THUMB_FUNC void FUN_020080E0(struct UnkStruct_02006D98_2 *param0) { + param0->unk14 = param0->unk04; + param0->unk78 = param0->unk6C; +} + +THUMB_FUNC void FUN_0200813C(struct UnkStruct_02006D98_2 *param0) { + param0->unk04 = param0->unk14; + param0->unk6C = param0->unk78; + param0->unk00_7 = 1; + param0->unk00_8 = 1; +} + +THUMB_FUNC void FUN_020081A8(struct UnkStruct_02006D98 *param0, u32 param1, u32 param2) { + param0->unk29C = param1; + param0->unk2A0 = param2; +} + +THUMB_FUNC void FUN_020081B4(struct UnkStruct_02006D98 *param0, u32 param1, u32 param2) { + param0->unk2A4 = param1; + param0->unk2A8 = param2; +} + +THUMB_FUNC u32 FUN_020081C0(u32 param0) { + return param0 + 4; +} + +THUMB_FUNC void FUN_020081C4(struct UnkStruct_02006D98 *param0) { + if (param0->unk2E1 != 0) { + param0->unk2E1 = 0; + NNS_G2dInitImageProxy(¶m0->unk260); + + param0->unk2B8.H = 0x20; + param0->unk2B8.W = 0x20; + param0->unk2B8.szByte = param0->unk2A0; + param0->unk2B8.pRawData = param0->unk2AC; + + NNS_G2dLoadImage2DMapping( + ¶m0->unk2B8, param0->unk29C, NNS_G2D_VRAM_TYPE_3DMAIN, ¶m0->unk260); + } + + if (param0->unk2E2 != 0) { + param0->unk2E2 = 0; + NNS_G2dInitImagePaletteProxy(¶m0->unk284); + + param0->unk2D0.szByte = param0->unk2A8; + param0->unk2D0.pRawData = param0->unk2B0; + + NNS_G2dLoadPalette( + ¶m0->unk2D0, param0->unk2A4, NNS_G2D_VRAM_TYPE_3DMAIN, ¶m0->unk284); + } +} + +THUMB_FUNC void FUN_0200825C(struct UnkStruct_02006D98 *param0, u8 param1) { + param0->unk2E3 = param1; +} + +THUMB_FUNC BOOL FUN_02008268(struct UnkStruct_02006D98_2 *param0) { + GF_ASSERT(param0); + return param0->unk00_0 != 0; +} + +THUMB_FUNC void FUN_02008284(struct UnkStruct_02006D98 *param0, u32 param1) { + param0->unk2E4 |= param1; +} + +THUMB_FUNC void FUN_02008290(struct UnkStruct_02006D98 *param0, u32 param1) { + param0->unk2E4 &= (param1 ^ ~0); +} + +THUMB_FUNC void FUN_020082A8(struct UnkStruct_02006D98 *param0) { + NNSG2dCharacterData *st58; + int st54; + int r4; + int st14; + u8 *st50; + void *st4c; + u8 st48 = 0; + + for (st54 = 0; st54 < 4; st54++) { + if (param0->unk000[st54].unk00_0 != 0 && param0->unk000[st54].unk00_7 != 0) { + param0->unk000[st54].unk00_7 = 0; + st48 = 1; + st4c = AllocAndReadWholeNarcMemberByIdPair((NarcId)param0->unk000[st54].unk04.field_00, + param0->unk000[st54].unk04.field_02, + param0->unk298); + NNS_G2dGetUnpackedCharacterData(st4c, &st58); + param0->unk2B8.pixelFmt = st58->pixelFmt; + param0->unk2B8.mapingType = st58->mapingType; + param0->unk2B8.characterFmt = st58->characterFmt; + + st50 = st58->pRawData; + FUN_02008A74(st50); + FUN_020088EC(¶m0->unk000[st54], st50); + + if (st54 == 3) { + for (st14 = 0; st14 < 0x50; st14++) { + for (r4 = 0; r4 < 0x50; r4++) { + if (r4 < 0x28) { + if (param0->unk000[st54].unk54_9 != 0 && + param0->unk000[st54].unk54_A != 0) { + param0->unk2AC[st14 * 0x80 + r4 + 0x50] = + FUN_020088D8(st50[(0x4f - st14) * 0x50 + (0x27 - r4)]); + } else if (param0->unk000[st54].unk54_9 != 0) { + param0->unk2AC[st14 * 0x80 + r4 + 0x50] = + FUN_020088D8(st50[st14 * 0x50 + (0x27 - r4)]); + } else if (param0->unk000[st54].unk54_A != 0) { + param0->unk2AC[st14 * 0x80 + r4 + 0x50] = + st50[(0x4f - st14) * 0x50 + r4]; + } else if (param0->unk000[st54].unk54_D != 0) { + if (st14 % (param0->unk000[st54].unk54_D * 2) != 0) { + param0->unk2AC[st14 * 0x80 + r4 + 0x50] = + param0->unk2AC[(st14 - 1) * 0x80 + r4 + 0x50]; + } else if (r4 % param0->unk000[st54].unk54_D != 0) { + param0->unk2AC[st14 * 0x80 + r4 + 0x50] = + param0->unk2AC[st14 * 0x80 + r4 + 0x4f]; + } else { + param0->unk2AC[st14 * 0x80 + r4 + 0x50] = + (u8)((st50[st14 * 0x50 + r4] & 0xf) | + ((st50[st14 * 0x50 + r4] & 0xf) << 4)); + } + } else { + param0->unk2AC[st14 * 0x80 + r4 + 0x50] = st50[st14 * 0x50 + r4]; + } + } else { + //_02008442 + if (param0->unk000[st54].unk54_9 != 0 && + param0->unk000[st54].unk54_A != 0) { + param0->unk2AC[st14 * 0x80 + r4 + 0x2828] = + FUN_020088D8(st50[(0x4f - st14) * 0x50 + (0x4f - (r4 - 0x28))]); + } else if (param0->unk000[st54].unk54_9 != 0) { + param0->unk2AC[st14 * 0x80 + r4 + 0x2828] = + FUN_020088D8(st50[st14 * 0x50 + (0x4f - (r4 - 0x28))]); + } else if (param0->unk000[st54].unk54_A != 0) { + param0->unk2AC[st14 * 0x80 + r4 + 0x2828] = + st50[(0x4f - st14) * 0x50 + r4]; + } else if (param0->unk000[st54].unk54_D != 0) { + if (st14 % (param0->unk000[st54].unk54_D * 2) != 0) { + param0->unk2AC[st14 * 0x80 + r4 + 0x2828] = + param0->unk2AC[(st14 - 1) * 0x80 + r4 + 0x2828]; + } else if (r4 % param0->unk000[st54].unk54_D != 0) { + param0->unk2AC[st14 * 0x80 + r4 + 0x2828] = + param0->unk2AC[st14 * 0x80 + (r4 - 1) + 0x2828]; + } else { + param0->unk2AC[st14 * 0x80 + r4 + 0x2828] = + (u8)((st50[st14 * 0x50 + r4] & 0xf) | + ((st50[st14 * 0x50 + r4] & 0xf) << 4)); + } + } else { + param0->unk2AC[st14 * 0x80 + r4 + 0x2828] = st50[st14 * 0x50 + r4]; + } + } + } + } + } else { + //_02008554 + for (st14 = 0; st14 < 0x50; st14++) { + for (r4 = 0; r4 < 0x50; r4++) { + if (param0->unk000[st54].unk54_9 != 0 && param0->unk000[st54].unk54_A != 0) { + if (r4 < 0x28) { + param0->unk2AC[st14 * 0x80 + r4 + st54 * 0x2800] = + FUN_020088D8(st50[(0x4f - st14) * 0x50 + (0x27 - r4)]); + } else { + param0->unk2AC[st14 * 0x80 + r4 + st54 * 0x2800] = + FUN_020088D8(st50[(0x4f - st14) * 0x50 + (0x4f - (r4 - 0x28))]); + } + } else if (param0->unk000[st54].unk54_9 != 0) { + if (r4 < 0x28) { + param0->unk2AC[st14 * 0x80 + r4 + st54 * 0x2800] = + FUN_020088D8(st50[st14 * 0x50 + (0x27 - r4)]); + } else { + param0->unk2AC[st14 * 0x80 + r4 + st54 * 0x2800] = + FUN_020088D8(st50[st14 * 0x50 + (0x4f - (r4 - 0x28))]); + } + } else if (param0->unk000[st54].unk54_A != 0) { + param0->unk2AC[st14 * 0x80 + r4 + st54 * 0x2800] = + st50[(0x4f - st14) * 0x50 + r4]; + } else if (param0->unk000[st54].unk54_D != 0) { + if (st14 % (param0->unk000[st54].unk54_D * 2) != 0) { + param0->unk2AC[st14 * 0x80 + r4 + st54 * 0x2800] = + param0->unk2AC[(st14 - 1) * 0x80 + r4 + st54 * 0x2800]; + } else if (r4 % (param0->unk000[st54].unk54_D) != 0) { + param0->unk2AC[st14 * 0x80 + r4 + st54 * 0x2800] = + param0->unk2AC[st14 * 0x80 + (r4 - 1) + st54 * 0x2800]; + } else { + param0->unk2AC[st14 * 0x80 + r4 + st54 * 0x2800] = + (u8)((st50[st14 * 0x50 + r4] & 0xf) | + ((st50[st14 * 0x50 + r4] & 0xf) << 4)); + } + } else { + param0->unk2AC[st14 * 0x80 + r4 + st54 * 0x2800] = + st50[st14 * 0x50 + r4]; + } + } + } + } + + FreeToHeap(st4c); + } + //_020086C2 + } + + param0->unk2E1 = st48; +} + +THUMB_FUNC void FUN_020086F4(struct UnkStruct_02006D98 *param0) { + NNSG2dPaletteData *st18; + int st14, r7; + u16 *r1; + void *st10; + u8 stc = 0; + + for (st14 = 0; st14 < 4; st14++) { + if (param0->unk000[st14].unk00_0 != 0 && param0->unk000[st14].unk00_8 != 0) { + param0->unk000[st14].unk00_8 = 0; + stc = 1; + st10 = AllocAndReadWholeNarcMemberByIdPair((NarcId)param0->unk000[st14].unk04.field_00, + param0->unk000[st14].unk04.field_04, + param0->unk298); + NNS_G2dGetUnpackedPaletteData(st10, &st18); + param0->unk2D0.fmt = st18->fmt; + r1 = st18->pRawData; + for (r7 = 0; r7 < 0x10; r7++) { + param0->unk2B0[st14 * 0x10 + r7] = r1[r7]; + param0->unk2B4[st14 * 0x10 + r7] = r1[r7]; + } + FreeToHeap(st10); + + if (param0->unk000[st14].unk6C.unk0_0 != 0) { + st10 = AllocAndReadWholeNarcMemberByIdPair( + NARC_POKETOOL_POKEGRA_OTHERPOKE, NARC_otherpoke_narc_0212_NCLR, param0->unk298); + NNS_G2dGetUnpackedPaletteData(st10, &st18); + r1 = st18->pRawData; + for (r7 = 0; r7 < 0x10; r7++) { + param0->unk2B0[(param0->unk000[st14].unk6C.unk0_0 + 3) * 0x10 + r7] = r1[r7]; + param0->unk2B4[(param0->unk000[st14].unk6C.unk0_0 + 3) * 0x10 + r7] = r1[r7]; + } + FreeToHeap(st10); + } + } + //_020087E0 + + if (param0->unk000[st14].unk00_0 != 0 && param0->unk000[st14].unk54_C != 0) { + if (param0->unk000[st14].unk4A == 0) { + stc = 1; + param0->unk000[st14].unk4A = param0->unk000[st14].unk4B; + BlendPalette(param0->unk2B4 + st14 * 0x10, + param0->unk2B0 + st14 * 0x10, + 0x10, + param0->unk000[st14].unk48, + (u16)param0->unk000[st14].unk4C); + + if (param0->unk000[st14].unk6C.unk0_0 != 0) { + BlendPalette(param0->unk2B4 + (param0->unk000[st14].unk6C.unk0_0 + 3) * 0x10, + param0->unk2B0 + (param0->unk000[st14].unk6C.unk0_0 + 3) * 0x10, + 0x10, + param0->unk000[st14].unk48, + (u16)param0->unk000[st14].unk4C); + } + + if (param0->unk000[st14].unk48 == param0->unk000[st14].unk49) { + param0->unk000[st14].unk54_C = 0; + } else if (param0->unk000[st14].unk48 > param0->unk000[st14].unk49) { + param0->unk000[st14].unk48--; + } else { + param0->unk000[st14].unk48++; + } + } else { + param0->unk000[st14].unk4A--; + } + } + } + + param0->unk2E2 = stc; +} + +THUMB_FUNC u8 FUN_020088D8(u8 param0) { + return (u8)(((u8)((param0 & 0xf0) >> 4)) | ((u8)(param0 << 4))); +} + +THUMB_FUNC void FUN_020088EC(struct UnkStruct_02006D98_2 *param0, u8 *param1) { + if (param0->unk04.field_06 != 0) { + FUN_02008904(param1, param0->unk04.field_0C, 1); + } +} + +THUMB_FUNC void FUN_02008904(u8 *param0, u32 param1, u32 param2) { + struct UnkStruct_02006D98_3 *st10; + s32 i; + u32 r2; + u8 r0; + u8 r4; + u8 r1; + u32 st0 = param1; + + for (i = 0; i < 4; i++) { + st10 = UNK_02105AE8[i]; + r1 = 0; + while (st10[r1].unk0 != 0xff) { + r0 = (u8)(st10[r1].unk0 + ((param1 & 0xf) - 8)); + r4 = (u8)(st10[r1].unk1 + (((param1 & 0xf0) >> 4) - 8)); + r2 = (u32)(r0 / 2 + r4 * 0x50); + if ((r0 & 1) != 0) { + if ((param0[r2] & 0xf0) >= 0x10 && (param0[r2] & 0xf0) <= 0x30) { + param0[r2] += 0x50; + } + } else { + if ((param0[r2] & 0xf) >= 1 && (param0[r2] & 0xf) <= 3) { + param0[r2] += 5; + } + } + + r1++; + } + param1 >>= 8; + } + + param1 = st0; + + if (param2 != 0) { + for (i = 0; i < 4; i++) { + st10 = UNK_02105AE8[i]; + r1 = 0; + while (st10[r1].unk0 != 0xff) { + r0 = (u8)(st10[r1].unk0 - 14 + ((param1 & 0xf) - 8) + 0x50); + r4 = (u8)(st10[r1].unk1 + (((param1 & 0xf0) >> 4) - 8)); + r2 = (u32)(r0 / 2 + r4 * 0x50); + if ((r0 & 1) != 0) { + if ((param0[r2] & 0xf0) >= 0x10 && (param0[r2] & 0xf0) <= 0x30) { + param0[r2] += 0x50; + } + } else { + if ((param0[r2] & 0xf) >= 1 && (param0[r2] & 0xf) <= 3) { + param0[r2] += 5; + } + } + r1++; + } + param1 >>= 8; + } + } +} + +THUMB_FUNC u16 FUN_02008A54(u32 *param0) { + *param0 = (*param0) * 0x41C64E6D + 0x6073; + + return (u16)(*param0 >> 16); +} + +THUMB_FUNC void FUN_02008A74(u8 *param0) { + u32 st0 = ((u16 *)param0)[0xc7f]; + for (s32 r4 = 0xc7f; r4 > -1; r4--) { + ((u16 *)param0)[r4] ^= st0; + FUN_02008A54(&st0); + } +} |