diff options
author | Cameron Hall <camthesaxman@users.noreply.github.com> | 2017-01-26 01:07:36 -0500 |
---|---|---|
committer | YamaArashi <YamaArashi@users.noreply.github.com> | 2017-01-25 22:07:36 -0800 |
commit | 448acff16e53485c5cfb90983a7a1e1b4644c30b (patch) | |
tree | 47525f8d2a65bd906b026d3c29160103b7c3a9d9 | |
parent | 9442bdcbf3abf3e44d2829ec72bfe23649c7d8ac (diff) |
finish decompiling naming_screen (#217)
* decompile more code
* incbin graphics data
* decompile more code
* decompile more code
* finish decompiling
* name some functions and variables
-rw-r--r-- | asm/naming_screen.s | 1290 | ||||
-rw-r--r-- | data/naming_screen.s | 107 | ||||
-rw-r--r-- | include/sprite.h | 4 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/naming_screen.c | 1595 | ||||
-rw-r--r-- | src/sprite.c | 4 |
6 files changed, 1146 insertions, 1855 deletions
diff --git a/asm/naming_screen.s b/asm/naming_screen.s deleted file mode 100644 index a2da2caf4..000000000 --- a/asm/naming_screen.s +++ /dev/null @@ -1,1290 +0,0 @@ - .include "constants/gba_constants.inc" - .include "constants/species_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_80B7090 -sub_80B7090: @ 80B7090 - push {r4-r7,lr} - bl sub_80B6F84 - lsls r0, 24 - lsrs r5, r0, 24 - adds r7, r5, 0 - ldr r0, _080B70C8 @ =0x02000000 - adds r0, 0x11 - adds r0, r5, r0 - ldrb r4, [r0] - adds r6, r4, 0 - adds r0, r4, 0 - bl sub_80B7198 - lsls r0, 24 - cmp r0, 0 - beq _080B70D6 - adds r0, r4, 0 - bl sub_80B7264 - lsls r0, 24 - cmp r0, 0 - beq _080B70CC - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_80B7370 - b _080B70F4 - .align 2, 0 -_080B70C8: .4byte 0x02000000 -_080B70CC: - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_80B73CC - b _080B70F4 -_080B70D6: - adds r0, r4, 0 - bl sub_80B71E4 - lsls r0, 24 - cmp r0, 0 - beq _080B70EC - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_80B7474 - b _080B70F4 -_080B70EC: - adds r0, r6, 0 - adds r1, r7, 0 - bl sub_80B72A4 -_080B70F4: - bl sub_80B7960 - movs r0, 0x5 - bl PlaySE - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80B7090 - - thumb_func_start sub_80B7104 -sub_80B7104: @ 80B7104 - push {r4,r5,lr} - bl sub_80B6F84 - lsls r0, 24 - lsrs r5, r0, 24 - ldr r0, _080B7128 @ =0x02000000 - adds r0, 0x11 - adds r0, r5, r0 - ldrb r4, [r0] - adds r0, r4, 0 - bl sub_80B720C - lsls r0, 24 - cmp r0, 0 - bne _080B712C - movs r0, 0 - b _080B7136 - .align 2, 0 -_080B7128: .4byte 0x02000000 -_080B712C: - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_80B72A4 - movs r0, 0x1 -_080B7136: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_80B7104 - - thumb_func_start sub_80B713C -sub_80B713C: @ 80B713C - push {r4,r5,lr} - bl sub_80B6F84 - lsls r0, 24 - lsrs r5, r0, 24 - ldr r0, _080B7160 @ =0x02000000 - adds r0, 0x11 - adds r0, r5, r0 - ldrb r4, [r0] - adds r0, r4, 0 - bl sub_80B7264 - lsls r0, 24 - cmp r0, 0 - bne _080B7164 - movs r0, 0 - b _080B716E - .align 2, 0 -_080B7160: .4byte 0x02000000 -_080B7164: - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_80B7370 - movs r0, 0x1 -_080B716E: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_80B713C - - thumb_func_start sub_80B7174 -sub_80B7174: @ 80B7174 - push {r4,lr} - adds r4, r0, 0 - lsls r4, 24 - lsrs r4, 24 - bl sub_80B6F44 - lsls r0, 24 - lsrs r0, 24 - ldr r1, _080B7194 @ =0x02000000 - adds r1, 0x11 - adds r0, r1 - strb r4, [r0] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080B7194: .4byte 0x02000000 - thumb_func_end sub_80B7174 - - thumb_func_start sub_80B7198 -sub_80B7198: @ 80B7198 - push {lr} - lsls r0, 24 - lsrs r1, r0, 24 - movs r2, 0xC9 - lsls r2, 24 - adds r0, r2 - lsrs r0, 24 - cmp r0, 0x13 - bls _080B71DA - adds r0, r1, 0 - adds r0, 0x79 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B71DA - adds r0, r1, 0 - adds r0, 0x74 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B71DA - adds r0, r1, 0 - adds r0, 0x6F - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B71DA - adds r0, r1, 0 - adds r0, 0x6A - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B71DE -_080B71DA: - movs r0, 0x1 - b _080B71E0 -_080B71DE: - movs r0, 0 -_080B71E0: - pop {r1} - bx r1 - thumb_func_end sub_80B7198 - - thumb_func_start sub_80B71E4 -sub_80B71E4: @ 80B71E4 - push {lr} - lsls r0, 24 - lsrs r1, r0, 24 - movs r2, 0xB5 - lsls r2, 24 - adds r0, r2 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B7202 - adds r0, r1, 0 - adds r0, 0x65 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B7206 -_080B7202: - movs r0, 0x1 - b _080B7208 -_080B7206: - movs r0, 0 -_080B7208: - pop {r1} - bx r1 - thumb_func_end sub_80B71E4 - - thumb_func_start sub_80B720C -sub_80B720C: @ 80B720C - push {lr} - lsls r0, 24 - lsrs r1, r0, 24 - movs r2, 0xFA - lsls r2, 24 - adds r0, r2 - lsrs r0, 24 - cmp r0, 0xE - bls _080B725A - adds r0, r1, 0 - subs r0, 0x1A - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B725A - adds r0, r1, 0 - subs r0, 0x4B - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B725A - adds r0, r1, 0 - subs r0, 0x56 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0xE - bls _080B725A - adds r0, r1, 0 - subs r0, 0x6A - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B725A - adds r0, r1, 0 - adds r0, 0x65 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B725E -_080B725A: - movs r0, 0x1 - b _080B7260 -_080B725E: - movs r0, 0 -_080B7260: - pop {r1} - bx r1 - thumb_func_end sub_80B720C - - thumb_func_start sub_80B7264 -sub_80B7264: @ 80B7264 - push {lr} - lsls r0, 24 - lsrs r1, r0, 24 - movs r2, 0xE6 - lsls r2, 24 - adds r0, r2 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B729A - adds r0, r1, 0 - subs r0, 0x46 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B729A - adds r0, r1, 0 - subs r0, 0x6A - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B729A - adds r0, r1, 0 - adds r0, 0x6A - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B729E -_080B729A: - movs r0, 0x1 - b _080B72A0 -_080B729E: - movs r0, 0 -_080B72A0: - pop {r1} - bx r1 - thumb_func_end sub_80B7264 - - thumb_func_start sub_80B72A4 -sub_80B72A4: @ 80B72A4 - push {lr} - lsls r0, 24 - lsls r1, 24 - lsrs r1, 24 - lsrs r2, r0, 24 - movs r3, 0xFA - lsls r3, 24 - adds r0, r3 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B72C0 - adds r0, r2, 0 - adds r0, 0x31 - b _080B735A -_080B72C0: - adds r0, r2, 0 - subs r0, 0xB - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B72D2 - adds r0, r2, 0 - adds r0, 0x31 - b _080B735A -_080B72D2: - adds r0, r2, 0 - subs r0, 0x10 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B72E4 - adds r0, r2, 0 - adds r0, 0x31 - b _080B735A -_080B72E4: - adds r0, r2, 0 - subs r0, 0x1A - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B72F6 - adds r0, r2, 0 - adds r0, 0x2C - b _080B735A -_080B72F6: - adds r0, r2, 0 - subs r0, 0x4B - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B7356 - adds r0, r2, 0 - subs r0, 0x56 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B7314 - adds r0, r2, 0 - adds r0, 0x31 - b _080B735A -_080B7314: - adds r0, r2, 0 - subs r0, 0x5B - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B7326 - adds r0, r2, 0 - adds r0, 0x31 - b _080B735A -_080B7326: - adds r0, r2, 0 - subs r0, 0x60 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B7338 - adds r0, r2, 0 - adds r0, 0x31 - b _080B735A -_080B7338: - adds r0, r2, 0 - subs r0, 0x6A - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B734A - adds r0, r2, 0 - adds r0, 0x2C - b _080B735A -_080B734A: - adds r0, r2, 0 - adds r0, 0x65 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B735E -_080B7356: - adds r0, r2, 0 - adds r0, 0xFB -_080B735A: - lsls r0, 24 - lsrs r2, r0, 24 -_080B735E: - ldr r0, _080B736C @ =0x02000000 - adds r0, 0x11 - adds r0, r1, r0 - strb r2, [r0] - pop {r0} - bx r0 - .align 2, 0 -_080B736C: .4byte 0x02000000 - thumb_func_end sub_80B72A4 - - thumb_func_start sub_80B7370 -sub_80B7370: @ 80B7370 - push {lr} - lsls r0, 24 - lsls r1, 24 - lsrs r1, 24 - lsrs r2, r0, 24 - movs r3, 0xE6 - lsls r3, 24 - adds r0, r3 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B738C - adds r0, r2, 0 - adds r0, 0x31 - b _080B73B8 -_080B738C: - adds r0, r2, 0 - subs r0, 0x46 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B73B6 - adds r0, r2, 0 - subs r0, 0x6A - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B73AA - adds r0, r2, 0 - adds r0, 0x31 - b _080B73B8 -_080B73AA: - adds r0, r2, 0 - adds r0, 0x6A - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B73BC -_080B73B6: - adds r0, r2, 0x5 -_080B73B8: - lsls r0, 24 - lsrs r2, r0, 24 -_080B73BC: - ldr r0, _080B73C8 @ =0x02000000 - adds r0, 0x11 - adds r0, r1, r0 - strb r2, [r0] - pop {r0} - bx r0 - .align 2, 0 -_080B73C8: .4byte 0x02000000 - thumb_func_end sub_80B7370 - - thumb_func_start sub_80B73CC -sub_80B73CC: @ 80B73CC - push {lr} - lsls r0, 24 - lsls r1, 24 - lsrs r1, 24 - lsrs r2, r0, 24 - movs r3, 0xC9 - lsls r3, 24 - adds r0, r3 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B73E8 - adds r0, r2, 0 - adds r0, 0xCF - b _080B745E -_080B73E8: - adds r0, r2, 0 - subs r0, 0x3C - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B73FA - adds r0, r2, 0 - adds r0, 0xCF - b _080B745E -_080B73FA: - adds r0, r2, 0 - subs r0, 0x41 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B740C - adds r0, r2, 0 - adds r0, 0xCF - b _080B745E -_080B740C: - adds r0, r2, 0 - subs r0, 0x46 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B745A - adds r0, r2, 0 - adds r0, 0x79 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B742A - adds r0, r2, 0 - adds r0, 0xCF - b _080B745E -_080B742A: - adds r0, r2, 0 - adds r0, 0x74 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B743C - adds r0, r2, 0 - adds r0, 0xCF - b _080B745E -_080B743C: - adds r0, r2, 0 - adds r0, 0x6F - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B744E - adds r0, r2, 0 - adds r0, 0xCF - b _080B745E -_080B744E: - adds r0, r2, 0 - adds r0, 0x6A - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B7462 -_080B745A: - adds r0, r2, 0 - adds r0, 0xD4 -_080B745E: - lsls r0, 24 - lsrs r2, r0, 24 -_080B7462: - ldr r0, _080B7470 @ =0x02000000 - adds r0, 0x11 - adds r0, r1, r0 - strb r2, [r0] - pop {r0} - bx r0 - .align 2, 0 -_080B7470: .4byte 0x02000000 - thumb_func_end sub_80B73CC - - thumb_func_start sub_80B7474 -sub_80B7474: @ 80B7474 - push {lr} - lsls r0, 24 - lsls r1, 24 - lsrs r1, 24 - lsrs r2, r0, 24 - movs r3, 0xB5 - lsls r3, 24 - adds r0, r3 - lsrs r0, 24 - cmp r0, 0x4 - bls _080B7496 - adds r0, r2, 0 - adds r0, 0x65 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x4 - bhi _080B749E -_080B7496: - adds r0, r2, 0 - adds r0, 0xCF - lsls r0, 24 - lsrs r2, r0, 24 -_080B749E: - ldr r0, _080B74AC @ =0x02000000 - adds r0, 0x11 - adds r0, r1, r0 - strb r2, [r0] - pop {r0} - bx r0 - .align 2, 0 -_080B74AC: .4byte 0x02000000 - thumb_func_end sub_80B7474 - - thumb_func_start sub_80B74B0 -sub_80B74B0: @ 80B74B0 - push {r4,lr} - movs r1, 0 - ldr r3, _080B74E4 @ =0x02000000 - ldr r0, [r3, 0x34] - ldrb r0, [r0, 0x1] - cmp r1, r0 - bcs _080B74F6 - adds r2, r3, 0 - adds r4, r3, 0 - adds r4, 0x11 -_080B74C4: - adds r0, r1, r4 - ldrb r0, [r0] - cmp r0, 0 - beq _080B74E8 - cmp r0, 0xFF - beq _080B74E8 - ldr r0, [r2, 0x38] - ldr r1, [r2, 0x34] - ldrb r2, [r1, 0x1] - adds r2, 0x1 - lsls r2, 24 - lsrs r2, 24 - adds r1, r4, 0 - bl StringCopyN - b _080B74F6 - .align 2, 0 -_080B74E4: .4byte 0x02000000 -_080B74E8: - adds r0, r1, 0x1 - lsls r0, 24 - lsrs r1, r0, 24 - ldr r0, [r3, 0x34] - ldrb r0, [r0, 0x1] - cmp r1, r0 - bcc _080B74C4 -_080B74F6: - pop {r4} - pop {r0} - bx r0 - thumb_func_end sub_80B74B0 - - thumb_func_start sub_80B74FC -sub_80B74FC: @ 80B74FC - push {r4,lr} - ldr r0, _080B7528 @ =gStringVar1 - ldr r1, _080B752C @ =0x02000000 - ldr r1, [r1, 0x38] - bl StringCopy - ldr r4, _080B7530 @ =gStringVar4 - ldr r1, _080B7534 @ =gOtherText_SentToPC - adds r0, r4, 0 - bl StringExpandPlaceholders - ldr r0, _080B7538 @ =gWindowConfig_81E6E88 - bl BasicInitMenuWindow - bl MenuDisplayMessageBox - adds r0, r4, 0 - bl sub_8072044 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080B7528: .4byte gStringVar1 -_080B752C: .4byte 0x02000000 -_080B7530: .4byte gStringVar4 -_080B7534: .4byte gOtherText_SentToPC -_080B7538: .4byte gWindowConfig_81E6E88 - thumb_func_end sub_80B74FC - - thumb_func_start sub_80B753C -sub_80B753C: @ 80B753C - push {lr} - ldr r0, _080B7550 @ =gUnknown_083CE6A0 - bl LoadSpriteSheets - ldr r0, _080B7554 @ =gUnknown_083CE708 - bl LoadSpritePalettes - pop {r0} - bx r0 - .align 2, 0 -_080B7550: .4byte gUnknown_083CE6A0 -_080B7554: .4byte gUnknown_083CE708 - thumb_func_end sub_80B753C - - thumb_func_start sub_80B7558 -sub_80B7558: @ 80B7558 - push {lr} - bl sub_80B7568 - bl sub_80B75B0 - pop {r0} - bx r0 - thumb_func_end sub_80B7558 - - thumb_func_start sub_80B7568 -sub_80B7568: @ 80B7568 - push {r4,lr} - ldr r4, _080B759C @ =gNamingScreenMenu_Gfx - ldr r3, _080B75A0 @ =gMenuMessageBoxContentTileOffset - ldrh r0, [r3] - lsls r0, 5 - movs r1, 0xC0 - lsls r1, 19 - adds r0, r1 - ldr r1, _080B75A4 @ =0x040000d4 - str r4, [r1] - str r0, [r1, 0x4] - ldr r2, _080B75A8 @ =0x80000400 - str r2, [r1, 0x8] - ldr r0, [r1, 0x8] - ldrh r0, [r3] - lsls r0, 5 - ldr r3, _080B75AC @ =0x06008000 - adds r0, r3 - str r4, [r1] - str r0, [r1, 0x4] - str r2, [r1, 0x8] - ldr r0, [r1, 0x8] - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080B759C: .4byte gNamingScreenMenu_Gfx -_080B75A0: .4byte gMenuMessageBoxContentTileOffset -_080B75A4: .4byte 0x040000d4 -_080B75A8: .4byte 0x80000400 -_080B75AC: .4byte 0x06008000 - thumb_func_end sub_80B7568 - - thumb_func_start sub_80B75B0 -sub_80B75B0: @ 80B75B0 - push {lr} - ldr r0, _080B75C0 @ =gNamingScreenPalettes - movs r1, 0 - movs r2, 0x80 - bl LoadPalette - pop {r0} - bx r0 - .align 2, 0 -_080B75C0: .4byte gNamingScreenPalettes - thumb_func_end sub_80B75B0 - - thumb_func_start sub_80B75C4 -sub_80B75C4: @ 80B75C4 - push {r4,r5,lr} - sub sp, 0x8 - ldr r0, _080B7608 @ =gUnknown_083CE308 - ldr r1, [r0, 0x4] - ldr r0, [r0] - str r0, [sp] - str r1, [sp, 0x4] - ldr r4, _080B760C @ =gUnknown_083CE2F0 - ldr r5, _080B7610 @ =0x02000000 - ldrb r1, [r5, 0xE] - lsls r1, 3 - adds r1, r4 - ldrb r0, [r5, 0xC] - lsls r0, 2 - add r0, sp - ldr r0, [r0] - ldr r1, [r1] - bl _call_via_r1 - ldrb r1, [r5, 0xE] - lsls r1, 3 - adds r4, 0x4 - adds r1, r4 - ldrb r0, [r5, 0xD] - lsls r0, 2 - add r0, sp - ldr r0, [r0] - ldr r1, [r1] - bl _call_via_r1 - add sp, 0x8 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080B7608: .4byte gUnknown_083CE308 -_080B760C: .4byte gUnknown_083CE2F0 -_080B7610: .4byte 0x02000000 - thumb_func_end sub_80B75C4 - - thumb_func_start sub_80B7614 -sub_80B7614: @ 80B7614 - push {lr} - sub sp, 0x8 - ldr r0, _080B7644 @ =gUnknown_083CE308 - ldr r1, [r0, 0x4] - ldr r0, [r0] - str r0, [sp] - str r1, [sp, 0x4] - ldr r0, _080B7648 @ =gUnknown_083CE2F0 - ldr r2, _080B764C @ =0x02000000 - ldrb r1, [r2, 0xE] - lsls r1, 3 - adds r0, 0x4 - adds r1, r0 - ldrb r0, [r2, 0xD] - lsls r0, 2 - add r0, sp - ldr r0, [r0] - ldr r1, [r1] - bl _call_via_r1 - add sp, 0x8 - pop {r0} - bx r0 - .align 2, 0 -_080B7644: .4byte gUnknown_083CE308 -_080B7648: .4byte gUnknown_083CE2F0 -_080B764C: .4byte 0x02000000 - thumb_func_end sub_80B7614 - - thumb_func_start sub_80B7650 -sub_80B7650: @ 80B7650 - push {lr} - ldr r1, _080B765C @ =gUnknown_083CE748 - bl sub_80B7698 - pop {r0} - bx r0 - .align 2, 0 -_080B765C: .4byte gUnknown_083CE748 - thumb_func_end sub_80B7650 - - thumb_func_start sub_80B7660 -sub_80B7660: @ 80B7660 - push {lr} - ldr r1, _080B766C @ =gUnknown_083CEBF8 - bl sub_80B7698 - pop {r0} - bx r0 - .align 2, 0 -_080B766C: .4byte gUnknown_083CEBF8 - thumb_func_end sub_80B7660 - - thumb_func_start sub_80B7670 -sub_80B7670: @ 80B7670 - push {lr} - ldr r1, _080B767C @ =gUnknown_083CF0A8 - bl sub_80B7698 - pop {r0} - bx r0 - .align 2, 0 -_080B767C: .4byte gUnknown_083CF0A8 - thumb_func_end sub_80B7670 - - thumb_func_start sub_80B7680 -sub_80B7680: @ 80B7680 - push {lr} - ldr r0, _080B7690 @ =0x0600f000 - ldr r1, _080B7694 @ =gUnknown_08E86258 - bl sub_80B76E0 - pop {r0} - bx r0 - .align 2, 0 -_080B7690: .4byte 0x0600f000 -_080B7694: .4byte gUnknown_08E86258 - thumb_func_end sub_80B7680 - - thumb_func_start sub_80B7698 -sub_80B7698: @ 80B7698 - push {r4-r7,lr} - mov r12, r0 - adds r3, r1, 0 - movs r4, 0 - ldr r0, _080B76DC @ =gMenuMessageBoxContentTileOffset - ldrh r6, [r0] -_080B76A4: - movs r1, 0 - lsls r4, 16 - asrs r5, r4, 11 -_080B76AA: - lsls r0, r1, 16 - asrs r0, 16 - adds r1, r5, r0 - lsls r1, 1 - add r1, r12 - ldrh r7, [r3] - adds r2, r6, r7 - strh r2, [r1] - adds r0, 0x1 - lsls r0, 16 - adds r3, 0x2 - lsrs r1, r0, 16 - asrs r0, 16 - cmp r0, 0x1D - ble _080B76AA - movs r1, 0x80 - lsls r1, 9 - adds r0, r4, r1 - lsrs r4, r0, 16 - asrs r0, 16 - cmp r0, 0x13 - ble _080B76A4 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080B76DC: .4byte gMenuMessageBoxContentTileOffset - thumb_func_end sub_80B7698 - - thumb_func_start sub_80B76E0 -sub_80B76E0: @ 80B76E0 - push {r4-r7,lr} - mov r12, r0 - adds r3, r1, 0 - movs r4, 0 - ldr r0, _080B7728 @ =gMenuMessageBoxContentTileOffset - ldrh r6, [r0] -_080B76EC: - movs r1, 0 - lsls r5, r4, 16 - asrs r4, r5, 11 -_080B76F2: - lsls r0, r1, 16 - asrs r0, 16 - adds r1, r4, r0 - lsls r1, 1 - add r1, r12 - ldrh r7, [r3] - adds r2, r6, r7 - strh r2, [r1] - adds r0, 0x1 - lsls r0, 16 - adds r3, 0x2 - lsrs r1, r0, 16 - asrs r0, 16 - cmp r0, 0x1D - ble _080B76F2 - adds r3, 0x4 - movs r1, 0x80 - lsls r1, 9 - adds r0, r5, r1 - lsrs r4, r0, 16 - asrs r0, 16 - cmp r0, 0x13 - ble _080B76EC - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080B7728: .4byte gMenuMessageBoxContentTileOffset - thumb_func_end sub_80B76E0 - - thumb_func_start sub_80B772C -sub_80B772C: @ 80B772C - push {lr} - ldr r1, _080B773C @ =0x02000000 - ldrb r0, [r1, 0xE] - ldrb r1, [r1, 0xC] - bl nullsub_20 - pop {r0} - bx r0 - .align 2, 0 -_080B773C: .4byte 0x02000000 - thumb_func_end sub_80B772C - - thumb_func_start sub_80B7740 -sub_80B7740: @ 80B7740 - push {r4,lr} - ldr r4, _080B7760 @ =0x02000000 - ldrb r0, [r4, 0xE] - adds r0, 0x1 - movs r1, 0x3 - bl __modsi3 - lsls r0, 24 - lsrs r0, 24 - ldrb r1, [r4, 0xD] - bl nullsub_20 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080B7760: .4byte 0x02000000 - thumb_func_end sub_80B7740 - - thumb_func_start nullsub_20 -nullsub_20: @ 80B7764 - bx lr - thumb_func_end nullsub_20 - - thumb_func_start sub_80B7768 -sub_80B7768: @ 80B7768 - ldr r3, _080B778C @ =gUnknown_083CE3A8 - lsls r0, 16 - asrs r0, 16 - lsls r1, 16 - asrs r1, 16 - lsls r2, r1, 2 - adds r2, r1 - lsls r2, 2 - adds r0, r2 - ldr r1, _080B7790 @ =0x02000000 - ldrb r2, [r1, 0xE] - lsls r1, r2, 2 - adds r1, r2 - lsls r1, 4 - adds r0, r1 - adds r0, r3 - ldrb r0, [r0] - bx lr - .align 2, 0 -_080B778C: .4byte gUnknown_083CE3A8 -_080B7790: .4byte 0x02000000 - thumb_func_end sub_80B7768 - - thumb_func_start sub_80B7794 -sub_80B7794: @ 80B7794 - push {r4-r6,lr} - ldr r6, _080B77EC @ =gUnknown_083CE328 - ldr r4, _080B77F0 @ =0x02000000 - ldrb r0, [r4, 0xC] - lsls r0, 2 - ldrb r1, [r4, 0xE] - lsls r1, 4 - adds r0, r1 - adds r0, r6 - ldr r0, [r0] - bl BasicInitMenuWindow - ldr r5, _080B77F4 @ =gUnknown_083CE310 - ldrb r0, [r4, 0xE] - lsls r0, 3 - adds r0, r5 - ldr r0, [r0] - bl _call_via_r0 - ldrb r1, [r4, 0xD] - lsls r1, 2 - ldrb r0, [r4, 0xE] - lsls r0, 4 - adds r1, r0 - adds r6, 0x8 - adds r1, r6 - ldr r0, [r1] - bl BasicInitMenuWindow - ldrb r0, [r4, 0xE] - lsls r0, 3 - adds r5, 0x4 - adds r0, r5 - ldr r0, [r0] - bl _call_via_r0 - bl sub_80B772C - bl sub_80B7740 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080B77EC: .4byte gUnknown_083CE328 -_080B77F0: .4byte 0x02000000 -_080B77F4: .4byte gUnknown_083CE310 - thumb_func_end sub_80B7794 - - thumb_func_start sub_80B77F8 -sub_80B77F8: @ 80B77F8 - push {r4,lr} - ldr r2, _080B782C @ =gUnknown_083CE328 - ldr r4, _080B7830 @ =0x02000000 - ldrb r1, [r4, 0xD] - lsls r1, 2 - ldrb r0, [r4, 0xE] - lsls r0, 4 - adds r1, r0 - adds r2, 0x8 - adds r1, r2 - ldr r0, [r1] - bl BasicInitMenuWindow - ldr r1, _080B7834 @ =gUnknown_083CE310 - ldrb r0, [r4, 0xE] - lsls r0, 3 - adds r1, 0x4 - adds r0, r1 - ldr r0, [r0] - bl _call_via_r0 - bl sub_80B7740 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080B782C: .4byte gUnknown_083CE328 -_080B7830: .4byte 0x02000000 -_080B7834: .4byte gUnknown_083CE310 - thumb_func_end sub_80B77F8 - - thumb_func_start sub_80B7838 -sub_80B7838: @ 80B7838 - push {lr} - movs r0, 0x1 - bl sub_80B785C - pop {r0} - bx r0 - thumb_func_end sub_80B7838 - - thumb_func_start sub_80B7844 -sub_80B7844: @ 80B7844 - push {lr} - movs r0, 0 - bl sub_80B785C - pop {r0} - bx r0 - thumb_func_end sub_80B7844 - - thumb_func_start sub_80B7850 -sub_80B7850: @ 80B7850 - push {lr} - movs r0, 0x2 - bl sub_80B785C - pop {r0} - bx r0 - thumb_func_end sub_80B7850 - - thumb_func_start sub_80B785C -sub_80B785C: @ 80B785C - push {r4-r6,lr} - lsls r0, 24 - lsrs r0, 24 - movs r2, 0 - movs r5, 0x9 - lsls r1, r0, 2 - adds r1, r0 - lsls r6, r1, 4 -_080B786C: - lsls r4, r2, 16 - asrs r4, 16 - lsls r0, r4, 2 - adds r0, r4 - lsls r0, 2 - ldr r1, _080B78A4 @ =gUnknown_083CE3A8 - adds r0, r1 - adds r0, r6, r0 - lsls r2, r5, 24 - lsrs r2, 24 - movs r1, 0x3 - bl MenuPrint - adds r4, 0x1 - lsls r4, 16 - lsls r0, r5, 16 - movs r1, 0x80 - lsls r1, 10 - adds r0, r1 - lsrs r5, r0, 16 - lsrs r2, r4, 16 - asrs r4, 16 - cmp r4, 0x3 - ble _080B786C - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_080B78A4: .4byte gUnknown_083CE3A8 - thumb_func_end sub_80B785C - - thumb_func_start sub_80B78A8 -sub_80B78A8: @ 80B78A8 - push {r4,lr} - ldr r0, _080B78E4 @ =gWindowConfig_81E6F4C - bl BasicInitMenuWindow - ldr r1, _080B78E8 @ =gUnknown_083CE358 - ldr r4, _080B78EC @ =0x02000000 - ldrb r0, [r4, 0x1] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - bl _call_via_r0 - ldr r1, _080B78F0 @ =gUnknown_083CE368 - ldr r0, [r4, 0x34] - ldrb r0, [r0, 0x3] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - bl _call_via_r0 - ldr r0, [r4, 0x34] - ldr r0, [r0, 0x8] - movs r1, 0x9 - movs r2, 0x2 - bl MenuPrint - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080B78E4: .4byte gWindowConfig_81E6F4C -_080B78E8: .4byte gUnknown_083CE358 -_080B78EC: .4byte 0x02000000 -_080B78F0: .4byte gUnknown_083CE368 - thumb_func_end sub_80B78A8 - - thumb_func_start nullsub_61 -nullsub_61: @ 80B78F4 - bx lr - thumb_func_end nullsub_61 - - thumb_func_start sub_80B78F8 -sub_80B78F8: @ 80B78F8 - push {lr} - ldr r0, _080B7914 @ =gStringVar1 - ldr r1, _080B7918 @ =0x02000000 - movs r3, 0x3E - ldrsh r2, [r1, r3] - movs r1, 0xB - muls r1, r2 - ldr r2, _080B791C @ =gSpeciesNames - adds r1, r2 - bl StringCopy - pop {r0} - bx r0 - .align 2, 0 -_080B7914: .4byte gStringVar1 -_080B7918: .4byte 0x02000000 -_080B791C: .4byte gSpeciesNames - thumb_func_end sub_80B78F8 - - thumb_func_start nullsub_62 -nullsub_62: @ 80B7920 - bx lr - thumb_func_end nullsub_62 - - thumb_func_start sub_80B7924 -sub_80B7924: @ 80B7924 - push {lr} - sub sp, 0x4 - ldr r1, _080B7958 @ =gUnknown_083CE370 - mov r0, sp - movs r2, 0x2 - bl memcpy - ldr r0, _080B795C @ =0x02000000 - adds r0, 0x40 - movs r1, 0 - ldrsh r0, [r0, r1] - cmp r0, 0xFF - beq _080B7952 - cmp r0, 0xFE - bne _080B7948 - mov r1, sp - movs r0, 0xB6 - strb r0, [r1] -_080B7948: - mov r0, sp - movs r1, 0x14 - movs r2, 0x4 - bl MenuPrint -_080B7952: - add sp, 0x4 - pop {r0} - bx r0 - .align 2, 0 -_080B7958: .4byte gUnknown_083CE370 -_080B795C: .4byte 0x02000000 - thumb_func_end sub_80B7924 - - thumb_func_start sub_80B7960 -sub_80B7960: @ 80B7960 - push {r4,lr} - ldr r0, _080B799C @ =gStringVar1 - movs r2, 0xFC - strb r2, [r0] - movs r1, 0x14 - strb r1, [r0, 0x1] - movs r1, 0x8 - strb r1, [r0, 0x2] - strb r2, [r0, 0x3] - movs r1, 0x11 - strb r1, [r0, 0x4] - movs r1, 0x1 - strb r1, [r0, 0x5] - adds r0, 0x6 - ldr r4, _080B79A0 @ =0x02000011 - adds r1, r4, 0 - bl StringCopy - ldr r0, _080B79A4 @ =gWindowConfig_81E6F4C - bl BasicInitMenuWindow - ldr r0, _080B799C @ =gStringVar1 - subs r4, 0x11 - ldrb r1, [r4, 0x2] - movs r2, 0x4 - bl MenuPrint - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080B799C: .4byte gStringVar1 -_080B79A0: .4byte 0x02000011 -_080B79A4: .4byte gWindowConfig_81E6F4C - thumb_func_end sub_80B7960 - - .align 2, 0 @ Don't pad with nop. diff --git a/data/naming_screen.s b/data/naming_screen.s index b799df2bb..60aba1345 100644 --- a/data/naming_screen.s +++ b/data/naming_screen.s @@ -4,113 +4,6 @@ .section .rodata .align 2 -gUnknown_083CE2F0:: @ 83CE2F0 - .4byte sub_80B7660 - .4byte sub_80B7650 - .4byte sub_80B7650 - .4byte sub_80B7670 - .4byte sub_80B7670 - .4byte sub_80B7660 - - .align 2 -gUnknown_083CE308:: @ 83CE308 - .4byte VRAM + 0xE000 - .4byte VRAM + 0xE800 - - .align 2 -gUnknown_083CE310:: @ 83CE310 - .4byte sub_80B7844 - .4byte sub_80B7838 - .4byte sub_80B7838 - .4byte sub_80B7850 - .4byte sub_80B7850 - .4byte sub_80B7844 - - .align 2 -gUnknown_083CE328:: @ 83CE328 - .4byte gWindowConfig_81E6EDC - .4byte gWindowConfig_81E6EF8 - .4byte gWindowConfig_81E6EA4 - .4byte gWindowConfig_81E6EC0 - .4byte gWindowConfig_81E6EA4 - .4byte gWindowConfig_81E6EC0 - .4byte gWindowConfig_81E6F14 - .4byte gWindowConfig_81E6F30 - .4byte gWindowConfig_81E6F14 - .4byte gWindowConfig_81E6F30 - .4byte gWindowConfig_81E6EDC - .4byte gWindowConfig_81E6EF8 - - .align 2 -gUnknown_083CE358:: @ 83CE358 - .4byte nullsub_61 - .4byte nullsub_61 - .4byte sub_80B78F8 - .4byte sub_80B78F8 - - .align 2 -gUnknown_083CE368:: @ 83CE368 - .4byte nullsub_62 - .4byte sub_80B7924 - -gUnknown_083CE370:: @ 83CE370 - .string "♂$" - - .align 2 -Unknown_83CE374: - .byte 0, 7, 1, 0, 0, 0, 0, 0 - .4byte OtherText_YourName - - .align 2 -Unknown_83CE380: - .byte 0, 8, 2, 0, 0, 0, 0, 0 - .4byte OtherText_BoxName - - .align 2 -Unknown_83CE38C: - .byte 0, 10, 3, 1, 0, 0, 0, 0 - .4byte OtherText_PokeName - - .align 2 -gUnknown_083CE398:: @ 83CE398 - .4byte Unknown_83CE374 - .4byte Unknown_83CE380 - .4byte Unknown_83CE38C - .4byte Unknown_83CE38C - -gUnknown_083CE3A8:: @ 83CE3A8 - .string " A B C D E F . $" - .string " G H I J K L , $" - .string " M N O P Q R S $" - .string " T U V W X Y Z $" - .string " a b c d e f . $" - .string " g h i j k l , $" - .string " m n o p q r s $" - .string " t u v w x y z $" - .string " 0 1 2 3 4 $" - .string " 5 6 7 8 9 $" - .string " ! ? ♂ ♀ / - $" - .string " … “ ” ‘ ’ $" - - .align 2 -gOamData_83CE498:: @ 83CE498 - .2byte 0x0000 - .2byte 0x0000 - .2byte 0x0000 - - .align 2 -gOamData_83CE4A0:: @ 83CE4A0 - .2byte 0x0000 - .2byte 0x4000 - .2byte 0x0000 - - .align 2 -gOamData_83CE4A8:: @ 83CE4A8 - .2byte 0x4000 - .2byte 0x8000 - .2byte 0x0000 - - .align 2 gSubspriteTable_83CE4B0:: @ 83CE4B0 subsprite -20, -16, 1, 0, 32x8 subsprite 12, -16, 1, 4, 8x8 diff --git a/include/sprite.h b/include/sprite.h index 447a8decb..721616e9e 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -223,8 +223,8 @@ u8 AllocOamMatrix(void); void FreeOamMatrix(u8 matrixNum); void InitSpriteAffineAnim(struct Sprite *sprite); void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotation); -u16 LoadSpriteSheet(struct SpriteSheet *sheet); -void LoadSpriteSheets(struct SpriteSheet *sheets); +u16 LoadSpriteSheet(const struct SpriteSheet *sheet); +void LoadSpriteSheets(const struct SpriteSheet *sheets); u16 AllocTilesForSpriteSheet(struct SpriteSheet *sheet); void AllocTilesForSpriteSheets(struct SpriteSheet *sheets); void LoadTilesForSpriteSheet(const struct SpriteSheet *sheet); diff --git a/ld_script.txt b/ld_script.txt index 62afdd1c7..ac8766459 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -151,7 +151,6 @@ SECTIONS { src/berry.o(.text); src/script_menu.o(.text); src/naming_screen.o(.text); - asm/naming_screen.o(.text); src/money.o(.text); asm/contest_effect.o(.text); src/record_mixing.o(.text); diff --git a/src/naming_screen.c b/src/naming_screen.c index 1c718b3ca..784e10f4f 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -11,10 +11,22 @@ #include "text.h" #include "trig.h" -struct UnknownStruct2 +extern u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8, u8); +extern u8 CreateMonIcon(); +extern void sub_809D51C(void); +extern void MultiplyInvertedPaletteRGBComponents(u16, u8, u8, u8); + +enum +{ + NAMING_SCREEN_TEMPLATE_PLAYER_NAME, + NAMING_SCREEN_TEMPLATE_BOX_NAME, + NAMING_SCREEN_TEMPLATE_MON_NAME, +}; + +struct NamingScreenTemplate { u8 unk0; - u8 unk1; + u8 maxChars; u8 unk2; u8 unk3; u8 unk4; //mode? @@ -24,36 +36,29 @@ struct UnknownStruct2 const u8 *title; }; -struct UnknownStruct1 +struct NamingScreenData { - u8 state; //state - u8 mode; + u8 state; + u8 templateNum; u16 unk2; - u16 unk4; - u16 unk6; + u16 bg1vOffset; + u16 bg2vOffset; u16 unk8; u16 unkA; u8 unkC; u8 unkD; - u8 currentPage; //page? - u8 cursorSpriteId; //spriteId + u8 currentPage; + u8 cursorSpriteId; u8 unk10; u8 textBuffer[0x10]; u8 filler21[0x13]; - /*0x34*/ const struct UnknownStruct2 *unk34; - /*0x38*/ u8 *nameBuffer; + const struct NamingScreenTemplate *template; + u8 *destBuffer; u16 unk3C; //savedKeyRepeatStartDelay u16 unk3E; u16 unk40; u32 unk44; - /*0x48*/ MainCallback returnCallback; -}; - -enum -{ - NAMING_SCREEN_MODE_PLAYER_NAME, - NAMING_SCREEN_MODE_BOX_NAME, - NAMING_SCREEN_MODE_MON_NAME, + MainCallback returnCallback; }; enum @@ -67,7 +72,7 @@ extern u16 gKeyRepeatStartDelay; extern u8 unk_2000000[]; -#define EWRAM_000000 (*(struct UnknownStruct1 *)(unk_2000000)) +#define namingScreenData (*(struct NamingScreenData *)(unk_2000000)) const u32 gSpriteImage_83CE094[] = INCBIN_U32("graphics/naming_screen/pc_icon/0.4bpp"); const u32 gSpriteImage_83CE154[] = INCBIN_U32("graphics/naming_screen/pc_icon/1.4bpp"); @@ -79,7 +84,6 @@ asm(".section .rodata\n\ .4byte 0x2000000\n"); extern u16 *const gUnknown_083CE28C[]; -extern const struct UnknownStruct2 *const gUnknown_083CE398[]; extern const struct SubspriteTable gSubspriteTables_83CE558[]; extern const struct SubspriteTable gSubspriteTables_83CE560[]; extern const struct SubspriteTable gSubspriteTables_83CE578[]; @@ -93,92 +97,129 @@ extern const struct SpriteTemplate gSpriteTemplate_83CE640; extern const struct SpriteTemplate gSpriteTemplate_83CE658; extern const struct SpriteTemplate gSpriteTemplate_83CE670; extern const struct SpriteTemplate gSpriteTemplate_83CE688; +extern const struct SpriteSheet gUnknown_083CE6A0[]; +extern const struct SpritePalette gUnknown_083CE708[]; +extern const u8 gOtherText_SentToPC[]; +extern const u8 gNamingScreenMenu_Gfx[]; +extern u16 gMenuMessageBoxContentTileOffset; +extern const u16 gNamingScreenPalettes[]; +extern const u16 gUnknown_083CE748[]; +extern const u16 gUnknown_083CEBF8[]; +extern const u16 gUnknown_083CF0A8[]; +extern const u16 gUnknown_08E86258[]; +extern const u8 gSpeciesNames[][11]; +extern const u8 OtherText_YourName[]; +extern const u8 OtherText_BoxName[]; +extern const u8 OtherText_PokeName[]; + +static void C2_NamingScreen(void); +static void sub_80B5AA0(void); +static void StoreNamingScreenParameters(u8, u8 *, u16, u16, u32, MainCallback); +static void NamingScreen_TurnOffScreen(void); +static void NamingScreen_Init(void); +static void NamingScreen_ClearVram(void); +static void NamingScreen_ClearOam(void); +static void NamingScreen_SetUpVideoRegs(void); +static void NamingScreen_SetUpWindow(void); +static void NamingScreen_ResetObjects(void); +static void sub_80B5DFC(void); +static void sub_80B5E20(void); +static void sub_80B5E3C(void); +static void NamingScreen_InitDisplayMode(void); +static void Task_DoNothing(u8); +static void sub_80B7558(void); +static void sub_80B753C(void); +static void sub_80B7680(void); +static void sub_80B75C4(void); +static void sub_80B7794(void); +static void sub_80B78A8(void); +static void sub_80B7960(void); +static void CursorInit(void); +static void sub_80B6A80(void); +static void sub_80B6CA8(void); +static void sub_80B6D04(void); +static void sub_80B6E44(void); +static void InputInit(void); +static void sub_80B6438(void); +static void sub_80B5E50(void); +static void Task_NamingScreenMain(u8); +static void SetInputState(u8); +static void sub_80B68D8(u8); +static bool8 HandleKeyboardEvent(void); +static bool8 IsCursorAnimFinished(void); +static void MoveCursorToOKButton(void); +static void sub_80B6B14(void); +static void StartPageSwapAnim(void); +static void sub_80B6888(u8); +static void sub_80B6460(u8, u8, u8); +static bool8 IsPageSwapAnimNotInProgress(void); +static void sub_80B7614(void); +static void GetCursorPos(s16 *, s16 *); +static void SetCursorPos(s16, s16); +static void sub_80B77F8(void); +static void sub_80B74B0(void); +static void DisplaySentToPCMessage(void); +static u8 GetKeyRoleAtCursorPos(void); +static u8 sub_80B61C8(void); +static void DeleteTextCharacter(void); +static void sub_80B7090(void); +static u8 GetInputEvent(void); +static bool8 sub_80B7004(void); +static void sub_80B6914(void); +static void Task_HandlePageSwapAnim(u8); +static void sub_80B6C48(u8, struct Sprite *, struct Sprite *); +static u8 GetTextCaretPosition(void); +static u8 GetCharAtKeyboardPos(s16, s16); +static bool8 sub_80B7104(void); +static bool8 sub_80B713C(void); +static void AddTextCharacter(u8); +static bool8 sub_80B7198(u8); +static bool8 sub_80B7264(u8); +static void sub_80B7370(u8, u8); +static void sub_80B73CC(u8, u8); +static bool8 sub_80B71E4(u8); +static void sub_80B7474(u8, u8); +static void sub_80B72A4(u8, u8); +static bool8 sub_80B720C(u8); +static void sub_80B7568(void); +static void sub_80B75B0(void); +static void sub_80B7698(u16 *, const u16 *); +static void sub_80B76E0(); +static void nullsub_20(u8, u8); +static void PrintKeyboardCharacters(u8); -void C2_NamingScreen(void); -void sub_80B5AA0(void); -//void AddNamingScreenTask(); -void AddNamingScreenTask(u8, u8 *, u16, u16, u32, MainCallback); -void NamingScreen_TurnOffScreen(void); -void NamingScreen_Init(void); -void NamingScreen_ClearVram(void); -void NamingScreen_ClearOam(void); -void NamingScreen_SetUpVideoRegs(void); -void sub_80B5DC8(void); -void NamingScreen_ResetObjects(void); -void sub_80B5DFC(void); -void sub_80B5E20(void); -void sub_80B5E3C(void); -void sub_80B5C04(void); -void NamingScreenDummyTask(u8); -void sub_80B7558(void); -void sub_80B753C(void); -void sub_80B7680(void); -void sub_80B75C4(void); -void sub_80B7794(void); -void sub_80B78A8(void); -void sub_80B7960(void); -void sub_80B6774(void); -void sub_80B6A80(void); -void sub_80B6CA8(void); -void sub_80B6D04(void); -void sub_80B6E44(void); -void InitInput(void); -void sub_80B6438(void); -void sub_80B5E50(void); -void sub_80B5E70(u8); -void SetInputState(u8); -void sub_80B68D8(u8); -u8 sub_80B60B8(void); -bool8 sub_80B6938(void); -void sub_80B6878(void); -void sub_80B6B14(void); -void sub_80B65F0(void); -void sub_80B6888(u8); -void sub_80B6460(u8, u8, u8); -bool8 sub_80B6610(void); -void sub_80B7614(void); -void get_cursor_pos(s16 *, s16 *); -void set_cursor_pos(s16, s16); -void sub_80B77F8(void); -void sub_80B74B0(void); -void sub_80B74FC(void); -u8 sub_80B6958(void); -u8 sub_80B61C8(void); -void sub_80B6FBC(void); -void sub_80B7090(void); -u8 GetInputPressedButton(void); -u8 sub_80B7004(void); -void sub_80B6914(void); -void Task_HandleInput(u8); -void HandleDpadMovement(struct Task *); -void sub_80B64D4(u8); -void sub_80B65AC(u8); -void sub_80B65D4(struct Task *, u8, u8); -u16 sub_80B654C(u8); -extern void MultiplyInvertedPaletteRGBComponents(u16, u8, u8, u8); -void sub_80B6630(u8); -void sub_80B6C48(u8, struct Sprite *, struct Sprite *); -u8 sub_80B6F44(void); -extern u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8, u8); -extern u8 CreateMonIcon(); -extern void sub_809D51C(void); -u8 sub_80B7768(s16, s16); -u8 sub_80B7104(void); -u8 sub_80B713C(void); -void sub_80B7174(u8); +enum +{ + MAIN_STATE_BEGIN_FADE_IN, + MAIN_STATE_WAIT_FADE_IN, + MAIN_STATE_HANDLE_INPUT, + MAIN_STATE_MOVE_TO_OK_BUTTON, + MAIN_STATE_START_PAGE_SWAP, + MAIN_STATE_WAIT_PAGE_SWAP, + MAIN_STATE_6, + MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE, + MAIN_STATE_BEGIN_FADE_OUT, +}; -#define NAMING_SCREEN_A_BUTTON 5 -#define NAMING_SCREEN_B_BUTTON 6 -#define NAMING_SCREEN_SELECT_BUTTON 8 -#define NAMING_SCREEN_START_BUTTON 9 +enum +{ + INPUT_STATE_DISABLED, + INPUT_STATE_ENABLED, +}; + +#define KBEVENT_NONE 0 +#define KBEVENT_PRESSED_A 5 +#define KBEVENT_PRESSED_B 6 +#define KBEVENT_PRESSED_SELECT 8 +#define KBEVENT_PRESSED_START 9 -void DoNamingScreen(u8 mode, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +void DoNamingScreen(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) { - AddNamingScreenTask(mode, nameBuffer, c, d, e, returnCallback); + StoreNamingScreenParameters(templateNum, destBuffer, c, d, e, returnCallback); SetMainCallback2(C2_NamingScreen); } -void C2_NamingScreen(void) +static void C2_NamingScreen(void) { switch (gMain.state) { @@ -200,7 +241,7 @@ void C2_NamingScreen(void) gMain.state++; break; case 4: - sub_80B5DC8(); + NamingScreen_SetUpWindow(); gMain.state++; break; case 5: @@ -214,13 +255,13 @@ void C2_NamingScreen(void) case 7: sub_80B5E20(); sub_80B5E3C(); - sub_80B5C04(); + NamingScreen_InitDisplayMode(); SetMainCallback2(sub_80B5AA0); break; } } -void sub_80B5AA0(void) +static void sub_80B5AA0(void) { RunTasks(); AnimateSprites(); @@ -228,65 +269,66 @@ void sub_80B5AA0(void) UpdatePaletteFade(); } -void sub_80B5AB8(void) +static void VBlankCB_NamingScreen(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); - REG_BG1VOFS = EWRAM_000000.unk4; - REG_BG2VOFS = EWRAM_000000.unk6; + REG_BG1VOFS = namingScreenData.bg1vOffset; + REG_BG2VOFS = namingScreenData.bg2vOffset; REG_BG1CNT &= 0xFFFC; - REG_BG1CNT |= EWRAM_000000.unk8; + REG_BG1CNT |= namingScreenData.unk8; REG_BG2CNT &= 0xFFFC; - REG_BG2CNT |= EWRAM_000000.unkA; + REG_BG2CNT |= namingScreenData.unkA; } -void AddNamingScreenTask(u8 mode, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) +static void StoreNamingScreenParameters(u8 templateNum, u8 *destBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback) { struct Task *task; - task = &gTasks[CreateTask(NamingScreenDummyTask, 0xFF)]; - task->data[0] = mode; + //Create a task that does nothing, and use it as a temporary space to store parameters + task = &gTasks[CreateTask(Task_DoNothing, 0xFF)]; + task->data[0] = templateNum; task->data[1] = c; task->data[2] = d; task->data[3] = e >> 16; task->data[4] = e; - StoreWordInTwoHalfwords(&task->data[5], (u32)nameBuffer); + StoreWordInTwoHalfwords(&task->data[5], (u32)destBuffer); StoreWordInTwoHalfwords(&task->data[7], (u32)returnCallback); } -void GetNamingScreenParameters(void) +static void GetNamingScreenParameters(void) { u8 taskId; struct Task *task; - taskId = FindTaskIdByFunc(NamingScreenDummyTask); + taskId = FindTaskIdByFunc(Task_DoNothing); task = &gTasks[taskId]; - EWRAM_000000.mode = task->data[0]; - EWRAM_000000.unk3E = task->data[1]; - EWRAM_000000.unk40 = task->data[2]; - EWRAM_000000.unk44 = (task->data[3] << 16) | (u16)task->data[4]; - LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&EWRAM_000000.nameBuffer); - LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&EWRAM_000000.returnCallback); + namingScreenData.templateNum = task->data[0]; + namingScreenData.unk3E = task->data[1]; + namingScreenData.unk40 = task->data[2]; + namingScreenData.unk44 = (task->data[3] << 16) | (u16)task->data[4]; + LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&namingScreenData.destBuffer); + LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&namingScreenData.returnCallback); DestroyTask(taskId); } -void NamingScreenDummyTask(u8 taskId) +static void Task_DoNothing(u8 taskId) { } -void NamingScreen_TurnOffScreen(void) +static void NamingScreen_TurnOffScreen(void) { SetVBlankCallback(NULL); SetHBlankCallback(NULL); REG_DISPCNT = 0; } -void sub_80B5C04(void) +static void NamingScreen_InitDisplayMode(void) { u16 savedIme; - SetVBlankCallback(sub_80B5AB8); + SetVBlankCallback(VBlankCB_NamingScreen); savedIme = REG_IME; REG_IME = 0; REG_IE |= INTR_FLAG_VBLANK; @@ -295,7 +337,7 @@ void sub_80B5C04(void) REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON; } -void NamingScreen_ClearVram(void) +static void NamingScreen_ClearVram(void) { u8 *addr = (void *)VRAM; u32 size = 0x10000; @@ -313,12 +355,12 @@ void NamingScreen_ClearVram(void) } } -void NamingScreen_ClearOam(void) +static void NamingScreen_ClearOam(void) { DmaClear16(3, (void *)OAM, 0x400); } -void NamingScreen_SetUpVideoRegs(void) +static void NamingScreen_SetUpVideoRegs(void) { REG_BG0CNT = 0; REG_BG1CNT = 0; @@ -340,33 +382,35 @@ void NamingScreen_SetUpVideoRegs(void) REG_BLDALPHA = 0x80C; } -void NamingScreen_Init(void) +static const struct NamingScreenTemplate *const sNamingScreenTemplates[]; //forward declaration + +static void NamingScreen_Init(void) { GetNamingScreenParameters(); - EWRAM_000000.state = 0; - EWRAM_000000.unk4 = 0; - EWRAM_000000.unk6 = 0; - EWRAM_000000.unk8 = 1; - EWRAM_000000.unkA = 2; - EWRAM_000000.unkC = 0; - EWRAM_000000.unkD = 1; - EWRAM_000000.unk34 = gUnknown_083CE398[EWRAM_000000.mode]; - EWRAM_000000.currentPage = EWRAM_000000.unk34->unk4; - EWRAM_000000.unk2 = 14 - EWRAM_000000.unk34->unk1 / 2; - EWRAM_000000.unk3C = gKeyRepeatStartDelay; - memset(EWRAM_000000.textBuffer, 0xFF, 0x10); - if (EWRAM_000000.unk34->unk0 != 0) - StringCopy(EWRAM_000000.textBuffer, EWRAM_000000.nameBuffer); + namingScreenData.state = 0; + namingScreenData.bg1vOffset = 0; + namingScreenData.bg2vOffset = 0; + namingScreenData.unk8 = 1; + namingScreenData.unkA = 2; + namingScreenData.unkC = 0; + namingScreenData.unkD = 1; + namingScreenData.template = sNamingScreenTemplates[namingScreenData.templateNum]; + namingScreenData.currentPage = namingScreenData.template->unk4; + namingScreenData.unk2 = 14 - namingScreenData.template->maxChars / 2; + namingScreenData.unk3C = gKeyRepeatStartDelay; + memset(namingScreenData.textBuffer, 0xFF, 0x10); + if (namingScreenData.template->unk0 != 0) + StringCopy(namingScreenData.textBuffer, namingScreenData.destBuffer); gKeyRepeatStartDelay = 16; } -void sub_80B5DC8(void) +static void NamingScreen_SetUpWindow(void) { SetUpWindowConfig(&gWindowConfig_81E6E88); InitMenuWindow(&gWindowConfig_81E6E88); } -void NamingScreen_ResetObjects(void) +static void NamingScreen_ResetObjects(void) { ResetPaletteFade(); ResetSpriteData(); @@ -374,7 +418,7 @@ void NamingScreen_ResetObjects(void) ResetTasks(); } -void sub_80B5DFC(void) +static void sub_80B5DFC(void) { sub_80B7558(); sub_80B753C(); @@ -385,257 +429,272 @@ void sub_80B5DFC(void) sub_80B7960(); } -void sub_80B5E20(void) +static void sub_80B5E20(void) { - sub_80B6774(); + CursorInit(); sub_80B6A80(); sub_80B6CA8(); sub_80B6D04(); sub_80B6E44(); } -void sub_80B5E3C(void) +static void sub_80B5E3C(void) { - InitInput(); + InputInit(); sub_80B6438(); sub_80B5E50(); } -void sub_80B5E50(void) +//-------------------------------------------------- +// Naming screen main +//-------------------------------------------------- + +static bool8 MainState_BeginFadeIn(struct Task *); +static bool8 MainState_WaitFadeIn(struct Task *); +static bool8 MainState_HandleInput(struct Task *); +static bool8 MainState_MoveToOKButton(struct Task *); +static bool8 MainState_StartPageSwap(struct Task *); +static bool8 MainState_WaitPageSwap(struct Task *); +static bool8 MainState_6(struct Task *); +static bool8 MainState_UpdateSentToPCMessage(struct Task *); +static bool8 MainState_BeginFadeInOut(struct Task *); +static bool8 MainState_WaitFadeOutAndExit(struct Task *); + +static bool8 (*const sMainStateFuncs[])(struct Task *) = +{ + MainState_BeginFadeIn, + MainState_WaitFadeIn, + MainState_HandleInput, + MainState_MoveToOKButton, + MainState_StartPageSwap, + MainState_WaitPageSwap, + MainState_6, + MainState_UpdateSentToPCMessage, + MainState_BeginFadeInOut, + MainState_WaitFadeOutAndExit, +}; + +static void sub_80B5E50(void) { u8 taskId; - taskId = CreateTask(sub_80B5E70, 2); - sub_80B5E70(taskId); + taskId = CreateTask(Task_NamingScreenMain, 2); + Task_NamingScreenMain(taskId); } -// - -u8 sub_80B5EA8(struct Task *); -u8 sub_80B5ED0(struct Task *); -u8 sub_80B5F00(struct Task *); -u8 sub_80B5F10(struct Task *); -u8 sub_80B5F38(struct Task *); -u8 sub_80B5F70(struct Task *); -u8 pokemon_store(struct Task *); -u8 sub_80B604C(struct Task *); -u8 sub_80B606C(struct Task *); -u8 sub_80B6094(struct Task *); - -static u8 (*const gUnknown_083CE218[])(struct Task *) = -{ - sub_80B5EA8, - sub_80B5ED0, - sub_80B5F00, - sub_80B5F10, - sub_80B5F38, - sub_80B5F70, - pokemon_store, - sub_80B604C, - sub_80B606C, - sub_80B6094, -}; - -void sub_80B5E70(u8 taskId) +static void Task_NamingScreenMain(u8 taskId) { - while (gUnknown_083CE218[EWRAM_000000.state](&gTasks[taskId]) != 0) + while (sMainStateFuncs[namingScreenData.state](&gTasks[taskId]) != 0) ; } -u8 sub_80B5EA8(struct Task *task) +static bool8 MainState_BeginFadeIn(struct Task *task) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); - EWRAM_000000.state++; + namingScreenData.state++; return 0; } -u8 sub_80B5ED0(struct Task *task) +static bool8 MainState_WaitFadeIn(struct Task *task) { if (!gPaletteFade.active) { - SetInputState(1); + SetInputState(INPUT_STATE_ENABLED); sub_80B68D8(1); - EWRAM_000000.state++; + namingScreenData.state++; } - return 0; + return FALSE; } -u8 sub_80B5F00(struct Task *task) +static bool8 MainState_HandleInput(struct Task *task) { - return sub_80B60B8(); + return HandleKeyboardEvent(); } -u8 sub_80B5F10(struct Task *task) +static bool8 MainState_MoveToOKButton(struct Task *task) { - if (sub_80B6938() != 0) + if (IsCursorAnimFinished()) { - SetInputState(1); - sub_80B6878(); - EWRAM_000000.state = 2; + SetInputState(INPUT_STATE_ENABLED); + MoveCursorToOKButton(); + namingScreenData.state = MAIN_STATE_HANDLE_INPUT; } - return 0; + return FALSE; } -u8 sub_80B5F38(struct Task *task) +static bool8 MainState_StartPageSwap(struct Task *task) { - SetInputState(0); + SetInputState(INPUT_STATE_DISABLED); sub_80B6B14(); - sub_80B65F0(); + StartPageSwapAnim(); sub_80B6888(1); sub_80B6460(0, 0, 1); PlaySE(SE_WIN_OPEN); - EWRAM_000000.state = 5; - return 0; + namingScreenData.state = MAIN_STATE_WAIT_PAGE_SWAP; + return FALSE; } -u8 sub_80B5F70(struct Task *task) +static bool8 MainState_WaitPageSwap(struct Task *task) { s16 cursorX; s16 cursorY; - if (sub_80B6610()) + if (IsPageSwapAnimNotInProgress()) { - EWRAM_000000.state = 2; - EWRAM_000000.currentPage++; - EWRAM_000000.currentPage %= 3; + namingScreenData.state = MAIN_STATE_HANDLE_INPUT; + namingScreenData.currentPage++; + namingScreenData.currentPage %= 3; sub_80B7614(); sub_80B77F8(); - SetInputState(1); - get_cursor_pos(&cursorX, &cursorY); - if (EWRAM_000000.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) + SetInputState(INPUT_STATE_ENABLED); + GetCursorPos(&cursorX, &cursorY); + if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) cursorX = 5; - set_cursor_pos(cursorX, cursorY); + SetCursorPos(cursorX, cursorY); sub_80B6888(0); } - return 0; + return FALSE; } -u8 pokemon_store(struct Task *task) +static bool8 MainState_6(struct Task *task) { sub_80B74B0(); - SetInputState(0); + SetInputState(INPUT_STATE_DISABLED); sub_80B68D8(0); sub_80B6460(3, 0, 1); - gKeyRepeatStartDelay = EWRAM_000000.unk3C; - if (EWRAM_000000.mode == NAMING_SCREEN_MODE_MON_NAME - && CalculatePlayerPartyCount() > 5) + gKeyRepeatStartDelay = namingScreenData.unk3C; + if (namingScreenData.templateNum == NAMING_SCREEN_TEMPLATE_MON_NAME + && CalculatePlayerPartyCount() >= 6) { - sub_80B74FC(); - EWRAM_000000.state = 7; - return 0; + DisplaySentToPCMessage(); + namingScreenData.state = MAIN_STATE_UPDATE_SENT_TO_PC_MESSAGE; + return FALSE; } else { - EWRAM_000000.state = 8; - return 1; + namingScreenData.state = MAIN_STATE_BEGIN_FADE_OUT; + return TRUE; //Exit the naming screen } } -u8 sub_80B604C(struct Task *task) +static bool8 MainState_UpdateSentToPCMessage(struct Task *task) { if (MenuUpdateWindowText()) - EWRAM_000000.state++; - return 0; + namingScreenData.state++; + return FALSE; } -u8 sub_80B606C(struct Task *task) +static bool8 MainState_BeginFadeInOut(struct Task *task) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); - EWRAM_000000.state++; - return 0; + namingScreenData.state++; + return FALSE; } -u8 sub_80B6094(struct Task *task) +static bool8 MainState_WaitFadeOutAndExit(struct Task *task) { if (!gPaletteFade.active) - SetMainCallback2(EWRAM_000000.returnCallback); - return 0; + SetMainCallback2(namingScreenData.returnCallback); + return FALSE; } -u8 sub_80B6108(u8); -u8 sub_80B6148(u8); -u8 sub_80B6170(u8); -u8 sub_80B6194(u8); +//-------------------------------------------------- +// Keyboard handling +//-------------------------------------------------- + +enum +{ + KEY_ROLE_CHAR, + KEY_ROLE_PAGE, + KEY_ROLE_BACKSPACE, + KEY_ROLE_OK, +}; + + +static bool8 KeyboardKeyHandler_Character(u8); +static bool8 KeyboardKeyHandler_Page(u8); +static bool8 KeyboardKeyHandler_Backspace(u8); +static bool8 KeyboardKeyHandler_OK(u8); -static u8 (*const gUnknown_083CE240[])(u8) = +static bool8 (*const sKeyboardKeyHandlers[])(u8) = { - sub_80B6108, - sub_80B6148, - sub_80B6170, - sub_80B6194, + KeyboardKeyHandler_Character, + KeyboardKeyHandler_Page, + KeyboardKeyHandler_Backspace, + KeyboardKeyHandler_OK, }; -u8 sub_80B60B8(void) +static bool8 HandleKeyboardEvent(void) { - u8 button = GetInputPressedButton(); - u8 r0 = sub_80B6958(); + u8 event = GetInputEvent(); + u8 keyRole = GetKeyRoleAtCursorPos(); - if (button == 8) + if (event == KBEVENT_PRESSED_SELECT) return sub_80B61C8(); - else if (button == 6) + else if (event == KBEVENT_PRESSED_B) { - sub_80B6FBC(); - return 0; + DeleteTextCharacter(); + return FALSE; } - else if (button == 7) + else if (event == 7) { sub_80B7090(); - return 0; + return FALSE; } - return gUnknown_083CE240[r0](button); + return sKeyboardKeyHandlers[keyRole](event); } -u8 sub_80B6108(u8 a) +static bool8 KeyboardKeyHandler_Character(u8 event) { sub_80B6460(3, 0, 0); - if (a == 5) + if (event == KBEVENT_PRESSED_A) { u8 var = sub_80B7004(); sub_80B6914(); - if (var != 0) + if (var) { - SetInputState(0); - EWRAM_000000.state = 3; + SetInputState(INPUT_STATE_DISABLED); + namingScreenData.state = MAIN_STATE_MOVE_TO_OK_BUTTON; } } - return 0; + return FALSE; } -u8 sub_80B6148(u8 a) +static bool8 KeyboardKeyHandler_Page(u8 event) { sub_80B6460(0, 1, 0); - if (a == 5) + if (event == KBEVENT_PRESSED_A) return sub_80B61C8(); else - return 0; + return FALSE; } -u8 sub_80B6170(u8 a) +static bool8 KeyboardKeyHandler_Backspace(u8 event) { sub_80B6460(1, 1, 0); - if (a == 5) - sub_80B6FBC(); - return 0; + if (event == KBEVENT_PRESSED_A) + DeleteTextCharacter(); + return FALSE; } -u8 sub_80B6194(u8 a) +static bool8 KeyboardKeyHandler_OK(u8 event) { sub_80B6460(2, 1, 0); - if (a == 5) + if (event == KBEVENT_PRESSED_A) { PlaySE(SE_SELECT); - EWRAM_000000.state = 6; - return 1; + namingScreenData.state = MAIN_STATE_6; + return TRUE; } else - return 0; + return FALSE; } -u8 sub_80B61C8(void) +static bool8 sub_80B61C8(void) { - EWRAM_000000.state = 4; - return 1; + namingScreenData.state = MAIN_STATE_START_PAGE_SWAP; + return TRUE; } //-------------------------------------------------- @@ -650,69 +709,72 @@ enum }; #define tState data[0] -#define tPressedButton data[1] +#define tKeyboardEvent data[1] #define tKbFunctionKey data[2] -void InitInput(void) +static void InputState_Disabled(struct Task *); +static void InputState_Enabled(struct Task *); + +static void (*const sInputStateFuncs[])(struct Task *) = +{ + InputState_Disabled, + InputState_Enabled, +}; + +static void Task_HandleInput(u8); +static void HandleDpadMovement(struct Task *); + +static void InputInit(void) { CreateTask(Task_HandleInput, 1); } -u8 GetInputPressedButton(void) +static u8 GetInputEvent(void) { u8 taskId = FindTaskIdByFunc(Task_HandleInput); - return gTasks[taskId].tPressedButton; + return gTasks[taskId].tKeyboardEvent; } -void SetInputState(u8 state) +static void SetInputState(u8 state) { u8 taskId = FindTaskIdByFunc(Task_HandleInput); gTasks[taskId].tState = state; } -static void sub_80B626C(struct Task *); -static void sub_80B6274(struct Task *); - -static void (*const sInputStateHandlers[])(struct Task *) = -{ - sub_80B626C, - sub_80B6274, -}; - -void Task_HandleInput(u8 taskId) +static void Task_HandleInput(u8 taskId) { - sInputStateHandlers[gTasks[taskId].tState](&gTasks[taskId]); + sInputStateFuncs[gTasks[taskId].tState](&gTasks[taskId]); } -static void sub_80B626C(struct Task *task) +static void InputState_Disabled(struct Task *task) { - task->tPressedButton = 0; + task->tKeyboardEvent = 0; } -static void sub_80B6274(struct Task *task) +static void InputState_Enabled(struct Task *task) { - task->tPressedButton = 0; + task->tKeyboardEvent = 0; if (gMain.newKeys & A_BUTTON) { - task->tPressedButton = 5; + task->tKeyboardEvent = KBEVENT_PRESSED_A; return; } if (gMain.newKeys & B_BUTTON) { - task->tPressedButton = 6; + task->tKeyboardEvent = KBEVENT_PRESSED_B; return; } if (gMain.newKeys & SELECT_BUTTON) { - task->tPressedButton = 8; + task->tKeyboardEvent = KBEVENT_PRESSED_SELECT; return; } if (gMain.newKeys & START_BUTTON) { - task->tPressedButton = 9; - sub_80B6878(); + task->tKeyboardEvent = KBEVENT_PRESSED_START; + MoveCursorToOKButton(); return; } HandleDpadMovement(task); @@ -739,14 +801,14 @@ static const s16 sDpadDeltaY[] = static const s16 s4RowTo3RowTableY[] = {0, 1, 1, 2}; static const s16 gUnknown_083CE274[] = {0, 0, 3, 0}; -void HandleDpadMovement(struct Task *task) +static void HandleDpadMovement(struct Task *task) { s16 cursorX; s16 cursorY; u16 dpadDir; s16 prevCursorX; - get_cursor_pos(&cursorX, &cursorY); + GetCursorPos(&cursorX, &cursorY); dpadDir = 0; if (gMain.newAndRepeatedKeys & DPAD_UP) dpadDir = 1; @@ -772,7 +834,7 @@ void HandleDpadMovement(struct Task *task) if (sDpadDeltaX[dpadDir] != 0) { //The "others" page only has 5 columns - if (EWRAM_000000.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) + if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) { if (sDpadDeltaX[dpadDir] > 0) cursorX = 8; @@ -815,28 +877,34 @@ void HandleDpadMovement(struct Task *task) if (cursorY > 3) cursorY = 0; } - set_cursor_pos(cursorX, cursorY); + SetCursorPos(cursorX, cursorY); } #undef tState -#undef tPressedButton +#undef tKeyboardEvent #undef tKbFunctionKey //-------------------------------------------------- +// +//-------------------------------------------------- + +static void Task_80B64D4(u8); +static u16 sub_80B654C(u8); +static void sub_80B65AC(u8); +static void sub_80B65D4(struct Task *, u8, u8); -void sub_80B6438(void) +static void sub_80B6438(void) { u8 taskId; - taskId = CreateTask(sub_80B64D4, 3); + taskId = CreateTask(Task_80B64D4, 3); gTasks[taskId].data[0] = 3; } -void sub_80B6460(u8 a, u8 b, u8 c) +static void sub_80B6460(u8 a, u8 b, u8 c) { - struct Task *task; + struct Task *task = &gTasks[FindTaskIdByFunc(Task_80B64D4)]; - task = &gTasks[FindTaskIdByFunc(sub_80B64D4)]; if (a == task->data[0] && c == 0) { task->data[1] = b; @@ -850,7 +918,7 @@ void sub_80B6460(u8 a, u8 b, u8 c) sub_80B65D4(task, a, b); } -void sub_80B64D4(u8 taskId) +static void Task_80B64D4(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -874,7 +942,7 @@ void sub_80B64D4(u8 taskId) } } -u16 sub_80B654C(u8 a) +static u16 sub_80B654C(u8 a) { const u16 arr[] = { @@ -886,14 +954,14 @@ u16 sub_80B654C(u8 a) return arr[a]; } -void sub_80B65AC(u8 a) +static void sub_80B65AC(u8 a) { u16 index = sub_80B654C(a); gPlttBufferFaded[index] = gPlttBufferUnfaded[index]; } -void sub_80B65D4(struct Task *task, u8 b, u8 c) +static void sub_80B65D4(struct Task *task, u8 b, u8 c) { task->data[0] = b; task->data[1] = c; @@ -903,103 +971,117 @@ void sub_80B65D4(struct Task *task, u8 b, u8 c) task->data[5] = 0; } -// +//-------------------------------------------------- +// Page Swap +//-------------------------------------------------- -u8 sub_80B6668(struct Task *); -u8 sub_80B6680(struct Task *); -u8 sub_80B66EC(struct Task *); -u8 sub_80B6758(struct Task *); +#define tState data[0] +#define tFrameCount data[1] -u8 (*const gUnknown_083CE27C[])(struct Task *) = +static bool8 PageSwapAnimState_Init(struct Task *); +static bool8 PageSwapAnimState_1(struct Task *); +static bool8 PageSwapAnimState_2(struct Task *); +static bool8 PageSwapAnimState_Done(struct Task *); + +static bool8 (*const sPageSwapAnimStateFuncs[])(struct Task *) = { - sub_80B6668, - sub_80B6680, - sub_80B66EC, - sub_80B6758, + PageSwapAnimState_Init, + PageSwapAnimState_1, + PageSwapAnimState_2, + PageSwapAnimState_Done, }; -void sub_80B65F0(void) +static void StartPageSwapAnim(void) { u8 taskId; - taskId = CreateTask(sub_80B6630, 0); - sub_80B6630(taskId); + taskId = CreateTask(Task_HandlePageSwapAnim, 0); + Task_HandlePageSwapAnim(taskId); } -bool8 sub_80B6610(void) +static bool8 IsPageSwapAnimNotInProgress(void) { - if (FindTaskIdByFunc(sub_80B6630) == 0xFF) + if (FindTaskIdByFunc(Task_HandlePageSwapAnim) == 0xFF) return TRUE; else return FALSE; } -void sub_80B6630(u8 taskId) +static void Task_HandlePageSwapAnim(u8 taskId) { - while (gUnknown_083CE27C[gTasks[taskId].data[0]](&gTasks[taskId]) != 0) + while (sPageSwapAnimStateFuncs[gTasks[taskId].tState](&gTasks[taskId]) != 0) ; } -u8 sub_80B6668(struct Task *task) +static bool8 PageSwapAnimState_Init(struct Task *task) { - EWRAM_000000.unk4 = 0; - EWRAM_000000.unk6 = 0; - task->data[0]++; + namingScreenData.bg1vOffset = 0; + namingScreenData.bg2vOffset = 0; + task->tState++; return 0; } -u8 sub_80B6680(struct Task *task) +static bool8 PageSwapAnimState_1(struct Task *task) { - u16 *const arr[] = {&EWRAM_000000.unk6, &EWRAM_000000.unk4}; + u16 *const arr[] = + { + &namingScreenData.bg2vOffset, + &namingScreenData.bg1vOffset + }; - task->data[1] += 4; - *arr[EWRAM_000000.unkC] = Sin(task->data[1], 0x28); - *arr[EWRAM_000000.unkD] = Sin((task->data[1] + 0x80) & 0xFF, 0x28); - if (task->data[1] > 0x3F) + task->tFrameCount += 4; + *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40); + *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); + if (task->tFrameCount >= 64) { - u8 temp = EWRAM_000000.unk8; //Why u8 and not u16? + u8 temp = namingScreenData.unk8; //Why u8 and not u16? - EWRAM_000000.unk8 = EWRAM_000000.unkA; - EWRAM_000000.unkA = temp; - task->data[0]++; + namingScreenData.unk8 = namingScreenData.unkA; + namingScreenData.unkA = temp; + task->tState++; } return 0; } -u8 sub_80B66EC(struct Task *task) +static bool8 PageSwapAnimState_2(struct Task *task) { - u16 *const arr[] = {&EWRAM_000000.unk6, &EWRAM_000000.unk4}; + u16 *const arr[] = {&namingScreenData.bg2vOffset, &namingScreenData.bg1vOffset}; - task->data[1] += 4; - *arr[EWRAM_000000.unkC] = Sin(task->data[1], 0x28); - *arr[EWRAM_000000.unkD] = Sin((task->data[1] + 0x80) & 0xFF, 0x28); - if (task->data[1] > 0x7F) + task->tFrameCount += 4; + *arr[namingScreenData.unkC] = Sin(task->tFrameCount, 40); + *arr[namingScreenData.unkD] = Sin((task->tFrameCount + 128) & 0xFF, 40); + if (task->tFrameCount >= 128) { - u8 temp = EWRAM_000000.unkC; + u8 temp = namingScreenData.unkC; - EWRAM_000000.unkC = EWRAM_000000.unkD; - EWRAM_000000.unkD = temp; - task->data[0]++; + namingScreenData.unkC = namingScreenData.unkD; + namingScreenData.unkD = temp; + task->tState++; } return 0; } -u8 sub_80B6758(struct Task *task) +static bool8 PageSwapAnimState_Done(struct Task *task) { - DestroyTask(FindTaskIdByFunc(sub_80B6630)); + DestroyTask(FindTaskIdByFunc(Task_HandlePageSwapAnim)); return 0; } -// +#undef tState +#undef tFrameCount -void sub_80B6774(void) +//-------------------------------------------------- +// Cursor +//-------------------------------------------------- + +static void CursorInit(void) { - EWRAM_000000.cursorSpriteId = CreateSprite(&gSpriteTemplate_83CE640, 0, 0, 0); - gSprites[EWRAM_000000.cursorSpriteId].oam.priority = 1; - gSprites[EWRAM_000000.cursorSpriteId].oam.objMode = 1; - gSprites[EWRAM_000000.cursorSpriteId].data6 = 1; - gSprites[EWRAM_000000.cursorSpriteId].data6 = 2; - set_cursor_pos(0, 0); + namingScreenData.cursorSpriteId = CreateSprite(&gSpriteTemplate_83CE640, 0, 0, 0); + gSprites[namingScreenData.cursorSpriteId].oam.priority = 1; + gSprites[namingScreenData.cursorSpriteId].oam.objMode = 1; + gSprites[namingScreenData.cursorSpriteId].data6 = 1; + gSprites[namingScreenData.cursorSpriteId].data6 = 2; + SetCursorPos(0, 0); } static const u8 sKeyboardSymbolPositions[][9] = @@ -1009,70 +1091,70 @@ static const u8 sKeyboardSymbolPositions[][9] = {1, 4, 7, 10, 13, 16, 16, 16, 19}, //Others page }; -u8 sub_80B67EC(s16 x) +static u8 CursorColToKeyboardCol(s16 x) { - return sKeyboardSymbolPositions[EWRAM_000000.currentPage][x]; + return sKeyboardSymbolPositions[namingScreenData.currentPage][x]; } -void set_cursor_pos(s16 x, s16 y) +static void SetCursorPos(s16 x, s16 y) { - struct Sprite *sprite = &gSprites[EWRAM_000000.cursorSpriteId]; + struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId]; - sprite->pos1.x = sub_80B67EC(x) * 8 + 27; - sprite->pos1.y = y * 16 + 80; - sprite->data2 = sprite->data0; - sprite->data3 = sprite->data1; - sprite->data0 = x; - sprite->data1 = y; + cursorSprite->pos1.x = CursorColToKeyboardCol(x) * 8 + 27; + cursorSprite->pos1.y = y * 16 + 80; + cursorSprite->data2 = cursorSprite->data0; + cursorSprite->data3 = cursorSprite->data1; + cursorSprite->data0 = x; + cursorSprite->data1 = y; } -void get_cursor_pos(s16 *x, s16 *y) +static void GetCursorPos(s16 *x, s16 *y) { - struct Sprite *sprite = &gSprites[EWRAM_000000.cursorSpriteId]; + struct Sprite *cursorSprite = &gSprites[namingScreenData.cursorSpriteId]; - *x = sprite->data0; - *y = sprite->data1; + *x = cursorSprite->data0; + *y = cursorSprite->data1; } -void sub_80B6878(void) +static void MoveCursorToOKButton(void) { - set_cursor_pos(8, 2); + SetCursorPos(8, 2); } -void sub_80B6888(u8 a) +static void sub_80B6888(u8 a) { - gSprites[EWRAM_000000.cursorSpriteId].data4 &= -256; - gSprites[EWRAM_000000.cursorSpriteId].data4 |= a; - StartSpriteAnim(&gSprites[EWRAM_000000.cursorSpriteId], 0); + gSprites[namingScreenData.cursorSpriteId].data4 &= -256; + gSprites[namingScreenData.cursorSpriteId].data4 |= a; + StartSpriteAnim(&gSprites[namingScreenData.cursorSpriteId], 0); } -void sub_80B68D8(u8 a) +static void sub_80B68D8(u8 a) { - gSprites[EWRAM_000000.cursorSpriteId].data4 &= 0xFF; - gSprites[EWRAM_000000.cursorSpriteId].data4 |= a << 8; + gSprites[namingScreenData.cursorSpriteId].data4 &= 0xFF; + gSprites[namingScreenData.cursorSpriteId].data4 |= a << 8; } -void sub_80B6914(void) +static void sub_80B6914(void) { - StartSpriteAnim(&gSprites[EWRAM_000000.cursorSpriteId], 1); + StartSpriteAnim(&gSprites[namingScreenData.cursorSpriteId], 1); } -bool8 sub_80B6938(void) +static bool8 IsCursorAnimFinished(void) { - return gSprites[EWRAM_000000.cursorSpriteId].animEnded; + return gSprites[namingScreenData.cursorSpriteId].animEnded; } -u8 sub_80B6958(void) +static u8 GetKeyRoleAtCursorPos(void) { - const u8 arr[] = {1, 2, 3}; - s16 var1; - s16 var2; + const u8 keyRoles[] = {KEY_ROLE_PAGE, KEY_ROLE_BACKSPACE, KEY_ROLE_OK}; + s16 cursorX; + s16 cursorY; - get_cursor_pos(&var1, &var2); - if (var1 < 8) - return 0; + GetCursorPos(&cursorX, &cursorY); + if (cursorX < 8) + return KEY_ROLE_CHAR; else - return arr[var2]; + return keyRoles[cursorY]; } #ifdef NONMATCHING @@ -1240,14 +1322,14 @@ _080B6A7C: .4byte 0x01010000\n\ } #endif -void sub_80B6A80(void) +static void sub_80B6A80(void) { u8 spriteId1; u8 spriteId2; u8 spriteId3; spriteId1 = CreateSprite(&gSpriteTemplate_83CE5C8, 0xCC, 0x50, 0); - EWRAM_000000.unk10 = spriteId1; + namingScreenData.unk10 = spriteId1; SetSubspriteTables(&gSprites[spriteId1], gSubspriteTables_83CE558); spriteId2 = CreateSprite(&gSpriteTemplate_83CE5F8, 0xCC, 0x4C, 1); @@ -1259,18 +1341,18 @@ void sub_80B6A80(void) gSprites[spriteId1].data7 = spriteId3; } -void sub_80B6B14(void) +static void sub_80B6B14(void) { - struct Sprite *sprite = &gSprites[EWRAM_000000.unk10]; + struct Sprite *sprite = &gSprites[namingScreenData.unk10]; sprite->data0 = 2; - sprite->data1 = EWRAM_000000.currentPage; + sprite->data1 = namingScreenData.currentPage; } -u8 sub_80B6B5C(struct Sprite *); -u8 sub_80B6B98(struct Sprite *); -u8 sub_80B6B9C(struct Sprite *); -u8 sub_80B6C08(struct Sprite *); +static u8 sub_80B6B5C(struct Sprite *); +static u8 sub_80B6B98(struct Sprite *); +static u8 sub_80B6B9C(struct Sprite *); +static u8 sub_80B6C08(struct Sprite *); static u8 (*const gUnknown_083CE2B4[])(struct Sprite *) = { @@ -1286,22 +1368,22 @@ void sub_80B6B34(struct Sprite *sprite) ; } -u8 sub_80B6B5C(struct Sprite *sprite) +static u8 sub_80B6B5C(struct Sprite *sprite) { struct Sprite *sprite1 = &gSprites[sprite->data6]; struct Sprite *sprite2 = &gSprites[sprite->data7]; - sub_80B6C48(EWRAM_000000.currentPage, sprite1, sprite2); + sub_80B6C48(namingScreenData.currentPage, sprite1, sprite2); sprite->data0++; return 0; } -u8 sub_80B6B98(struct Sprite *sprite) +static u8 sub_80B6B98(struct Sprite *sprite) { return 0; } -u8 sub_80B6B9C(struct Sprite *sprite) +static u8 sub_80B6B9C(struct Sprite *sprite) { struct Sprite *r4 = &gSprites[sprite->data6]; struct Sprite *r5 = &gSprites[sprite->data7]; @@ -1317,7 +1399,7 @@ u8 sub_80B6B9C(struct Sprite *sprite) return 0; } -u8 sub_80B6C08(struct Sprite *sprite) +static u8 sub_80B6C08(struct Sprite *sprite) { struct Sprite *r2 = &gSprites[sprite->data6]; @@ -1334,7 +1416,7 @@ u8 sub_80B6C08(struct Sprite *sprite) static const u16 gUnknown_083CE2C4[] = {1, 3, 2}; static const u16 gUnknown_083CE2CA[] = {4, 6, 5}; -void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c) +static void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c) { c->oam.paletteNum = IndexOfSpritePaletteTag(gUnknown_083CE2C4[a]); b->sheetTileStart = GetSpriteTileStartByTag(gUnknown_083CE2CA[a]); @@ -1343,7 +1425,7 @@ void sub_80B6C48(u8 a, struct Sprite *b, struct Sprite *c) // -void sub_80B6CA8(void) +static void sub_80B6CA8(void) { u8 spriteId; @@ -1354,17 +1436,17 @@ void sub_80B6CA8(void) SetSubspriteTables(&gSprites[spriteId], gSubspriteTables_83CE578); } -void sub_80B6D04(void) +static void sub_80B6D04(void) { u8 spriteId; s16 r1; u8 i; - r1 = (EWRAM_000000.unk2 - 1) * 8 + 4; + r1 = (namingScreenData.unk2 - 1) * 8 + 4; spriteId = CreateSprite(&gSpriteTemplate_83CE658, r1, 0x28, 0); gSprites[spriteId].oam.priority = 3; - r1 = EWRAM_000000.unk2 * 8 + 4; - for (i = 0; i < EWRAM_000000.unk34->unk1; i++, r1 += 8) + r1 = namingScreenData.unk2 * 8 + 4; + for (i = 0; i < namingScreenData.template->maxChars; i++, r1 += 8) { spriteId = CreateSprite(&gSpriteTemplate_83CE670, r1, 0x2C, 0); gSprites[spriteId].oam.priority = 3; @@ -1389,7 +1471,7 @@ void sub_80B6DE8(struct Sprite *sprite) const s16 arr[] = {2, 3, 2, 1}; u8 var; - var = sub_80B6F44(); + var = GetTextCaretPosition(); if (var != (u8)sprite->data0) { sprite->pos2.y = 0; @@ -1410,10 +1492,10 @@ void sub_80B6DE8(struct Sprite *sprite) // -void nullsub_40(void); -void sub_80B6E68(void); -void sub_80B6EBC(void); -void sub_80B6EFC(void); +static void nullsub_40(void); +static void sub_80B6E68(void); +static void sub_80B6EBC(void); +static void sub_80B6EFC(void); static void (*const gUnknown_083CE2E0[])(void) = { @@ -1423,27 +1505,27 @@ static void (*const gUnknown_083CE2E0[])(void) = sub_80B6EFC, }; -void sub_80B6E44(void) +static void sub_80B6E44(void) { - gUnknown_083CE2E0[EWRAM_000000.unk34->unk2](); + gUnknown_083CE2E0[namingScreenData.template->unk2](); } -void nullsub_40(void) +static void nullsub_40(void) { } -void sub_80B6E68(void) +static void sub_80B6E68(void) { u8 rivalGfxId; u8 spriteId; - rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, EWRAM_000000.unk3E); + rivalGfxId = GetRivalAvatarGraphicsIdByStateIdAndGender(0, namingScreenData.unk3E); spriteId = AddPseudoFieldObject(rivalGfxId, SpriteCallbackDummy, 0x38, 0x18, 0); gSprites[spriteId].oam.priority = 3; StartSpriteAnim(&gSprites[spriteId], 4); } -void sub_80B6EBC(void) +static void sub_80B6EBC(void) { u8 spriteId; @@ -1452,77 +1534,684 @@ void sub_80B6EBC(void) gSprites[spriteId].oam.priority = 3; } -void sub_80B6EFC(void) +static void sub_80B6EFC(void) { u8 spriteId; sub_809D51C(); - spriteId = CreateMonIcon(EWRAM_000000.unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, EWRAM_000000.unk44); + spriteId = CreateMonIcon(namingScreenData.unk3E, SpriteCallbackDummy, 0x34, 0x18, 0, namingScreenData.unk44); gSprites[spriteId].oam.priority = 3; } -u8 sub_80B6F44(void) +static u8 GetTextCaretPosition(void) { u8 i; - for (i = 0; i < EWRAM_000000.unk34->unk1; i++) + for (i = 0; i < namingScreenData.template->maxChars; i++) { - if (EWRAM_000000.textBuffer[i] == 0xFF) + if (namingScreenData.textBuffer[i] == EOS) return i; } - return EWRAM_000000.unk34->unk1 - 1; + return namingScreenData.template->maxChars - 1; } -u8 sub_80B6F84(void) +static u8 GetPreviousTextCaretPosition(void) { s8 i; - for (i = EWRAM_000000.unk34->unk1 - 1; i > 0; i--) + for (i = namingScreenData.template->maxChars - 1; i > 0; i--) { - if (EWRAM_000000.textBuffer[i] != 0xFF) + if (namingScreenData.textBuffer[i] != EOS) return i; } return 0; } -void sub_80B6FBC(void) +static void DeleteTextCharacter(void) { - u8 var; + u8 index; u8 var2; - var = sub_80B6F84(); - EWRAM_000000.textBuffer[var] = 0; + index = GetPreviousTextCaretPosition(); + namingScreenData.textBuffer[index] = 0; sub_80B7960(); - EWRAM_000000.textBuffer[var] = 0xFF; - var2 = sub_80B6958(); + namingScreenData.textBuffer[index] = EOS; + var2 = GetKeyRoleAtCursorPos(); if (var2 == 0 || var2 == 2) sub_80B6460(1, 0, 1); PlaySE(SE_BOWA); } -u8 sub_80B7004(void) +static bool8 sub_80B7004(void) { s16 x; s16 y; - u8 var; - u8 r4; + u8 ch; + bool8 r4; - get_cursor_pos(&x, &y); - x = sub_80B67EC(x); - var = sub_80B7768(x, y); + GetCursorPos(&x, &y); + x = CursorColToKeyboardCol(x); + ch = GetCharAtKeyboardPos(x, y); r4 = 1; - if (var == 0xFF) + if (ch == 0xFF) r4 = sub_80B7104(); - else if (var == 0xFE) + else if (ch == 0xFE) r4 = sub_80B713C(); else - sub_80B7174(var); + AddTextCharacter(ch); sub_80B7960(); PlaySE(SE_SELECT); - if (r4 != 0) + if (r4) { - if (sub_80B6F84() == EWRAM_000000.unk34->unk1 - 1) - return 1; + if (GetPreviousTextCaretPosition() == namingScreenData.template->maxChars - 1) + return TRUE; } - return 0; + return FALSE; +} + +static void sub_80B7090(void) +{ + u8 r5; + u8 r4; + + r5 = GetPreviousTextCaretPosition(); + r4 = namingScreenData.textBuffer[r5]; + if (sub_80B7198(r4)) + { + if (sub_80B7264(r4)) + sub_80B7370(r4, r5); + else + sub_80B73CC(r4, r5); + } + else + { + if (sub_80B71E4(r4)) + sub_80B7474(r4, r5); + else + sub_80B72A4(r4, r5); + } + sub_80B7960(); + PlaySE(SE_SELECT); +} + +static bool8 sub_80B7104(void) +{ + u8 r5; + u8 r4; + + r5 = GetPreviousTextCaretPosition(); + r4 = namingScreenData.textBuffer[r5]; + if (sub_80B720C(r4)) + { + sub_80B72A4(r4, r5); + return TRUE; + } + return FALSE; +} + +static bool8 sub_80B713C(void) +{ + u8 r5; + u8 r4; + + r5 = GetPreviousTextCaretPosition(); + r4 = namingScreenData.textBuffer[r5]; + if (sub_80B7264(r4)) + { + sub_80B7370(r4, r5); + return TRUE; + } + return FALSE; +} + +static void AddTextCharacter(u8 ch) +{ + u8 index = GetTextCaretPosition(); + + namingScreenData.textBuffer[index] = ch; +} + +static bool8 sub_80B7198(u8 a) +{ + if ((a >= 55 && a <= 74) + || (a >= 135 && a <= 139) + || (a >= 140 && a <= 144) + || (a >= 145 && a <= 149) + || (a >= 150 && a <= 154)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80B71E4(u8 a) +{ + if ((a >= 75 && a <= 79) + || (a >= 155 && a <= 159)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80B720C(u8 a) +{ + if ((a >= 6 && a <= 20) + || (a >= 26 && a <= 30) + || (a >= 75 && a <= 79) + || (a >= 86 && a <= 100) + || (a >= 106 && a <= 110) + || (a >= 155 && a <= 159)) + return TRUE; + else + return FALSE; +} + +static bool8 sub_80B7264(u8 a) +{ + if ((a >= 26 && a <= 30) + || (a >= 70 && a <= 74) + || (a >= 106 && a <= 110) + || (a >= 150 && a <= 154)) + return TRUE; + else + return FALSE; +} + +static void sub_80B72A4(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 6 && a <= 10) + chr = a + 0x31; + else if (a >= 11 && a <= 15) + chr = a + 0x31; + else if (a >= 16 && a <= 20) + chr = a + 0x31; + else if (a >= 26 && a <= 30) + chr = a + 0x2C; + else if (a >= 75 && a <= 79) + chr = a + 0xFB; + else if (a >= 86 && a <= 90) + chr = a + 0x31; + else if (a >= 91 && a <= 95) + chr = a + 0x31; + else if (a >= 96 && a <= 100) + chr = a + 0x31; + else if (a >= 106 && a <= 110) + chr = a + 0x2C; + else if (a >= 155 && a <= 159) + chr = a + 0xFB; + namingScreenData.textBuffer[b] = chr; +} + +static void sub_80B7370(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 26 && a <= 30) + chr = a + 0x31; + else if (a >= 70 && a <= 74) + chr = a + 5; + else if (a >= 106 && a <= 110) + chr = a + 0x31; + else if (a >= 150 && a <= 154) + chr = a + 5; + namingScreenData.textBuffer[b] = chr; +} + +static void sub_80B73CC(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 55 && a <= 59) + chr = a + 0xCF; + else if (a >= 60 && a <= 64) + chr = a + 0xCF; + else if (a >= 65 && a <= 69) + chr = a + 0xCF; + else if (a >= 70 && a <= 74) + chr = a + 0xD4; + else if (a >= 135 && a <= 139) + chr = a + 0xCF; + else if (a >= 140 && a <= 144) + chr = a + 0xCF; + else if (a >= 145 && a <= 149) + chr = a + 0xCF; + else if (a >= 150 && a <= 154) + chr = a + 0xD4; + namingScreenData.textBuffer[b] = chr; +} + +static void sub_80B7474(u8 a, u8 b) +{ + u8 chr = a; + + if (a >= 75 && a <= 79) + chr = a + 0xCF; + else if (a >= 155 && a <= 159) + chr = a + 0xCF; + namingScreenData.textBuffer[b] = chr; +} + +static void sub_80B74B0(void) +{ + u8 i; + + for (i = 0; i < namingScreenData.template->maxChars; i++) + { + if (namingScreenData.textBuffer[i] != 0 && namingScreenData.textBuffer[i] != 0xFF) + { + StringCopyN(namingScreenData.destBuffer, namingScreenData.textBuffer, namingScreenData.template->maxChars + 1); + break; + } + } +} + +static void DisplaySentToPCMessage(void) +{ + StringCopy(gStringVar1, namingScreenData.destBuffer); + StringExpandPlaceholders(gStringVar4, gOtherText_SentToPC); + BasicInitMenuWindow(&gWindowConfig_81E6E88); + MenuDisplayMessageBox(); + sub_8072044(gStringVar4); } + +static void sub_80B753C(void) +{ + LoadSpriteSheets(gUnknown_083CE6A0); + LoadSpritePalettes(gUnknown_083CE708); +} + +static void sub_80B7558(void) +{ + sub_80B7568(); + sub_80B75B0(); +} + +static void sub_80B7568(void) +{ + const void *src; + void *dst; + + src = gNamingScreenMenu_Gfx; + dst = (void *)(VRAM + gMenuMessageBoxContentTileOffset * 32); + DmaCopy16(3, src, dst, 0x800); + + src = gNamingScreenMenu_Gfx; + dst = (void *)(VRAM + 0x8000 + gMenuMessageBoxContentTileOffset * 32); + DmaCopy16(3, src, dst, 0x800); +} + +static void sub_80B75B0(void) +{ + LoadPalette(gNamingScreenPalettes, 0, 0x80); +} + +static void sub_80B7650(u16 *); +static void sub_80B7660(u16 *); +static void sub_80B7670(u16 *); + +static void (*const gUnknown_083CE2F0[][2])(u16 *) = +{ + {sub_80B7660, sub_80B7650}, + {sub_80B7650, sub_80B7670}, + {sub_80B7670, sub_80B7660}, +}; + +static void sub_80B75C4(void) +{ + u16 *const arr[] = + { + (u16 *)(VRAM + 0xE000), + (u16 *)(VRAM + 0xE800), + }; + + gUnknown_083CE2F0[namingScreenData.currentPage][0](arr[namingScreenData.unkC]); + gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]); +} + +static void sub_80B7614(void) +{ + u16 *const arr[] = + { + (u16 *)(VRAM + 0xE000), + (u16 *)(VRAM + 0xE800), + }; + + gUnknown_083CE2F0[namingScreenData.currentPage][1](arr[namingScreenData.unkD]); +} + +static void sub_80B7650(u16 *vramBuffer) +{ + sub_80B7698(vramBuffer, gUnknown_083CE748); +} + +static void sub_80B7660(u16 *vramBuffer) +{ + sub_80B7698(vramBuffer, gUnknown_083CEBF8); +} + +static void sub_80B7670(u16 *vramBuffer) +{ + sub_80B7698(vramBuffer, gUnknown_083CF0A8); +} + +static void sub_80B7680(void) +{ + sub_80B76E0(VRAM + 0xF000, gUnknown_08E86258); +} + +static void sub_80B7698(u16 *vramBuffer, const u16 *src) +{ + s16 i; + s16 j; + + for (i = 0; i < 20; i++) + { + for (j = 0; j < 30; j++, src++) + { + vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset; + } + } +} + +static void sub_80B76E0(u16 *vramBuffer, const u16 *src) +{ + s16 i; + s16 j; + + for (i = 0; i < 20; i++) + { + for (j = 0; j < 30; j++, src++) + { + vramBuffer[i * 32 + j] = *src + gMenuMessageBoxContentTileOffset; + } + src += 2; + } +} + +static void sub_80B772C(void) +{ + nullsub_20(namingScreenData.currentPage, namingScreenData.unkC); +} + +static void sub_80B7740(void) +{ + nullsub_20((namingScreenData.currentPage + 1) % 3, namingScreenData.unkD); +} + +static void nullsub_20(u8 a, u8 b) +{ +} + +static void sub_80B7838(void); +static void sub_80B7844(void); +static void sub_80B7850(void); + +static void (*const gUnknown_083CE310[][2])(void) = +{ + sub_80B7844, + sub_80B7838, + sub_80B7838, + sub_80B7850, + sub_80B7850, + sub_80B7844, +}; + +static const struct WindowConfig *const gUnknown_083CE328[][2][2] = +{ + { + {&gWindowConfig_81E6EDC, &gWindowConfig_81E6EF8}, + {&gWindowConfig_81E6EA4, &gWindowConfig_81E6EC0}, + }, + { + {&gWindowConfig_81E6EA4, &gWindowConfig_81E6EC0}, + {&gWindowConfig_81E6F14, &gWindowConfig_81E6F30}, + }, + { + {&gWindowConfig_81E6F14, &gWindowConfig_81E6F30}, + {&gWindowConfig_81E6EDC, &gWindowConfig_81E6EF8}, + }, +}; + +static void nullsub_61(void); +static void sub_80B78F8(void); + +static void (*const gUnknown_083CE358[])(void) = +{ + nullsub_61, + nullsub_61, + sub_80B78F8, + sub_80B78F8, +}; + +static void nullsub_62(void); +static void sub_80B7924(void); + +static void (*const gUnknown_083CE368[])(void) = +{ + nullsub_62, + sub_80B7924, +}; + +static const u8 sKeyboardCharacters[][4][20]; //forward declaration + +static u8 GetCharAtKeyboardPos(s16 a, s16 b) +{ + return sKeyboardCharacters[namingScreenData.currentPage][b][a]; +} + +static void sub_80B7794(void) +{ + BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][0][namingScreenData.unkC]); + gUnknown_083CE310[namingScreenData.currentPage][0](); + BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][1][namingScreenData.unkD]); + gUnknown_083CE310[namingScreenData.currentPage][1](); + sub_80B772C(); + sub_80B7740(); +} + +static void sub_80B77F8(void) +{ + BasicInitMenuWindow(gUnknown_083CE328[namingScreenData.currentPage][1][namingScreenData.unkD]); + gUnknown_083CE310[namingScreenData.currentPage][1](); + sub_80B7740(); +} + +static void sub_80B7838(void) +{ + PrintKeyboardCharacters(1); +} + +static void sub_80B7844(void) +{ + PrintKeyboardCharacters(0); +} + +static void sub_80B7850(void) +{ + PrintKeyboardCharacters(2); +} + +static void PrintKeyboardCharacters(u8 page) //print letters on page +{ + s16 i; + s16 r5; + + for (i = 0, r5 = 9; i < 4; i++, r5 += 2) + MenuPrint(sKeyboardCharacters[page][i], 3, r5); +} + +static void sub_80B78A8(void) +{ + BasicInitMenuWindow(&gWindowConfig_81E6F4C); + gUnknown_083CE358[namingScreenData.templateNum](); + gUnknown_083CE368[namingScreenData.template->unk3](); + MenuPrint(namingScreenData.template->title, 9, 2); +} + +static void nullsub_61(void) +{ +} + +static void sub_80B78F8(void) +{ + StringCopy(gStringVar1, gSpeciesNames[(s16)namingScreenData.unk3E]); +} + +static void nullsub_62(void) +{ +} + +static void sub_80B7924(void) +{ + u8 genderSymbol[2] = _("♂"); + + if ((s16)namingScreenData.unk40 != MON_GENDERLESS) + { + if ((s16)namingScreenData.unk40 == MON_FEMALE) + genderSymbol[0] = 0xB6; //female symbol + MenuPrint(genderSymbol, 0x14, 4); + } +} + +static void sub_80B7960(void) +{ + u8 *string = gStringVar1; + + string[0] = 0xFC; + string[1] = 0x14; + string[2] = 8; + string[3] = 0xFC; + string[4] = 0x11; + string[5] = 1; + string += 6; + StringCopy(string, namingScreenData.textBuffer); + BasicInitMenuWindow(&gWindowConfig_81E6F4C); + MenuPrint(gStringVar1, namingScreenData.unk2, 4); +} + +//-------------------------------------------------- +// Forward-declared variables +//-------------------------------------------------- + +static const struct NamingScreenTemplate playerNamingScreenTemplate = +{ + .unk0 = 0, + .maxChars = 7, + .unk2 = 1, + .unk3 = 0, + .unk4 = 0, + .unk5 = 0, + .unk6 = 0, + .unk7 = 0, + .title = OtherText_YourName, +}; + +static const struct NamingScreenTemplate pcBoxNamingTemplate = +{ + .unk0 = 0, + .maxChars = 8, + .unk2 = 2, + .unk3 = 0, + .unk4 = 0, + .unk5 = 0, + .unk6 = 0, + .unk7 = 0, + .title = OtherText_BoxName, +}; + +static const struct NamingScreenTemplate monNamingScreenTemplate = +{ + .unk0 = 0, + .maxChars = 10, + .unk2 = 3, + .unk3 = 1, + .unk4 = 0, + .unk5 = 0, + .unk6 = 0, + .unk7 = 0, + .title = OtherText_PokeName, +}; + +static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = +{ + &playerNamingScreenTemplate, + &pcBoxNamingTemplate, + &monNamingScreenTemplate, + &monNamingScreenTemplate, +}; + +static const u8 sKeyboardCharacters[][4][20] = +{ + { + _(" A B C D E F . "), + _(" G H I J K L , "), + _(" M N O P Q R S "), + _(" T U V W X Y Z "), + }, + { + _(" a b c d e f . "), + _(" g h i j k l , "), + _(" m n o p q r s "), + _(" t u v w x y z "), + }, + { + _(" 0 1 2 3 4 "), + _(" 5 6 7 8 9 "), + _(" ! ? ♂ ♀ / - "), + _(" … “ ” ‘ ’ "), + }, +}; + +const struct OamData gOamData_83CE498 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const struct OamData gOamData_83CE4A0 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +const struct OamData gOamData_83CE4A8 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 1, + .x = 0, + .matrixNum = 0, + .size = 2, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +//TODO: dump sprite data diff --git a/src/sprite.c b/src/sprite.c index fd8a5aaac..8e8833536 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -1468,7 +1468,7 @@ void SetOamMatrixRotationScaling(u8 matrixNum, s16 xScale, s16 yScale, u16 rotat CopyOamMatrix(matrixNum, &matrix); } -u16 LoadSpriteSheet(struct SpriteSheet *sheet) +u16 LoadSpriteSheet(const struct SpriteSheet *sheet) { s16 tileStart = AllocSpriteTiles(sheet->size / TILE_SIZE_4BPP); @@ -1484,7 +1484,7 @@ u16 LoadSpriteSheet(struct SpriteSheet *sheet) } } -void LoadSpriteSheets(struct SpriteSheet *sheets) +void LoadSpriteSheets(const struct SpriteSheet *sheets) { u8 i; for (i = 0; sheets[i].data != NULL; i++) |