diff options
-rwxr-xr-x | asm/pokemon_jump.s | 2 | ||||
-rw-r--r-- | asm/pokenav.s | 2343 | ||||
-rw-r--r-- | data/pokenav.s | 114 | ||||
-rw-r--r-- | include/graphics.h | 7 | ||||
-rw-r--r-- | include/menu.h | 1 | ||||
-rw-r--r-- | include/strings.h | 3 | ||||
-rw-r--r-- | src/menu.c | 2 | ||||
-rw-r--r-- | src/pokenav.c | 2094 | ||||
-rw-r--r-- | src/strings.c | 6 | ||||
-rw-r--r-- | sym_ewram.txt | 11 |
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" |