summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/unk_020139D8.s533
-rw-r--r--arm9/src/unk_020139D8.c291
-rw-r--r--include/unk_020139D8.h34
3 files changed, 325 insertions, 533 deletions
diff --git a/arm9/asm/unk_020139D8.s b/arm9/asm/unk_020139D8.s
deleted file mode 100644
index d03cc66a..00000000
--- a/arm9/asm/unk_020139D8.s
+++ /dev/null
@@ -1,533 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .rodata
-
- .global UNK_020ED580
-UNK_020ED580: ; 0x020ED580
- .byte 0xC0, 0x04, 0xF0, 0x04
-
- .global UNK_020ED584
-UNK_020ED584: ; 0x020ED584
- .byte 0x4E, 0x02, 0xD2, 0x03
-
- .global UNK_020ED588
-UNK_020ED588: ; 0x020ED588
- .byte 0xBB, 0x04, 0x00, 0x05
-
- .global UNK_020ED58C
-UNK_020ED58C: ; 0x020ED58C
- .byte 0x41, 0x04, 0x99, 0x05
-
- .global UNK_020ED590
-UNK_020ED590: ; 0x020ED590
- .byte 0x2C, 0x04, 0x9D, 0x05
-
- .global UNK_020ED594
-UNK_020ED594: ; 0x020ED594
- .byte 0x7A, 0x04, 0x8D, 0x04
-
- .global UNK_020ED598
-UNK_020ED598: ; 0x020ED598
- .byte 0xB6, 0x04, 0x05, 0x05
-
- .global UNK_020ED59C
-UNK_020ED59C: ; 0x020ED59C
- .byte 0xFC, 0x04, 0x96, 0x05
-
- .global UNK_020ED5A0
-UNK_020ED5A0: ; 0x020ED5A0
- .byte 0x8F, 0x04, 0x97, 0x04
-
- .global UNK_020ED5A4
-UNK_020ED5A4: ; 0x020ED5A4
- .byte 0xB0, 0x04, 0xFF, 0x04
-
- .global UNK_020ED5A8
-UNK_020ED5A8: ; 0x020ED5A8
- .byte 0xA7, 0x04, 0xE1, 0x04
-
- .global UNK_020ED5AC
-UNK_020ED5AC: ; 0x020ED5AC
- .byte 0x79, 0x04, 0x98, 0x04, 0x9B, 0x04, 0x9C, 0x04
-
- .global UNK_020ED5B4
-UNK_020ED5B4: ; 0x020ED5B4
- .byte 0x01
-
- .global UNK_020ED5B5
-UNK_020ED5B5: ; 0x020ED5B5
- .byte 0x00, 0x02, 0x01, 0x03, 0x02, 0x04, 0x03, 0x05, 0x04, 0x07, 0x05
-
- .global UNK_020ED5C0
-UNK_020ED5C0: ; 0x020ED5C0
- .short 0x016A, 0x024D, 0x0235, 0x0229, 0x0184, 0x0185, 0x0186, 0x0187
- .short 0x0188, 0x0189, 0x018A
-
- .global UNK_020ED5D6
-UNK_020ED5D6: ; 0x020ED5D6
- .short 0x01F0, 0x01D4, 0x0012, 0x007C, 0x0026, 0x0026, 0x006B, 0x0068
- .short 0x002F, 0x0020, 0x0017
-
- .global UNK_020ED5EC
-UNK_020ED5EC: ; 0x020ED5EC
- .word UNK_020ED58C
- .byte 2
- .word UNK_020ED580
- .byte 2
- .word UNK_020ED5A8
- .byte 2
- .word UNK_020ED5AC
- .byte 4
- .word UNK_020ED5A0
- .byte 2
- .word UNK_020ED59C
- .byte 2
- .word UNK_020ED588
- .byte 2
- .word UNK_020ED584
- .byte 2
- .word UNK_020ED590
- .byte 2
- .word UNK_020ED5A4
- .byte 2
- .word UNK_020ED598
- .byte 2
- .word UNK_020ED594
- .byte 2
-
- .text
-
- thumb_func_start FUN_020139D8
-FUN_020139D8: ; 0x020139D8
- push {r3-r7, lr}
- mov r1, #0x30
- add r6, r0, #0x0
- bl AllocFromHeap
- ldr r4, _02013A0C ; =UNK_020ED5C0
- str r0, [sp, #0x0]
- mov r7, #0x0
- add r5, r0, #0x0
-_020139EA:
- ldr r0, [sp, #0x0]
- mov r1, #0x1a
- str r6, [r0, #0x0]
- ldrh r2, [r4, #0x0]
- mov r0, #0x1
- add r3, r6, #0x0
- bl NewMsgDataFromNarc
- str r0, [r5, #0x4]
- add r7, r7, #0x1
- add r4, r4, #0x2
- add r5, r5, #0x4
- cmp r7, #0xb
- blt _020139EA
- ldr r0, [sp, #0x0]
- pop {r3-r7, pc}
- nop
-_02013A0C: .word UNK_020ED5C0
-
- thumb_func_start FUN_02013A10
-FUN_02013A10: ; 0x02013A10
- push {r4-r6, lr}
- add r6, r0, #0x0
- mov r4, #0x0
- add r5, r6, #0x0
-_02013A18:
- ldr r0, [r5, #0x4]
- bl DestroyMsgData
- add r4, r4, #0x1
- add r5, r5, #0x4
- cmp r4, #0xb
- blt _02013A18
- add r0, r6, #0x0
- bl FreeToHeap
- pop {r4-r6, pc}
- .balign 4
-
- thumb_func_start FUN_02013A30
-FUN_02013A30: ; 0x02013A30
- push {r3-r5, lr}
- sub sp, #0x8
- add r5, r0, #0x0
- add r4, r2, #0x0
- add r0, r1, #0x0
- add r1, sp, #0x4
- add r2, sp, #0x0
- bl FUN_02013AEC
- ldr r0, [sp, #0x4]
- ldr r1, [sp, #0x0]
- lsl r0, r0, #0x2
- add r0, r5, r0
- ldr r0, [r0, #0x4]
- add r2, r4, #0x0
- bl ReadMsgDataIntoString
- add sp, #0x8
- pop {r3-r5, pc}
- .balign 4
-
- thumb_func_start FUN_02013A58
-FUN_02013A58: ; 0x02013A58
- push {r3-r4, lr}
- sub sp, #0xc
- add r4, r1, #0x0
- ldr r1, _02013A94 ; =0x0000FFFF
- cmp r0, r1
- beq _02013A88
- add r1, sp, #0x8
- add r2, sp, #0x4
- bl FUN_02013AEC
- ldr r0, [sp, #0x8]
- mov r3, #0x0
- lsl r1, r0, #0x1
- ldr r0, _02013A98 ; =UNK_020ED5C0
- ldrh r0, [r0, r1]
- str r0, [sp, #0x8]
- str r4, [sp, #0x0]
- ldr r1, [sp, #0x8]
- ldr r2, [sp, #0x4]
- mov r0, #0x1a
- bl ReadMsgData_NewNarc_ExistingString
- add sp, #0xc
- pop {r3-r4, pc}
-_02013A88:
- add r0, r4, #0x0
- bl StringSetEmpty
- add sp, #0xc
- pop {r3-r4, pc}
- nop
-_02013A94: .word 0x0000FFFF
-_02013A98: .word UNK_020ED5C0
-
- thumb_func_start FUN_02013A9C
-FUN_02013A9C: ; 0x02013A9C
- push {r4-r5}
- ldr r4, _02013AE0 ; =UNK_020ED5C0
- mov r2, #0x0
-_02013AA2:
- ldrh r3, [r4, #0x0]
- cmp r0, r3
- bne _02013AD0
- mov r4, #0x0
- add r3, r4, #0x0
- cmp r2, #0x0
- bls _02013AC6
- ldr r0, _02013AE4 ; =UNK_020ED5D6
-_02013AB2:
- lsl r5, r4, #0x1
- ldrh r5, [r0, r5]
- add r4, r4, #0x1
- lsl r4, r4, #0x10
- add r3, r3, r5
- lsl r3, r3, #0x10
- lsr r4, r4, #0x10
- lsr r3, r3, #0x10
- cmp r4, r2
- blo _02013AB2
-_02013AC6:
- add r0, r3, r1
- lsl r0, r0, #0x10
- lsr r0, r0, #0x10
- pop {r4-r5}
- bx lr
-_02013AD0:
- add r2, r2, #0x1
- add r4, r4, #0x2
- cmp r2, #0xb
- blo _02013AA2
- ldr r0, _02013AE8 ; =0x0000FFFF
- pop {r4-r5}
- bx lr
- nop
-_02013AE0: .word UNK_020ED5C0
-_02013AE4: .word UNK_020ED5D6
-_02013AE8: .word 0x0000FFFF
-
- thumb_func_start FUN_02013AEC
-FUN_02013AEC: ; 0x02013AEC
- push {r3-r6}
- ldr r3, _02013B20 ; =0x00000FFF
- ldr r6, _02013B24 ; =UNK_020ED5D6
- and r3, r0
- mov r0, #0x0
- add r5, r0, #0x0
-_02013AF8:
- ldrh r4, [r6, #0x0]
- add r0, r0, r4
- cmp r3, r0
- bhs _02013B12
- str r5, [r1, #0x0]
- ldr r1, _02013B24 ; =UNK_020ED5D6
- lsl r4, r5, #0x1
- ldrh r1, [r1, r4]
- sub r0, r0, r1
- sub r0, r3, r0
- str r0, [r2, #0x0]
- pop {r3-r6}
- bx lr
-_02013B12:
- add r5, r5, #0x1
- add r6, r6, #0x2
- cmp r5, #0xb
- blo _02013AF8
- pop {r3-r6}
- bx lr
- nop
-_02013B20: .word 0x00000FFF
-_02013B24: .word UNK_020ED5D6
-
- thumb_func_start FUN_02013B28
-FUN_02013B28: ; 0x02013B28
- mov r0, #0x8
- bx lr
-
- thumb_func_start FUN_02013B2C
-FUN_02013B2C: ; 0x02013B2C
- push {r3, lr}
- mov r2, #0x0
- str r2, [r0, #0x0]
- ldr r3, _02013B54 ; =UNK_020ED5B4
- str r2, [r0, #0x4]
-_02013B36:
- ldrb r1, [r3, #0x0]
- cmp r1, #0x2
- bne _02013B48
- ldr r1, _02013B58 ; =UNK_020ED5B5
- lsl r2, r2, #0x1
- ldrb r1, [r1, r2]
- bl FUN_02013C18
- pop {r3, pc}
-_02013B48:
- add r2, r2, #0x1
- add r3, r3, #0x2
- cmp r2, #0x6
- blo _02013B36
- pop {r3, pc}
- nop
-_02013B54: .word UNK_020ED5B4
-_02013B58: .word UNK_020ED5B5
-
- thumb_func_start FUN_02013B5C
-FUN_02013B5C: ; 0x02013B5C
- ldr r3, _02013B64 ; =SavArray_get
- mov r1, #0x22
- bx r3
- nop
-_02013B64: .word SavArray_get
-
- thumb_func_start FUN_02013B68
-FUN_02013B68: ; 0x02013B68
- ldr r0, [r0, #0x4]
- add r2, r0, #0x0
- lsr r2, r1
- mov r0, #0x1
- and r0, r2
- bx lr
-
- thumb_func_start FUN_02013B74
-FUN_02013B74: ; 0x02013B74
- push {r3-r5, lr}
- add r5, r0, #0x0
- mov r2, #0x0
- ldr r3, [r5, #0x4]
- add r4, r2, #0x0
- mov r0, #0x1
-_02013B80:
- add r1, r3, #0x0
- lsr r1, r2
- tst r1, r0
- bne _02013B8A
- add r4, r4, #0x1
-_02013B8A:
- add r2, r2, #0x1
- cmp r2, #0x20
- blo _02013B80
- cmp r4, #0x0
- beq _02013BC4
- bl LCRandom
- add r1, r4, #0x0
- bl _u32_div_f
- ldr r4, [r5, #0x4]
- mov r0, #0x0
- mov r2, #0x1
-_02013BA4:
- add r3, r4, #0x0
- lsr r3, r0
- tst r3, r2
- bne _02013BBE
- cmp r1, #0x0
- bne _02013BBC
- mov r1, #0x1
- ldr r2, [r5, #0x4]
- lsl r1, r0
- orr r1, r2
- str r1, [r5, #0x4]
- pop {r3-r5, pc}
-_02013BBC:
- sub r1, r1, #0x1
-_02013BBE:
- add r0, r0, #0x1
- cmp r0, #0x20
- blo _02013BA4
-_02013BC4:
- mov r0, #0x20
- pop {r3-r5, pc}
-
- thumb_func_start FUN_02013BC8
-FUN_02013BC8: ; 0x02013BC8
- ldr r3, [r0, #0x4]
- mov r2, #0x0
- mov r0, #0x1
-_02013BCE:
- add r1, r3, #0x0
- lsr r1, r2
- tst r1, r0
- bne _02013BDA
- mov r0, #0x0
- bx lr
-_02013BDA:
- add r2, r2, #0x1
- cmp r2, #0x20
- blo _02013BCE
- mov r0, #0x1
- bx lr
-
- thumb_func_start FUN_02013BE4
-FUN_02013BE4: ; 0x02013BE4
- push {r3-r4}
- mov r3, #0x0
- ldr r4, _02013C08 ; =UNK_020ED5D6
- add r2, r3, #0x0
-_02013BEC:
- ldrh r1, [r4, #0x0]
- add r2, r2, #0x1
- add r4, r4, #0x2
- add r1, r3, r1
- lsl r1, r1, #0x10
- lsr r3, r1, #0x10
- cmp r2, #0x9
- blt _02013BEC
- add r0, r3, r0
- lsl r0, r0, #0x10
- lsr r0, r0, #0x10
- pop {r3-r4}
- bx lr
- nop
-_02013C08: .word UNK_020ED5D6
-
- thumb_func_start FUN_02013C0C
-FUN_02013C0C: ; 0x02013C0C
- ldr r0, [r0, #0x0]
- add r2, r0, #0x0
- lsr r2, r1
- mov r0, #0x1
- and r0, r2
- bx lr
-
- thumb_func_start FUN_02013C18
-FUN_02013C18: ; 0x02013C18
- mov r2, #0x1
- ldr r3, [r0, #0x0]
- lsl r2, r1
- add r1, r3, #0x0
- orr r1, r2
- str r1, [r0, #0x0]
- bx lr
- .balign 4
-
- thumb_func_start FUN_02013C28
-FUN_02013C28: ; 0x02013C28
- push {r4-r7}
- mov r3, #0x0
- ldr r5, _02013C64 ; =UNK_020ED5EC
- add r2, r3, #0x0
-_02013C30:
- ldr r7, [r5, #0x4]
- add r4, r2, #0x0
- cmp r7, #0x0
- ble _02013C54
- ldr r6, [r5, #0x0]
-_02013C3A:
- ldrh r1, [r6, #0x0]
- cmp r0, r1
- bne _02013C4C
- ldr r0, _02013C68 ; =UNK_020ED5EC + 4
- lsl r1, r3, #0x3
- ldr r0, [r0, r1]
- sub r0, r0, #0x1
- pop {r4-r7}
- bx lr
-_02013C4C:
- add r4, r4, #0x1
- add r6, r6, #0x2
- cmp r4, r7
- blt _02013C3A
-_02013C54:
- add r3, r3, #0x1
- add r5, #0x8
- cmp r3, #0xc
- blo _02013C30
- mov r0, #0x0
- pop {r4-r7}
- bx lr
- nop
-_02013C64: .word UNK_020ED5EC
-_02013C68: .word UNK_020ED5EC + 4
-
- thumb_func_start FUN_02013C6C
-FUN_02013C6C: ; 0x02013C6C
- push {r3-r7, lr}
- ldr r3, _02013CC8 ; =UNK_020ED5EC
- add r6, r1, #0x0
- mov r7, #0x0
-_02013C74:
- ldr r5, [r3, #0x4]
- mov r2, #0x0
- cmp r5, #0x0
- ble _02013CBC
- ldr r4, [r3, #0x0]
-_02013C7E:
- ldrh r1, [r4, #0x0]
- cmp r0, r1
- bne _02013CB4
- ldr r2, _02013CCC ; =UNK_020ED5EC + 4
- lsl r1, r7, #0x3
- ldr r2, [r2, r1]
- mov r0, #0x0
- cmp r2, #0x0
- beq _02013CAC
- ldr r2, _02013CC8 ; =UNK_020ED5EC
- add r2, r2, r1
- ldr r2, [r2, #0x4]
-_02013C96:
- cmp r6, #0x0
- bne _02013CA4
- ldr r2, _02013CC8 ; =UNK_020ED5EC
- lsl r0, r0, #0x1
- ldr r1, [r2, r1]
- ldrh r0, [r1, r0]
- pop {r3-r7, pc}
-_02013CA4:
- sub r6, r6, #0x1
- add r0, r0, #0x1
- cmp r2, #0x0
- bne _02013C96
-_02013CAC:
- bl ErrorHandling
- ldr r0, _02013CD0 ; =0x0000FFFF
- pop {r3-r7, pc}
-_02013CB4:
- add r2, r2, #0x1
- add r4, r4, #0x2
- cmp r2, r5
- blt _02013C7E
-_02013CBC:
- add r7, r7, #0x1
- add r3, #0x8
- cmp r7, #0xc
- blo _02013C74
- pop {r3-r7, pc}
- nop
-_02013CC8: .word UNK_020ED5EC
-_02013CCC: .word UNK_020ED5EC + 4
-_02013CD0: .word 0x0000FFFF
diff --git a/arm9/src/unk_020139D8.c b/arm9/src/unk_020139D8.c
new file mode 100644
index 00000000..82c96ea9
--- /dev/null
+++ b/arm9/src/unk_020139D8.c
@@ -0,0 +1,291 @@
+#include "global.h"
+#include "msgdata.h"
+#include "heap.h"
+#include "save_block_2.h"
+#include "math_util.h"
+#include "unk_020139D8.h"
+
+#pragma thumb on
+
+const u8 UNK_020ED5B4[][2] = {
+ { LANGUAGE_JAPANESE, 0 },
+ { LANGUAGE_ENGLISH, 1 },
+ { LANGUAGE_FRENCH, 2 },
+ { LANGUAGE_ITALIAN, 3 },
+ { LANGUAGE_GERMAN, 4 },
+ { LANGUAGE_SPANISH, 5 },
+};
+
+const u16 UNK_020ED5C0[] = {
+ 362,
+ 589,
+ 565,
+ 553,
+ 388,
+ 389,
+ 390,
+ 391,
+ 392,
+ 393,
+ 394
+};
+
+const u16 UNK_020ED5D6[] = {
+ 496,
+ 468,
+ 18,
+ 124,
+ 38,
+ 38,
+ 107,
+ 104,
+ 47,
+ 32,
+ 23
+};
+
+const u16 UNK_020ED580[] = { 0x04C0, 0x04F0 };
+const u16 UNK_020ED5A8[] = { 0x04A7, 0x04E1 };
+const u16 UNK_020ED5AC[] = { 0x0479, 0x0498, 0x049B, 0x049C };
+const u16 UNK_020ED5A0[] = { 0x048F, 0x0497 };
+const u16 UNK_020ED59C[] = { 0x04FC, 0x0596 };
+const u16 UNK_020ED594[] = { 0x047A, 0x048D };
+const u16 UNK_020ED58C[] = { 0x0441, 0x0599 };
+const u16 UNK_020ED590[] = { 0x042C, 0x059D };
+const u16 UNK_020ED5A4[] = { 0x04B0, 0x04FF };
+const u16 UNK_020ED598[] = { 0x04B6, 0x0505 };
+const u16 UNK_020ED584[] = { 0x024E, 0x03D2 };
+const u16 UNK_020ED588[] = { 0x04BB, 0x0500 };
+
+const struct UnkStruct_020ED5EC
+{
+ const u16 * data;
+ s32 count;
+} UNK_020ED5EC[] = {
+ { UNK_020ED58C, NELEMS(UNK_020ED58C) },
+ { UNK_020ED580, NELEMS(UNK_020ED580) },
+ { UNK_020ED5A8, NELEMS(UNK_020ED5A8) },
+ { UNK_020ED5AC, NELEMS(UNK_020ED5AC) },
+ { UNK_020ED5A0, NELEMS(UNK_020ED5A0) },
+ { UNK_020ED59C, NELEMS(UNK_020ED59C) },
+ { UNK_020ED588, NELEMS(UNK_020ED588) },
+ { UNK_020ED584, NELEMS(UNK_020ED584) },
+ { UNK_020ED590, NELEMS(UNK_020ED590) },
+ { UNK_020ED5A4, NELEMS(UNK_020ED5A4) },
+ { UNK_020ED598, NELEMS(UNK_020ED598) },
+ { UNK_020ED594, NELEMS(UNK_020ED594) },
+};
+
+struct UnkStruct_020139D8 * FUN_020139D8(u32 heap_id)
+{
+ struct UnkStruct_020139D8 * ret = (struct UnkStruct_020139D8 *)AllocFromHeap(heap_id, sizeof(struct UnkStruct_020139D8));
+ s32 i;
+ for (i = 0; i < 11; i++)
+ {
+ ret->heap_id = heap_id; // inadvertently inside the loop
+ ret->msgDatas[i] = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, UNK_020ED5C0[i], heap_id);
+ }
+ return ret;
+}
+
+void FUN_02013A10(struct UnkStruct_020139D8 * unk)
+{
+ s32 i;
+ for (i = 0; i < 11; i++)
+ {
+ DestroyMsgData(unk->msgDatas[i]);
+ }
+ FreeToHeap(unk);
+}
+
+void FUN_02013A30(struct UnkStruct_020139D8 * unk, u16 a1, struct String * str)
+{
+ s32 sp4;
+ s32 sp0;
+ FUN_02013AEC(a1, &sp4, &sp0);
+ ReadMsgDataIntoString(unk->msgDatas[sp4], (u32)sp0, str);
+}
+
+void FUN_02013A58(u16 a0, struct String * a1)
+{
+ s32 sp8;
+ s32 sp4;
+ if (a0 != 0xFFFF)
+ {
+ FUN_02013AEC(a0, &sp8, &sp4);
+ sp8 = UNK_020ED5C0[sp8];
+ ReadMsgData_NewNarc_ExistingString(NARC_MSGDATA_MSG, (u32)sp8, (u32)sp4, 0, a1);
+ }
+ else
+ StringSetEmpty(a1);
+}
+
+u16 FUN_02013A9C(u16 a0, u16 a1)
+{
+ u32 i;
+ u16 k;
+ u16 j;
+ for (i = 0; i < 11; i++)
+ {
+ if (a0 == UNK_020ED5C0[i])
+ {
+ for (j = 0, k = 0; j < i; j++)
+ k += UNK_020ED5D6[j];
+ return (u16)(k + a1);
+ }
+ }
+ return 0xFFFF;
+}
+
+void FUN_02013AEC(u32 a0, s32 * a1, s32 * a2)
+{
+ s32 i;
+ s32 j;
+ u32 r3;
+
+ r3 = a0 & 0xFFF;
+ j = 0;
+
+ for (i = 0; i < NELEMS(UNK_020ED5D6); i++)
+ {
+ j += UNK_020ED5D6[i];
+ if (r3 < j)
+ {
+ *a1 = i;
+ *a2 = (s32)(r3 - (j - UNK_020ED5D6[i]));
+ return;
+ }
+ }
+}
+
+u32 FUN_02013B28(void)
+{
+ return sizeof(struct UnkStruct_02013B28);
+}
+
+void FUN_02013B2C(struct UnkStruct_02013B28 * unk)
+{
+ u32 i;
+ unk->unk_0 = 0;
+ unk->unk_4 = 0;
+ for (i = 0; i < 6; i++)
+ {
+ if (UNK_020ED5B4[i][0] == GAME_LANGUAGE)
+ {
+ FUN_02013C18(unk, UNK_020ED5B4[i][1]);
+ break;
+ }
+ }
+}
+
+struct UnkStruct_02013B28 * FUN_02013B5C(struct SaveBlock2 * sav2)
+{
+ return (struct UnkStruct_02013B28 *)SavArray_get(sav2, 34);
+}
+
+BOOL FUN_02013B68(struct UnkStruct_02013B28 * unk, u32 a1)
+{
+ return (BOOL)((unk->unk_4 >> a1) & 1);
+}
+
+s32 FUN_02013B74(struct UnkStruct_02013B28 * unk)
+{
+ u32 i;
+ u32 count;
+ u32 which_bit;
+ for (i = 0, count = 0; i < 32; i++)
+ {
+ if (!((unk->unk_4 >> i) & 1))
+ count++;
+ }
+ if (count != 0)
+ {
+ which_bit = LCRandom() % count;
+ for (i = 0; i < 32; i++)
+ {
+ if (!((unk->unk_4 >> i) & 1))
+ {
+ if (which_bit == 0)
+ {
+ unk->unk_4 |= (1 << i);
+ return (s32)i;
+ }
+ which_bit--;
+ }
+ }
+ }
+ return 32;
+}
+
+BOOL FUN_02013BC8(struct UnkStruct_02013B28 * unk)
+{
+ u32 i;
+ for (i = 0; i < 32; i++)
+ {
+ if (!((unk->unk_4 >> i) & 1))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+u16 FUN_02013BE4(u16 a0)
+{
+ s32 i;
+ u16 skip = 0;
+ for (i = 0; i < 9; i++)
+ skip += UNK_020ED5D6[i];
+ return (u16)(skip + a0);
+}
+
+BOOL FUN_02013C0C(struct UnkStruct_02013B28 * unk, u32 a1)
+{
+ return (BOOL)((unk->unk_0 >> a1) & 1);
+}
+
+void FUN_02013C18(struct UnkStruct_02013B28 * unk, u32 a1)
+{
+ unk->unk_0 |= (1 << a1);
+}
+
+s32 FUN_02013C28(u16 a0)
+{
+ s32 r3;
+ s32 r4;
+
+ for (r3 = 0; r3 < NELEMS(UNK_020ED5EC); r3++)
+ {
+ for (r4 = 0; r4 < UNK_020ED5EC[r3].count; r4++)
+ {
+ if (a0 == UNK_020ED5EC[r3].data[r4])
+ return UNK_020ED5EC[r3].count - 1;
+ }
+ }
+ return 0;
+}
+
+u16 FUN_02013C6C(u16 a0, s32 a1)
+{
+ s32 r7;
+ s32 r2;
+ s32 r0;
+
+ for (r7 = 0; r7 < NELEMS(UNK_020ED5EC); r7++)
+ {
+ for (r2 = 0; r2 < UNK_020ED5EC[r7].count; r2++)
+ {
+ if (a0 == UNK_020ED5EC[r7].data[r2])
+ {
+ // ERROR: Infinite loop when reached
+ for (r0 = 0; /*r0 <*/ UNK_020ED5EC[r7].count; r0++)
+ {
+ if (a1 == 0)
+ return UNK_020ED5EC[r7].data[r0];
+ a1--;
+ }
+ GF_ASSERT(0);
+ return 0xFFFF;
+ }
+ }
+ }
+ return a0;
+}
diff --git a/include/unk_020139D8.h b/include/unk_020139D8.h
new file mode 100644
index 00000000..652c9caf
--- /dev/null
+++ b/include/unk_020139D8.h
@@ -0,0 +1,34 @@
+#ifndef POKEDIAMOND_UNK_020139D8_H
+#define POKEDIAMOND_UNK_020139D8_H
+
+struct UnkStruct_020139D8
+{
+ u32 heap_id;
+ struct MsgData * msgDatas[11];
+};
+
+struct UnkStruct_02013B28
+{
+ u32 unk_0;
+ u32 unk_4;
+};
+
+struct UnkStruct_020139D8 * FUN_020139D8(u32 heap_id);
+void FUN_02013A10(struct UnkStruct_020139D8 * unk);
+void FUN_02013A30(struct UnkStruct_020139D8 * unk, u16 a1, struct String * str);
+void FUN_02013A58(u16 a0, struct String * a1);
+u16 FUN_02013A9C(u16 a0, u16 a1);
+void FUN_02013AEC(u32 a0, s32 * a1, s32 * a2);
+u32 FUN_02013B28(void);
+void FUN_02013B2C(struct UnkStruct_02013B28 * unk);
+struct UnkStruct_02013B28 * FUN_02013B5C(struct SaveBlock2 * sav2);
+BOOL FUN_02013B68(struct UnkStruct_02013B28 * unk, u32 a1);
+s32 FUN_02013B74(struct UnkStruct_02013B28 * unk);
+BOOL FUN_02013BC8(struct UnkStruct_02013B28 * unk);
+u16 FUN_02013BE4(u16 a0);
+BOOL FUN_02013C0C(struct UnkStruct_02013B28 * unk, u32 a1);
+void FUN_02013C18(struct UnkStruct_02013B28 * unk, u32 a1);
+s32 FUN_02013C28(u16 a0);
+u16 FUN_02013C6C(u16 a0, s32 a1);
+
+#endif //POKEDIAMOND_UNK_020139D8_H