diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-06-19 19:32:35 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-06-19 19:32:35 -0400 |
commit | 669fafdcf6929def1bdc82805f57daa0b75c245e (patch) | |
tree | 69198d5bacc534653ec5e8e2df9c3604eba31711 | |
parent | 06a7bf4c8c36af699b9882623d2642baf0269bf3 (diff) |
through FUN_0200A76C
-rw-r--r-- | arm9/asm/unk_0200A384.s | 539 | ||||
-rw-r--r-- | arm9/lib/include/MI_memory.h | 5 | ||||
-rw-r--r-- | arm9/src/msgdata.c | 193 | ||||
-rw-r--r-- | include/string16.h | 2 |
4 files changed, 199 insertions, 540 deletions
diff --git a/arm9/asm/unk_0200A384.s b/arm9/asm/unk_0200A384.s index 26e615af..0016d0d7 100644 --- a/arm9/asm/unk_0200A384.s +++ b/arm9/asm/unk_0200A384.s @@ -6,538 +6,13 @@ .extern LoadSingleElementFromNarc .extern FreeMsgDataRawData .extern DecryptMessageDirect - - thumb_func_start DecryptMessageViaNewNarcHandle -DecryptMessageViaNewNarcHandle: ; 0x0200A418 - ; r0: narc_id - ; r1: ??? - ; r2: ??? - ; r3: heap_id - push {r4-r6, lr} - sub sp, #0x10 - add r5, r1, #0x0 - add r1, r3, #0x0 - add r4, r2, #0x0 - bl NARC_ctor - add r6, r0, #0x0 - beq _0200A4AE - add r1, sp, #0xc - str r1, [sp, #0x0] - add r1, r5, #0x0 - mov r2, #0x0 - mov r3, #0x4 - bl NARC_ReadFromMember - add r0, sp, #0x4 - lsl r2, r4, #0x3 - str r0, [sp, #0x0] - add r0, r6, #0x0 - add r1, r5, #0x0 - add r2, r2, #0x4 - mov r3, #0x8 - bl NARC_ReadFromMember - add r0, sp, #0x4 - ldrh r2, [r0, #0xa] - ldr r0, _0200A4B4 ; =0x000002FD - add r1, r4, #0x1 - mul r0, r2 - mul r0, r1 - lsl r0, r0, #0x10 - lsr r1, r0, #0x10 - lsl r0, r1, #0x10 - orr r1, r0 - ldr r0, [sp, #0x4] - eor r0, r1 - str r0, [sp, #0x4] - ldr r0, [sp, #0x8] - eor r0, r1 - str r0, [sp, #0x8] - ldr r0, [sp, #0x20] - add r1, r5, #0x0 - str r0, [sp, #0x0] - ldr r3, [sp, #0x8] - ldr r2, [sp, #0x4] - add r0, r6, #0x0 - lsl r3, r3, #0x1 - bl NARC_ReadFromMember - ldr r2, _0200A4B8 ; =0x00091BD3 - add r3, r4, #0x1 - mul r2, r3 - lsl r2, r2, #0x10 - ldr r0, [sp, #0x8] - lsr r3, r2, #0x10 - sub r2, r0, #0x1 - ldr r1, [sp, #0x20] - cmp r0, #0x0 - beq _0200A4A8 - ldr r0, _0200A4BC ; =0x0000493D -_0200A492: - ldrh r4, [r1, #0x0] - eor r4, r3 - strh r4, [r1, #0x0] - add r3, r3, r0 - lsl r3, r3, #0x10 - add r4, r2, #0x0 - add r1, r1, #0x2 - lsr r3, r3, #0x10 - sub r2, r2, #0x1 - cmp r4, #0x0 - bne _0200A492 -_0200A4A8: - add r0, r6, #0x0 - bl NARC_dtor -_0200A4AE: - add sp, #0x10 - pop {r4-r6, pc} - nop -_0200A4B4: .word 0x000002FD -_0200A4B8: .word 0x00091BD3 -_0200A4BC: .word 0x0000493D - - thumb_func_start CopyEncryptedMessage16 -CopyEncryptedMessage16: ; 0x0200A4C0 - add r3, r0, #0x0 - add r0, r1, #0x0 - add r1, r3, #0x0 - ldr r2, [r2, #0x4] - ldr r3, _0200A4D0 ; =MIi_CpuCopy16 - lsl r2, r2, #0x1 - bx r3 - nop -_0200A4D0: .word MIi_CpuCopy16 - - thumb_func_start FUN_0200A4D4 -FUN_0200A4D4: ; 0x0200A4D4 - push {r3-r7, lr} - sub sp, #0x10 - add r5, r0, #0x0 - ldrh r0, [r5, #0x0] - add r4, r1, #0x0 - str r2, [sp, #0x0] - cmp r4, r0 - bhs _0200A56A - lsl r0, r4, #0x3 - add r0, r5, r0 - ldr r3, [r0, #0x4] - ldr r2, [r0, #0x8] - ldrh r1, [r5, #0x2] - ldr r6, _0200A578 ; =0x000002FD - add r0, r4, #0x1 - mul r6, r1 - add r1, r0, #0x0 - mul r1, r6 - lsl r0, r1, #0x10 - lsr r1, r0, #0x10 - lsl r0, r1, #0x10 - orr r1, r0 - add r0, r3, #0x0 - add r6, r2, #0x0 - str r3, [sp, #0x8] - eor r0, r1 - eor r6, r1 - str r0, [sp, #0x8] - lsl r0, r6, #0x1 - str r0, [sp, #0x4] - str r2, [sp, #0xc] - ldr r1, [sp, #0x4] - mov r0, #0x0 - str r6, [sp, #0xc] - bl AllocFromHeapAtEnd - add r7, r0, #0x0 - beq _0200A574 - ldr r0, [sp, #0x8] - ldr r2, [sp, #0x4] - add r0, r5, r0 - add r1, r7, #0x0 - bl MIi_CpuCopy16 - ldr r1, _0200A57C ; =0x00091BD3 - add r2, r4, #0x1 - mul r1, r2 - lsl r1, r1, #0x10 - lsr r2, r1, #0x10 - add r0, r7, #0x0 - sub r1, r6, #0x1 - cmp r6, #0x0 - beq _0200A556 - ldr r3, _0200A580 ; =0x0000493D -_0200A540: - ldrh r4, [r0, #0x0] - eor r4, r2 - strh r4, [r0, #0x0] - add r2, r2, r3 - lsl r2, r2, #0x10 - add r4, r1, #0x0 - add r0, r0, #0x2 - lsr r2, r2, #0x10 - sub r1, r1, #0x1 - cmp r4, #0x0 - bne _0200A540 -_0200A556: - ldr r0, [sp, #0x0] - add r1, r7, #0x0 - add r2, r6, #0x0 - bl FUN_02021E8C - add r0, r7, #0x0 - bl FreeToHeap - add sp, #0x10 - pop {r3-r7, pc} -_0200A56A: - bl ErrorHandling - ldr r0, [sp, #0x0] - bl FUN_02021A4C -_0200A574: - add sp, #0x10 - pop {r3-r7, pc} - .balign 4 -_0200A578: .word 0x000002FD -_0200A57C: .word 0x00091BD3 -_0200A580: .word 0x0000493D - - thumb_func_start FUN_0200A584 -FUN_0200A584: ; 0x0200A584 - push {r3-r7, lr} - sub sp, #0x10 - add r5, r0, #0x0 - ldrh r0, [r5, #0x0] - add r4, r1, #0x0 - str r2, [sp, #0x0] - cmp r4, r0 - bhs _0200A62C - lsl r0, r4, #0x3 - add r0, r5, r0 - ldr r3, [r0, #0x4] - ldr r2, [r0, #0x8] - ldrh r1, [r5, #0x2] - ldr r6, _0200A63C ; =0x000002FD - add r0, r4, #0x1 - mul r6, r1 - add r1, r0, #0x0 - mul r1, r6 - lsl r0, r1, #0x10 - lsr r1, r0, #0x10 - lsl r0, r1, #0x10 - orr r1, r0 - add r0, r3, #0x0 - add r6, r2, #0x0 - str r3, [sp, #0x8] - eor r0, r1 - eor r6, r1 - str r0, [sp, #0x8] - lsl r0, r6, #0x1 - str r0, [sp, #0x4] - str r2, [sp, #0xc] - ldr r0, [sp, #0x0] - ldr r1, [sp, #0x4] - str r6, [sp, #0xc] - bl AllocFromHeapAtEnd - add r7, r0, #0x0 - beq _0200A626 - ldr r0, [sp, #0x8] - ldr r2, [sp, #0x4] - add r0, r5, r0 - add r1, r7, #0x0 - bl MIi_CpuCopy16 - ldr r1, _0200A640 ; =0x00091BD3 - add r2, r4, #0x1 - mul r1, r2 - lsl r1, r1, #0x10 - lsr r2, r1, #0x10 - add r0, r7, #0x0 - sub r1, r6, #0x1 - cmp r6, #0x0 - beq _0200A606 - ldr r3, _0200A644 ; =0x0000493D -_0200A5F0: - ldrh r4, [r0, #0x0] - eor r4, r2 - strh r4, [r0, #0x0] - add r2, r2, r3 - lsl r2, r2, #0x10 - add r4, r1, #0x0 - add r0, r0, #0x2 - lsr r2, r2, #0x10 - sub r1, r1, #0x1 - cmp r4, #0x0 - bne _0200A5F0 -_0200A606: - ldr r1, [sp, #0x0] - add r0, r6, #0x0 - bl FUN_020219F4 - add r4, r0, #0x0 - beq _0200A61A - add r1, r7, #0x0 - add r2, r6, #0x0 - bl FUN_02021E8C -_0200A61A: - add r0, r7, #0x0 - bl FreeToHeap - add sp, #0x10 - add r0, r4, #0x0 - pop {r3-r7, pc} -_0200A626: - add sp, #0x10 - mov r0, #0x0 - pop {r3-r7, pc} -_0200A62C: - bl ErrorHandling - ldr r1, [sp, #0x0] - mov r0, #0x4 - bl FUN_020219F4 - add sp, #0x10 - pop {r3-r7, pc} - .balign 4 -_0200A63C: .word 0x000002FD -_0200A640: .word 0x00091BD3 -_0200A644: .word 0x0000493D - - thumb_func_start FUN_0200A648 -FUN_0200A648: ; 0x0200A648 - push {r3-r7, lr} - add r7, r3, #0x0 - add r5, r1, #0x0 - add r1, r7, #0x0 - add r4, r2, #0x0 - bl NARC_ctor - add r6, r0, #0x0 - beq _0200A66E - ldr r1, [sp, #0x18] - add r2, r4, #0x0 - str r1, [sp, #0x0] - add r1, r5, #0x0 - add r3, r7, #0x0 - bl FUN_0200A670 - add r0, r6, #0x0 - bl NARC_dtor -_0200A66E: - pop {r3-r7, pc} - - thumb_func_start FUN_0200A670 -FUN_0200A670: ; 0x0200A670 - push {r4-r7, lr} - sub sp, #0x14 - add r5, r2, #0x0 - add r2, sp, #0x10 - add r4, r3, #0x0 - str r2, [sp, #0x0] - mov r2, #0x0 - mov r3, #0x4 - add r7, r0, #0x0 - str r1, [sp, #0x4] - bl NARC_ReadFromMember - add r0, sp, #0x8 - ldrh r0, [r0, #0x8] - cmp r5, r0 - bhs _0200A71E - add r0, sp, #0x8 - lsl r2, r5, #0x3 - str r0, [sp, #0x0] - ldr r1, [sp, #0x4] - add r0, r7, #0x0 - add r2, r2, #0x4 - mov r3, #0x8 - bl NARC_ReadFromMember - add r0, sp, #0x8 - ldrh r2, [r0, #0xa] - ldr r0, _0200A72C ; =0x000002FD - add r1, r5, #0x1 - mul r0, r2 - mul r0, r1 - lsl r0, r0, #0x10 - lsr r1, r0, #0x10 - lsl r0, r1, #0x10 - orr r1, r0 - ldr r0, [sp, #0x8] - eor r0, r1 - str r0, [sp, #0x8] - ldr r0, [sp, #0xc] - eor r0, r1 - lsl r6, r0, #0x1 - str r0, [sp, #0xc] - add r0, r4, #0x0 - add r1, r6, #0x0 - bl AllocFromHeapAtEnd - add r4, r0, #0x0 - beq _0200A728 - str r4, [sp, #0x0] - ldr r1, [sp, #0x4] - ldr r2, [sp, #0x8] - add r0, r7, #0x0 - add r3, r6, #0x0 - bl NARC_ReadFromMember - ldr r2, _0200A730 ; =0x00091BD3 - add r3, r5, #0x1 - mul r2, r3 - lsl r2, r2, #0x10 - ldr r0, [sp, #0xc] - lsr r3, r2, #0x10 - add r1, r4, #0x0 - sub r2, r0, #0x1 - cmp r0, #0x0 - beq _0200A70A - ldr r0, _0200A734 ; =0x0000493D -_0200A6F4: - ldrh r5, [r1, #0x0] - eor r5, r3 - strh r5, [r1, #0x0] - add r3, r3, r0 - lsl r3, r3, #0x10 - add r5, r2, #0x0 - add r1, r1, #0x2 - lsr r3, r3, #0x10 - sub r2, r2, #0x1 - cmp r5, #0x0 - bne _0200A6F4 -_0200A70A: - ldr r0, [sp, #0x28] - ldr r2, [sp, #0xc] - add r1, r4, #0x0 - bl FUN_02021E8C - add r0, r4, #0x0 - bl FreeToHeap - add sp, #0x14 - pop {r4-r7, pc} -_0200A71E: - bl ErrorHandling - ldr r0, [sp, #0x28] - bl FUN_02021A4C -_0200A728: - add sp, #0x14 - pop {r4-r7, pc} - .balign 4 -_0200A72C: .word 0x000002FD -_0200A730: .word 0x00091BD3 -_0200A734: .word 0x0000493D - - thumb_func_start FUN_0200A738 -FUN_0200A738: ; 0x0200A738 - push {r3-r7, lr} - add r6, r3, #0x0 - add r5, r1, #0x0 - add r1, r6, #0x0 - add r4, r2, #0x0 - bl NARC_ctor - add r7, r0, #0x0 - beq _0200A75E - add r1, r5, #0x0 - add r2, r4, #0x0 - add r3, r6, #0x0 - bl FUN_0200A76C - add r4, r0, #0x0 - add r0, r7, #0x0 - bl NARC_dtor - b _0200A768 -_0200A75E: - mov r0, #0x4 - add r1, r6, #0x0 - bl FUN_020219F4 - add r4, r0, #0x0 -_0200A768: - add r0, r4, #0x0 - pop {r3-r7, pc} - - thumb_func_start FUN_0200A76C -FUN_0200A76C: ; 0x0200A76C - push {r3-r7, lr} - sub sp, #0x18 - add r4, r2, #0x0 - add r2, sp, #0x14 - add r5, r3, #0x0 - str r2, [sp, #0x0] - mov r2, #0x0 - mov r3, #0x4 - add r7, r0, #0x0 - str r1, [sp, #0x4] - bl NARC_ReadFromMember - add r0, sp, #0xc - ldrh r0, [r0, #0x8] - cmp r4, r0 - bhs _0200A82A - add r0, sp, #0xc - lsl r2, r4, #0x3 - str r0, [sp, #0x0] - ldr r1, [sp, #0x4] - add r0, r7, #0x0 - add r2, r2, #0x4 - mov r3, #0x8 - bl NARC_ReadFromMember - add r0, sp, #0xc - ldrh r2, [r0, #0xa] - ldr r0, _0200A83C ; =0x000002FD - add r1, r4, #0x1 - mul r0, r2 - mul r0, r1 - lsl r0, r0, #0x10 - lsr r1, r0, #0x10 - lsl r0, r1, #0x10 - orr r1, r0 - ldr r0, [sp, #0xc] - eor r0, r1 - str r0, [sp, #0xc] - ldr r0, [sp, #0x10] - eor r0, r1 - add r1, r5, #0x0 - str r0, [sp, #0x10] - bl FUN_020219F4 - str r0, [sp, #0x8] - cmp r0, #0x0 - beq _0200A824 - ldr r0, [sp, #0x10] - lsl r6, r0, #0x1 - add r0, r5, #0x0 - add r1, r6, #0x0 - bl AllocFromHeapAtEnd - add r5, r0, #0x0 - beq _0200A824 - str r5, [sp, #0x0] - ldr r1, [sp, #0x4] - ldr r2, [sp, #0xc] - add r0, r7, #0x0 - add r3, r6, #0x0 - bl NARC_ReadFromMember - ldr r2, _0200A840 ; =0x00091BD3 - add r3, r4, #0x1 - mul r2, r3 - lsl r2, r2, #0x10 - ldr r0, [sp, #0x10] - lsr r3, r2, #0x10 - add r1, r5, #0x0 - sub r2, r0, #0x1 - cmp r0, #0x0 - beq _0200A814 - ldr r0, _0200A844 ; =0x0000493D -_0200A7FE: - ldrh r4, [r1, #0x0] - eor r4, r3 - strh r4, [r1, #0x0] - add r3, r3, r0 - lsl r3, r3, #0x10 - add r4, r2, #0x0 - add r1, r1, #0x2 - lsr r3, r3, #0x10 - sub r2, r2, #0x1 - cmp r4, #0x0 - bne _0200A7FE -_0200A814: - ldr r0, [sp, #0x8] - ldr r2, [sp, #0x10] - add r1, r5, #0x0 - bl FUN_02021E8C - add r0, r5, #0x0 - bl FreeToHeap -_0200A824: - ldr r0, [sp, #0x8] - add sp, #0x18 - pop {r3-r7, pc} -_0200A82A: - bl ErrorHandling - mov r0, #0x4 - add r1, r5, #0x0 - bl FUN_020219F4 - add sp, #0x18 - pop {r3-r7, pc} - nop -_0200A83C: .word 0x000002FD -_0200A840: .word 0x00091BD3 -_0200A844: .word 0x0000493D +.extern DecryptMessageViaNewNarcHandle +.extern CopyEncryptedMessage16 +.extern FUN_0200A4D4 +.extern FUN_0200A584 +.extern FUN_0200A648 +.extern FUN_0200A670 +.extern FUN_0200A76C thumb_func_start FUN_0200A848 FUN_0200A848: ; 0x0200A848 diff --git a/arm9/lib/include/MI_memory.h b/arm9/lib/include/MI_memory.h index e1e5fe11..c39c7895 100644 --- a/arm9/lib/include/MI_memory.h +++ b/arm9/lib/include/MI_memory.h @@ -22,6 +22,11 @@ static inline void MI_CpuClear32(void *dest, u32 size) MI_CpuFill32(dest, 0, size); } +static inline void MI_CpuCopy16(const void *src, void *dest, u32 size) +{ + MIi_CpuCopy16(src, dest, size); +} + void MIi_CpuClearFast(u32 data, void *destp, u32 size); #endif //NITRO_MI_MEMORY_H_ diff --git a/arm9/src/msgdata.c b/arm9/src/msgdata.c index b3a1c027..007cb471 100644 --- a/arm9/src/msgdata.c +++ b/arm9/src/msgdata.c @@ -2,6 +2,8 @@ #include "filesystem.h" #include "msg_data.h" #include "heap.h" +#include "MI_memory.h" +#include "string16.h" #pragma thumb on @@ -9,6 +11,13 @@ void * LoadSingleElementFromNarc(NarcId narc_id, s32 file_id, u32 heap_id); void FreeMsgDataRawData(void * data); void CopyEncryptedMessage16(u16 * dest, const u16 * src, struct UnkStruct_200A394_4 * param); void DecryptMessageDirect(struct UnkStruct_200A394 * r3, u32 r5, u16 * r4); +void DecryptMessageViaNewNarcHandle(NarcId narc_id, u32 group, u32 num, u32 heap_id, u16 * dest); +void FUN_0200A4D4(struct UnkStruct_200A394 * r5, u32 r4, struct String * dest); +struct String * FUN_0200A584(struct UnkStruct_200A394 * r5, u32 r4, u32 heap_id); +void FUN_0200A648(NarcId narc_id, u32 group, u32 num, u32 heap_id, struct String * dest); +void FUN_0200A670(NARC * narc, u32 group, u32 num, u32 heap_id, struct String * dest); +struct String * FUN_0200A738(NarcId narc_id, u32 group, u32 num, u32 heap_id); +struct String * FUN_0200A76C(NARC * narc, u32 group, u32 num, u32 heap_id); void * LoadSingleElementFromNarc(NarcId narc_id, s32 file_id, u32 heap_id) { @@ -30,30 +39,198 @@ inline static void Decrypt1(struct UnkStruct_200A394_4 * arg0, u32 arg1, u32 see inline static void Decrypt2(u16 * arg0, u32 count, u32 arg2) { - u16 seed = (arg2 + 1) * 596947; + u16 seed = (u16)((arg2 + 1) * 596947); while (count-- > 0) { *arg0 ^= seed; - seed += 18749; arg0++; + seed += 18749; } } -void DecryptMessageDirect(struct UnkStruct_200A394 * r3, u32 r5, u16 * r4) +void DecryptMessageDirect(struct UnkStruct_200A394 * table, u32 num, u16 * dest) { struct UnkStruct_200A394_4 sp0; - if (r5 < r3->unk0) + if (num < table->unk0) + { + sp0 = table->unk4[num]; + Decrypt1(&sp0, num, table->unk2); + + CopyEncryptedMessage16(dest, (const u16 *)((u8 *)table + sp0.unk0), &sp0); + Decrypt2(dest, sp0.unk4, num); + } + else + { + GF_ASSERT(0); + } +} + +void DecryptMessageViaNewNarcHandle(NarcId narc_id, u32 group, u32 num, u32 heap_id, u16 * dest) +{ + NARC * narc = NARC_ctor(narc_id, heap_id); + u16 spC[2]; + struct UnkStruct_200A394_4 sp4; + if (narc != NULL) { - sp0 = r3->unk4[r5]; - Decrypt1(&sp0, r5, r3->unk2); + NARC_ReadFromMember(narc, group, 0, 4, spC); + NARC_ReadFromMember(narc, group, 8 * num + 4, 8, &sp4); + Decrypt1(&sp4, num, spC[1]); + NARC_ReadFromMember(narc, group, sp4.unk0, 2 * sp4.unk4, dest); + Decrypt2(dest, sp4.unk4, num); + NARC_dtor(narc); + } +} - CopyEncryptedMessage16(r4, (const u16 *)((u8 *)r3 + sp0.unk0), &sp0); - Decrypt2(r4, sp0.unk4, r5); +void CopyEncryptedMessage16(u16 * dest, const u16 * src, struct UnkStruct_200A394_4 * param) +{ + MI_CpuCopy16(src, dest, 2 * param->unk4); +} + +void FUN_0200A4D4(struct UnkStruct_200A394 * table, u32 num, struct String * dest) +{ + struct UnkStruct_200A394_4 sp4; + u16 * buf; + if (num < table->unk0) + { + sp4 = table->unk4[num]; + Decrypt1(&sp4, num, table->unk2); + buf = AllocFromHeapAtEnd(0, 2 * sp4.unk4); + if (buf != NULL) + { + MI_CpuCopy16((char *)table + sp4.unk0, buf, 2 * sp4.unk4); + Decrypt2(buf, sp4.unk4, num); + FUN_02021E8C(dest, buf, sp4.unk4); + FreeToHeap(buf); + } + } + else + { + GF_ASSERT(0); + FUN_02021A4C(dest); + } +} + +struct String * FUN_0200A584(struct UnkStruct_200A394 * table, u32 num, u32 heap_id) +{ + struct UnkStruct_200A394_4 sp4; + u16 * buf; + struct String * dest; + if (num < table->unk0) + { + sp4 = table->unk4[num]; + Decrypt1(&sp4, num, table->unk2); + buf = AllocFromHeapAtEnd(heap_id, 2 * sp4.unk4); + if (buf != NULL) + { + MI_CpuCopy16((char *)table + sp4.unk0, buf, 2 * sp4.unk4); + Decrypt2(buf, sp4.unk4, num); + dest = FUN_020219F4(sp4.unk4, heap_id); + if (dest != NULL) + FUN_02021E8C(dest, buf, sp4.unk4); + FreeToHeap(buf); + return dest; + } + else + { + return NULL; + } + } + else + { + GF_ASSERT(0); + return FUN_020219F4(4, heap_id); + } +} + +void FUN_0200A648(NarcId narc_id, u32 group, u32 num, u32 heap_id, struct String * dest) +{ + NARC * narc = NARC_ctor(narc_id, heap_id); + if (narc != NULL) + { + FUN_0200A670(narc, group, num, heap_id, dest); + NARC_dtor(narc); + } +} + +void FUN_0200A670(NARC * narc, u32 group, u32 num, u32 heap_id, struct String * dest) +{ + u16 * buf; + u32 size; + u16 sp10[2]; + struct UnkStruct_200A394_4 sp8; + + NARC_ReadFromMember(narc, group, 0, 4, sp10); + if (num < sp10[0]) + { + NARC_ReadFromMember(narc, group, 8 * num + 4, 8, &sp8); + Decrypt1(&sp8, num, sp10[1]); + size = sp8.unk4 * 2; + buf = AllocFromHeapAtEnd(heap_id, size); + if (buf != NULL) + { + NARC_ReadFromMember(narc, group, sp8.unk0, size, buf); + Decrypt2(buf, sp8.unk4, num); + FUN_02021E8C(dest, buf, sp8.unk4); + FreeToHeap(buf); + return; + } + } + else + { + GF_ASSERT(0); + FUN_02021A4C(dest); + } +} + +struct String * FUN_0200A738(NarcId narc_id, u32 group, u32 num, u32 heap_id) +{ + NARC * narc = NARC_ctor(narc_id, heap_id); + struct String * string; + if (narc != NULL) + { + string = FUN_0200A76C(narc, group, num, heap_id); + NARC_dtor(narc); + } + else + { + string = FUN_020219F4(4, heap_id); + } + return string; +} + +struct String * FUN_0200A76C(NARC * narc, u32 group, u32 num, u32 heap_id) +{ + struct String * dest; + u16 * buf; + u32 size; + u16 sp10[2]; + struct UnkStruct_200A394_4 sp8; + + NARC_ReadFromMember(narc, group, 0, 4, sp10); + if (num < sp10[0]) + { + NARC_ReadFromMember(narc, group, 8 * num + 4, 8, &sp8); + Decrypt1(&sp8, num, sp10[1]); + dest = FUN_020219F4(sp8.unk4, heap_id); + if (dest != NULL) + { + size = sp8.unk4 * 2; + buf = AllocFromHeapAtEnd(heap_id, size); + if (buf != NULL) + { + NARC_ReadFromMember(narc, group, sp8.unk0, size, buf); + Decrypt2(buf, sp8.unk4, num); + FUN_02021E8C(dest, buf, sp8.unk4); + FreeToHeap(buf); + } + } + return dest; } else { GF_ASSERT(0); + return FUN_020219F4(4, heap_id); } } diff --git a/include/string16.h b/include/string16.h index 7092c641..6bbf567d 100644 --- a/include/string16.h +++ b/include/string16.h @@ -13,5 +13,7 @@ struct String struct String * FUN_020219F4(u32 count, u32 heap_id); int FUN_02021CE0(struct String *, struct String *); int FUN_0206AE00(int x); +void FUN_02021E8C(struct String *, u16 *, u32); // copy +void FUN_02021A4C(struct String *); // set empty #endif //POKEDIAMOND_STRING16_H |