summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xasm/pokemon_jump.s2
-rw-r--r--asm/pokenav.s2343
-rw-r--r--data/pokenav.s114
-rw-r--r--include/graphics.h7
-rw-r--r--include/menu.h1
-rw-r--r--include/strings.h3
-rw-r--r--src/menu.c2
-rw-r--r--src/pokenav.c2094
-rw-r--r--src/strings.c6
-rw-r--r--sym_ewram.txt11
10 files changed, 1899 insertions, 2684 deletions
diff --git a/asm/pokemon_jump.s b/asm/pokemon_jump.s
index e9aa9089d..074a87474 100755
--- a/asm/pokemon_jump.s
+++ b/asm/pokemon_jump.s
@@ -5212,7 +5212,7 @@ _0802D178:
bl CopyBgTilemapBufferToVram
movs r0, 0x1
bl CopyBgTilemapBufferToVram
- bl sub_8199D98
+ bl ResetBgPositions
b _0802D2CC
.pool
_0802D298:
diff --git a/asm/pokenav.s b/asm/pokenav.s
index 8b082c2ae..e453c814c 100644
--- a/asm/pokenav.s
+++ b/asm/pokenav.s
@@ -3,2149 +3,6 @@
.syntax unified
- .text
-
-
-
-
-
- thumb_func_start sub_81C81D4
-sub_81C81D4: @ 81C81D4
- push {r4-r7,lr}
- adds r6, r0, 0
- adds r5, r1, 0
- adds r7, r2, 0
- ldr r1, =0x000008a4
- movs r0, 0x11
- bl AllocSubstruct
- adds r4, r0, 0
- cmp r4, 0
- beq _081C821C
- ldr r1, =0x00000888
- adds r0, r4, r1
- adds r1, r5, 0
- bl sub_81C9160
- adds r0, r4, 0
- adds r1, r6, 0
- adds r2, r5, 0
- adds r3, r7, 0
- bl sub_81C91AC
- cmp r0, 0
- beq _081C821C
- ldr r0, =sub_81C8254
- movs r1, 0x6
- bl sub_81C7078
- movs r0, 0x1
- b _081C821E
- .pool
-_081C821C:
- movs r0, 0
-_081C821E:
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_81C81D4
-
- thumb_func_start sub_81C8224
-sub_81C8224: @ 81C8224
- push {lr}
- ldr r0, =sub_81C8254
- bl sub_81C7124
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81C8224
-
- thumb_func_start sub_81C8234
-sub_81C8234: @ 81C8234
- push {r4,lr}
- movs r0, 0x11
- bl GetSubstructPtr
- adds r4, r0, 0
- bl sub_81C8FE0
- ldrb r0, [r4, 0x8]
- bl RemoveWindow
- movs r0, 0x11
- bl FreeSubstruct
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_81C8234
-
- thumb_func_start sub_81C8254
-sub_81C8254: @ 81C8254
- push {r4,lr}
- adds r4, r0, 0
- bl IsDma3ManagerBusyWithBgCopy
- lsls r0, 24
- cmp r0, 0
- bne _081C82C0
- movs r0, 0x11
- bl GetSubstructPtr
- adds r2, r0, 0
- cmp r4, 0x4
- bhi _081C82D6
- lsls r0, r4, 2
- ldr r1, =_081C827C
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .pool
- .align 2, 0
-_081C827C:
- .4byte _081C8290
- .4byte _081C829A
- .4byte _081C82A4
- .4byte _081C82B8
- .4byte _081C82CC
-_081C8290:
- adds r0, r2, 0
- bl sub_81C82E4
- movs r0, 0
- b _081C82D8
-_081C829A:
- adds r0, r2, 0
- bl sub_81C835C
- movs r0, 0
- b _081C82D8
-_081C82A4:
- ldr r1, =0x00000888
- adds r0, r2, r1
- adds r1, r2, 0
- bl sub_81C837C
- movs r0, 0
- b _081C82D8
- .pool
-_081C82B8:
- bl sub_81C83E0
- cmp r0, 0
- beq _081C82C4
-_081C82C0:
- movs r0, 0x2
- b _081C82D8
-_081C82C4:
- bl sub_81C8ED0
- movs r0, 0x1
- b _081C82D8
-_081C82CC:
- ldr r1, =0x00000888
- adds r0, r2, r1
- adds r1, r2, 0
- bl sub_81C8EF8
-_081C82D6:
- movs r0, 0x4
-_081C82D8:
- pop {r4}
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81C8254
-
- thumb_func_start sub_81C82E4
-sub_81C82E4: @ 81C82E4
- push {r4,r5,lr}
- sub sp, 0x8
- adds r5, r0, 0
- ldrb r4, [r5, 0x1]
- lsls r4, 12
- ldrh r0, [r5, 0x6]
- orrs r4, r0
- lsls r4, 16
- lsrs r4, 16
- ldrb r0, [r5]
- ldrh r2, [r5, 0x6]
- movs r1, 0x11
- movs r3, 0x1
- bl sub_8199DF0
- ldrb r0, [r5]
- ldrh r2, [r5, 0x6]
- adds r2, 0x1
- movs r1, 0x44
- movs r3, 0x1
- bl sub_8199DF0
- ldrb r0, [r5]
- adds r1, r5, 0
- adds r1, 0x88
- bl SetBgTilemapBuffer
- ldrb r0, [r5]
- movs r1, 0x20
- str r1, [sp]
- str r1, [sp, 0x4]
- adds r1, r4, 0
- movs r2, 0
- movs r3, 0
- bl FillBgTilemapBufferRect_Palette0
- ldrb r0, [r5]
- movs r1, 0
- movs r2, 0
- bl ChangeBgY
- ldrb r0, [r5]
- movs r1, 0
- movs r2, 0
- bl ChangeBgX
- ldrb r0, [r5]
- ldrb r1, [r5, 0x3]
- lsls r1, 11
- movs r2, 0x2
- bl ChangeBgY
- ldrb r0, [r5]
- bl CopyBgTilemapBufferToVram
- add sp, 0x8
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_81C82E4
-
- thumb_func_start sub_81C835C
-sub_81C835C: @ 81C835C
- push {r4,lr}
- adds r4, r0, 0
- ldrb r0, [r4, 0x8]
- movs r1, 0x11
- bl FillWindowPixelBuffer
- ldrb r0, [r4, 0x8]
- bl PutWindowTilemap
- ldrb r0, [r4, 0x8]
- movs r1, 0x1
- bl CopyWindowToVram
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_81C835C
-
- thumb_func_start sub_81C837C
-sub_81C837C: @ 81C837C
- push {r4,r5,lr}
- sub sp, 0x8
- adds r3, r0, 0
- adds r5, r1, 0
- ldrh r0, [r3, 0x2]
- ldrh r4, [r3]
- subs r2, r0, r4
- ldrh r0, [r3, 0x8]
- cmp r2, r0
- ble _081C8392
- adds r2, r0, 0
-_081C8392:
- ldr r0, [r3, 0x10]
- ldr r3, [r3, 0xC]
- movs r1, 0
- str r1, [sp]
- str r5, [sp, 0x4]
- adds r1, r4, 0
- bl sub_81C83AC
- add sp, 0x8
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_81C837C
-
- thumb_func_start sub_81C83AC
-sub_81C83AC: @ 81C83AC
- push {r4,r5,lr}
- adds r4, r0, 0
- adds r5, r1, 0
- ldr r1, [sp, 0x10]
- cmp r2, 0
- beq _081C83D6
- adds r0, r5, 0
- muls r0, r3
- adds r0, r4, r0
- str r0, [r1, 0x1C]
- str r3, [r1, 0x18]
- movs r0, 0
- strh r0, [r1, 0xC]
- strh r2, [r1, 0xE]
- str r5, [r1, 0x14]
- ldr r0, [sp, 0xC]
- str r0, [r1, 0x10]
- ldr r0, =sub_81C83F0
- movs r1, 0x5
- bl sub_81C7078
-_081C83D6:
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C83AC
-
- thumb_func_start sub_81C83E0
-sub_81C83E0: @ 81C83E0
- push {lr}
- ldr r0, =sub_81C83F0
- bl sub_81C7124
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81C83E0
-
- thumb_func_start sub_81C83F0
-sub_81C83F0: @ 81C83F0
- push {r4-r7,lr}
- sub sp, 0xC
- adds r6, r0, 0
- movs r0, 0x11
- bl GetSubstructPtr
- adds r4, r0, 0
- cmp r6, 0
- beq _081C8408
- cmp r6, 0x1
- beq _081C848C
- b _081C849A
-_081C8408:
- ldrh r0, [r4, 0xA]
- ldrh r1, [r4, 0xC]
- adds r0, r1
- ldr r1, [r4, 0x10]
- adds r5, r0, r1
- movs r0, 0xF
- ands r5, r0
- ldr r0, [r4, 0x1C]
- adds r7, r4, 0
- adds r7, 0x48
- ldr r2, [r4, 0x34]
- adds r1, r7, 0
- bl _call_via_r2
- ldr r3, [r4, 0x38]
- cmp r3, 0
- beq _081C8434
- ldrh r0, [r4, 0x8]
- ldr r1, [r4, 0x14]
- adds r2, r5, 0
- bl _call_via_r3
-_081C8434:
- ldrb r0, [r4, 0x8]
- ldrb r1, [r4, 0x5]
- lsls r2, r5, 4
- movs r3, 0x1
- orrs r2, r3
- str r2, [sp]
- movs r2, 0xFF
- str r2, [sp, 0x4]
- str r6, [sp, 0x8]
- adds r2, r7, 0
- movs r3, 0x8
- bl AddTextPrinterParameterized
- ldrh r0, [r4, 0xC]
- adds r0, 0x1
- strh r0, [r4, 0xC]
- lsls r0, 16
- lsrs r0, 16
- ldrh r1, [r4, 0xE]
- cmp r0, r1
- bcc _081C847A
- ldr r0, [r4, 0x38]
- cmp r0, 0
- beq _081C846E
- ldrb r0, [r4, 0x8]
- movs r1, 0x3
- bl CopyWindowToVram
- b _081C8476
-_081C846E:
- ldrb r0, [r4, 0x8]
- movs r1, 0x2
- bl CopyWindowToVram
-_081C8476:
- movs r0, 0
- b _081C849C
-_081C847A:
- ldr r0, [r4, 0x1C]
- ldr r1, [r4, 0x18]
- adds r0, r1
- str r0, [r4, 0x1C]
- ldr r0, [r4, 0x14]
- adds r0, 0x1
- str r0, [r4, 0x14]
- movs r0, 0x3
- b _081C849C
-_081C848C:
- bl IsDma3ManagerBusyWithBgCopy
- lsls r0, 24
- cmp r0, 0
- beq _081C849A
- movs r0, 0x2
- b _081C849C
-_081C849A:
- movs r0, 0x4
-_081C849C:
- add sp, 0xC
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_81C83F0
-
- thumb_func_start sub_81C84A4
-sub_81C84A4: @ 81C84A4
- push {lr}
- movs r0, 0x11
- bl GetSubstructPtr
- ldr r1, =0x00000888
- adds r0, r1
- ldrh r1, [r0]
- negs r0, r1
- orrs r0, r1
- lsrs r0, 31
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81C84A4
-
- thumb_func_start sub_81C84C0
-sub_81C84C0: @ 81C84C0
- push {lr}
- movs r0, 0x11
- bl GetSubstructPtr
- ldr r1, =0x00000888
- adds r0, r1
- movs r3, 0
- ldrh r1, [r0]
- ldrh r2, [r0, 0x8]
- adds r1, r2
- ldrh r0, [r0, 0x2]
- cmp r1, r0
- bge _081C84DC
- movs r3, 0x1
-_081C84DC:
- adds r0, r3, 0
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81C84C0
-
- thumb_func_start sub_81C84E8
-sub_81C84E8: @ 81C84E8
- push {r4-r7,lr}
- sub sp, 0x8
- adds r6, r0, 0
- adds r4, r1, 0
- movs r0, 0x11
- bl GetSubstructPtr
- adds r7, r0, 0
- ldr r0, =0x00000888
- adds r5, r7, r0
- cmp r6, 0
- bge _081C8524
- ldrh r1, [r5]
- adds r0, r1, r6
- cmp r0, 0
- bge _081C850A
- negs r6, r1
-_081C850A:
- cmp r4, 0
- beq _081C854E
- ldr r0, [r5, 0x10]
- adds r1, r6
- negs r2, r6
- ldr r3, [r5, 0xC]
- str r6, [sp]
- str r7, [sp, 0x4]
- bl sub_81C83AC
- b _081C854E
- .pool
-_081C8524:
- cmp r4, 0
- beq _081C854E
- ldr r2, =gUnknown_0203CF44
- ldrh r1, [r5]
- ldrh r0, [r5, 0x8]
- adds r4, r1, r0
- str r4, [r2]
- adds r0, r4, r6
- ldrh r1, [r5, 0x2]
- cmp r0, r1
- blt _081C853C
- subs r6, r1, r4
-_081C853C:
- ldr r0, [r5, 0x10]
- ldr r3, [r5, 0xC]
- ldrh r1, [r5, 0x8]
- str r1, [sp]
- str r7, [sp, 0x4]
- adds r1, r4, 0
- adds r2, r6, 0
- bl sub_81C83AC
-_081C854E:
- adds r0, r6, 0
- adds r1, r7, 0
- bl sub_81C8568
- ldrh r0, [r5]
- adds r0, r6
- strh r0, [r5]
- add sp, 0x8
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C84E8
-
- thumb_func_start sub_81C8568
-sub_81C8568: @ 81C8568
- push {r4,r5,lr}
- adds r5, r0, 0
- adds r4, r1, 0
- ldrb r0, [r4]
- bl GetBgY
- str r0, [r4, 0x20]
- lsls r1, r5, 12
- adds r0, r1
- str r0, [r4, 0x24]
- cmp r5, 0
- ble _081C8584
- movs r0, 0x1
- b _081C8586
-_081C8584:
- movs r0, 0x2
-_081C8586:
- str r0, [r4, 0x30]
- str r5, [r4, 0x2C]
- ldr r0, =sub_81C85A0
- movs r1, 0x6
- bl sub_81C7078
- str r0, [r4, 0x28]
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C8568
-
- thumb_func_start sub_81C85A0
-sub_81C85A0: @ 81C85A0
- push {r4-r6,lr}
- adds r5, r0, 0
- movs r0, 0x11
- bl GetSubstructPtr
- adds r4, r0, 0
- cmp r5, 0
- beq _081C85B8
- cmp r5, 0x1
- beq _081C85C4
- movs r0, 0x4
- b _081C862A
-_081C85B8:
- bl sub_81C83E0
- cmp r0, 0
- bne _081C8628
- movs r0, 0x1
- b _081C862A
-_081C85C4:
- movs r6, 0
- ldrb r0, [r4]
- bl GetBgY
- adds r5, r0, 0
- ldrb r0, [r4]
- movs r1, 0x80
- lsls r1, 5
- ldr r2, [r4, 0x30]
- lsls r2, 24
- lsrs r2, 24
- bl ChangeBgY
- adds r1, r0, 0
- ldr r0, [r4, 0x30]
- cmp r0, 0x2
- bne _081C85F8
- ldr r2, [r4, 0x24]
- cmp r5, r2
- bgt _081C85F2
- ldr r0, [r4, 0x20]
- cmp r5, r0
- bgt _081C860A
-_081C85F2:
- cmp r1, r2
- bgt _081C860A
- b _081C860E
-_081C85F8:
- ldr r2, [r4, 0x24]
- cmp r5, r2
- blt _081C8604
- ldr r0, [r4, 0x20]
- cmp r5, r0
- blt _081C860A
-_081C8604:
- cmp r1, r2
- blt _081C860A
- movs r6, 0x1
-_081C860A:
- cmp r6, 0
- beq _081C8628
-_081C860E:
- ldr r1, [r4, 0x2C]
- ldrh r0, [r4, 0xA]
- adds r0, r1
- movs r1, 0xF
- ands r0, r1
- strh r0, [r4, 0xA]
- ldrb r0, [r4]
- adds r1, r2, 0
- movs r2, 0
- bl ChangeBgY
- movs r0, 0x4
- b _081C862A
-_081C8628:
- movs r0, 0x2
-_081C862A:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end sub_81C85A0
-
- thumb_func_start sub_81C8630
-sub_81C8630: @ 81C8630
- push {lr}
- movs r0, 0x11
- bl GetSubstructPtr
- ldr r0, [r0, 0x28]
- bl sub_81C70D8
- pop {r1}
- bx r1
- thumb_func_end sub_81C8630
-
- thumb_func_start sub_81C8644
-sub_81C8644: @ 81C8644
- push {lr}
- movs r0, 0x11
- bl GetSubstructPtr
- ldr r1, =0x00000888
- adds r0, r1
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81C8644
-
- thumb_func_start sub_81C8658
-sub_81C8658: @ 81C8658
- push {lr}
- bl sub_81C8644
- adds r1, r0, 0
- ldrh r0, [r1, 0x6]
- cmp r0, 0
- beq _081C866E
- subs r0, 0x1
- strh r0, [r1, 0x6]
- movs r0, 0x1
- b _081C8686
-_081C866E:
- bl sub_81C84A4
- cmp r0, 0
- bne _081C867A
- movs r0, 0
- b _081C8686
-_081C867A:
- movs r0, 0x1
- negs r0, r0
- movs r1, 0x1
- bl sub_81C84E8
- movs r0, 0x2
-_081C8686:
- pop {r1}
- bx r1
- thumb_func_end sub_81C8658
-
- thumb_func_start sub_81C868C
-sub_81C868C: @ 81C868C
- push {lr}
- bl sub_81C8644
- adds r2, r0, 0
- ldrh r1, [r2]
- ldrh r3, [r2, 0x6]
- adds r1, r3
- ldrh r0, [r2, 0x2]
- subs r0, 0x1
- cmp r1, r0
- bge _081C86BA
- ldrh r0, [r2, 0x8]
- subs r0, 0x1
- cmp r3, r0
- bge _081C86B2
- adds r0, r3, 0x1
- strh r0, [r2, 0x6]
- movs r0, 0x1
- b _081C86C8
-_081C86B2:
- bl sub_81C84C0
- cmp r0, 0
- bne _081C86BE
-_081C86BA:
- movs r0, 0
- b _081C86C8
-_081C86BE:
- movs r0, 0x1
- movs r1, 0x1
- bl sub_81C84E8
- movs r0, 0x2
-_081C86C8:
- pop {r1}
- bx r1
- thumb_func_end sub_81C868C
-
- thumb_func_start sub_81C86CC
-sub_81C86CC: @ 81C86CC
- push {r4,lr}
- bl sub_81C8644
- adds r4, r0, 0
- bl sub_81C84A4
- adds r1, r0, 0
- cmp r1, 0
- beq _081C86F8
- ldrh r0, [r4]
- ldrh r1, [r4, 0x8]
- cmp r0, r1
- bcc _081C86EA
- ldrh r0, [r4, 0x8]
- b _081C86EC
-_081C86EA:
- ldrh r0, [r4]
-_081C86EC:
- negs r0, r0
- movs r1, 0x1
- bl sub_81C84E8
- movs r0, 0x2
- b _081C8706
-_081C86F8:
- ldrh r0, [r4, 0x6]
- cmp r0, 0
- bne _081C8702
- movs r0, 0
- b _081C8706
-_081C8702:
- strh r1, [r4, 0x6]
- movs r0, 0x1
-_081C8706:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_81C86CC
-
- thumb_func_start sub_81C870C
-sub_81C870C: @ 81C870C
- push {r4,lr}
- bl sub_81C8644
- adds r4, r0, 0
- bl sub_81C84C0
- cmp r0, 0
- beq _081C8736
- ldrh r0, [r4]
- ldrh r3, [r4, 0x8]
- adds r2, r0, r3
- ldrh r1, [r4, 0x4]
- subs r0, r1, r0
- cmp r2, r1
- bgt _081C872C
- adds r0, r3, 0
-_081C872C:
- movs r1, 0x1
- bl sub_81C84E8
- movs r0, 0x2
- b _081C8756
-_081C8736:
- ldrh r0, [r4, 0x2]
- ldrh r1, [r4, 0x8]
- cmp r0, r1
- bcc _081C8744
- ldrh r1, [r4, 0x6]
- ldrh r0, [r4, 0x8]
- b _081C8748
-_081C8744:
- ldrh r1, [r4, 0x6]
- ldrh r0, [r4, 0x2]
-_081C8748:
- subs r0, 0x1
- cmp r1, r0
- bge _081C8754
- strh r0, [r4, 0x6]
- movs r0, 0x1
- b _081C8756
-_081C8754:
- movs r0, 0
-_081C8756:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end sub_81C870C
-
- thumb_func_start sub_81C875C
-sub_81C875C: @ 81C875C
- push {lr}
- bl sub_81C8644
- adds r1, r0, 0
- ldrh r0, [r1]
- ldrh r1, [r1, 0x6]
- adds r0, r1
- pop {r1}
- bx r1
- thumb_func_end sub_81C875C
-
- thumb_func_start sub_81C8770
-sub_81C8770: @ 81C8770
- push {lr}
- bl sub_81C8644
- ldrh r0, [r0]
- pop {r1}
- bx r1
- thumb_func_end sub_81C8770
-
- thumb_func_start sub_81C877C
-sub_81C877C: @ 81C877C
- push {r4,lr}
- movs r0, 0x11
- bl GetSubstructPtr
- adds r4, r0, 0
- ldr r0, =0x0000089c
- adds r1, r4, r0
- movs r0, 0
- str r0, [r1]
- ldr r0, =sub_81C8870
- movs r1, 0x6
- bl sub_81C7078
- movs r1, 0x8A
- lsls r1, 4
- adds r4, r1
- str r0, [r4]
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C877C
-
- thumb_func_start sub_81C87AC
-sub_81C87AC: @ 81C87AC
- push {r4,r5,lr}
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- movs r0, 0x11
- bl GetSubstructPtr
- adds r5, r0, 0
- ldr r0, =0x00000888
- adds r1, r5, r0
- ldrh r0, [r1]
- adds r0, r4
- movs r2, 0
- strh r0, [r1]
- ldr r1, =0x0000089c
- adds r0, r5, r1
- str r2, [r0]
- ldr r0, =sub_81C8958
- movs r1, 0x6
- bl sub_81C7078
- movs r1, 0x8A
- lsls r1, 4
- adds r5, r1
- str r0, [r5]
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C87AC
-
- thumb_func_start sub_81C87F0
-sub_81C87F0: @ 81C87F0
- push {r4,lr}
- movs r0, 0x11
- bl GetSubstructPtr
- adds r4, r0, 0
- ldr r0, =0x0000089c
- adds r1, r4, r0
- movs r0, 0
- str r0, [r1]
- ldr r0, =sub_81C8A28
- movs r1, 0x6
- bl sub_81C7078
- movs r1, 0x8A
- lsls r1, 4
- adds r4, r1
- str r0, [r4]
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C87F0
-
- thumb_func_start sub_81C8820
-sub_81C8820: @ 81C8820
- push {lr}
- movs r0, 0x11
- bl GetSubstructPtr
- movs r1, 0x8A
- lsls r1, 4
- adds r0, r1
- ldr r0, [r0]
- bl sub_81C70D8
- pop {r1}
- bx r1
- thumb_func_end sub_81C8820
-
- thumb_func_start sub_81C8838
-sub_81C8838: @ 81C8838
- push {r4,lr}
- movs r0, 0x11
- bl GetSubstructPtr
- adds r4, r0, 0
- ldr r0, =0x00000888
- adds r2, r4, r0
- ldrh r0, [r4, 0x8]
- ldrh r1, [r2]
- ldrh r3, [r2, 0x6]
- adds r1, r3
- ldrh r2, [r4, 0xA]
- adds r2, r3
- movs r3, 0xF
- ands r2, r3
- ldr r3, [r4, 0x38]
- bl _call_via_r3
- ldrb r0, [r4, 0x8]
- movs r1, 0x1
- bl CopyWindowToVram
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C8838
-
- thumb_func_start sub_81C8870
-sub_81C8870: @ 81C8870
- push {r4,r5,lr}
- adds r5, r0, 0
- movs r0, 0x11
- bl GetSubstructPtr
- adds r4, r0, 0
- cmp r5, 0x4
- bhi _081C894C
- lsls r0, r5, 2
- ldr r1, =_081C8890
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .pool
- .align 2, 0
-_081C8890:
- .4byte _081C88A4
- .4byte _081C88AC
- .4byte _081C88D8
- .4byte _081C8918
- .4byte _081C8938
-_081C88A4:
- adds r0, r4, 0
- movs r1, 0x1
- bl sub_81C9008
-_081C88AC:
- ldr r0, =0x0000089c
- adds r5, r4, r0
- ldr r1, =0x0000088e
- adds r0, r4, r1
- ldr r1, [r5]
- ldrh r0, [r0]
- cmp r1, r0
- beq _081C88C4
- adds r0, r4, 0
- movs r2, 0x1
- bl sub_81C8B70
-_081C88C4:
- ldr r0, [r5]
- adds r0, 0x1
- str r0, [r5]
-_081C88CA:
- movs r0, 0
- b _081C894E
- .pool
-_081C88D8:
- bl IsDma3ManagerBusyWithBgCopy
- lsls r0, 24
- cmp r0, 0
- bne _081C8942
- ldr r2, =0x0000089c
- adds r0, r4, r2
- subs r2, 0xC
- adds r1, r4, r2
- ldr r3, [r0]
- ldrh r1, [r1]
- cmp r3, r1
- beq _081C88FC
- movs r0, 0x6
- b _081C894E
- .pool
-_081C88FC:
- ldr r0, =0x0000088e
- adds r1, r4, r0
- ldrh r0, [r1]
- cmp r0, 0
- beq _081C88CA
- adds r2, r0, 0
- adds r0, r4, 0
- adds r1, r3, 0
- bl sub_81C8B70
- b _081C88CA
- .pool
-_081C8918:
- bl IsDma3ManagerBusyWithBgCopy
- lsls r0, 24
- cmp r0, 0
- bne _081C8942
- ldr r2, =0x0000088e
- adds r1, r4, r2
- ldrh r0, [r1]
- cmp r0, 0
- beq _081C894C
- movs r1, 0
- bl sub_81C84E8
- b _081C88CA
- .pool
-_081C8938:
- bl sub_81C8630
- adds r1, r0, 0
- cmp r1, 0
- beq _081C8946
-_081C8942:
- movs r0, 0x2
- b _081C894E
-_081C8946:
- ldr r2, =0x0000088e
- adds r0, r4, r2
- strh r1, [r0]
-_081C894C:
- movs r0, 0x4
-_081C894E:
- pop {r4,r5}
- pop {r1}
- bx r1
- .pool
- thumb_func_end sub_81C8870
-
- thumb_func_start sub_81C8958
-sub_81C8958: @ 81C8958
- push {r4,r5,lr}
- adds r5, r0, 0
- movs r0, 0x11
- bl GetSubstructPtr
- adds r4, r0, 0
- bl IsDma3ManagerBusyWithBgCopy
- lsls r0, 24
- cmp r0, 0
- beq _081C8972
- movs r0, 0x2
- b _081C8A22
-_081C8972:
- cmp r5, 0x7
- bhi _081C8A1C
- lsls r0, r5, 2
- ldr r1, =_081C8984
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .pool
- .align 2, 0
-_081C8984:
- .4byte _081C89A4
- .4byte _081C89B4
- .4byte _081C89BE
- .4byte _081C89D0
- .4byte _081C89DA
- .4byte _081C89EC
- .4byte _081C89F6
- .4byte _081C8A08
-_081C89A4:
- ldr r1, =0x00000888
- adds r0, r4, r1
- adds r1, r4, 0
- bl sub_81C8CB4
- b _081C8A20
- .pool
-_081C89B4:
- adds r0, r4, 0
- movs r1, 0
- bl sub_81C8DBC
- b _081C8A20
-_081C89BE:
- ldr r1, =0x00000888
- adds r0, r4, r1
- adds r1, r4, 0
- movs r2, 0
- bl sub_81C8E54
- b _081C8A20
- .pool
-_081C89D0:
- adds r0, r4, 0
- movs r1, 0x1
- bl sub_81C8DBC
- b _081C8A20
-_081C89DA:
- ldr r1, =0x00000888
- adds r0, r4, r1
- adds r1, r4, 0
- movs r2, 0x1
- bl sub_81C8E54
- b _081C8A20
- .pool
-_081C89EC:
- adds r0, r4, 0
- movs r1, 0x2
- bl sub_81C8DBC
- b _081C8A20
-_081C89F6:
- ldr r1, =0x00000888
- adds r0, r4, r1
- adds r1, r4, 0
- movs r2, 0x2
- bl sub_81C8E54
- b _081C8A20
- .pool
-_081C8A08:
- ldr r1, =0x00000888
- adds r0, r4, r1
- adds r1, r4, 0
- movs r2, 0x3
- bl sub_81C8E54
- b _081C8A20
- .pool
-_081C8A1C:
- movs r0, 0x4
- b _081C8A22
-_081C8A20:
- movs r0, 0
-_081C8A22:
- pop {r4,r5}
- pop {r1}
- bx r1
- thumb_func_end sub_81C8958
-
- thumb_func_start sub_81C8A28
-sub_81C8A28: @ 81C8A28
- push {r4-r7,lr}
- sub sp, 0x8
- adds r5, r0, 0
- bl IsDma3ManagerBusyWithBgCopy
- lsls r0, 24
- cmp r0, 0
- bne _081C8AA6
- movs r0, 0x11
- bl GetSubstructPtr
- adds r4, r0, 0
- ldr r0, =0x00000888
- adds r6, r4, r0
- adds r2, r4, 0
- cmp r5, 0x6
- bls _081C8A4C
- b _081C8B64
-_081C8A4C:
- lsls r0, r5, 2
- ldr r1, =_081C8A60
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .pool
- .align 2, 0
-_081C8A60:
- .4byte _081C8A7C
- .4byte _081C8A88
- .4byte _081C8AE8
- .4byte _081C8AFC
- .4byte _081C8B14
- .4byte _081C8B34
- .4byte _081C8B5C
-_081C8A7C:
- adds r0, r6, 0
- adds r1, r2, 0
- bl sub_81C8D4C
- movs r0, 0
- b _081C8B66
-_081C8A88:
- ldr r1, =0x0000089c
- adds r7, r4, r1
- ldr r0, [r7]
- adds r1, r0, 0x1
- str r1, [r7]
- movs r3, 0x89
- lsls r3, 4
- adds r0, r4, r3
- ldrh r0, [r0]
- cmp r1, r0
- bge _081C8AB0
- adds r0, r2, 0
- movs r2, 0x1
- bl sub_81C8B70
-_081C8AA6:
- movs r0, 0x2
- b _081C8B66
- .pool
-_081C8AB0:
- movs r0, 0
- str r0, [r7]
- ldrh r0, [r6, 0x2]
- ldrh r1, [r6, 0x8]
- cmp r0, r1
- bhi _081C8AC6
- ldrh r0, [r6]
- cmp r0, 0
- beq _081C8B52
- adds r4, r0, 0
- b _081C8AD4
-_081C8AC6:
- ldrh r1, [r6]
- ldrh r0, [r6, 0x8]
- adds r4, r1, r0
- ldrh r1, [r6, 0x2]
- cmp r4, r1
- ble _081C8B52
- subs r4, r1
-_081C8AD4:
- negs r5, r4
- adds r0, r2, 0
- adds r1, r5, 0
- adds r2, r4, 0
- bl sub_81C8B70
- strh r4, [r6, 0x6]
- str r5, [r7]
- movs r0, 0
- b _081C8B66
-_081C8AE8:
- ldr r2, =0x0000089c
- adds r0, r4, r2
- ldr r0, [r0]
- movs r1, 0
- bl sub_81C84E8
- movs r0, 0
- b _081C8B66
- .pool
-_081C8AFC:
- bl sub_81C8630
- adds r1, r0, 0
- cmp r1, 0
- bne _081C8AA6
- ldr r3, =0x0000089c
- adds r0, r4, r3
- str r1, [r0]
-_081C8B0C:
- movs r0, 0x1
- b _081C8B66
- .pool
-_081C8B14:
- ldr r0, [r6, 0x10]
- ldrh r1, [r6]
- ldr r3, =0x0000089c
- adds r2, r4, r3
- ldr r2, [r2]
- adds r1, r2
- ldr r3, [r6, 0xC]
- str r2, [sp]
- str r4, [sp, 0x4]
- movs r2, 0x1
- bl sub_81C83AC
- movs r0, 0
- b _081C8B66
- .pool
-_081C8B34:
- bl sub_81C83E0
- cmp r0, 0
- bne _081C8AA6
- ldr r0, =0x0000089c
- adds r1, r4, r0
- ldr r0, [r1]
- adds r0, 0x1
- str r0, [r1]
- ldrh r1, [r6, 0x2]
- cmp r0, r1
- bge _081C8B0C
- ldrh r6, [r6, 0x8]
- cmp r0, r6
- bge _081C8B0C
-_081C8B52:
- movs r0, 0x9
- b _081C8B66
- .pool
-_081C8B5C:
- adds r0, r2, 0
- movs r1, 0
- bl sub_81C9008
-_081C8B64:
- movs r0, 0x4
-_081C8B66:
- add sp, 0x8
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_81C8A28
-
- thumb_func_start sub_81C8B70
-sub_81C8B70: @ 81C8B70
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x10
- mov r9, r0
- adds r7, r1, 0
- adds r6, r2, 0
- ldrb r0, [r0, 0x8]
- movs r1, 0x7
- bl GetWindowAttribute
- mov r10, r0
- mov r1, r9
- ldrb r0, [r1, 0x4]
- lsls r3, r0, 6
- ldrh r0, [r1, 0xA]
- adds r7, r0, r7
- movs r0, 0xF
- ands r7, r0
- adds r0, r7, r6
- cmp r0, 0x10
- bgt _081C8BD4
- ldr r0, =0x11111111
- str r0, [sp]
- adds r1, r7, 0
- muls r1, r3
- add r1, r10
- adds r2, r6, 0
- muls r2, r3
- lsrs r2, 2
- ldr r0, =0x001fffff
- ands r2, r0
- movs r0, 0x80
- lsls r0, 17
- orrs r2, r0
- mov r0, sp
- bl CpuFastSet
- mov r1, r9
- ldrb r0, [r1, 0x8]
- movs r1, 0x2
- bl CopyWindowToVram
- b _081C8C1E
- .pool
-_081C8BD4:
- movs r2, 0x10
- subs r2, r7
- subs r0, r6, r2
- mov r8, r0
- ldr r1, =0x11111111
- str r1, [sp, 0x4]
- add r0, sp, 0x4
- adds r1, r7, 0
- muls r1, r3
- add r1, r10
- muls r2, r3
- lsrs r2, 2
- ldr r5, =0x001fffff
- ands r2, r5
- movs r4, 0x80
- lsls r4, 17
- orrs r2, r4
- str r3, [sp, 0xC]
- bl CpuFastSet
- ldr r0, =0x11111111
- str r0, [sp, 0x8]
- add r0, sp, 0x8
- ldr r3, [sp, 0xC]
- mov r2, r8
- muls r2, r3
- lsrs r2, 2
- ands r2, r5
- orrs r2, r4
- mov r1, r10
- bl CpuFastSet
- mov r1, r9
- ldrb r0, [r1, 0x8]
- movs r1, 0x2
- bl CopyWindowToVram
-_081C8C1E:
- subs r6, 0x1
- movs r0, 0x1
- negs r0, r0
- cmp r6, r0
- beq _081C8C40
- movs r5, 0xF
- adds r4, r0, 0
-_081C8C2C:
- mov r1, r9
- ldrh r0, [r1, 0x8]
- adds r1, r7, 0
- bl sub_81CBD48
- adds r7, 0x1
- ands r7, r5
- subs r6, 0x1
- cmp r6, r4
- bne _081C8C2C
-_081C8C40:
- mov r1, r9
- ldrb r0, [r1, 0x8]
- movs r1, 0x1
- bl CopyWindowToVram
- add sp, 0x10
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C8B70
-
- thumb_func_start sub_81C8C64
-sub_81C8C64: @ 81C8C64
- push {r4,r5,lr}
- adds r5, r0, 0
- adds r4, r1, 0
- ldrb r0, [r5, 0x8]
- movs r1, 0
- bl GetWindowAttribute
- lsls r0, 24
- lsrs r0, 24
- bl GetBgTilemapBuffer
- adds r2, r0, 0
- ldrh r0, [r5, 0xA]
- lsls r0, 6
- ldrb r1, [r5, 0x2]
- adds r0, r1
- lsls r0, 1
- subs r0, 0x2
- adds r2, r0
- cmp r4, 0
- beq _081C8C98
- ldrb r0, [r5, 0x1]
- lsls r0, 12
- ldrh r1, [r5, 0x6]
- adds r1, 0x1
- b _081C8C9E
-_081C8C98:
- ldrb r0, [r5, 0x1]
- lsls r0, 12
- ldrh r1, [r5, 0x6]
-_081C8C9E:
- orrs r0, r1
- lsls r0, 16
- lsrs r1, r0, 16
- strh r1, [r2]
- adds r0, r2, 0
- adds r0, 0x40
- strh r1, [r0]
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_81C8C64
-
- thumb_func_start sub_81C8CB4
-sub_81C8CB4: @ 81C8CB4
- push {r4-r6,lr}
- sub sp, 0x10
- adds r5, r0, 0
- adds r4, r1, 0
- ldr r1, =gUnknown_0861FBE4
- add r0, sp, 0xC
- movs r2, 0x3
- bl memcpy
- ldrh r1, [r5]
- ldr r0, [r5, 0xC]
- muls r1, r0
- ldr r0, [r5, 0x10]
- adds r0, r1
- adds r6, r4, 0
- adds r6, 0x48
- ldr r2, [r4, 0x34]
- adds r1, r6, 0
- bl _call_via_r2
- ldrh r0, [r4, 0x8]
- ldrh r1, [r5]
- ldrh r2, [r4, 0xA]
- ldr r3, [r4, 0x38]
- bl _call_via_r3
- ldrb r0, [r4, 0x8]
- ldrh r3, [r4, 0xA]
- lsls r3, 20
- lsrs r3, 16
- ldrb r1, [r4, 0x4]
- lsls r1, 3
- str r1, [sp]
- movs r1, 0x10
- str r1, [sp, 0x4]
- movs r1, 0x44
- movs r2, 0
- bl FillWindowPixelRect
- ldrb r0, [r4, 0x8]
- ldrb r1, [r4, 0x5]
- ldrh r3, [r4, 0xA]
- lsls r3, 4
- adds r3, 0x1
- lsls r3, 24
- lsrs r3, 24
- add r2, sp, 0xC
- str r2, [sp]
- movs r2, 0x1
- negs r2, r2
- str r2, [sp, 0x4]
- str r6, [sp, 0x8]
- movs r2, 0x8
- bl AddTextPrinterParameterized3
- adds r0, r4, 0
- movs r1, 0x1
- bl sub_81C8C64
- ldrh r0, [r4, 0x8]
- ldrh r3, [r4, 0xA]
- lsls r3, 1
- ldrb r1, [r4, 0x4]
- str r1, [sp]
- movs r1, 0x2
- str r1, [sp, 0x4]
- movs r1, 0x3
- movs r2, 0
- bl CopyWindowRectToVram
- add sp, 0x10
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C8CB4
-
- thumb_func_start sub_81C8D4C
-sub_81C8D4C: @ 81C8D4C
- push {r4,r5,lr}
- sub sp, 0xC
- adds r4, r1, 0
- ldrh r2, [r0]
- ldr r1, [r0, 0xC]
- muls r1, r2
- ldr r0, [r0, 0x10]
- adds r0, r1
- adds r5, r4, 0
- adds r5, 0x48
- ldr r2, [r4, 0x34]
- adds r1, r5, 0
- bl _call_via_r2
- ldrb r0, [r4, 0x8]
- ldrh r3, [r4, 0xA]
- lsls r3, 20
- lsrs r3, 16
- ldrb r1, [r4, 0x4]
- lsls r1, 3
- str r1, [sp]
- movs r1, 0x10
- str r1, [sp, 0x4]
- movs r1, 0x11
- movs r2, 0
- bl FillWindowPixelRect
- ldrb r0, [r4, 0x8]
- ldrb r1, [r4, 0x5]
- ldrh r2, [r4, 0xA]
- lsls r2, 4
- adds r2, 0x1
- lsls r2, 24
- lsrs r2, 24
- str r2, [sp]
- movs r2, 0xFF
- str r2, [sp, 0x4]
- movs r2, 0
- str r2, [sp, 0x8]
- adds r2, r5, 0
- movs r3, 0x8
- bl AddTextPrinterParameterized
- adds r0, r4, 0
- movs r1, 0
- bl sub_81C8C64
- ldrb r0, [r4, 0x8]
- movs r1, 0x3
- bl CopyWindowToVram
- add sp, 0xC
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_81C8D4C
-
- thumb_func_start sub_81C8DBC
-sub_81C8DBC: @ 81C8DBC
- push {r4-r6,lr}
- mov r6, r9
- mov r5, r8
- push {r5,r6}
- sub sp, 0x1C
- adds r6, r0, 0
- mov r8, r1
- add r1, sp, 0xC
- ldr r0, =gUnknown_0861FBE8
- ldm r0!, {r2-r4}
- stm r1!, {r2-r4}
- add r0, sp, 0x18
- mov r9, r0
- ldr r1, =gUnknown_0861FBF4
- movs r2, 0x3
- bl memcpy
- ldrh r4, [r6, 0xA]
- mov r1, r8
- lsls r0, r1, 1
- adds r0, 0x1
- adds r4, r0
- movs r0, 0xF
- ands r4, r0
- ldrb r0, [r6, 0x8]
- lsls r5, r4, 4
- adds r3, r5, 0
- ldrb r1, [r6, 0x4]
- str r1, [sp]
- movs r1, 0x10
- str r1, [sp, 0x4]
- movs r1, 0x11
- movs r2, 0
- bl FillWindowPixelRect
- ldrb r0, [r6, 0x8]
- movs r1, 0x1
- orrs r5, r1
- mov r2, r9
- str r2, [sp]
- subs r1, 0x2
- str r1, [sp, 0x4]
- mov r3, r8
- lsls r3, 2
- mov r8, r3
- mov r1, sp
- add r1, r8
- adds r1, 0xC
- ldr r1, [r1]
- str r1, [sp, 0x8]
- movs r1, 0x7
- movs r2, 0x2
- adds r3, r5, 0
- bl AddTextPrinterParameterized3
- ldrh r0, [r6, 0x8]
- lsls r4, 1
- ldrb r1, [r6, 0x4]
- str r1, [sp]
- movs r1, 0x2
- str r1, [sp, 0x4]
- movs r2, 0
- adds r3, r4, 0
- bl CopyWindowRectToVram
- add sp, 0x1C
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C8DBC
-
- thumb_func_start sub_81C8E54
-sub_81C8E54: @ 81C8E54
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- sub sp, 0xC
- adds r7, r1, 0
- adds r1, r2, 0
- ldrh r3, [r7, 0xA]
- ldr r2, =gUnknown_0861FBF7
- adds r2, r1, r2
- ldrb r2, [r2]
- adds r6, r3, r2
- movs r2, 0xF
- ands r6, r2
- ldrh r0, [r0]
- bl sub_81CAFD8
- adds r5, r0, 0
- cmp r5, 0
- beq _081C8EC0
- ldrh r0, [r7, 0x8]
- lsls r4, r6, 1
- ldrb r3, [r7, 0x4]
- subs r3, 0x1
- movs r1, 0x2
- mov r8, r1
- str r1, [sp]
- movs r1, 0x1
- adds r2, r4, 0
- bl sub_81DB620
- ldrb r0, [r7, 0x8]
- lsls r1, r6, 4
- movs r2, 0x1
- orrs r1, r2
- str r1, [sp]
- movs r1, 0xFF
- str r1, [sp, 0x4]
- movs r1, 0
- str r1, [sp, 0x8]
- movs r1, 0x7
- adds r2, r5, 0
- movs r3, 0x2
- bl AddTextPrinterParameterized
- ldrh r0, [r7, 0x8]
- ldrb r1, [r7, 0x4]
- str r1, [sp]
- mov r1, r8
- str r1, [sp, 0x4]
- movs r1, 0x2
- movs r2, 0
- adds r3, r4, 0
- bl CopyWindowRectToVram
-_081C8EC0:
- add sp, 0xC
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C8E54
-
- thumb_func_start sub_81C8ED0
-sub_81C8ED0: @ 81C8ED0
- push {r4,r5,lr}
- movs r5, 0
- ldr r4, =gUnknown_0861FBFC
-_081C8ED6:
- adds r0, r4, 0
- bl LoadCompressedSpriteSheet
- adds r4, 0x8
- adds r5, 0x1
- cmp r5, 0
- beq _081C8ED6
- ldr r0, =gUnknown_0861FC04
- bl sub_81C795C
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C8ED0
-
- thumb_func_start sub_81C8EF8
-sub_81C8EF8: @ 81C8EF8
- push {r4-r6,lr}
- mov r6, r10
- mov r5, r9
- mov r4, r8
- push {r4-r6}
- adds r4, r0, 0
- adds r5, r1, 0
- ldr r0, =gUnknown_0861FC1C
- ldrb r1, [r5, 0x2]
- lsls r1, 3
- adds r1, 0x3
- ldrb r2, [r5, 0x3]
- adds r2, 0x1
- lsls r2, 3
- movs r3, 0x7
- bl CreateSprite
- lsls r0, 24
- lsrs r3, r0, 24
- lsls r0, r3, 4
- adds r0, r3
- lsls r0, 2
- ldr r1, =gSprites
- mov r8, r1
- add r0, r8
- str r0, [r5, 0x3C]
- ldrb r6, [r5, 0x2]
- lsls r6, 3
- ldrb r0, [r5, 0x4]
- subs r0, 0x1
- lsls r0, 2
- ldr r3, =gUnknown_0861FC3C
- mov r10, r3
- adds r6, r0
- ldrb r2, [r5, 0x3]
- lsls r2, 3
- ldrh r0, [r4, 0x8]
- lsls r0, 4
- adds r2, r0
- lsls r2, 16
- asrs r2, 16
- mov r0, r10
- adds r1, r6, 0
- movs r3, 0x7
- bl CreateSprite
- lsls r0, 24
- lsrs r3, r0, 24
- lsls r2, r3, 4
- adds r2, r3
- lsls r2, 2
- add r2, r8
- str r2, [r5, 0x44]
- ldrh r3, [r2, 0x4]
- lsls r1, r3, 22
- lsrs r1, 22
- adds r1, 0x2
- ldr r0, =0x000003ff
- mov r9, r0
- mov r0, r9
- ands r1, r0
- ldr r4, =0xfffffc00
- adds r0, r4, 0
- ands r0, r3
- orrs r0, r1
- strh r0, [r2, 0x4]
- ldr r1, [r5, 0x44]
- ldr r0, =sub_81C90A0
- str r0, [r1, 0x1C]
- ldrb r2, [r5, 0x3]
- lsls r2, 3
- mov r0, r10
- adds r1, r6, 0
- movs r3, 0x7
- bl CreateSprite
- lsls r0, 24
- lsrs r3, r0, 24
- lsls r1, r3, 4
- adds r1, r3
- lsls r1, 2
- add r1, r8
- str r1, [r5, 0x40]
- ldrh r2, [r1, 0x4]
- lsls r0, r2, 22
- lsrs r0, 22
- adds r0, 0x4
- mov r3, r9
- ands r0, r3
- ands r4, r2
- orrs r4, r0
- strh r4, [r1, 0x4]
- ldr r1, [r5, 0x40]
- ldr r0, =sub_81C90F4
- str r0, [r1, 0x1C]
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r6}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C8EF8
-
- thumb_func_start sub_81C8FE0
-sub_81C8FE0: @ 81C8FE0
- push {r4,lr}
- adds r4, r0, 0
- ldr r0, [r4, 0x3C]
- bl DestroySprite
- ldr r0, [r4, 0x40]
- bl DestroySprite
- ldr r0, [r4, 0x44]
- bl DestroySprite
- movs r0, 0xA
- bl FreeSpriteTilesByTag
- movs r0, 0x14
- bl FreeSpritePaletteByTag
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_81C8FE0
-
- thumb_func_start sub_81C9008
-sub_81C9008: @ 81C9008
- push {r4,r5,lr}
- adds r5, r0, 0
- adds r4, r1, 0
- cmp r4, 0
- beq _081C9028
- ldr r2, [r5, 0x3C]
- ldr r1, =SpriteCallbackDummy
- str r1, [r2, 0x1C]
- ldr r0, [r5, 0x40]
- str r1, [r0, 0x1C]
- ldr r0, [r5, 0x44]
- str r1, [r0, 0x1C]
- b _081C903A
- .pool
-_081C9028:
- ldr r2, [r5, 0x3C]
- ldr r0, =sub_81C9080
- str r0, [r2, 0x1C]
- ldr r1, [r5, 0x40]
- ldr r0, =sub_81C90F4
- str r0, [r1, 0x1C]
- ldr r1, [r5, 0x44]
- ldr r0, =sub_81C90A0
- str r0, [r1, 0x1C]
-_081C903A:
- adds r3, r2, 0
- adds r3, 0x3E
- movs r0, 0x1
- ands r4, r0
- lsls r4, 2
- ldrb r2, [r3]
- movs r1, 0x5
- negs r1, r1
- adds r0, r1, 0
- ands r0, r2
- orrs r0, r4
- strb r0, [r3]
- ldr r2, [r5, 0x40]
- adds r2, 0x3E
- ldrb r3, [r2]
- adds r0, r1, 0
- ands r0, r3
- orrs r0, r4
- strb r0, [r2]
- ldr r0, [r5, 0x44]
- adds r0, 0x3E
- ldrb r2, [r0]
- ands r1, r2
- orrs r1, r4
- strb r1, [r0]
- pop {r4,r5}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C9008
-
- thumb_func_start sub_81C9080
-sub_81C9080: @ 81C9080
- push {r4,lr}
- adds r4, r0, 0
- movs r0, 0x11
- bl GetSubstructPtr
- ldr r1, =0x0000088e
- adds r0, r1
- ldrh r0, [r0]
- lsls r0, 4
- strh r0, [r4, 0x26]
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_81C9080
-
- thumb_func_start sub_81C90A0
-sub_81C90A0: @ 81C90A0
- push {r4,lr}
- adds r4, r0, 0
- movs r1, 0x3C
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _081C90C2
- bl sub_81C84C0
- cmp r0, 0
- beq _081C90C2
- adds r2, r4, 0
- adds r2, 0x3E
- ldrb r1, [r2]
- movs r0, 0x5
- negs r0, r0
- ands r0, r1
- b _081C90CC
-_081C90C2:
- adds r2, r4, 0
- adds r2, 0x3E
- ldrb r0, [r2]
- movs r1, 0x4
- orrs r0, r1
-_081C90CC:
- strb r0, [r2]
- ldrh r0, [r4, 0x2E]
- adds r0, 0x1
- strh r0, [r4, 0x2E]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x3
- ble _081C90EC
- movs r0, 0
- strh r0, [r4, 0x2E]
- ldrh r0, [r4, 0x30]
- adds r0, 0x1
- movs r1, 0x7
- ands r0, r1
- strh r0, [r4, 0x30]
- strh r0, [r4, 0x26]
-_081C90EC:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_81C90A0
-
- thumb_func_start sub_81C90F4
-sub_81C90F4: @ 81C90F4
- push {r4,lr}
- adds r4, r0, 0
- movs r1, 0x3C
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _081C9116
- bl sub_81C84A4
- cmp r0, 0
- beq _081C9116
- adds r2, r4, 0
- adds r2, 0x3E
- ldrb r1, [r2]
- movs r0, 0x5
- negs r0, r0
- ands r0, r1
- b _081C9120
-_081C9116:
- adds r2, r4, 0
- adds r2, 0x3E
- ldrb r0, [r2]
- movs r1, 0x4
- orrs r0, r1
-_081C9120:
- strb r0, [r2]
- ldrh r0, [r4, 0x2E]
- adds r0, 0x1
- strh r0, [r4, 0x2E]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x3
- ble _081C9142
- movs r0, 0
- strh r0, [r4, 0x2E]
- ldrh r0, [r4, 0x30]
- adds r0, 0x1
- movs r1, 0x7
- ands r0, r1
- strh r0, [r4, 0x30]
- negs r0, r0
- strh r0, [r4, 0x26]
-_081C9142:
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_81C90F4
-
- thumb_func_start sub_81C9148
-sub_81C9148: @ 81C9148
- push {r4,lr}
- adds r4, r0, 0
- movs r0, 0x11
- bl GetSubstructPtr
- ldr r1, [r0, 0x40]
- strh r4, [r1, 0x3C]
- ldr r0, [r0, 0x44]
- strh r4, [r0, 0x3C]
- pop {r4}
- pop {r0}
- bx r0
- thumb_func_end sub_81C9148
-
- thumb_func_start sub_81C9160
-sub_81C9160: @ 81C9160
- push {r4,r5,lr}
- adds r2, r0, 0
- ldr r0, [r1]
- str r0, [r2, 0x10]
- ldrh r4, [r1, 0x6]
- movs r5, 0
- strh r4, [r2]
- ldrh r3, [r1, 0x4]
- strh r3, [r2, 0x2]
- ldrb r0, [r1, 0x8]
- str r0, [r2, 0xC]
- ldrb r1, [r1, 0xC]
- strh r1, [r2, 0x8]
- lsls r0, r3, 16
- lsrs r0, 16
- cmp r1, r0
- bcc _081C918A
- strh r5, [r2]
- strh r5, [r2, 0x4]
- strh r4, [r2, 0x6]
- b _081C91A6
-_081C918A:
- subs r0, r3, r1
- strh r0, [r2, 0x4]
- ldrh r1, [r2]
- ldrh r0, [r2, 0x8]
- adds r1, r0
- ldrh r0, [r2, 0x2]
- cmp r1, r0
- ble _081C91A4
- subs r0, r1, r0
- strh r0, [r2, 0x6]
- subs r0, r4, r0
- strh r0, [r2]
- b _081C91A6
-_081C91A4:
- strh r5, [r2, 0x6]
-_081C91A6:
- pop {r4,r5}
- pop {r0}
- bx r0
- thumb_func_end sub_81C9160
-
- thumb_func_start sub_81C91AC
-sub_81C91AC: @ 81C91AC
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- sub sp, 0x8
- adds r7, r0, 0
- ldr r4, [r1]
- lsls r4, 30
- lsrs r0, r4, 30
- movs r1, 0
- mov r9, r1
- strb r0, [r7]
- strh r3, [r7, 0x6]
- ldr r0, [r2, 0x10]
- str r0, [r7, 0x34]
- ldr r0, [r2, 0x14]
- str r0, [r7, 0x38]
- ldrb r6, [r2, 0xD]
- strb r6, [r7, 0x1]
- ldrb r1, [r2, 0x9]
- strb r1, [r7, 0x2]
- ldrb r0, [r2, 0xB]
- strb r0, [r7, 0x3]
- ldrb r5, [r2, 0xA]
- strb r5, [r7, 0x4]
- ldrb r0, [r2, 0xE]
- strb r0, [r7, 0x5]
- lsrs r4, 30
- ldr r2, =0xffffff00
- mov r8, r2
- ldr r0, [sp]
- ands r0, r2
- orrs r0, r4
- lsls r1, 24
- lsrs r1, 16
- ldr r2, =0xffff00ff
- ands r0, r2
- orrs r0, r1
- ldr r1, =0xff00ffff
- ands r0, r1
- lsls r5, 24
- ldr r1, =0x00ffffff
- ands r0, r1
- orrs r0, r5
- str r0, [sp]
- ldr r0, [sp, 0x4]
- mov r1, r8
- ands r0, r1
- movs r1, 0x20
- orrs r0, r1
- lsls r6, 24
- lsrs r6, 16
- ands r0, r2
- orrs r0, r6
- adds r3, 0x2
- lsls r3, 16
- ldr r1, =0x0000ffff
- ands r0, r1
- orrs r0, r3
- str r0, [sp, 0x4]
- mov r0, sp
- bl AddWindow
- strh r0, [r7, 0x8]
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0xFF
- beq _081C9258
- mov r2, r9
- strh r2, [r7, 0xA]
- mov r0, r9
- str r0, [r7, 0x3C]
- str r0, [r7, 0x40]
- str r0, [r7, 0x44]
- movs r0, 0x1
- b _081C925A
- .pool
-_081C9258:
- movs r0, 0
-_081C925A:
- add sp, 0x8
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r1}
- bx r1
- thumb_func_end sub_81C91AC
-
thumb_func_start sub_81C9268
sub_81C9268: @ 81C9268
push {r4,lr}
@@ -2396,7 +253,7 @@ sub_81C941C: @ 81C941C
sub_81C9430: @ 81C9430
push {lr}
movs r0, 0x1
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r0}
bx r0
thumb_func_end sub_81C9430
@@ -3089,7 +946,7 @@ sub_81C9958: @ 81C9958
strb r0, [r4, 0xC]
ldr r0, =sub_81C9A10
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r4, 0x4]
ldr r0, =sub_81C99FC
str r0, [r4]
@@ -3113,7 +970,7 @@ sub_81C9990: @ 81C9990
adds r4, r0
ldr r0, [r4]
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r5, 0x4]
ldr r0, =sub_81C99FC
str r0, [r5]
@@ -3146,7 +1003,7 @@ sub_81C99D4: @ 81C99D4
bl sub_81C9FEC
bl sub_81CA994
movs r0, 0x2
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r4}
pop {r0}
bx r0
@@ -3158,7 +1015,7 @@ sub_81C99FC: @ 81C99FC
movs r0, 0x2
bl GetSubstructPtr
ldr r0, [r0, 0x4]
- bl sub_81C70D8
+ bl IsLoopedTaskActive
pop {r1}
bx r1
thumb_func_end sub_81C99FC
@@ -3358,14 +1215,14 @@ _081C9BEC:
cmp r0, 0x4
bne _081C9C06
movs r0, 0x7
- bl sub_81C7DFC
+ bl LoadLeftHeaderGfxForIndex
_081C9BFE:
movs r0, 0x1
- bl sub_81C7DFC
+ bl LoadLeftHeaderGfxForIndex
b _081C9AD6
_081C9C06:
movs r0, 0
- bl sub_81C7DFC
+ bl LoadLeftHeaderGfxForIndex
b _081C9AD6
_081C9C0E:
bl IsPaletteFadeActive
@@ -3482,7 +1339,7 @@ _081C9CDC:
bne _081C9D34
bl sub_81CA0C8
movs r0, 0x1
- bl sub_81C7DFC
+ bl LoadLeftHeaderGfxForIndex
movs r0, 0
b _081C9D3E
_081C9CFA:
@@ -3553,7 +1410,7 @@ _081C9D72:
bne _081C9DCA
bl sub_81CA0C8
movs r0, 0
- bl sub_81C7DFC
+ bl LoadLeftHeaderGfxForIndex
movs r0, 0
b _081C9DD4
_081C9D90:
@@ -3619,7 +1476,7 @@ _081C9E04:
cmp r0, 0
bne _081C9E48
movs r0, 0x7
- bl sub_81C7DFC
+ bl LoadLeftHeaderGfxForIndex
bl sub_81CA0C8
movs r0, 0
b _081C9E52
@@ -3858,7 +1715,7 @@ _081C9FCA:
cmp r5, 0x1
bls _081C9FCA
ldr r0, =gUnknown_086201D4
- bl sub_81C795C
+ bl Pokenav_AllocAndLoadPalettes
pop {r4,r5}
pop {r0}
bx r0
@@ -5288,7 +3145,7 @@ sub_81CAAE8: @ 81CAAE8
str r0, [r4, 0x10]
ldr r0, =sub_81CAD20
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r4, 0x14]
movs r0, 0x1
b _081CAB1E
@@ -5316,7 +3173,7 @@ sub_81CAB24: @ 81CAB24
sub_81CAB38: @ 81CAB38
push {lr}
movs r0, 0x5
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r0}
bx r0
thumb_func_end sub_81CAB38
@@ -5367,7 +3224,7 @@ _081CAB84:
ldr r0, =sub_81CAC04
str r0, [r4, 0x18]
strh r2, [r4]
- bl sub_81C875C
+ bl GetSelectedMatchCall
lsls r0, 2
adds r1, r4, r0
ldrb r0, [r1, 0x1C]
@@ -6240,7 +4097,7 @@ sub_81CB1D0: @ 81CB1D0
movs r0, 0x5
bl GetSubstructPtr
adds r4, r0, 0
- bl sub_81C875C
+ bl GetSelectedMatchCall
adds r1, r0, 0
lsls r0, r1, 2
adds r4, r0
@@ -6312,7 +4169,7 @@ sub_81CB260: @ 81CB260
strb r0, [r4, 0x19]
ldr r0, =sub_81CB324
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r4, 0x4]
ldr r0, =sub_81CB310
str r0, [r4]
@@ -6339,7 +4196,7 @@ sub_81CB29C: @ 81CB29C
adds r4, r0
ldr r0, [r4]
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r5, 0x4]
ldr r0, =sub_81CB310
str r0, [r5]
@@ -6375,7 +4232,7 @@ sub_81CB2E0: @ 81CB2E0
ldrb r0, [r4, 0x14]
bl RemoveWindow
movs r0, 0x6
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r4}
pop {r0}
bx r0
@@ -6387,7 +4244,7 @@ sub_81CB310: @ 81CB310
movs r0, 0x6
bl GetSubstructPtr
ldr r0, [r0, 0x4]
- bl sub_81C70D8
+ bl IsLoopedTaskActive
pop {r1}
bx r1
thumb_func_end sub_81CB310
@@ -6562,7 +4419,7 @@ _081CB4A6:
bl ShowBg
bl sub_81CC214
movs r0, 0x3
- bl sub_81C7DFC
+ bl LoadLeftHeaderGfxForIndex
movs r0, 0x3
movs r1, 0x1
movs r2, 0
@@ -6614,7 +4471,7 @@ _081CB52A:
beq _081CB572
b _081CB580
_081CB534:
- bl sub_81C868C
+ bl MatchCall_MoveCursorDown
cmp r0, 0x1
beq _081CB54C
cmp r0, 0x1
@@ -6683,7 +4540,7 @@ _081CB5A2:
beq _081CB5EA
b _081CB5F8
_081CB5AC:
- bl sub_81C8658
+ bl MatchCall_MoveCursorUp
cmp r0, 0x1
beq _081CB5C4
cmp r0, 0x1
@@ -6752,7 +4609,7 @@ _081CB61A:
beq _081CB662
b _081CB670
_081CB624:
- bl sub_81C870C
+ bl MatchCall_PageDown
cmp r0, 0x1
beq _081CB63C
cmp r0, 0x1
@@ -6821,7 +4678,7 @@ _081CB692:
beq _081CB6DA
b _081CB6E8
_081CB69C:
- bl sub_81C86CC
+ bl MatchCall_PageUp
cmp r0, 0x1
beq _081CB6B4
cmp r0, 0x1
@@ -6983,7 +4840,7 @@ _081CB7BA:
b _081CB81A
_081CB7C4:
movs r0, 0x1
- bl sub_81C9148
+ bl ToggleMatchCallVerticalArrows
adds r0, r5, 0
bl sub_81CC058
movs r0, 0
@@ -7051,7 +4908,7 @@ _081CB844:
adds r0, r5, 0
bl sub_81CC09C
movs r0, 0x1
- bl sub_81C9148
+ bl ToggleMatchCallVerticalArrows
movs r0, 0x1
strb r0, [r5, 0xE]
movs r0, 0
@@ -7160,7 +5017,7 @@ _081CB922:
bne _081CB8EC
_081CB92C:
movs r0, 0
- bl sub_81C9148
+ bl ToggleMatchCallVerticalArrows
movs r6, 0x4
_081CB934:
adds r0, r6, 0
@@ -7261,7 +5118,7 @@ _081CB9E8:
.4byte _081CBA40
.4byte _081CBA4A
_081CB9FC:
- bl sub_81C8770
+ bl GetMatchCallListTopIndex
bl sub_81CB0E4
adds r5, r0, 0
cmp r5, 0
@@ -7393,7 +5250,7 @@ _081CBAF4:
.4byte _081CBB4C
.4byte _081CBB56
_081CBB08:
- bl sub_81C8770
+ bl GetMatchCallListTopIndex
bl sub_81CB128
adds r5, r0, 0
cmp r5, 0
@@ -7468,7 +5325,7 @@ _081CBB9A:
bl IsPaletteFadeActive
cmp r0, 0
bne _081CBBAA
- bl sub_81C78C0
+ bl MainMenuLoopedTaskIsBusy
cmp r0, 0
beq _081CBBAE
_081CBBAA:
@@ -7887,7 +5744,7 @@ sub_81CBEF8: @ 81CBEF8
sub sp, 0x2C
adds r5, r0, 0
adds r4, r1, 0
- bl sub_81C875C
+ bl GetSelectedMatchCall
adds r0, r4
bl sub_81CAEA4
lsls r0, 16
@@ -8081,7 +5938,7 @@ sub_81CC058: @ 81CC058
ldrb r0, [r4, 0x14]
movs r1, 0x3
bl CopyWindowToVram
- bl sub_81C7CCC
+ bl PauseSpinningNavgearSprite
movs r2, 0
movs r1, 0x18
strh r1, [r0, 0x20]
@@ -8201,7 +6058,7 @@ sub_81CC158: @ 81CC158
push {r4,r5,lr}
sub sp, 0xC
adds r4, r0, 0
- bl sub_81C875C
+ bl GetSelectedMatchCall
adds r1, r4, 0
adds r1, 0xF
bl sub_81CAF78
@@ -8265,7 +6122,7 @@ _081CC1C4:
sub_81CC1DC: @ 81CC1DC
push {lr}
sub sp, 0x8
- bl sub_81C7CE4
+ bl ResumeSpinningNavgearSprite
movs r0, 0x20
str r0, [sp]
movs r0, 0x14
@@ -8309,7 +6166,7 @@ _081CC224:
cmp r5, 0
beq _081CC224
ldr r0, =gUnknown_08622818
- bl sub_81C795C
+ bl Pokenav_AllocAndLoadPalettes
movs r0, 0
str r0, [r6, 0x1C]
ldr r1, =0x00001828
@@ -8487,7 +6344,7 @@ sub_81CC370: @ 81CC370
sub_81CC39C: @ 81CC39C
push {r4-r7,lr}
adds r7, r0, 0
- bl sub_81C875C
+ bl GetSelectedMatchCall
bl sub_81CAF04
cmp r0, 0
blt _081CC400
@@ -8694,9 +6551,9 @@ sub_81CC524: @ 81CC524
orrs r0, r1
strb r0, [r3, 0x15]
movs r0, 0x10
- bl FreeSubstruct
+ bl FreePokenavSubstruct
movs r0, 0x3
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r0}
bx r0
.pool
@@ -8809,7 +6666,7 @@ sub_81CC5F4: @ 81CC5F4
beq _081CC624
ldr r0, =sub_81CC6F4
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r4, 0x4]
ldr r0, =sub_81CC6BC
str r0, [r4]
@@ -8836,7 +6693,7 @@ sub_81CC62C: @ 81CC62C
adds r4, r0
ldr r0, [r4]
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r5, 0x4]
ldr r0, =sub_81CC6BC
str r0, [r5]
@@ -8868,9 +6725,9 @@ sub_81CC670: @ 81CC670
ldrb r0, [r4, 0x8]
bl RemoveWindow
movs r0, 0x10
- bl FreeSubstruct
+ bl FreePokenavSubstruct
movs r0, 0x4
- bl FreeSubstruct
+ bl FreePokenavSubstruct
bl SetPokenavVBlankCallback
movs r0, 0
bl SetBgMode
@@ -8896,7 +6753,7 @@ sub_81CC6BC: @ 81CC6BC
movs r0, 0x4
bl GetSubstructPtr
ldr r0, [r0, 0x4]
- bl sub_81C70D8
+ bl IsLoopedTaskActive
pop {r1}
bx r1
thumb_func_end sub_81CC6BC
@@ -9043,7 +6900,7 @@ _081CC804:
movs r4, 0x4
_081CC812:
adds r0, r4, 0
- bl sub_81C7DFC
+ bl LoadLeftHeaderGfxForIndex
adds r0, r4, 0
movs r1, 0x1
movs r2, 0x1
@@ -9246,7 +7103,7 @@ _081CC982:
movs r0, 0
b _081CC9BA
_081CC996:
- bl sub_81C78C0
+ bl MainMenuLoopedTaskIsBusy
cmp r0, 0
beq _081CC9A2
_081CC99E:
@@ -9281,7 +7138,7 @@ _081CC9C6:
cmp r5, 0
beq _081CC9C6
ldr r0, =gUnknown_08623100
- bl sub_81C795C
+ bl Pokenav_AllocAndLoadPalettes
bl sub_81CCE58
pop {r4,r5}
pop {r0}
@@ -9661,7 +7518,7 @@ sub_81CCD10: @ 81CCD10
push {lr}
ldr r0, =sub_81CCD34
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
pop {r0}
bx r0
.pool
@@ -9671,7 +7528,7 @@ sub_81CCD10: @ 81CCD10
sub_81CCD24: @ 81CCD24
push {lr}
ldr r0, =sub_81CCD34
- bl sub_81C7124
+ bl FuncIsActiveLoopedTask
pop {r1}
bx r1
.pool
@@ -10258,10 +8115,10 @@ sub_81CD1C0: @ 81CD1C0
cmp r0, 0
bne _081CD1DA
movs r0, 0x12
- bl FreeSubstruct
+ bl FreePokenavSubstruct
_081CD1DA:
movs r0, 0xB
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r0}
bx r0
thumb_func_end sub_81CD1C0
@@ -11785,7 +9642,7 @@ sub_81CDDD4: @ 81CDDD4
strb r0, [r1]
ldr r0, =sub_81CDE94
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r4]
ldr r0, =0x00001810
adds r1, r4, r0
@@ -11818,7 +9675,7 @@ sub_81CDE2C: @ 81CDE2C
adds r4, r0
ldr r0, [r4]
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r5]
ldr r0, =0x00001810
adds r5, r0
@@ -11850,7 +9707,7 @@ sub_81CDE80: @ 81CDE80
movs r0, 0xC
bl GetSubstructPtr
ldr r0, [r0]
- bl sub_81C70D8
+ bl IsLoopedTaskActive
pop {r1}
bx r1
thumb_func_end sub_81CDE80
@@ -12195,7 +10052,7 @@ _081CE1EC:
b _081CDFB0
_081CE1FC:
movs r0, 0x6
- bl sub_81C7DFC
+ bl LoadLeftHeaderGfxForIndex
movs r0, 0x1
movs r1, 0x1
movs r2, 0
@@ -12338,7 +10195,7 @@ _081CE33E:
bl IsPaletteFadeActive
cmp r0, 0
bne _081CE34E
- bl sub_81C78C0
+ bl MainMenuLoopedTaskIsBusy
cmp r0, 0
beq _081CE352
_081CE34E:
@@ -13215,7 +11072,7 @@ _081CEA78:
mov r0, sp
bl LoadSpriteSheets
mov r0, r10
- bl sub_81C795C
+ bl Pokenav_AllocAndLoadPalettes
movs r4, 0
add r0, sp, 0x50
mov r8, r0
@@ -13376,7 +11233,7 @@ _081CEBC6:
mov r3, r10
str r0, [r3, 0x8]
mov r0, r10
- bl sub_81C795C
+ bl Pokenav_AllocAndLoadPalettes
add sp, 0x58
pop {r3-r5}
mov r8, r3
@@ -13500,7 +11357,7 @@ _081CECF0:
bl sub_81CEBF4
bl sub_81CEE68
movs r0, 0xC
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r4}
pop {r0}
bx r0
@@ -13782,7 +11639,7 @@ sub_81CEF3C: @ 81CEF3C
str r0, [r4]
ldr r0, =sub_81CF11C
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r4, 0x4]
movs r0, 0
str r0, [r4, 0x18]
@@ -13856,10 +11713,10 @@ sub_81CEFF0: @ 81CEFF0
cmp r0, 0
bne _081CF004
movs r0, 0x12
- bl FreeSubstruct
+ bl FreePokenavSubstruct
_081CF004:
movs r0, 0x7
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r0}
bx r0
thumb_func_end sub_81CEFF0
@@ -13869,7 +11726,7 @@ sub_81CF010: @ 81CF010
push {r4,lr}
adds r4, r0, 0
ldr r0, [r4, 0x4]
- bl sub_81C70D8
+ bl IsLoopedTaskActive
cmp r0, 0
bne _081CF022
ldr r0, =sub_81CF030
@@ -13939,7 +11796,7 @@ _081CF088:
movs r0, 0
b _081CF0A6
_081CF096:
- bl sub_81C875C
+ bl GetSelectedMatchCall
ldr r1, [r4, 0x20]
strh r0, [r1, 0x2]
str r5, [r4, 0x1C]
@@ -14005,7 +11862,7 @@ sub_81CF0F0: @ 81CF0F0
movs r0, 0x7
bl GetSubstructPtr
adds r4, r0, 0
- bl sub_81C875C
+ bl GetSelectedMatchCall
ldr r1, [r4, 0x20]
lsls r0, 2
adds r1, r0
@@ -14320,7 +12177,7 @@ sub_81CF330: @ 81CF330
beq _081CF360
ldr r0, =sub_81CF418
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r4, 0x4]
ldr r0, =sub_81CF3E4
str r0, [r4]
@@ -14349,7 +12206,7 @@ sub_81CF368: @ 81CF368
beq _081CF398
ldr r0, =sub_81CF418
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r4, 0x4]
ldr r0, =sub_81CF3E4
str r0, [r4]
@@ -14377,7 +12234,7 @@ sub_81CF3A0: @ 81CF3A0
adds r4, r0
ldr r0, [r4]
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r5, 0x4]
ldr r0, =sub_81CF3E4
str r0, [r5]
@@ -14404,7 +12261,7 @@ sub_81CF3E4: @ 81CF3E4
movs r0, 0x8
bl GetSubstructPtr
ldr r0, [r0, 0x4]
- bl sub_81C70D8
+ bl IsLoopedTaskActive
pop {r1}
bx r1
thumb_func_end sub_81CF3E4
@@ -14419,7 +12276,7 @@ sub_81CF3F8: @ 81CF3F8
ldrb r0, [r4, 0x8]
bl RemoveWindow
movs r0, 0x8
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r4}
pop {r0}
bx r0
@@ -14541,7 +12398,7 @@ _081CF4F6:
lsls r4, 24
lsrs r4, 24
adds r0, r4, 0
- bl sub_81C7DFC
+ bl LoadLeftHeaderGfxForIndex
adds r0, r4, 0
movs r1, 0x1
movs r2, 0
@@ -14594,7 +12451,7 @@ _081CF592:
beq _081CF5D8
b _081CF5E6
_081CF59C:
- bl sub_81C8658
+ bl MatchCall_MoveCursorUp
cmp r0, 0x1
beq _081CF5B4
cmp r0, 0x1
@@ -14662,7 +12519,7 @@ _081CF60A:
beq _081CF650
b _081CF65E
_081CF614:
- bl sub_81C868C
+ bl MatchCall_MoveCursorDown
cmp r0, 0x1
beq _081CF62C
cmp r0, 0x1
@@ -14730,7 +12587,7 @@ _081CF682:
beq _081CF6C8
b _081CF6D6
_081CF68C:
- bl sub_81C86CC
+ bl MatchCall_PageUp
cmp r0, 0x1
beq _081CF6A4
cmp r0, 0x1
@@ -14798,7 +12655,7 @@ _081CF6FA:
beq _081CF740
b _081CF74E
_081CF704:
- bl sub_81C870C
+ bl MatchCall_PageDown
cmp r0, 0x1
beq _081CF71C
cmp r0, 0x1
@@ -14865,7 +12722,7 @@ _081CF778:
bl IsPaletteFadeActive
cmp r0, 0
bne _081CF788
- bl sub_81C78C0
+ bl MainMenuLoopedTaskIsBusy
cmp r0, 0
beq _081CF78C
_081CF788:
@@ -15151,7 +13008,7 @@ sub_81CF9BC: @ 81CF9BC
str r0, [r4]
ldr r0, =sub_81CFB74
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r4, 0x4]
movs r0, 0
str r0, [r4, 0x14]
@@ -15212,10 +13069,10 @@ sub_81CFA48: @ 81CFA48
cmp r0, 0
bne _081CFA5C
movs r0, 0x12
- bl FreeSubstruct
+ bl FreePokenavSubstruct
_081CFA5C:
movs r0, 0x9
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r0}
bx r0
thumb_func_end sub_81CFA48
@@ -15225,7 +13082,7 @@ sub_81CFA68: @ 81CFA68
push {r4,lr}
adds r4, r0, 0
ldr r0, [r4, 0x4]
- bl sub_81C70D8
+ bl IsLoopedTaskActive
cmp r0, 0
bne _081CFA7A
ldr r0, =sub_81CFA88
@@ -15295,7 +13152,7 @@ _081CFAE0:
movs r0, 0
b _081CFAFE
_081CFAEE:
- bl sub_81C875C
+ bl GetSelectedMatchCall
ldr r1, [r4, 0x1C]
strh r0, [r1, 0x2]
str r5, [r4, 0x18]
@@ -15361,7 +13218,7 @@ sub_81CFB48: @ 81CFB48
movs r0, 0x9
bl GetSubstructPtr
adds r4, r0, 0
- bl sub_81C875C
+ bl GetSelectedMatchCall
ldr r1, [r4, 0x1C]
lsls r0, 2
adds r1, r0
@@ -15706,7 +13563,7 @@ sub_81CFDD0: @ 81CFDD0
beq _081CFE00
ldr r0, =sub_81CFEB8
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r4, 0x4]
ldr r0, =sub_81CFE84
str r0, [r4]
@@ -15735,7 +13592,7 @@ sub_81CFE08: @ 81CFE08
beq _081CFE38
ldr r0, =sub_81CFEB8
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r4, 0x4]
ldr r0, =sub_81CFE84
str r0, [r4]
@@ -15763,7 +13620,7 @@ sub_81CFE40: @ 81CFE40
adds r4, r0
ldr r0, [r4]
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r5, 0x4]
ldr r0, =sub_81CFE84
str r0, [r5]
@@ -15790,7 +13647,7 @@ sub_81CFE84: @ 81CFE84
movs r0, 0xA
bl GetSubstructPtr
ldr r0, [r0, 0x4]
- bl sub_81C70D8
+ bl IsLoopedTaskActive
pop {r1}
bx r1
thumb_func_end sub_81CFE84
@@ -15805,7 +13662,7 @@ sub_81CFE98: @ 81CFE98
ldrb r0, [r4, 0x8]
bl RemoveWindow
movs r0, 0xA
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r4}
pop {r0}
bx r0
@@ -15922,7 +13779,7 @@ _081CFFA4:
cmp r0, 0
bne _081CFF32
movs r0, 0x2
- bl sub_81C7DFC
+ bl LoadLeftHeaderGfxForIndex
movs r0, 0x2
movs r1, 0x1
movs r2, 0
@@ -15968,7 +13825,7 @@ _081D0016:
beq _081D005C
b _081D006A
_081D0020:
- bl sub_81C8658
+ bl MatchCall_MoveCursorUp
cmp r0, 0x1
beq _081D0038
cmp r0, 0x1
@@ -16036,7 +13893,7 @@ _081D008E:
beq _081D00D4
b _081D00E2
_081D0098:
- bl sub_81C868C
+ bl MatchCall_MoveCursorDown
cmp r0, 0x1
beq _081D00B0
cmp r0, 0x1
@@ -16104,7 +13961,7 @@ _081D0106:
beq _081D014C
b _081D015A
_081D0110:
- bl sub_81C86CC
+ bl MatchCall_PageUp
cmp r0, 0x1
beq _081D0128
cmp r0, 0x1
@@ -16172,7 +14029,7 @@ _081D017E:
beq _081D01C4
b _081D01D2
_081D0188:
- bl sub_81C870C
+ bl MatchCall_PageDown
cmp r0, 0x1
beq _081D01A0
cmp r0, 0x1
@@ -16239,7 +14096,7 @@ _081D01FC:
bl IsPaletteFadeActive
cmp r0, 0
bne _081D020C
- bl sub_81C78C0
+ bl MainMenuLoopedTaskIsBusy
cmp r0, 0
beq _081D0210
_081D020C:
@@ -16312,7 +14169,7 @@ sub_81D024C: @ 81D024C
sub_81D0288: @ 81D0288
push {r4,r5,lr}
adds r5, r0, 0
- bl sub_81C875C
+ bl GetSelectedMatchCall
adds r4, r0, 0
bl sub_81CFB38
adds r2, r0, 0
@@ -16571,7 +14428,7 @@ sub_81D04A0: @ 81D04A0
sub_81D04B8: @ 81D04B8
push {lr}
movs r0, 0xD
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r0}
bx r0
thumb_func_end sub_81D04B8
@@ -17246,7 +15103,7 @@ sub_81D0978: @ 81D0978
beq _081D09A8
ldr r0, =sub_81D0A6C
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r4, 0x4]
ldr r0, =sub_81D0A58
str r0, [r4]
@@ -17273,7 +15130,7 @@ sub_81D09B0: @ 81D09B0
adds r4, r0
ldr r0, [r4]
movs r1, 0x1
- bl sub_81C7078
+ bl CreateLoopedTask
str r0, [r5, 0x4]
ldr r0, =sub_81D0A58
str r0, [r5]
@@ -17327,7 +15184,7 @@ sub_81D09F4: @ 81D09F4
ldr r0, [r4, 0x14]
bl DestroySprite
movs r0, 0xE
- bl FreeSubstruct
+ bl FreePokenavSubstruct
pop {r4}
pop {r0}
bx r0
@@ -17339,7 +15196,7 @@ sub_81D0A58: @ 81D0A58
movs r0, 0xE
bl GetSubstructPtr
ldr r0, [r0, 0x4]
- bl sub_81C70D8
+ bl IsLoopedTaskActive
pop {r1}
bx r1
thumb_func_end sub_81D0A58
@@ -18524,7 +16381,7 @@ sub_81D13FC: @ 81D13FC
ldr r0, =gUnknown_08624C78
bl LoadCompressedSpriteSheet
ldr r0, =gUnknown_08624C80
- bl sub_81C795C
+ bl Pokenav_AllocAndLoadPalettes
ldr r0, =gUnknown_08624D04
movs r1, 0
movs r2, 0
diff --git a/data/pokenav.s b/data/pokenav.s
index cb5030b4b..0e2c78166 100644
--- a/data/pokenav.s
+++ b/data/pokenav.s
@@ -3,118 +3,6 @@
.section .rodata
-gUnknown_0861FA6C:: @ 861FA6C
- obj_tiles gPokenavLeftHeaderMainMenu_Gfx, 0x20, 3
- obj_tiles gPokenavLeftHeaderCondition_Gfx, 0x20, 1
- obj_tiles gPokenavLeftHeaderRibbons_Gfx, 0x20, 2
- obj_tiles gPokenavLeftHeaderMatchCall_Gfx, 0x20, 4
- obj_tiles gPokenavLeftHeaderHoennMap_Gfx, 0x20, 0
- obj_tiles gPokenavLeftHeaderHoennMap_Gfx, 0x40, 0
-
-gUnknown_0861FA9C:: @ 861FA9C
- .4byte gPokenavLeftHeaderParty_Gfx, 1
- .4byte gPokenavLeftHeaderSearch_Gfx, 1
- .4byte gPokenavLeftHeaderCool_Gfx, 4
- .4byte gPokenavLeftHeaderBeauty_Gfx, 1
- .4byte gPokenavLeftHeaderCute_Gfx, 2
- .4byte gPokenavLeftHeaderSmart_Gfx, 0
- .4byte gPokenavLeftHeaderTough_Gfx, 0
-
-gUnknown_0861FAD4:: @ 861FAD4
- .2byte 0x0
- .2byte 0x8000
- .2byte 0x0
- .2byte 0x0
-
-gUnknown_0861FADC::
- obj_image_anim_frame 0, 8
- obj_image_anim_frame 16, 8
- obj_image_anim_frame 32, 8
- obj_image_anim_frame 48, 8
- obj_image_anim_frame 64, 8
- obj_image_anim_frame 80, 8
- obj_image_anim_frame 96, 8
- obj_image_anim_frame 112, 8
- obj_image_anim_jump 0
-
-gUnknown_0861FB00::
- .4byte gUnknown_0861FADC
-
-gUnknown_0861FB04:: @ 861FB04
- spr_template 0, 0, gUnknown_0861FAD4, gUnknown_0861FB00, NULL, gDummySpriteAffineAnimTable, sub_81C7CB4
-
-gUnknown_0861FB1C::
- .2byte 0x4000
- .2byte 0xC000
- .2byte 0x400
- .2byte 0x0
-
-gUnknown_0861FB24::
- .2byte 0x4000
- .2byte 0x8000
- .2byte 0x400
- .2byte 0x0
-
-gUnknown_0861FB2C:: @ 861FB2C
- spr_template 2, 1, gUnknown_0861FB1C, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
-
-gUnknown_0861FB44:: @ 861FB44
- spr_template 2, 2, gUnknown_0861FB24, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
-
-gUnknown_0861FB5C:: @ 861FB5C
- .incbin "graphics/pokenav/arrows_matchcall.gbapal"
-
-gUnknown_0861FB7C:: @ 861FB7C
- .incbin "graphics/pokenav/arrows_matchcall.4bpp.lz"
-
-gUnknown_0861FBE4:: @ 861FBE4
- .byte 0x0
- .byte 0x2
- .byte 0x5
- .byte 0x0
-
-gUnknown_0861FBE8:: @ 861FBE8
- .4byte gUnknown_085EBEA8
- .4byte gUnknown_085EBEB1
- .4byte gUnknown_085EBEC3
-
-gUnknown_0861FBF4:: @ 861FBF4
- .byte 0x1
- .byte 0x4
- .byte 0x5
-
-gUnknown_0861FBF7:: @ 861FBF7
- .byte 0x2
- .byte 0x4
- .byte 0x6
- .byte 0x7
- .byte 0x0
-
-gUnknown_0861FBFC:: @ 861FBFC
- .4byte gUnknown_0861FB7C
- .2byte 0xC0
- .2byte 0xA
-
-gUnknown_0861FC04:: @ 861FC04
- .4byte gUnknown_0861FB5C
- .4byte 0x14
- .4byte 0x0
- .4byte 0x0
-
-gUnknown_0861FC14:: @ 861FC14
- .4byte 0x8000
- .4byte 0x800
-
-gUnknown_0861FC1C:: @ 861FC1C
- spr_template 10, 20, gUnknown_0861FC14, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, sub_81C9080
-
-gUnknown_0861FC34:: @ 861FC34
- .4byte 0x4000
- .4byte 0x800
-
-gUnknown_0861FC3C:: @ 861FC3C
- spr_template 10, 20, gUnknown_0861FC34, gDummySpriteAnimTable, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy
-
gUnknown_0861FC54:: @ 861FC54
.byte 2
.byte 3
@@ -1371,7 +1259,7 @@ gUnknown_0862278C:: @ 862278C
.4byte 0x20206A
gUnknown_08622794:: @ 8622794
- .4byte 0x3077
+ .4byte 0x00003077
gUnknown_08622798:: @ 8622798
.4byte NULL
diff --git a/include/graphics.h b/include/graphics.h
index 5a73e7b92..1171d3c1c 100644
--- a/include/graphics.h
+++ b/include/graphics.h
@@ -4019,6 +4019,13 @@ extern const u32 gPokenavLeftHeaderMainMenu_Gfx[];
extern const u32 gPokenavLeftHeaderCondition_Gfx[];
extern const u32 gPokenavLeftHeaderRibbons_Gfx[];
extern const u32 gPokenavLeftHeaderMatchCall_Gfx[];
+extern const u32 gPokenavLeftHeaderParty_Gfx[];
+extern const u32 gPokenavLeftHeaderSearch_Gfx[];
+extern const u32 gPokenavLeftHeaderCool_Gfx[];
+extern const u32 gPokenavLeftHeaderBeauty_Gfx[];
+extern const u32 gPokenavLeftHeaderCute_Gfx[];
+extern const u32 gPokenavLeftHeaderSmart_Gfx[];
+extern const u32 gPokenavLeftHeaderTough_Gfx[];
extern const u32 gPageInfoTilemap[];
extern const u32 gUnknown_08D98CC8[];
diff --git a/include/menu.h b/include/menu.h
index 4d55fc955..08cad40bd 100644
--- a/include/menu.h
+++ b/include/menu.h
@@ -99,6 +99,7 @@ void sub_8199CBC(u8 bgId, u16 *dest, u8 left, u8 top, u8 width, u8 height);
u8 sub_81980F0(u8 bg, u8 xPos, u8 yPos, u8 palette, u16 baseTile);
void sub_8198314(void);
void sub_8198180(const u8 *string, u8 a2, bool8 copyToVram);
+void ResetBgPositions(void);
void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonPress, u8 speed);
void sub_8198C78(void);
void PrintTextArray(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs);
diff --git a/include/strings.h b/include/strings.h
index 74e364232..c62835ca1 100644
--- a/include/strings.h
+++ b/include/strings.h
@@ -1008,6 +1008,9 @@ extern const u8 gText_SomeonesPC[];
extern const u8 gText_PlayersPC[];
extern const u8 gText_WhichPCShouldBeAccessed[];
+extern const u8 gText_NavgearMatchCall_Strategy[];
+extern const u8 gText_NavgearMatchCall_TrainerPokemon[];
+extern const u8 gText_NavgearMatchCall_SelfIntroduction[];
extern const u8 gText_Navgear_ClearButtonList[];
extern const u8 gText_NavgearMap_ZoomedOutButtons[];
extern const u8 gText_NavgearMap_ZoomedInButtons[];
diff --git a/src/menu.c b/src/menu.c
index b766b1b86..354346d27 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -1919,7 +1919,7 @@ void sub_8199D3C(void *ptr, int delta, int width, int height, bool32 is8BPP)
}
}
-void sub_8199D98(void)
+void ResetBgPositions(void)
{
ChangeBgX(0, 0, 0);
ChangeBgX(1, 0, 0);
diff --git a/src/pokenav.c b/src/pokenav.c
index 42114a4b2..6299d2647 100644
--- a/src/pokenav.c
+++ b/src/pokenav.c
@@ -26,39 +26,172 @@ enum
MODE_FORCE_CALL_2, // Set after making a call, has to exit Pokenav.
};
+enum
+{
+ NAVMENU_CB_UNK_0,
+ NAVMENU_CB_UNK_1,
+ NAVMENU_CB_UNK_2,
+ NAVMENU_CB_UNK_3,
+ NAVMENU_CB_UNK_4,
+ NAVMENU_CB_UNK_5,
+ NAVMENU_CB_UNK_6
+};
+
+enum
+{
+ NAVGEAR_GFX_MAIN_MENU,
+ NAVGEAR_GFX_CONDITION_MENU,
+ NAVGEAR_GFX_RIBBONS_MENU,
+ NAVGEAR_GFX_MATCH_CALL_MENU,
+
+ // One of these is for the zoomed-in map, and the other is for the
+ // zoomed-out map. Don't know which is which yet.
+ NAVGEAR_GFX_MAP_MENU_UNK0,
+ NAVGEAR_GFX_MAP_MENU_UNK1,
+
+ NAVGEAR_GFX_PARTY_MENU,
+ NAVGEAR_GFX_SEARCH_MENU,
+ NAVGEAR_GFX_COOL_MENU,
+ NAVGEAR_GFX_BEAUTY_MENU,
+ NAVGEAR_GFX_CUTE_MENU,
+ NAVGEAR_GFX_SMART_MENU,
+ NAVGEAR_GFX_TOUGH_MENU,
+
+ NAVGEAR_GFX_MENUS_END
+};
+
+#define NAVGEAR_GFX_SUBMENUS_START NAVGEAR_GFX_PARTY_MENU
+
+// Return values of LoopedTask functions.
+#define LT_INC_AND_PAUSE 0
+#define LT_INC_AND_CONTINUE 1
+#define LT_PAUSE 2
+#define LT_CONTINUE 3
+#define LT_FINISH 4
+#define LT_SET_STATE(newState) (newState + 5)
+
+#define LOOPED_TASK_DECODE_STATE(action) (action - 5)
+
+#define LOOPED_TASK_ID(primary, secondary) (((secondary) << 16) |(primary))
+#define LOOPED_TASK_PRIMARY_ID(taskId) (taskId & 0xFFFF)
+#define LOOPED_TASK_SECONDARY_ID(taskId) (taskId >> 16)
+
#define UNKNOWN_OFFSET 100000
-struct UnknownSubStruct_0203CF40
+typedef u32 (*LoopedTask)(s32 state);
+
+struct UnknownSubSubStruct_0203CF40 {
+ u8 bg;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u8 unk4;
+ u8 fontId;
+ u16 unk6;
+ u16 windowId;
+ u16 unkA;
+ u16 unkC;
+ u16 unkE;
+};
+
+struct MatchCallWindowState {
+ // The index of the element at the top of the window.
+ u16 windowTopIndex;
+ u16 listLength;
+ u16 unk4;
+ // The index of the cursor, relative to the top of the window.
+ u16 selectedIndexOffset;
+ u16 visibleEntries;
+ u16 unkA;
+ u32 unkC;
+ u32 unk10;
+};
+
+// Generally at index 0.
+struct PokenavMainMenuResources
{
void (*unk0)(u32);
u32 (*unk4)(void);
u32 unk8;
- u32 unkC;
+ u32 currentTaskId;
u32 unk10;
u32 unk14;
- struct Sprite *unk18;
- struct Sprite *unk1C[2];
- struct Sprite *unk24[2];
- u8 tilemapBuffer[0x1000];
+ struct Sprite *spinningNavgear;
+ struct Sprite *leftHeaderSprites[2];
+ struct Sprite *submenuLeftHeaderSprites[2];
+ u8 tilemapBuffer[0x800];
+};
+
+struct UnknownInnerStruct_81C81D4
+{
+ struct UnknownSubSubStruct_0203CF40 unk0;
+ u32 unk10;
+ u32 unk14;
+ u32 unk18;
+ u32 unk1C;
+ s32 unk20;
+ s32 unk24;
+ u32 unk28;
+ s32 unk2C;
+ u32 unk30;
+ void (*unk34)(u32, u8*);
+ void (*unk38)(u16, u32, u32);
+ struct Sprite *rightArrow;
+ struct Sprite *upArrow;
+ struct Sprite *downArrow;
+ u8 unkTextBuffer[0x40];
+};
+
+// Generally at index 0x11 (17)
+struct UnknownSubStruct_81C81D4
+{
+ struct UnknownInnerStruct_81C81D4 unk0;
+ u8 tilemapBuffer[0x800];
+ struct MatchCallWindowState unk888;
+ u32 unk89C;
+ u32 unk8A0;
};
#define SUBSTRUCT_COUNT 19
-struct UnknownStruct_0203CF40
+struct PokenavResources
{
- u32 (*field0)(void);
- u32 field4;
+ u32 (*currentMenuCb1)(void);
+ u32 currentMenuIndex;
u16 mode;
u16 fieldA;
bool32 hasAnyRibbons;
- struct UnknownSubStruct_0203CF40 *field10[SUBSTRUCT_COUNT];
+ void *field10[SUBSTRUCT_COUNT];
+};
+
+// This struct uses a 32bit tag, and doesn't have a size field.
+// Needed to match LoadLeftHeaderGfxForSubMenu.
+struct CompressedSpriteSheetNoSize
+{
+ const u32 *data; // LZ77 compressed palette data
+ u32 tag;
+};
+
+struct MatchCallListTemplate
+{
+ u32 unk0;
+ u16 unk4;
+ u16 unk6;
+ u8 unk8;
+ u8 unk9;
+ u8 unkA;
+ u8 unkB;
+ u8 unkC;
+ u8 unkD;
+ u8 unkE;
+ void (*unk10)(u32, u8 *a1);
+ void (*unk14)(u16 a0, u32 a1, u32 a2);
};
extern u32 sub_81C9430(void);
extern void sub_81CAADC(void);
extern u32 sub_81C99D4(void);
-extern void sub_8199D98(void);
-extern void sub_81C7D28(void);
+extern void InitHoenMapHeaderSprites(void);
extern u32 sub_81C9298(void);
extern u32 sub_81C941C(void);
extern u32 sub_81C9924(void);
@@ -116,47 +249,77 @@ extern u32 sub_81D04B8(void);
extern u32 sub_81D09F4(void);
extern u32 sub_81CFA04(void);
extern u32 sub_81CFE08(void);
-
-u32 sub_81C791C(s32 a0);
-bool32 sub_81C756C(u32 a0);
-bool32 sub_81C76C4(void);
+extern void SpriteCB_SpinningNavgear(struct Sprite* sprite);
+extern void sub_81CBD48(u16 windowId, u32 a1);
+extern u8 *sub_81CAFD8(u16 a0, u32 a1);
+extern void sub_81DB620(u32 windowId, u32 a1, u32 a2, u32 a3, u32 a4);
+
+u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct MatchCallListTemplate *a2, s32 a3);
+void sub_81C9160(struct MatchCallWindowState *a0, struct MatchCallListTemplate *a1);
+void SpriteCB_MatchCallUpArrow(struct Sprite *sprite);
+void SpriteCB_MatchCallDownArrow(struct Sprite *sprite);
+void SpriteCB_MatchCallRightArrow(struct Sprite *sprite);
+void ToggleMatchCallArrows(struct UnknownInnerStruct_81C81D4 *a0, u32 a1);
+void sub_81C8FE0(struct UnknownInnerStruct_81C81D4 *a0);
+void sub_81C8EF8(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1);
+void sub_81C8ED0(void);
+void sub_81C8E54(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2);
+void PrintMatchCallFieldNames(struct UnknownInnerStruct_81C81D4 *a0, u32 a1);
+void sub_81C8D4C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1);
+void sub_81C8CB4(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1);
+void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2);
+u32 LoopedTask_sub_81C8A28(s32 a0);
+u32 LoopedTask_sub_81C8958(s32 a0);
+u32 LoopedTask_sub_81C8870(s32 a0);
+u32 LoopedTask_sub_81C85A0(s32 a0);
+void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1);
+u32 LoopedTask_sub_81C83F0(s32 a0);
+bool32 sub_81C83E0(void);
+void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStruct_81C81D4 *a5);
+void sub_81C837C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1);
+void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0);
+void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0);
+u32 LoopedTask_sub_81C8254(s32 a0);
+u32 LoopedTask_ScrollMenuHeaderUp(s32 a0);
+bool32 SetActivePokenavMenu(u32 a0);
+bool32 InitPokenavMainMenu(void);
static bool32 AnyMonHasRibbon(void);
u32 sub_81C75E0(void);
u32 sub_81C75D4(void);
-u32 sub_81C76FC(void);
+u32 PokenavMainMenuLoopedTaskIsActive(void);
u32 sub_81C786C(void);
-u32 sub_81C7764(s32 a0);
-u32 sub_81C78D4(s32 a0);
-bool32 sub_81C7738(void);
+u32 LoopedTask_InitPokenavMenu(s32 a0);
+u32 LoopedTask_ScrollMenuHeaderDown(s32 a0);
+bool32 WaitForPokenavShutdownFade(void);
void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 a1, u32 a2);
void sub_81C7834(void *func1, void *func2);
-static void InitMainStruct(struct UnknownStruct_0203CF40 *a0);
-void FreeSubstruct(u32 index);
+static void InitPokenavResources(struct PokenavResources *a0);
+void FreePokenavSubstruct(u32 index);
void sub_81C7850(u32 a0);
void sub_81C7BF8(u32 a0);
-void sub_81C71E4(u8 a0);
-void sub_81C7170(u8 taskId);
+void Task_RunLoopedTask_LinkMode(u8 a0);
+void Task_RunLoopedTask(u8 taskId);
void sub_81C742C(u8 taskId);
-void sub_81C7710(void);
+void ShutdownPokenav(void);
static void InitKeys_(void);
-static void FreeVars(void);
-static void VblankCb_Pokenav(void);
+static void FreePokenavResources(void);
+static void VBlankCB_Pokenav(void);
static void CB2_Pokenav(void);
-void sub_81C7C28(void);
+void InitPokenavMainMenuResources(void);
void sub_81C72BC(void);
void sub_81C7B74(void);
-void sub_81C7C94(void);
-void sub_81C7F24(u32 arg0);
-void sub_81C7E58(u32 arg0);
-void sub_81C8110(bool32 arg0);
-void sub_81C80D4(bool32 arg0);
-void sub_81C803C(u32 arg0, bool32 arg1);
-void sub_81C8088(u32 arg0, bool32 arg1);
-void sub_81C814C(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3);
-void sub_81C817C(struct Sprite *sprite);
+void CleanupPokenavMainMenuResources(void);
+void LoadLeftHeaderGfxForSubMenu(u32 arg0);
+void LoadLeftHeaderGfxForMenu(u32 arg0);
+void HideLeftHeaderSubmenuSprites(bool32 arg0);
+void HideLeftHeaderSprites(bool32 arg0);
+void ShowLeftHeaderSprites(u32 arg0, bool32 arg1);
+void ShowLeftHeaderSubmenuSprites(u32 arg0, bool32 arg1);
+void MoveLeftHeader(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3);
+void SpriteCB_MoveLeftHeader(struct Sprite *sprite);
// Const rom data.
-u32 (*const gUnknown_0861F3EC[15][7])(void) =
+u32 (*const PokenavMenuCallbacks[15][7])(void) =
{
{
sub_81C9298,
@@ -295,11 +458,11 @@ u32 (*const gUnknown_0861F3EC[15][7])(void) =
},
};
-const u16 gUnknown_0861F590[] = INCBIN_U16("graphics/pokenav/icon2.gbapal");
-const u32 gUnknown_0861F5B0[] = INCBIN_U32("graphics/pokenav/icon2.4bpp.lz");
-const u32 gUnknown_0861F994[] = INCBIN_U32("graphics/pokenav/icon2_unused.4bpp.lz");
+const u16 gSpinningNavgearPaletteData[] = INCBIN_U16("graphics/pokenav/icon2.gbapal");
+const u32 gSpinningNavgearGfx[] = INCBIN_U32("graphics/pokenav/icon2.4bpp.lz");
+const u32 gUnused_SpinningNavgearGfx2[] = INCBIN_U32("graphics/pokenav/icon2_unused.4bpp.lz");
-const struct BgTemplate gUnknown_0861FA04[] =
+const struct BgTemplate gPokenavMainMenuBgTemplates[] =
{
{
.bg = 0,
@@ -355,151 +518,417 @@ const u8 gMenuButtonReminderColor[4] =
4, 1, 2, 0
};
-const struct CompressedSpriteSheet gUnknown_0861FA4C[] =
+static const struct CompressedSpriteSheet gSpinningNavgearSpriteSheet[] =
{
{
- .data = gUnknown_0861F5B0,
+ .data = gSpinningNavgearGfx,
.size = 0x1000,
.tag = 0,
}
};
-const struct SpritePalette gUnknown_0861FA54[2] =
+static const struct SpritePalette gSpinningNavgearPalette[] =
{
{
- .data = gUnknown_0861F590,
+ .data = gSpinningNavgearPaletteData,
.tag = 0,
},
+ {}
};
-const struct CompressedSpriteSheet gUnknown_0861FA64 =
+static const struct CompressedSpriteSheet sPokenavHoenMapLeftHeaderSpriteSheet =
{
.data = gPokenavLeftHeaderHoennMap_Gfx,
.size = 0xC00,
.tag = 2
};
-extern struct UnknownStruct_0203CF40 *gUnknown_0203CF40;
-extern u8 gUnknown_0203CF3C;
-extern const struct SpriteTemplate gUnknown_0861FB04;
+static const struct CompressedSpriteSheet sPokenavMenuLeftHeaderSpriteSheets[] =
+{
+ [NAVGEAR_GFX_MAIN_MENU] = {
+ .data = gPokenavLeftHeaderMainMenu_Gfx,
+ .size = 0x20,
+ .tag = 3
+ },
+ [NAVGEAR_GFX_CONDITION_MENU] = {
+ .data = gPokenavLeftHeaderCondition_Gfx,
+ .size = 0x20,
+ .tag = 1
+ },
+ [NAVGEAR_GFX_RIBBONS_MENU] = {
+ .data = gPokenavLeftHeaderRibbons_Gfx,
+ .size = 0x20,
+ .tag = 2
+ },
+ [NAVGEAR_GFX_MATCH_CALL_MENU] = {
+ .data = gPokenavLeftHeaderMatchCall_Gfx,
+ .size = 0x20,
+ .tag = 4
+ },
+ [NAVGEAR_GFX_MAP_MENU_UNK0] = {
+ .data = gPokenavLeftHeaderHoennMap_Gfx,
+ .size = 0x20,
+ .tag = 0
+ },
+ [NAVGEAR_GFX_MAP_MENU_UNK1] = {
+ .data = gPokenavLeftHeaderHoennMap_Gfx,
+ .size = 0x40,
+ .tag = 0
+ }
+};
+
+static const struct CompressedSpriteSheetNoSize sPokenavSubMenuLeftHeaderSpriteSheets[] =
+{
+ [NAVGEAR_GFX_PARTY_MENU - NAVGEAR_GFX_SUBMENUS_START] = {
+ .data = gPokenavLeftHeaderParty_Gfx,
+ .tag = 1
+ },
+ [NAVGEAR_GFX_SEARCH_MENU - NAVGEAR_GFX_SUBMENUS_START] = {
+ .data = gPokenavLeftHeaderSearch_Gfx,
+ .tag = 1
+ },
+ [NAVGEAR_GFX_COOL_MENU - NAVGEAR_GFX_SUBMENUS_START] = {
+ .data = gPokenavLeftHeaderCool_Gfx,
+ .tag = 4
+ },
+ [NAVGEAR_GFX_BEAUTY_MENU - NAVGEAR_GFX_SUBMENUS_START] = {
+ .data = gPokenavLeftHeaderBeauty_Gfx,
+ .tag = 1
+ },
+ [NAVGEAR_GFX_CUTE_MENU - NAVGEAR_GFX_SUBMENUS_START] = {
+ .data = gPokenavLeftHeaderCute_Gfx,
+ .tag = 2
+ },
+ [NAVGEAR_GFX_SMART_MENU - NAVGEAR_GFX_SUBMENUS_START] = {
+ .data = gPokenavLeftHeaderSmart_Gfx,
+ .tag = 0
+ },
+ [NAVGEAR_GFX_TOUGH_MENU - NAVGEAR_GFX_SUBMENUS_START] = {
+ .data = gPokenavLeftHeaderTough_Gfx,
+ .tag = 0
+ }
+};
+
+static const struct OamData sSpinningNavgearSpriteOam =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 0, // FIXME: Use SPRITE_SHAPE
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2, // FIXME: Use SPRITE_SIZE
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const union AnimCmd sSpinningNavgearAnims[] =
+{
+ ANIMCMD_FRAME(0, 8),
+ ANIMCMD_FRAME(16, 8),
+ ANIMCMD_FRAME(32, 8),
+ ANIMCMD_FRAME(48, 8),
+ ANIMCMD_FRAME(64, 8),
+ ANIMCMD_FRAME(80, 8),
+ ANIMCMD_FRAME(96, 8),
+ ANIMCMD_FRAME(112, 8),
+ ANIMCMD_JUMP(0)
+};
+
+static const union AnimCmd *const sSpinningNavgearAnimTable[] =
+{
+ sSpinningNavgearAnims
+};
+
+static const struct SpriteTemplate sSpinningNavgearSpriteTemplate =
+{
+ .tileTag = 0,
+ .paletteTag = 0,
+ .oam = &sSpinningNavgearSpriteOam,
+ .anims = sSpinningNavgearAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_SpinningNavgear
+};
+
+static const struct OamData sPokenavLeftHeaderHoenMapSpriteOam =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct OamData sUnknown_0861FB24 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 0,
+ .bpp = 0,
+ .shape = 1,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 2,
+ .tileNum = 0,
+ .priority = 1,
+ .paletteNum = 0,
+ .affineParam = 0
+};
+
+static const struct SpriteTemplate sPokenavLeftHeaderHoenMapSpriteTemplate =
+{
+ .tileTag = 2,
+ .paletteTag = 1,
+ .oam = &sPokenavLeftHeaderHoenMapSpriteOam,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const struct SpriteTemplate sUnknown_0861FB44 =
+{
+ .tileTag = 2,
+ .paletteTag = 2,
+ .oam = &sUnknown_0861FB24,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+static const u16 sMatchcallArrowPaletteData[] = INCBIN_U16("graphics/pokenav/arrows_matchcall.gbapal");
+static const u32 sMatchcallArrowSpriteSheetData[] = INCBIN_U32("graphics/pokenav/arrows_matchcall.4bpp.lz");
+
+static const u8 sPokenavColors_0861FBE4[] =
+{
+ 0, 2, 5
+};
+
+static const u8 *const sMatchCallFieldNames[] =
+{
+ gText_NavgearMatchCall_Strategy,
+ gText_NavgearMatchCall_TrainerPokemon,
+ gText_NavgearMatchCall_SelfIntroduction
+};
+
+static const u8 sMatchCallFieldColors[] =
+{
+ 1, 4, 5
+};
+
+static const u8 sUnknown_0861FBF7[] =
+{
+ 2, 4, 6, 7, 0
+};
+
+static const struct CompressedSpriteSheet sMatchcallArrowSpriteSheet[] =
+{
+ {
+ .data = sMatchcallArrowSpriteSheetData,
+ .size = 192,
+ .tag = 0xA
+ }
+};
+
+static const struct SpritePalette sMatchcallArrowPalette[] =
+{
+ {
+ .data = sMatchcallArrowPaletteData,
+ .tag = 0x14
+ },
+ {}
+};
+
+static const struct OamData sMatchCallRightArrowSpriteOam =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = 2, //SPRITE_SHAPE(16x8),
+ .x = 0,
+ .size = 0, //SPRITE_SIZE(16x8),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0
+};
+
+static const struct SpriteTemplate sMatchCallRightArrowSprite =
+{
+ .tileTag = 0xA,
+ .paletteTag = 0x14,
+ .oam = &sMatchCallRightArrowSpriteOam,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCB_MatchCallRightArrow
+};
+
+static const struct OamData sMatchCallUpDownArrowSpriteOam =
+{
+ .y = 0,
+ .affineMode = ST_OAM_AFFINE_OFF,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .bpp = ST_OAM_4BPP,
+ .shape = 1, //SPRITE_SHAPE(8x16),
+ .x = 0,
+ .size = 0, //SPRITE_SIZE(8x16),
+ .tileNum = 0,
+ .priority = 2,
+ .paletteNum = 0
+};
+
+static const struct SpriteTemplate sMatchCallUpDownArrowSprite =
+{
+ .tileTag = 0xA,
+ .paletteTag = 0x14,
+ .oam = &sMatchCallUpDownArrowSpriteOam,
+ .anims = gDummySpriteAnimTable,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+EWRAM_DATA u8 gNextLoopedTaskId = 0;
+EWRAM_DATA struct PokenavResources *gPokenavResources = NULL;
+EWRAM_DATA u32 gUnknown_0203CF44 = 0;
// code
-u32 sub_81C7078(u32 (*func)(s32), u32 priority)
+u32 CreateLoopedTask(LoopedTask loopedTask, u32 priority)
{
u16 taskId;
if (!IsUpdateLinkStateCBActive())
- taskId = CreateTask(sub_81C7170, priority);
+ taskId = CreateTask(Task_RunLoopedTask, priority);
else
- taskId = CreateTask(sub_81C71E4, priority);
+ taskId = CreateTask(Task_RunLoopedTask_LinkMode, priority);
- SetWordTaskArg(taskId, 1, (u32)func);
+ SetWordTaskArg(taskId, 1, (u32)loopedTask);
- gTasks[taskId].data[3] = gUnknown_0203CF3C;
- return ((gUnknown_0203CF3C++) << 16) | taskId;
+ gTasks[taskId].data[3] = gNextLoopedTaskId;
+ return LOOPED_TASK_ID(taskId, gNextLoopedTaskId++);
}
-bool32 sub_81C70D8(u32 a0)
+bool32 IsLoopedTaskActive(u32 taskId)
{
- u32 taskId = a0 & 0xFFFF;
- u32 v2 = a0 >> 16;
+ u32 primaryId = LOOPED_TASK_PRIMARY_ID(taskId);
+ u32 secondaryId = LOOPED_TASK_SECONDARY_ID(taskId);
- if (gTasks[taskId].isActive
- && (gTasks[taskId].func == sub_81C7170 || gTasks[taskId].func == sub_81C71E4)
- && gTasks[taskId].data[3] == v2)
+ if (gTasks[primaryId].isActive
+ && (gTasks[primaryId].func == Task_RunLoopedTask || gTasks[primaryId].func == Task_RunLoopedTask_LinkMode)
+ && gTasks[primaryId].data[3] == secondaryId)
return TRUE;
else
return FALSE;
}
-bool32 sub_81C7124(u32 a0)
+bool32 FuncIsActiveLoopedTask(LoopedTask func)
{
s32 i;
for (i = 0; i < NUM_TASKS; i++)
{
if (gTasks[i].isActive
- && (gTasks[i].func == sub_81C7170 || gTasks[i].func == sub_81C71E4)
- && GetWordTaskArg(i, 1) == a0)
+ && (gTasks[i].func == Task_RunLoopedTask || gTasks[i].func == Task_RunLoopedTask_LinkMode)
+ && (LoopedTask)GetWordTaskArg(i, 1) == func)
return TRUE;
}
return FALSE;
}
-void sub_81C7170(u8 taskId)
+void Task_RunLoopedTask(u8 taskId)
{
- u32 (*func)(s32) = (void *)GetWordTaskArg(taskId, 1);
- s16 *data = gTasks[taskId].data;
+ LoopedTask loopedTask = (LoopedTask)GetWordTaskArg(taskId, 1);
+ s16 *state = &gTasks[taskId].data[0];
bool32 exitLoop = FALSE;
while (!exitLoop)
{
- u32 var = func(data[0]);
- switch (var)
+ u32 action = loopedTask(*state);
+ switch (action)
{
- case 1:
- data[0] = data[0] + 1;
+ case LT_INC_AND_CONTINUE:
+ (*state)++;
break;
- case 0:
- data[0]++;
+ case LT_INC_AND_PAUSE:
+ (*state)++;
return;
- case 4:
+ case LT_FINISH:
DestroyTask(taskId);
return;
+ // case LT_SET_STATE:
default:
- data[0] = var - 5;
+ *state = LOOPED_TASK_DECODE_STATE(action);
break;
- case 3:
+ case LT_CONTINUE:
break;
- case 2:
+ case LT_PAUSE:
return;
}
}
}
-void sub_81C71E4(u8 taskId)
+// Every "Continue" action pauses instead.
+void Task_RunLoopedTask_LinkMode(u8 taskId)
{
- u32 (*func)(u32);
- s16 *data;
- u32 v1;
+ LoopedTask task;
+ s16 *state;
+ u32 action;
if (sub_8087598())
return;
- func = (u32 (*)(u32))GetWordTaskArg(taskId, 1);
- data = gTasks[taskId].data;
- v1 = func(data[0]);
- switch (v1)
+
+ task = (LoopedTask)GetWordTaskArg(taskId, 1);
+ state = &gTasks[taskId].data[0];
+ action = task(*state);
+ switch (action)
{
- case 0:
- case 1:
- data[0]++;
+ case LT_INC_AND_PAUSE:
+ case LT_INC_AND_CONTINUE:
+ (*state)++;
break;
- case 4:
+ case LT_FINISH:
DestroyTask(taskId);
break;
+ // case: LT_SET_STATE:
default:
- data[0] = v1 - 5;
+ *state = LOOPED_TASK_DECODE_STATE(action);
break;
- case 2:
- case 3:
+ case LT_PAUSE:
+ case LT_CONTINUE:
break;
}
}
void CB2_InitPokeNav(void)
{
- gUnknown_0203CF40 = Alloc(sizeof(*gUnknown_0203CF40));
- if (gUnknown_0203CF40 == NULL)
+ gPokenavResources = Alloc(sizeof(*gPokenavResources));
+ if (gPokenavResources == NULL)
{
SetMainCallback2(CB2_ReturnToFieldWithOpenMenu);
}
else
{
- InitMainStruct(gUnknown_0203CF40);
+ InitPokenavResources(gPokenavResources);
ResetTasks();
SetVBlankCallback(NULL);
CreateTask(sub_81C742C, 0);
SetMainCallback2(CB2_Pokenav);
- SetVBlankCallback(VblankCb_Pokenav);
+ SetVBlankCallback(VBlankCB_Pokenav);
}
}
@@ -515,38 +944,37 @@ void sub_81C72BC(void)
if (gPaletteFade.active)
return;
- gUnknown_0203CF40 = Alloc(sizeof(*gUnknown_0203CF40));
- if (gUnknown_0203CF40 == NULL)
+ gPokenavResources = Alloc(sizeof(*gPokenavResources));
+ if (gPokenavResources == NULL)
{
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
}
else
{
- InitMainStruct(gUnknown_0203CF40);
- gUnknown_0203CF40->mode = MODE_FORCE_CALL_1;
+ InitPokenavResources(gPokenavResources);
+ gPokenavResources->mode = MODE_FORCE_CALL_1;
ResetTasks();
ResetSpriteData();
FreeAllSpritePalettes();
SetVBlankCallback(NULL);
CreateTask(sub_81C742C, 0);
SetMainCallback2(CB2_Pokenav);
- SetVBlankCallback(VblankCb_Pokenav);
+ SetVBlankCallback(VBlankCB_Pokenav);
}
}
-static void FreeVars(void)
+static void FreePokenavResources(void)
{
s32 i;
for (i = 0; i < SUBSTRUCT_COUNT; i++)
- FreeSubstruct(i);
+ FreePokenavSubstruct(i);
- FREE_AND_SET_NULL(gUnknown_0203CF40);
+ FREE_AND_SET_NULL(gPokenavResources);
InitKeys();
}
-// Clears UnknownStruct_0203CF40
-static void InitMainStruct(struct UnknownStruct_0203CF40 *a0)
+static void InitPokenavResources(struct PokenavResources *a0)
{
s32 i;
@@ -554,9 +982,9 @@ static void InitMainStruct(struct UnknownStruct_0203CF40 *a0)
a0->field10[i] = NULL;
a0->mode = MODE_NORMAL;
- a0->field4 = 0;
+ a0->currentMenuIndex = 0;
a0->hasAnyRibbons = AnyMonHasRibbon();
- a0->field0 = NULL;
+ a0->currentMenuCb1 = NULL;
}
static bool32 AnyMonHasRibbon(void)
@@ -596,7 +1024,7 @@ static void CB2_Pokenav(void)
UpdatePaletteFade();
}
-static void VblankCb_Pokenav(void)
+static void VBlankCB_Pokenav(void)
{
TransferPlttBuffer();
LoadOam();
@@ -611,13 +1039,14 @@ void sub_81C742C(u8 taskId)
switch (data[0])
{
case 0:
- sub_81C76C4();
+ InitPokenavMainMenu();
data[0] = 1;
break;
case 1:
- if (sub_81C76FC())
+ // Wait for LoopedTask_InitPokenavMenu to finish
+ if (PokenavMainMenuLoopedTaskIsActive())
break;
- sub_81C756C(UNKNOWN_OFFSET);
+ SetActivePokenavMenu(0 + UNKNOWN_OFFSET);
data[0] = 4;
break;
case 2:
@@ -628,20 +1057,20 @@ void sub_81C742C(u8 taskId)
v1 = sub_81C75E0();
if (v1 == -1)
{
- sub_81C7710();
+ ShutdownPokenav();
data[0] = 5;
}
else if (v1 >= UNKNOWN_OFFSET)
{
- gUnknown_0861F3EC[gUnknown_0203CF40->field4][6]();
- gUnknown_0861F3EC[gUnknown_0203CF40->field4][5]();
- if (sub_81C756C(v1))
+ PokenavMenuCallbacks[gPokenavResources->currentMenuIndex][NAVMENU_CB_UNK_6]();
+ PokenavMenuCallbacks[gPokenavResources->currentMenuIndex][NAVMENU_CB_UNK_5]();
+ if (SetActivePokenavMenu(v1))
{
data[0] = 4;
}
else
{
- sub_81C7710();
+ ShutdownPokenav();
data[0] = 5;
}
}
@@ -657,12 +1086,12 @@ void sub_81C742C(u8 taskId)
data[0] = 3;
break;
case 5:
- if (!sub_81C7738())
+ if (!WaitForPokenavShutdownFade())
{
- bool32 calledFromScript = (gUnknown_0203CF40->mode != MODE_NORMAL);
+ bool32 calledFromScript = (gPokenavResources->mode != MODE_NORMAL);
sub_81C9430();
- FreeVars();
+ FreePokenavResources();
if (calledFromScript)
SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
else
@@ -672,19 +1101,19 @@ void sub_81C742C(u8 taskId)
}
}
-bool32 sub_81C756C(u32 a0)
+bool32 SetActivePokenavMenu(u32 indexWithOffset)
{
- u32 index = a0 - UNKNOWN_OFFSET;
+ u32 index = indexWithOffset - UNKNOWN_OFFSET;
InitKeys_();
- if (!gUnknown_0861F3EC[index][0]())
+ if (!PokenavMenuCallbacks[index][NAVMENU_CB_UNK_0]())
return FALSE;
- if (!gUnknown_0861F3EC[index][2]())
+ if (!PokenavMenuCallbacks[index][NAVMENU_CB_UNK_2]())
return FALSE;
- sub_81C7834(gUnknown_0861F3EC[index][3], gUnknown_0861F3EC[index][4]);
- gUnknown_0203CF40->field0 = gUnknown_0861F3EC[index][1];
- gUnknown_0203CF40->field4 = index;
+ sub_81C7834(PokenavMenuCallbacks[index][NAVMENU_CB_UNK_3], PokenavMenuCallbacks[index][NAVMENU_CB_UNK_4]);
+ gPokenavResources->currentMenuCb1 = PokenavMenuCallbacks[index][NAVMENU_CB_UNK_1];
+ gPokenavResources->currentMenuIndex = index;
return TRUE;
}
@@ -695,7 +1124,7 @@ u32 sub_81C75D4(void)
u32 sub_81C75E0(void)
{
- return gUnknown_0203CF40->field0();
+ return gPokenavResources->currentMenuCb1();
}
static void InitKeys_(void)
@@ -710,33 +1139,33 @@ void SetVBlankCallback_(IntrCallback callback)
void SetPokenavVBlankCallback(void)
{
- SetVBlankCallback(VblankCb_Pokenav);
+ SetVBlankCallback(VBlankCB_Pokenav);
}
void *AllocSubstruct(u32 index, u32 size)
{
- return gUnknown_0203CF40->field10[index] = Alloc(size);
+ return gPokenavResources->field10[index] = Alloc(size);
}
-struct UnknownSubStruct_0203CF40 *GetSubstructPtr(u32 index)
+void *GetSubstructPtr(u32 index)
{
- return gUnknown_0203CF40->field10[index];
+ return gPokenavResources->field10[index];
}
-void FreeSubstruct(u32 index)
+void FreePokenavSubstruct(u32 index)
{
- if (gUnknown_0203CF40->field10[index] != NULL)
- FREE_AND_SET_NULL(gUnknown_0203CF40->field10[index]);
+ if (gPokenavResources->field10[index] != NULL)
+ FREE_AND_SET_NULL(gPokenavResources->field10[index]);
}
u16 GetPokenavMode(void)
{
- return gUnknown_0203CF40->mode;
+ return gPokenavResources->mode;
}
void SetPokenavMode(u16 mode)
{
- gUnknown_0203CF40->mode = mode;
+ gPokenavResources->mode = mode;
}
void sub_81C7694(u32 a0)
@@ -745,50 +1174,52 @@ void sub_81C7694(u32 a0)
if (value > 4)
value = 0;
- gUnknown_0203CF40->fieldA = value;
+ gPokenavResources->fieldA = value;
}
u16 sub_81C76AC(void)
{
- return gUnknown_0203CF40->fieldA;
+ return gPokenavResources->fieldA;
}
bool32 CanViewRibbonsMenu(void)
{
- return gUnknown_0203CF40->hasAnyRibbons;
+ return gPokenavResources->hasAnyRibbons;
}
-bool32 sub_81C76C4(void)
+bool32 InitPokenavMainMenu(void)
{
- struct UnknownSubStruct_0203CF40 *structPtr = AllocSubstruct(0, 0x82C);
+ struct PokenavMainMenuResources *structPtr;
+
+ structPtr = AllocSubstruct(0, sizeof(struct PokenavMainMenuResources));
if (structPtr == NULL)
return FALSE;
ResetSpriteData();
FreeAllSpritePalettes();
- structPtr->unkC = sub_81C7078(sub_81C7764, 1);
+ structPtr->currentTaskId = CreateLoopedTask(LoopedTask_InitPokenavMenu, 1);
return TRUE;
}
-u32 sub_81C76FC(void)
+u32 PokenavMainMenuLoopedTaskIsActive(void)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
- return sub_81C70D8(structPtr->unkC);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
+ return IsLoopedTaskActive(structPtr->currentTaskId);
}
-void sub_81C7710(void)
+void ShutdownPokenav(void)
{
PlaySE(SE_PN_OFF);
sub_81CAADC();
BeginNormalPaletteFade(0xFFFFFFFF, -1, 0, 16, RGB_BLACK);
}
-bool32 sub_81C7738(void)
+bool32 WaitForPokenavShutdownFade(void)
{
if (!gPaletteFade.active)
{
sub_81C99D4();
- sub_81C7C94();
+ CleanupPokenavMainMenuResources();
FreeAllWindowBuffers();
return FALSE;
}
@@ -796,9 +1227,9 @@ bool32 sub_81C7738(void)
return TRUE;
}
-u32 sub_81C7764(s32 a0)
+u32 LoopedTask_InitPokenavMenu(s32 a0)
{
- struct UnknownSubStruct_0203CF40 *structPtr;
+ struct PokenavMainMenuResources *structPtr;
switch (a0)
{
@@ -806,10 +1237,10 @@ u32 sub_81C7764(s32 a0)
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_OBJ_ON | DISPCNT_OBJ_1D_MAP);
FreeAllWindowBuffers();
ResetBgsAndClearDma3BusyFlags(0);
- InitBgsFromTemplates(0, gUnknown_0861FA04, ARRAY_COUNT(gUnknown_0861FA04));
- sub_8199D98();
+ InitBgsFromTemplates(0, gPokenavMainMenuBgTemplates, ARRAY_COUNT(gPokenavMainMenuBgTemplates));
+ ResetBgPositions();
reset_temp_tile_data_buffers();
- return 1;
+ return LT_INC_AND_CONTINUE;
case 1:
structPtr = GetSubstructPtr(0);
decompress_and_copy_tile_data_to_vram(0, &gPokenavHeader_Gfx, 0, 0, 0);
@@ -817,29 +1248,29 @@ u32 sub_81C7764(s32 a0)
CopyToBgTilemapBuffer(0, &gPokenavHeader_Tilemap, 0, 0);
CopyPaletteIntoBufferUnfaded(gPokenavHeader_Pal, 0, 0x20);
CopyBgTilemapBufferToVram(0);
- return 0;
+ return LT_INC_AND_PAUSE;
case 2:
if (free_temp_tile_data_buffers_if_possible())
- return 2;
+ return LT_PAUSE;
sub_81C7B74();
- return 0;
+ return LT_INC_AND_PAUSE;
case 3:
if (IsDma3ManagerBusyWithBgCopy())
- return 2;
+ return LT_PAUSE;
- sub_81C7C28();
- sub_81C7D28();
+ InitPokenavMainMenuResources();
+ InitHoenMapHeaderSprites();
ShowBg(0);
- return 4;
+ return LT_FINISH;
default:
- return 4;
+ return LT_FINISH;
}
}
void sub_81C7834(void *func1, void *func2) // Fix types later.
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
structPtr->unk0 = func1;
structPtr->unk4 = func2;
structPtr->unk8 = 0;
@@ -847,57 +1278,57 @@ void sub_81C7834(void *func1, void *func2) // Fix types later.
void sub_81C7850(u32 a0)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
structPtr->unk8 = 0;
structPtr->unk0(a0);
}
u32 sub_81C786C(void)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
return structPtr->unk4();
}
void sub_81C7880(void)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
- structPtr->unkC = sub_81C7078(sub_81C78D4, 4);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
+ structPtr->currentTaskId = CreateLoopedTask(LoopedTask_ScrollMenuHeaderDown, 4);
}
void sub_81C78A0(void)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
- structPtr->unkC = sub_81C7078(sub_81C791C, 4);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
+ structPtr->currentTaskId = CreateLoopedTask(LoopedTask_ScrollMenuHeaderUp, 4);
}
-bool32 sub_81C78C0(void)
+bool32 MainMenuLoopedTaskIsBusy(void)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
- return sub_81C70D8(structPtr->unkC);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
+ return IsLoopedTaskActive(structPtr->currentTaskId);
}
-u32 sub_81C78D4(s32 a0)
+u32 LoopedTask_ScrollMenuHeaderDown(s32 a0)
{
switch (a0)
{
default:
- return 4;
+ return LT_FINISH;
case 1:
- return 0;
+ return LT_INC_AND_PAUSE;
case 0:
- return 0;
+ return LT_INC_AND_PAUSE;
case 2:
if (ChangeBgY(0, 384, 1) >= 0x2000u)
{
ChangeBgY(0, 0x2000, 0);
- return 4;
+ return LT_FINISH;
}
- return 2;
+ return LT_PAUSE;
}
}
-u32 sub_81C791C(s32 a0)
+u32 LoopedTask_ScrollMenuHeaderUp(s32 a0)
{
if (ChangeBgY(0, 384, 2) <= 0)
{
@@ -912,7 +1343,7 @@ void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 bufferOffset, u32 size
CpuCopy16(palette, gPlttBufferUnfaded + bufferOffset, size);
}
-void sub_81C795C(const struct SpritePalette *palettes)
+void Pokenav_AllocAndLoadPalettes(const struct SpritePalette *palettes)
{
const struct SpritePalette *current;
u32 index;
@@ -1075,7 +1506,7 @@ _081C7AAE:\n\
void sub_81C7AC0(s32 a0)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
switch (a0)
{
@@ -1114,7 +1545,7 @@ void InitBgTemplates(const struct BgTemplate *templates, s32 count)
void sub_81C7B74(void)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
InitWindows(&gUnknown_0861FA08[0]);
structPtr->unk10 = 0;
@@ -1125,7 +1556,7 @@ void sub_81C7B74(void)
void sub_81C7BA4(u32 a0)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
sub_81C7BF8(structPtr->unk10);
AddTextPrinterParameterized3(structPtr->unk10, 1, 0, 1, gMenuButtonReminderColor, 0, sMenuButtonReminders[a0]);
@@ -1142,143 +1573,131 @@ void sub_81C7BF8(u32 windowId)
FillWindowPixelRect(windowId, PIXEL_FILL(5), 0, 0, 0x80, 1);
}
-void sub_81C7C28(void)
+void InitPokenavMainMenuResources(void)
{
s32 i;
u8 spriteId;
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
- for (i = 0; i < ARRAY_COUNT(gUnknown_0861FA4C); i++)
- LoadCompressedSpriteSheet(&gUnknown_0861FA4C[i]);
+ for (i = 0; i < ARRAY_COUNT(gSpinningNavgearSpriteSheet); i++)
+ LoadCompressedSpriteSheet(&gSpinningNavgearSpriteSheet[i]);
- sub_81C795C(gUnknown_0861FA54);
+ Pokenav_AllocAndLoadPalettes(gSpinningNavgearPalette);
structPtr->unk14 = ~1 & ~(0x10000 << IndexOfSpritePaletteTag(0));
- spriteId = CreateSprite(&gUnknown_0861FB04, 220, 12, 0);
- structPtr->unk18 = &gSprites[spriteId];
+ spriteId = CreateSprite(&sSpinningNavgearSpriteTemplate, 220, 12, 0);
+ structPtr->spinningNavgear = &gSprites[spriteId];
}
-void sub_81C7C94(void)
+void CleanupPokenavMainMenuResources(void)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
- DestroySprite(structPtr->unk18);
+ DestroySprite(structPtr->spinningNavgear);
FreeSpriteTilesByTag(0);
FreeSpritePaletteByTag(0);
}
-void sub_81C7CB4(struct Sprite *sprite)
+void SpriteCB_SpinningNavgear(struct Sprite *sprite)
{
+ // If the background starts scrolling, follow it.
sprite->pos2.y = (GetBgY(0) / 256u) * -1;
}
-struct Sprite *sub_81C7CCC(void)
+struct Sprite *PauseSpinningNavgearSprite(void)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
- structPtr->unk18->callback = SpriteCallbackDummy;
- return structPtr->unk18;
+ structPtr->spinningNavgear->callback = SpriteCallbackDummy;
+ return structPtr->spinningNavgear;
}
-void sub_81C7CE4(void)
+void ResumeSpinningNavgearSprite(void)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
- structPtr->unk18->pos1.x = 220;
- structPtr->unk18->pos1.y = 12;
- structPtr->unk18->callback = sub_81C7CB4;
- structPtr->unk18->invisible = FALSE;
- structPtr->unk18->oam.priority = 0;
- structPtr->unk18->subpriority = 0;
+ structPtr->spinningNavgear->pos1.x = 220;
+ structPtr->spinningNavgear->pos1.y = 12;
+ structPtr->spinningNavgear->callback = SpriteCB_SpinningNavgear;
+ structPtr->spinningNavgear->invisible = FALSE;
+ structPtr->spinningNavgear->oam.priority = 0;
+ structPtr->spinningNavgear->subpriority = 0;
}
-extern const struct SpriteTemplate gUnknown_0861FB2C;
-extern const struct SpriteTemplate gUnknown_0861FB44;
-extern const struct CompressedSpriteSheet gUnknown_0861FA6C[];
-
-void sub_81C7D28(void)
+void InitHoenMapHeaderSprites(void)
{
s32 i, spriteId;
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
- LoadCompressedSpriteSheet(&gUnknown_0861FA64);
+ LoadCompressedSpriteSheet(&sPokenavHoenMapLeftHeaderSpriteSheet);
AllocSpritePalette(1);
AllocSpritePalette(2);
- for (i = 0; i < 2; i++)
+ for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
{
- spriteId = CreateSprite(&gUnknown_0861FB2C, 0, 0, 1);
- structPtr->unk1C[i] = &gSprites[spriteId];
- structPtr->unk1C[i]->invisible = TRUE;
- structPtr->unk1C[i]->pos2.x = i * 64;
-
- spriteId = CreateSprite(&gUnknown_0861FB44, 0, 0, 2);
- structPtr->unk24[i] = &gSprites[spriteId];
- structPtr->unk24[i]->invisible = TRUE;
- structPtr->unk24[i]->pos2.x = i * 32;
- structPtr->unk24[i]->pos2.y = 18;
- structPtr->unk24[i]->oam.tileNum += (i * 8) + 64;
+ spriteId = CreateSprite(&sPokenavLeftHeaderHoenMapSpriteTemplate, 0, 0, 1);
+ structPtr->leftHeaderSprites[i] = &gSprites[spriteId];
+ structPtr->leftHeaderSprites[i]->invisible = TRUE;
+ structPtr->leftHeaderSprites[i]->pos2.x = i * 64;
+
+ spriteId = CreateSprite(&sUnknown_0861FB44, 0, 0, 2);
+ structPtr->submenuLeftHeaderSprites[i] = &gSprites[spriteId];
+ structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE;
+ structPtr->submenuLeftHeaderSprites[i]->pos2.x = i * 32;
+ structPtr->submenuLeftHeaderSprites[i]->pos2.y = 18;
+ structPtr->submenuLeftHeaderSprites[i]->oam.tileNum += (i * 8) + 64;
}
}
-void sub_81C7DFC(u32 arg0)
+void LoadLeftHeaderGfxForIndex(u32 arg0)
{
- if (arg0 < 6)
- sub_81C7E58(arg0);
+ if (arg0 < NAVGEAR_GFX_SUBMENUS_START)
+ LoadLeftHeaderGfxForMenu(arg0);
else
- sub_81C7F24(arg0 - 6);
+ LoadLeftHeaderGfxForSubMenu(arg0 - NAVGEAR_GFX_SUBMENUS_START);
}
void sub_81C7E14(u32 arg0)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
if (arg0 == 4)
- structPtr->unk1C[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 32;
+ structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 32;
else
- structPtr->unk1C[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 64;
+ structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + 64;
}
-void sub_81C7E58(u32 arg0)
+void LoadLeftHeaderGfxForMenu(u32 index)
{
- struct UnknownSubStruct_0203CF40 *structPtr;
+ struct PokenavMainMenuResources *structPtr;
u32 size, tag;
- if (arg0 >= 6)
+ if (index >= NAVGEAR_GFX_SUBMENUS_START)
return;
structPtr = GetSubstructPtr(0);
- tag = gUnknown_0861FA6C[arg0].tag;
- size = GetDecompressedDataSize(gUnknown_0861FA6C[arg0].data);
+ tag = sPokenavMenuLeftHeaderSpriteSheets[index].tag;
+ size = GetDecompressedDataSize(sPokenavMenuLeftHeaderSpriteSheets[index].data);
LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(1) * 16) + 0x100, 0x20);
- LZ77UnCompWram(gUnknown_0861FA6C[arg0].data, gDecompressionBuffer);
+ LZ77UnCompWram(sPokenavMenuLeftHeaderSpriteSheets[index].data, gDecompressionBuffer);
RequestDma3Copy(gDecompressionBuffer, (void *)VRAM + 0x10000 + (GetSpriteTileStartByTag(2) * 32), size, 1);
- structPtr->unk1C[1]->oam.tileNum = GetSpriteTileStartByTag(2) + gUnknown_0861FA6C[arg0].size;
+ structPtr->leftHeaderSprites[1]->oam.tileNum = GetSpriteTileStartByTag(2) + sPokenavMenuLeftHeaderSpriteSheets[index].size;
- if (arg0 == 4 || arg0 == 5)
- structPtr->unk1C[1]->pos2.x = 56;
+ if (index == NAVGEAR_GFX_MAP_MENU_UNK0 || index == NAVGEAR_GFX_MAP_MENU_UNK1)
+ structPtr->leftHeaderSprites[1]->pos2.x = 56;
else
- structPtr->unk1C[1]->pos2.x = 64;
+ structPtr->leftHeaderSprites[1]->pos2.x = 64;
}
-// Needed to match u32/u16 tag field difference.
-struct CompressedSpritePalette_
-{
- const u32 *data; // LZ77 compressed palette data
- u32 tag;
-};
-
-extern const struct CompressedSpritePalette_ gUnknown_0861FA9C[];
-
-void sub_81C7F24(u32 arg0)
+void LoadLeftHeaderGfxForSubMenu(u32 arg0)
{
u32 size, tag;
- if (arg0 >= 7)
+ if (arg0 >= NAVGEAR_GFX_MENUS_END - NAVGEAR_GFX_SUBMENUS_START)
return;
- tag = gUnknown_0861FA9C[arg0].tag;
- size = GetDecompressedDataSize(gUnknown_0861FA9C[arg0].data);
+ tag = sPokenavSubMenuLeftHeaderSpriteSheets[arg0].tag;
+ size = GetDecompressedDataSize(sPokenavSubMenuLeftHeaderSpriteSheets[arg0].data);
LoadPalette(&gPokenavLeftHeader_Pal[tag * 16], (IndexOfSpritePaletteTag(2) * 16) + 0x100, 0x20);
- LZ77UnCompWram(gUnknown_0861FA9C[arg0].data, &gDecompressionBuffer[0x1000]);
+ LZ77UnCompWram(sPokenavSubMenuLeftHeaderSpriteSheets[arg0].data, &gDecompressionBuffer[0x1000]);
RequestDma3Copy(&gDecompressionBuffer[0x1000], (void *)VRAM + 0x10800 + (GetSpriteTileStartByTag(2) * 32), size, 1);
}
@@ -1292,118 +1711,118 @@ void sub_81C7FA0(u32 arg0, bool32 arg1, bool32 arg2)
var = 0x10;
if (arg0 < 6)
- sub_81C803C(var, arg2);
+ ShowLeftHeaderSprites(var, arg2);
else
- sub_81C8088(var, arg2);
+ ShowLeftHeaderSubmenuSprites(var, arg2);
}
void sub_81C7FC4(u32 arg0, bool32 arg1)
{
if (arg0 < 6)
- sub_81C80D4(arg1);
+ HideLeftHeaderSprites(arg1);
else
- sub_81C8110(arg1);
+ HideLeftHeaderSubmenuSprites(arg1);
}
void sub_81C7FDC(void)
{
s32 i;
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
- for (i = 0; i < 2; i++)
+ for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
{
- structPtr->unk1C[i]->invisible = TRUE;
- structPtr->unk24[i]->invisible = TRUE;
+ structPtr->leftHeaderSprites[i]->invisible = TRUE;
+ structPtr->submenuLeftHeaderSprites[i]->invisible = TRUE;
}
}
bool32 sub_81C8010(void)
{
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
- if (structPtr->unk1C[0]->callback == SpriteCallbackDummy && structPtr->unk24[0]->callback == SpriteCallbackDummy)
+ if (structPtr->leftHeaderSprites[0]->callback == SpriteCallbackDummy && structPtr->submenuLeftHeaderSprites[0]->callback == SpriteCallbackDummy)
return FALSE;
else
return TRUE;
}
-void sub_81C803C(u32 arg0, bool32 arg1)
+void ShowLeftHeaderSprites(u32 startY, bool32 isOnRightSide)
{
- s32 var1, var2, i;
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ s32 start, end, i;
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
- if (!arg1)
- var1 = -96, var2 = 32;
+ if (!isOnRightSide)
+ start = -96, end = 32;
else
- var1 = 256, var2 = 160;
+ start = 256, end = 160;
- for (i = 0; i < 2; i++)
+ for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
{
- structPtr->unk1C[i]->pos1.y = arg0;
- sub_81C814C(structPtr->unk1C[i], var1, var2, 12);
+ structPtr->leftHeaderSprites[i]->pos1.y = startY;
+ MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12);
}
}
-void sub_81C8088(u32 arg0, bool32 arg1)
+void ShowLeftHeaderSubmenuSprites(u32 startY, bool32 isOnRightSide)
{
- s32 var1, var2, i;
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ s32 start, end, i;
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
- if (!arg1)
- var1 = -96, var2 = 16;
+ if (!isOnRightSide)
+ start = -96, end = 16;
else
- var1 = 256, var2 = 192;
+ start = 256, end = 192;
- for (i = 0; i < 2; i++)
+ for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++)
{
- structPtr->unk24[i]->pos1.y = arg0;
- sub_81C814C(structPtr->unk24[i], var1, var2, 12);
+ structPtr->submenuLeftHeaderSprites[i]->pos1.y = startY;
+ MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12);
}
}
-void sub_81C80D4(bool32 arg0)
+void HideLeftHeaderSprites(bool32 isOnRightSide)
{
- s32 var1, var2, i;
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ s32 start, end, i;
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
- if (!arg0)
- var1 = 32, var2 = -96;
+ if (!isOnRightSide)
+ start = 32, end = -96;
else
- var1 = 192, var2 = 256;
+ start = 192, end = 256;
- for (i = 0; i < 2; i++)
+ for (i = 0; i < (s32)ARRAY_COUNT(structPtr->leftHeaderSprites); i++)
{
- sub_81C814C(structPtr->unk1C[i], var1, var2, 12);
+ MoveLeftHeader(structPtr->leftHeaderSprites[i], start, end, 12);
}
}
-void sub_81C8110(bool32 arg0)
+void HideLeftHeaderSubmenuSprites(bool32 isOnRightSide)
{
- s32 var1, var2, i;
- struct UnknownSubStruct_0203CF40 *structPtr = GetSubstructPtr(0);
+ s32 start, end, i;
+ struct PokenavMainMenuResources *structPtr = GetSubstructPtr(0);
- if (!arg0)
- var1 = 16, var2 = -96;
+ if (!isOnRightSide)
+ start = 16, end = -96;
else
- var1 = 192, var2 = 256;
+ start = 192, end = 256;
- for (i = 0; i < 2; i++)
+ for (i = 0; i < (s32)ARRAY_COUNT(structPtr->submenuLeftHeaderSprites); i++)
{
- sub_81C814C(structPtr->unk24[i], var1, var2, 12);
+ MoveLeftHeader(structPtr->submenuLeftHeaderSprites[i], start, end, 12);
}
}
-void sub_81C814C(struct Sprite *sprite, s32 arg1, s32 arg2, s32 arg3)
+void MoveLeftHeader(struct Sprite *sprite, s32 startX, s32 endX, s32 duration)
{
- sprite->pos1.x = arg1;
- sprite->data[0] = arg1 * 16;
- sprite->data[1] = (arg2 - arg1) * 16 / arg3;
- sprite->data[2] = arg3;
- sprite->data[7] = arg2;
- sprite->callback = sub_81C817C;
+ sprite->pos1.x = startX;
+ sprite->data[0] = startX * 16;
+ sprite->data[1] = (endX - startX) * 16 / duration;
+ sprite->data[2] = duration;
+ sprite->data[7] = endX;
+ sprite->callback = SpriteCB_MoveLeftHeader;
}
-void sub_81C817C(struct Sprite *sprite)
+void SpriteCB_MoveLeftHeader(struct Sprite *sprite)
{
if (sprite->data[2] != 0)
{
@@ -1422,12 +1841,1061 @@ void sub_81C817C(struct Sprite *sprite)
}
}
-/*
-bool32 sub_81C81D4(const void *arg0, void *arg1, s32 arg3)
+bool32 sub_81C81D4(const struct BgTemplate *arg0, struct MatchCallListTemplate *arg1, s32 arg2)
{
- struct UnknownSubStruct_0203CF40 *structPtr = AllocSubstruct(0x11, 0x8A4);
+ u32 v1;
+ struct UnknownSubStruct_81C81D4 *structPtr;
+
+ structPtr = AllocSubstruct(0x11, sizeof(struct UnknownSubStruct_81C81D4));
if (structPtr == NULL)
return FALSE;
+
+ sub_81C9160(&structPtr->unk888, arg1);
+
+ v1 = sub_81C91AC(&structPtr->unk0, arg0, arg1, arg2);
+ if (v1 == 0)
+ return FALSE;
+
+ CreateLoopedTask(LoopedTask_sub_81C8254, 6);
+ return TRUE;
+}
+
+bool32 sub_81C8224(void)
+{
+ return FuncIsActiveLoopedTask(LoopedTask_sub_81C8254);
+}
+
+void sub_81C8234(void)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+
+ structPtr = GetSubstructPtr(0x11);
+ sub_81C8FE0(&structPtr->unk0);
+ RemoveWindow(structPtr->unk0.unk0.windowId);
+ FreePokenavSubstruct(0x11);
+}
+
+u32 LoopedTask_sub_81C8254(s32 a0)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+
+ if (IsDma3ManagerBusyWithBgCopy())
+ return 2;
+
+ structPtr = GetSubstructPtr(0x11);
+
+ switch (a0)
+ {
+ case 0:
+ sub_81C82E4(structPtr);
+ return 0;
+ case 1:
+ sub_81C835C(&structPtr->unk0.unk0);
+ return 0;
+ case 2:
+ sub_81C837C(&structPtr->unk888, &structPtr->unk0);
+ return 0;
+ case 3:
+ if (sub_81C83E0())
+ {
+ return 2;
+ }
+ else
+ {
+ sub_81C8ED0();
+ return 1;
+ }
+ case 4:
+ sub_81C8EF8(&structPtr->unk888, &structPtr->unk0);
+ return 4;
+ default:
+ return 4;
+ }
+}
+
+void sub_81C82E4(struct UnknownSubStruct_81C81D4 *a0)
+{
+ u16 v1 = (a0->unk0.unk0.unk1 << 12) | a0->unk0.unk0.unk6;
+ // TODO: When #553 is merged, use a PALETTE_NUM_TO_FILL_VALUE(1) macro here...
+ sub_8199DF0(a0->unk0.unk0.bg, 0x11, a0->unk0.unk0.unk6, 1);
+ // ...and PALETTE_NUM_TO_FILL_VALUE(4) here.
+ sub_8199DF0(a0->unk0.unk0.bg, 0x44, a0->unk0.unk0.unk6 + 1, 1);
+ SetBgTilemapBuffer(a0->unk0.unk0.bg, a0->tilemapBuffer);
+ FillBgTilemapBufferRect_Palette0(a0->unk0.unk0.bg, v1, 0, 0, 32, 32);
+ ChangeBgY(a0->unk0.unk0.bg, 0, 0);
+ ChangeBgX(a0->unk0.unk0.bg, 0, 0);
+ ChangeBgY(a0->unk0.unk0.bg, a0->unk0.unk0.unk3 << 11, 2);
+ CopyBgTilemapBufferToVram(a0->unk0.unk0.bg);
+}
+
+void sub_81C835C(struct UnknownSubSubStruct_0203CF40 *a0)
+{
+ FillWindowPixelBuffer(a0->windowId, PIXEL_FILL(1));
+ PutWindowTilemap(a0->windowId);
+ CopyWindowToVram(a0->windowId, 1);
+}
+
+void sub_81C837C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1)
+{
+ s32 v1;
+ s32 v2;
+
+ // TODO: Clean this up.
+ v1 = a0->listLength - a0->windowTopIndex;
+ v2 = a0->visibleEntries;
+ if (v1 > a0->visibleEntries)
+ v1 = v2;
+ sub_81C83AC(a0->unk10, a0->windowTopIndex, v1, a0->unkC, 0, a1);
+}
+
+void sub_81C83AC(u32 a0, u32 a1, u32 a2, u32 a3, u32 a4, struct UnknownInnerStruct_81C81D4 *a5)
+{
+ if (a2 == 0)
+ return;
+
+ a5->unk1C = a0 + a1 * a3;
+ a5->unk18 = a3;
+ a5->unk0.unkC = 0;
+ a5->unk0.unkE = a2;
+ a5->unk14 = a1;
+ a5->unk10 = a4;
+ CreateLoopedTask(LoopedTask_sub_81C83F0, 5);
+}
+
+bool32 sub_81C83E0(void)
+{
+ return FuncIsActiveLoopedTask(LoopedTask_sub_81C83F0);
+}
+
+u32 LoopedTask_sub_81C83F0(s32 a0)
+{
+ struct UnknownInnerStruct_81C81D4 *structPtr;
+ u32 v1;
+
+ structPtr = &((struct UnknownSubStruct_81C81D4*)GetSubstructPtr(0x11))->unk0;
+ switch (a0)
+ {
+ case 0:
+ v1 = (structPtr->unk0.unkA + structPtr->unk0.unkC + structPtr->unk10) & 0xF;
+ structPtr->unk34(structPtr->unk1C, structPtr->unkTextBuffer);
+ if (structPtr->unk38 != NULL)
+ // Accessing unk0.windowId as if it were a u16...?
+ // It's accessed as a u8 again in the very next line...
+ structPtr->unk38(*(u16*)(&structPtr->unk0.windowId), structPtr->unk14, v1);
+
+ AddTextPrinterParameterized(structPtr->unk0.windowId, structPtr->unk0.fontId, structPtr->unkTextBuffer, 8, (v1 << 4) + 1, 255, NULL);
+
+ if (++structPtr->unk0.unkC >= structPtr->unk0.unkE)
+ {
+ if (structPtr->unk38 != NULL)
+ CopyWindowToVram(structPtr->unk0.windowId, 3);
+ else
+ CopyWindowToVram(structPtr->unk0.windowId, 2);
+ return 0;
+ }
+ else
+ {
+ structPtr->unk1C += structPtr->unk18;
+ structPtr->unk14++;
+ return 3;
+ }
+ case 1:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return 2;
+ else
+ return 4;
+ default:
+ return 4;
+ }
+}
+
+bool32 ShouldShowUpArrow(void)
+{
+ u16 v1;
+ s32 v2;
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ structPtr = GetSubstructPtr(0x11);
+
+ return structPtr->unk888.windowTopIndex != 0;
+}
+
+bool32 ShouldShowDownArrow(void)
+{
+ struct MatchCallWindowState *subPtr;
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ structPtr = GetSubstructPtr(0x11);
+ subPtr = &structPtr->unk888;
+
+ return subPtr->windowTopIndex + subPtr->visibleEntries < subPtr->listLength;
+}
+
+
+#ifdef NONMATCHING
+// This has some register renaming issues (r4, r5, and r6 are all switched around), and
+// for some reason it's creating two copies of subPtr->unk0.
+// TODO: Now I know why it's making two copies - one of them is UnknownInnerStruct_81C81D4.
+void MatchCall_MoveWindow(s32 a0, bool32 a1)
+{
+ s32 v1;
+ struct MatchCallWindowState *subPtr;
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ structPtr = GetSubstructPtr(0x11);
+ subPtr = &structPtr->unk888;
+
+ if (a0 < 0)
+ {
+ // This is where the issue is. subPtr->windowTopIndex is being stored in r1 and then copied to
+ // r2... and then r2 is read for the if statement, r1 is read for the function call,
+ // and then both are clobbered as expected. Between those two uses, no writes to r1/r2
+ // happen; it doesn't need to be duplicated/moved at all.
+ if (subPtr->windowTopIndex + a0 < 0)
+ v1 = -1 * subPtr->windowTopIndex;
+ else
+ v1 = a0;
+ if (a1)
+ sub_81C83AC(subPtr->unk10, subPtr->windowTopIndex + v1, v1 * -1, subPtr->unkC, v1, structPtr);
+ }
+ else if (a1)
+ {
+
+ gUnknown_0203CF44 = subPtr->windowTopIndex + subPtr->visibleEntries;
+ if ((s32)(gUnknown_0203CF44) + a0 >= (s32)subPtr->listLength)
+ v1 = subPtr->listLength - gUnknown_0203CF44;
+ else
+ v1 = a0;
+
+ sub_81C83AC(subPtr->unk10, gUnknown_0203CF44, v1, subPtr->unkC, subPtr->visibleEntries, structPtr);
+ // Needed to prevent GCC from combining the two sub_81C83AC calls.
+ asm("");
+ }
+ else
+ {
+ v1 = a0;
+ }
+
+ sub_81C8568(v1, structPtr);
+ subPtr->windowTopIndex++;
+}
+#else
+NAKED
+void MatchCall_MoveWindow(s32 a0, bool32 a1)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ sub sp, 0x8\n\
+ adds r6, r0, 0\n\
+ adds r4, r1, 0\n\
+ movs r0, 0x11\n\
+ bl GetSubstructPtr\n\
+ adds r7, r0, 0\n\
+ ldr r0, =0x00000888\n\
+ adds r5, r7, r0\n\
+ cmp r6, 0\n\
+ bge _081C8524\n\
+ ldrh r1, [r5]\n\
+ adds r0, r1, r6\n\
+ cmp r0, 0\n\
+ bge _081C850A\n\
+ negs r6, r1\n\
+_081C850A:\n\
+ cmp r4, 0\n\
+ beq _081C854E\n\
+ ldr r0, [r5, 0x10]\n\
+ adds r1, r6\n\
+ negs r2, r6\n\
+ ldr r3, [r5, 0xC]\n\
+ str r6, [sp]\n\
+ str r7, [sp, 0x4]\n\
+ bl sub_81C83AC\n\
+ b _081C854E\n\
+ .pool\n\
+_081C8524:\n\
+ cmp r4, 0\n\
+ beq _081C854E\n\
+ ldr r2, =gUnknown_0203CF44\n\
+ ldrh r1, [r5]\n\
+ ldrh r0, [r5, 0x8]\n\
+ adds r4, r1, r0\n\
+ str r4, [r2]\n\
+ adds r0, r4, r6\n\
+ ldrh r1, [r5, 0x2]\n\
+ cmp r0, r1\n\
+ blt _081C853C\n\
+ subs r6, r1, r4\n\
+_081C853C:\n\
+ ldr r0, [r5, 0x10]\n\
+ ldr r3, [r5, 0xC]\n\
+ ldrh r1, [r5, 0x8]\n\
+ str r1, [sp]\n\
+ str r7, [sp, 0x4]\n\
+ adds r1, r4, 0\n\
+ adds r2, r6, 0\n\
+ bl sub_81C83AC\n\
+_081C854E:\n\
+ adds r0, r6, 0\n\
+ adds r1, r7, 0\n\
+ bl sub_81C8568\n\
+ ldrh r0, [r5]\n\
+ adds r0, r6\n\
+ strh r0, [r5]\n\
+ add sp, 0x8\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .pool\n\
+ .syntax divided");
+}
+#endif
+
+void sub_81C8568(s32 a0, struct UnknownInnerStruct_81C81D4 *a1)
+{
+ a1->unk20 = GetBgY(a1->unk0.bg);
+ a1->unk24 = a1->unk20 + (a0 << 12);
+ if (a0 > 0)
+ a1->unk30 = 1;
+ else
+ a1->unk30 = 2;
+ a1->unk2C = a0;
+ a1->unk28 = CreateLoopedTask(LoopedTask_sub_81C85A0, 6);
+}
+
+u32 LoopedTask_sub_81C85A0(s32 a0)
+{
+ s32 y;
+ s32 v1;
+ bool32 flag;
+ struct UnknownInnerStruct_81C81D4 *structPtr;
+ structPtr = &((struct UnknownSubStruct_81C81D4 *)GetSubstructPtr(0x11))->unk0;
+
+ switch (a0)
+ {
+ case 0:
+ if (sub_81C83E0() == FALSE)
+ return 1;
+ else
+ return 2;
+ case 1:
+ flag = FALSE;
+ y = GetBgY(structPtr->unk0.bg);
+ v1 = ChangeBgY(structPtr->unk0.bg, 0x1000, structPtr->unk30);
+ if (structPtr->unk30 == 2)
+ {
+ if ((y > structPtr->unk24 || y <= structPtr->unk20) && v1 <= structPtr->unk24)
+ {
+ flag = TRUE;
+ }
+ }
+ else
+ {
+ if ((y < structPtr->unk24 || y >= structPtr->unk20) && v1 >= structPtr->unk24)
+ {
+ flag = TRUE;
+ }
+ }
+ if (flag)
+ {
+ structPtr->unk0.unkA = (structPtr->unk0.unkA + structPtr->unk2C) & 0xF;
+ ChangeBgY(structPtr->unk0.bg, structPtr->unk24, 0);
+ return 4;
+ }
+ else
+ {
+ return 2;
+ }
+ default:
+ return 4;
+ }
+}
+
+bool32 sub_81C8630(void)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ structPtr = GetSubstructPtr(0x11);
+ return IsLoopedTaskActive(structPtr->unk0.unk28);
+}
+
+struct MatchCallWindowState *GetMatchCallWindowStruct(void)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ structPtr = GetSubstructPtr(0x11);
+ return &structPtr->unk888;
+}
+
+u32 MatchCall_MoveCursorUp(void)
+{
+ struct MatchCallWindowState *structPtr;
+ structPtr = GetMatchCallWindowStruct();
+
+ if (structPtr->selectedIndexOffset != 0)
+ {
+ structPtr->selectedIndexOffset--;
+ return 1;
+ }
+ else
+ {
+ if (ShouldShowUpArrow())
+ {
+ MatchCall_MoveWindow(-1, TRUE);
+ return 2;
+ }
+ else
+ {
+ return 0;
+ }
+ }
+}
+
+u32 MatchCall_MoveCursorDown(void)
+{
+ struct MatchCallWindowState *structPtr;
+ structPtr = GetMatchCallWindowStruct();
+
+ if (structPtr->windowTopIndex + structPtr->selectedIndexOffset < structPtr->listLength - 1)
+ {
+ if (structPtr->selectedIndexOffset < structPtr->visibleEntries - 1)
+ {
+ structPtr->selectedIndexOffset++;
+ return 1;
+ }
+ else if (!ShouldShowDownArrow())
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ return 0;
+ }
+ MatchCall_MoveWindow(1, TRUE);
+ return 2;
+}
+
+u32 MatchCall_PageUp(void)
+{
+ struct MatchCallWindowState *structPtr;
+ s32 scroll;
+
+ structPtr = GetMatchCallWindowStruct();
+ if (ShouldShowUpArrow())
+ {
+ if (structPtr->windowTopIndex >= structPtr->visibleEntries)
+ scroll = structPtr->visibleEntries;
+ else
+ scroll = structPtr->windowTopIndex;
+ MatchCall_MoveWindow(scroll * -1, TRUE);
+ return 2;
+ }
+ else if (structPtr->selectedIndexOffset != 0)
+ {
+ structPtr->selectedIndexOffset = 0;
+ return 1;
+ }
+ else
+ {
+ return 0;
+ }
+}
+
+u32 MatchCall_PageDown(void)
+{
+ struct MatchCallWindowState *structPtr;
+ structPtr = GetMatchCallWindowStruct();
+
+ if (ShouldShowDownArrow())
+ {
+ s32 scroll;
+ s32 windowBottomIndex;
+ s32 v3;
+ windowBottomIndex = structPtr->windowTopIndex + structPtr->visibleEntries;
+ scroll = structPtr->unk4 - structPtr->windowTopIndex;
+ if (windowBottomIndex <= structPtr->unk4)
+ scroll = structPtr->visibleEntries;
+ MatchCall_MoveWindow(scroll, TRUE);
+ return 2;
+ }
+ else
+ {
+ s32 cursor;
+ s32 lastVisibleIndex;
+ if (structPtr->listLength >= structPtr->visibleEntries)
+ {
+ cursor = structPtr->selectedIndexOffset;
+ lastVisibleIndex = structPtr->visibleEntries;
+ }
+ else
+ {
+ cursor = structPtr->selectedIndexOffset;
+ lastVisibleIndex = structPtr->listLength;
+ }
+ lastVisibleIndex -= 1;
+ if (cursor >= lastVisibleIndex)
+ {
+ return 0;
+ }
+ else
+ {
+ structPtr->selectedIndexOffset = lastVisibleIndex;
+ return 1;
+ }
+ }
+}
+
+u32 GetSelectedMatchCall(void)
+{
+ struct MatchCallWindowState *structPtr;
+ structPtr = GetMatchCallWindowStruct();
+
+ return structPtr->windowTopIndex + structPtr->selectedIndexOffset;
+}
+
+u32 GetMatchCallListTopIndex(void)
+{
+ struct MatchCallWindowState *structPtr;
+ structPtr = GetMatchCallWindowStruct();
+
+ return structPtr->windowTopIndex;
+}
+
+void sub_81C877C(void)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ structPtr = GetSubstructPtr(0x11);
+ structPtr->unk89C = 0;
+ structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8870, 6);
+}
+
+void sub_81C87AC(u16 a0)
+{
+ u16 temp;
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ structPtr = GetSubstructPtr(0x11);
+ temp = structPtr->unk888.windowTopIndex;
+ temp += a0;
+ structPtr->unk888.windowTopIndex = temp;
+ structPtr->unk89C = 0;
+ structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8958, 6);
+}
+
+void sub_81C87F0(void)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ structPtr = GetSubstructPtr(0x11);
+ structPtr->unk89C = 0;
+ structPtr->unk8A0 = CreateLoopedTask(LoopedTask_sub_81C8A28, 6);
+}
+
+bool32 sub_81C8820(void)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ structPtr = GetSubstructPtr(0x11);
+ return IsLoopedTaskActive(structPtr->unk8A0);
+}
+
+void sub_81C8838(void)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ struct MatchCallWindowState *subStr;
+ structPtr = GetSubstructPtr(0x11);
+ subStr = &structPtr->unk888;
+ structPtr->unk0.unk38(structPtr->unk0.unk0.windowId, subStr->windowTopIndex + subStr->selectedIndexOffset, (structPtr->unk0.unk0.unkA + subStr->selectedIndexOffset) & 0xF);
+ CopyWindowToVram(structPtr->unk0.unk0.windowId, 1);
+}
+
+u32 LoopedTask_sub_81C8870(s32 a0)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ u16 v1;
+ u32 v2;
+
+ // Needed to fix a register renaming issue.
+ register u16* temp asm("r1");
+ structPtr = GetSubstructPtr(0x11);
+
+ switch (a0)
+ {
+ case 0:
+ ToggleMatchCallArrows(&structPtr->unk0, 1);
+ // fall-through
+ case 1:
+ if (structPtr->unk89C != structPtr->unk888.selectedIndexOffset)
+ sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, 1);
+
+ structPtr->unk89C++;
+ return 0;
+ case 2:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return 2;
+
+ if (structPtr->unk89C != structPtr->unk888.visibleEntries)
+ return 6;
+
+ if (structPtr->unk888.selectedIndexOffset != 0)
+ sub_81C8B70(&structPtr->unk0.unk0, structPtr->unk89C, structPtr->unk888.selectedIndexOffset);
+
+ return 0;
+ case 3:
+ if (IsDma3ManagerBusyWithBgCopy())
+ return 2;
+ temp = &structPtr->unk888.selectedIndexOffset;
+ v1 = *temp;
+ if (v1 == 0)
+ return 4;
+
+ MatchCall_MoveWindow(v1, FALSE);
+ return 0;
+ case 4:
+ v2 = sub_81C8630();
+ if (v2)
+ return 2;
+
+ structPtr->unk888.selectedIndexOffset = v2;
+ return 4;
+ default:
+ return 4;
+ }
+}
+
+u32 LoopedTask_sub_81C8958(s32 a0)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ structPtr = GetSubstructPtr(0x11);
+ if (IsDma3ManagerBusyWithBgCopy())
+ return 2;
+
+ switch (a0)
+ {
+ case 0:
+ sub_81C8CB4(&structPtr->unk888, &structPtr->unk0);
+ break;
+ case 1:
+ PrintMatchCallFieldNames(&structPtr->unk0, 0);
+ break;
+ case 2:
+ sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 0);
+ break;
+ case 3:
+ PrintMatchCallFieldNames(&structPtr->unk0, 1);
+ break;
+ case 4:
+ sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 1);
+ break;
+ case 5:
+ PrintMatchCallFieldNames(&structPtr->unk0, 2);
+ break;
+ case 6:
+ sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 2);
+ break;
+ case 7:
+ sub_81C8E54(&structPtr->unk888, &structPtr->unk0, 3);
+ break;
+ default:
+ return 4;
+ }
+ return 0;
+}
+
+u32 LoopedTask_sub_81C8A28(s32 a0)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ struct MatchCallWindowState *subPtr888;
+ register struct UnknownInnerStruct_81C81D4 *subPtr0 asm("r2");
+ s32 v4;
+
+ if (IsDma3ManagerBusyWithBgCopy())
+ {
+ return 2;
+ }
+
+ structPtr = GetSubstructPtr(0x11);
+ subPtr888 = &structPtr->unk888;
+ subPtr0 = &structPtr->unk0;
+
+ switch (a0)
+ {
+ default:
+ return 4;
+ case 0:
+ sub_81C8D4C(subPtr888, subPtr0);
+ return 0;
+ case 1:
+ {
+ s32 v1;
+ s32 v2;
+ u32 *v3;
+ register s32 v4 asm("r5");
+
+ v3 = &structPtr->unk89C;
+ v1 = *v3 + 1;
+ *v3 = v1;
+ if (v1 < structPtr->unk888.visibleEntries)
+ {
+ sub_81C8B70(&subPtr0->unk0, v1, 1);
+ return 2;
+ }
+
+ *v3 = 0;
+ if (subPtr888->listLength <= subPtr888->visibleEntries)
+ {
+ register u32 temp asm("r0");
+ temp = subPtr888->windowTopIndex;
+ if (temp == 0)
+ return 9;
+ v2 = temp;
+ }
+ else
+ {
+ register s32 temp asm("r1");
+ v2 = subPtr888->windowTopIndex + subPtr888->visibleEntries;
+ temp = (s32)subPtr888->listLength;
+ if (v2 <= temp)
+ return 9;
+ v2 -= temp;
+ }
+ v4 = v2 * -1;
+ sub_81C8B70(&subPtr0->unk0, v4, v2);
+ subPtr888->selectedIndexOffset = v2;
+ *v3 = v4;
+ return 0;
+ }
+ case 2:
+ MatchCall_MoveWindow(structPtr->unk89C, FALSE);
+ return 0;
+ case 3:
+ if (sub_81C8630())
+ return 2;
+
+ structPtr->unk89C = 0;
+ return 1;
+ case 4:
+ sub_81C83AC(subPtr888->unk10, subPtr888->windowTopIndex + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, &structPtr->unk0);
+ return 0;
+ case 5:
+ if (sub_81C83E0())
+ return 2;
+
+ v4 = ++structPtr->unk89C;
+ if (v4 >= subPtr888->listLength || v4 >= subPtr888->visibleEntries)
+ return 1;
+ return 9;
+ case 6:
+ ToggleMatchCallArrows(subPtr0, 0);
+ return 4;
+ }
}
-*/
+
+void sub_81C8B70(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1, u32 a2)
+{
+ u8 *v1;
+ u32 v2;
+
+ v1 = (u8*)GetWindowAttribute(a0->windowId, WINDOW_TILE_DATA);
+ v2 = a0->unk4 * 64;
+
+ a1 = (a0->unkA + a1) & 0xF;
+ if ((s32)(a1 + a2) <= 16)
+ {
+ CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, a2 * v2);
+ CopyWindowToVram(a0->windowId, 2);
+ }
+ else
+ {
+ u32 v3;
+ u32 v4;
+
+ v3 = 16 - a1;
+ v4 = a2 - v3;
+
+ CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, v3 * v2);
+ CpuFastFill8(PIXEL_FILL(1), v1, v4 * v2);
+ CopyWindowToVram(a0->windowId, 2);
+ }
+
+ a2 -= 1;
+ for (a2; a2 != -1; a1 = (a1 + 1) & 0xF, a2--)
+ {
+ sub_81CBD48(a0->windowId, a1);
+ }
+
+ CopyWindowToVram(a0->windowId, 1);
+}
+
+void sub_81C8C64(struct UnknownSubSubStruct_0203CF40 *a0, u32 a1)
+{
+ u16 *v1;
+ register u32 v2 asm("r0");
+ u32 v3;
+
+ v1 = (u16*)GetBgTilemapBuffer(GetWindowAttribute(a0->windowId, WINDOW_BG));
+
+ v1 = &v1[(a0->unkA << 6) + a0->unk2 - 1];
+
+ if (a1 != 0)
+ {
+ v2 = a0->unk1 << 12;
+ v3 = a0->unk6 + 1;
+ }
+ else
+ {
+ v2 = a0->unk1 << 12;
+ v3 = a0->unk6;
+ }
+ {
+ register u16 v5 asm("r1");
+ register u32 v6 asm("r0");
+ v6 = (v3 | v2);
+ v6 = v6 << 16;
+ v5 = v6 >> 16;
+ v1[0] = v5;
+ v1[0x20] = v5;
+ }
+}
+
+void sub_81C8CB4(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1)
+{
+ u8 colors[3];
+
+
+ memcpy(colors, sPokenavColors_0861FBE4, ARRAY_COUNT(sPokenavColors_0861FBE4));
+
+ a1->unk34(a0->unk10 + a0->unkC * a0->windowTopIndex, a1->unkTextBuffer);
+ a1->unk38(a1->unk0.windowId, a0->windowTopIndex, a1->unk0.unkA);
+ FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(4), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16);
+ AddTextPrinterParameterized3(a1->unk0.windowId, a1->unk0.fontId, 8, (a1->unk0.unkA * 16) + 1, colors, TEXT_SPEED_FF, a1->unkTextBuffer);
+ sub_81C8C64(&a1->unk0, 1);
+ CopyWindowRectToVram(a1->unk0.windowId, 3, 0, a1->unk0.unkA * 2, a1->unk0.unk4, 2);
+}
+
+void sub_81C8D4C(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1)
+{
+ a1->unk34(a0->unk10 + a0->unkC * a0->windowTopIndex, a1->unkTextBuffer);
+ FillWindowPixelRect(a1->unk0.windowId, PIXEL_FILL(1), 0, a1->unk0.unkA * 16, a1->unk0.unk4 * 8, 16);
+ AddTextPrinterParameterized(a1->unk0.windowId, a1->unk0.fontId, a1->unkTextBuffer, 8, a1->unk0.unkA * 16 + 1, TEXT_SPEED_FF, NULL);
+ sub_81C8C64(&a1->unk0, 0);
+ CopyWindowToVram(a1->unk0.windowId, 3);
+}
+
+void PrintMatchCallFieldNames(struct UnknownInnerStruct_81C81D4 *a0, u32 fieldId)
+{
+ const u8 *fieldNames[3];
+ u8 colors[3];
+ u32 r4;
+ u32 r5;
+ u32 tmp;
+ u32 one;
+
+ memcpy(fieldNames, sMatchCallFieldNames, sizeof(sMatchCallFieldNames));
+ memcpy(colors, sMatchCallFieldColors, sizeof(sMatchCallFieldColors));
+
+ r4 = a0->unk0.unkA;
+ tmp = fieldId * 2 + 1;
+ r4 += tmp;
+ r4 &= 0xF;
+ FillWindowPixelRect(a0->unk0.windowId, PIXEL_FILL(1), 0, r4 << 4, a0->unk0.unk4, 16);
+
+ // This is a fake match. It should be this:
+ // AddTextPrinterParameterized3(a0->unk0.windowId, 7, 2, r4 << 4 + 1, colors, TEXT_SPEED_FF, fieldNames[fieldId]);
+ // But the original GCC does some clever reuse of the `1` constant that the current GCC doesn't.
+ one = 1;
+ AddTextPrinterParameterized3(a0->unk0.windowId, 7, 2, (r4 << 4) + one, colors, one - 2, fieldNames[fieldId]);
+ CopyWindowRectToVram(a0->unk0.windowId, 2, 0, r4 << 1, a0->unk0.unk4, 2);
+}
+
+void sub_81C8E54(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1, u32 a2)
+{
+ const u8 *str;
+ u32 r6;
+
+ r6 = (a1->unk0.unkA + sUnknown_0861FBF7[a2]) & 0xF;
+
+ str = sub_81CAFD8(a0->windowTopIndex, a2);
+ if (str != NULL) {
+ sub_81DB620(a1->unk0.windowId, 1, r6 * 2, a1->unk0.unk4 - 1, 2);
+ AddTextPrinterParameterized(a1->unk0.windowId, 7, str, 2, (r6 << 4) + 1, TEXT_SPEED_FF, NULL);
+ CopyWindowRectToVram(a1->unk0.windowId, 2, 0, r6 * 2, a1->unk0.unk4, 2);
+ }
+}
+
+void sub_81C8ED0(void)
+{
+ u32 i;
+ const struct CompressedSpriteSheet *ptr;
+
+ for (i = 0, ptr = sMatchcallArrowSpriteSheet; i < ARRAY_COUNT(sMatchcallArrowSpriteSheet); ptr++, i++)
+ {
+ LoadCompressedSpriteSheet(ptr);
+ }
+ Pokenav_AllocAndLoadPalettes(sMatchcallArrowPalette);
+}
+
+void sub_81C8EF8(struct MatchCallWindowState *a0, struct UnknownInnerStruct_81C81D4 *a1)
+{
+ register u32 spriteId asm("r3");
+ s16 temp;
+
+ spriteId = (u8)CreateSprite(&sMatchCallRightArrowSprite, a1->unk0.unk2 * 8 + 3, (a1->unk0.unk3 + 1) * 8, 7);
+ a1->rightArrow = &gSprites[spriteId];
+
+ temp = a1->unk0.unk2 * 8 + (a1->unk0.unk4 - 1) * 4;
+ spriteId = (u8)CreateSprite(&sMatchCallUpDownArrowSprite, temp, a1->unk0.unk3 * 8 + a0->visibleEntries * 16, 7);
+ a1->downArrow = &gSprites[spriteId];
+ a1->downArrow->oam.tileNum += 2;
+ a1->downArrow->callback = SpriteCB_MatchCallDownArrow;
+
+ spriteId = (u8)CreateSprite(&sMatchCallUpDownArrowSprite, temp, a1->unk0.unk3 * 8, 7);
+ a1->upArrow = &gSprites[spriteId];
+ a1->upArrow->oam.tileNum += 4;
+ a1->upArrow->callback = SpriteCB_MatchCallUpArrow;
+}
+
+void sub_81C8FE0(struct UnknownInnerStruct_81C81D4 *a0)
+{
+ DestroySprite(a0->rightArrow);
+ DestroySprite(a0->upArrow);
+ DestroySprite(a0->downArrow);
+ FreeSpriteTilesByTag(0xA);
+ FreeSpritePaletteByTag(0x14);
+}
+
+void ToggleMatchCallArrows(struct UnknownInnerStruct_81C81D4 *a0, bool32 shouldHide)
+{
+ if (shouldHide)
+ {
+ a0->rightArrow->callback = SpriteCallbackDummy;
+ a0->upArrow->callback = SpriteCallbackDummy;
+ a0->downArrow->callback = SpriteCallbackDummy;
+ }
+ else
+ {
+ a0->rightArrow->callback = SpriteCB_MatchCallRightArrow;
+ a0->upArrow->callback = SpriteCB_MatchCallUpArrow;
+ a0->downArrow->callback = SpriteCB_MatchCallDownArrow;
+ }
+ a0->rightArrow->invisible = shouldHide;
+ a0->upArrow->invisible = shouldHide;
+ a0->downArrow->invisible = shouldHide;
+}
+
+void SpriteCB_MatchCallRightArrow(struct Sprite *sprite)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ structPtr = GetSubstructPtr(0x11);
+ sprite->pos2.y = structPtr->unk888.selectedIndexOffset << 4;
+}
+
+void SpriteCB_MatchCallDownArrow(struct Sprite *sprite)
+{
+ if (sprite->data[7] == 0 && ShouldShowDownArrow())
+ sprite->invisible = FALSE;
+ else
+ sprite->invisible = TRUE;
+
+ if (++sprite->data[0] > 3)
+ {
+ s16 offset;
+
+ sprite->data[0] = 0;
+ offset = (sprite->data[1] + 1) & 7;
+ sprite->data[1] = offset;
+ sprite->pos2.y = offset;
+ }
+}
+
+void SpriteCB_MatchCallUpArrow(struct Sprite *sprite)
+{
+ if (sprite->data[7] == 0 && ShouldShowUpArrow())
+ sprite->invisible = FALSE;
+ else
+ sprite->invisible = TRUE;
+
+ if (++sprite->data[0] > 3)
+ {
+ s16 offset;
+
+ sprite->data[0] = 0;
+ offset = (sprite->data[1] + 1) & 7;
+ sprite->data[1] = offset;
+ sprite->pos2.y = -1 * offset;
+ }
+}
+
+void ToggleMatchCallVerticalArrows(bool32 shouldHide)
+{
+ struct UnknownSubStruct_81C81D4 *structPtr;
+ structPtr = GetSubstructPtr(0x11);
+ structPtr->unk0.upArrow->data[7] = shouldHide;
+ structPtr->unk0.downArrow->data[7] = shouldHide;
+}
+
+void sub_81C9160(struct MatchCallWindowState *a0, struct MatchCallListTemplate *a1)
+{
+ u32 unused1 = a0->unk10 = a1->unk0;
+ u32 v0 = a1->unk6;
+ u32 zero = 0;
+ u32 unused2 = a0->windowTopIndex = v0;
+ u32 v1 = a0->listLength = a1->unk4;
+
+ a0->unkC = a1->unk8;
+ a0->visibleEntries = a1->unkC;
+ if (a0->visibleEntries >= (u16)v1)
+ {
+ a0->windowTopIndex = 0;
+ a0->unk4 = 0;
+ a0->selectedIndexOffset = v0;
+ }
+ else
+ {
+ s32 v2;
+ a0->unk4 = a0->listLength - a0->visibleEntries;
+ v2 = a0->windowTopIndex + a0->visibleEntries;
+ if (v2 > a0->listLength) {
+ a0->selectedIndexOffset = v2 - a0->listLength;
+ a0->windowTopIndex = v0 - a0->selectedIndexOffset;
+ }
+ else
+ {
+ a0->selectedIndexOffset = 0;
+ }
+ }
+}
+
+u32 sub_81C91AC(struct UnknownInnerStruct_81C81D4 *a0, const struct BgTemplate *a1, struct MatchCallListTemplate *a2, s32 a3)
+{
+ register u32 raw_bg asm("r4") = ((a1->bg) << 30);
+ u8 bg = raw_bg >> 30;
+ u32 unknown = 0;
+ struct WindowTemplate window;
+ u8 bg_again;
+
+ a0->unk0.bg = bg;
+ a0->unk0.unk6 = a3;
+ a0->unk34 = a2->unk10;
+ a0->unk38 = a2->unk14;
+ a0->unk0.unk1 = a2->unkD;
+ a0->unk0.unk2 = a2->unk9;
+ a0->unk0.unk3 = a2->unkB;
+ a0->unk0.unk4 = a2->unkA;
+ a0->unk0.fontId = a2->unkE;
+
+ window.bg = raw_bg >> 30;
+ window.tilemapLeft = a2->unk9;
+ window.tilemapTop = 0;
+ window.width = a2->unkA;
+ window.height = 32;
+ window.paletteNum = a2->unkD;
+ window.baseBlock = a3 + 2;
+
+ a0->unk0.windowId = AddWindow(&window);
+ if (a0->unk0.windowId == 0xFF)
+ {
+ return 0;
+ }
+ else
+ {
+ a0->unk0.unkA = unknown;
+ a0->rightArrow = NULL;
+ a0->upArrow = NULL;
+ a0->downArrow = NULL;
+ return 1;
+ }
+} \ No newline at end of file
diff --git a/src/strings.c b/src/strings.c
index 44c2ae1a2..12cf9cacf 100644
--- a/src/strings.c
+++ b/src/strings.c
@@ -962,9 +962,9 @@ const u8 gUnknown_085EBE7D[] = _("DETAIL");
const u8 gUnknown_085EBE84[] = _("CALL");
const u8 gUnknown_085EBE89[] = _("EXIT");
const u8 gUnknown_085EBE8E[] = _("Can't call opponent here.");
-const u8 gUnknown_085EBEA8[] = _("STRATEGY");
-const u8 gUnknown_085EBEB1[] = _("TRAINER'S POKéMON");
-const u8 gUnknown_085EBEC3[] = _("SELF-INTRODUCTION");
+const u8 gText_NavgearMatchCall_Strategy[] = _("STRATEGY");
+const u8 gText_NavgearMatchCall_TrainerPokemon[] = _("TRAINER'S POKéMON");
+const u8 gText_NavgearMatchCall_SelfIntroduction[] = _("SELF-INTRODUCTION");
const u8 gText_Navgear_ClearButtonList[] = _("{CLEAR 0x80}");
const u8 gText_NavgearMap_ZoomedOutButtons[] = _("{A_BUTTON}ZOOM {B_BUTTON}CANCEL");
const u8 gText_NavgearMap_ZoomedInButtons[] = _("{A_BUTTON}FULL {B_BUTTON}CANCEL");
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 40171a167..8ad36666a 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -168,16 +168,7 @@ gUnknown_02022D00: @ 2022D00
.include "src/pokemon_summary_screen.o"
.include "src/unk_pokedex_area_screen_helper.o"
.include "src/battle_pyramid_bag.o"
-
- @ pokenav
-gUnknown_0203CF3C: @ 203CF3C
- .space 0x4
-
-gUnknown_0203CF40: @ 203CF40
- .space 0x4
-
-gUnknown_0203CF44: @ 203CF44
- .space 0x4
+ .include "src/pokenav.o"
.include "src/menu_specialized.o"
.include "src/faraway_island.o"