diff --git a/src/game/game_0e5ce0.c b/src/game/game_0e5ce0.c index 13cdebc55..fd673f1ae 100644 --- a/src/game/game_0e5ce0.c +++ b/src/game/game_0e5ce0.c @@ -39,19 +39,15 @@ s32 var8007119c = 0x00000000; s32 var800711a0 = 0; s32 var800711a4 = 0; u32 var800711a8 = 0x0000000b; -u32 var800711ac = 0x30313233; -u32 var800711b0 = 0x34353637; -u32 var800711b4 = 0x38394142; -u32 var800711b8 = 0x43444546; -u32 var800711bc = 0x4748494a; -u32 var800711c0 = 0x4b4c4d4e; -u32 var800711c4 = 0x4f505152; -u32 var800711c8 = 0x53545556; -u32 var800711cc = 0x5758595a; -u32 var800711d0 = 0x203f212e; -u32 var800711d4 = 0x31323132; -u32 var800711d8 = 0x31323331; -u32 var800711dc = 0x32330000; + +u8 g_KeyboardKeys[5][10] = { + { '0','1','2','3','4','5','6','7','8','9' }, + { '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',' ','?','!','.' }, + { '1','2','1','2','1','2','3','1','2','3' }, +}; + u32 var800711e0 = 0x573a573b; u32 var800711e4 = 0x573c573d; u32 var800711e8 = 0x00000000; @@ -1812,9 +1808,9 @@ bool menuTickItemList(struct menuitem *item, struct menuinputs *inputs, u32 arg2 data->list.unk04 = func0f0e5ef8(data->list.unk02, item); } - if (inputs->unk01) { + if (inputs->updown) { prev2 = data->list.unk02; - data->list.unk02 += inputs->unk01; + data->list.unk02 += inputs->updown; if (data->list.unk02 < 0) { data->list.unk02 = handlerdata.list.value - 1; @@ -1851,7 +1847,7 @@ bool menuTickItemList(struct menuitem *item, struct menuinputs *inputs, u32 arg2 } } - inputs->unk01 = false; + inputs->updown = false; } } @@ -3290,9 +3286,9 @@ glabel menuRenderItemKeyboard .L0f0e8f44: /* f0e8f44: 0018c040 */ sll $t8,$t8,0x1 /* f0e8f48: 03177021 */ addu $t6,$t8,$s7 -/* f0e8f4c: 3c198007 */ lui $t9,%hi(var800711ac) +/* f0e8f4c: 3c198007 */ lui $t9,%hi(g_KeyboardKeys) /* f0e8f50: 032ec821 */ addu $t9,$t9,$t6 -/* f0e8f54: 933911ac */ lbu $t9,%lo(var800711ac)($t9) +/* f0e8f54: 933911ac */ lbu $t9,%lo(g_KeyboardKeys)($t9) /* f0e8f58: 8fab00e4 */ lw $t3,0xe4($sp) /* f0e8f5c: 27a400c0 */ addiu $a0,$sp,0xc0 /* f0e8f60: a3b900f0 */ sb $t9,0xf0($sp) @@ -3462,401 +3458,219 @@ glabel menuRenderItemKeyboard /* f0e91cc: 27bd00f8 */ addiu $sp,$sp,0xf8 ); -GLOBAL_ASM( -glabel menuTickItemKeyboard -/* f0e91d0: 27bdff88 */ addiu $sp,$sp,-120 -/* f0e91d4: afb00020 */ sw $s0,0x20($sp) -/* f0e91d8: 30ce0002 */ andi $t6,$a2,0x2 -/* f0e91dc: 00e08025 */ or $s0,$a3,$zero -/* f0e91e0: afbf0024 */ sw $ra,0x24($sp) -/* f0e91e4: afa40078 */ sw $a0,0x78($sp) -/* f0e91e8: afa5007c */ sw $a1,0x7c($sp) -/* f0e91ec: 00e04025 */ or $t0,$a3,$zero -/* f0e91f0: afa00060 */ sw $zero,0x60($sp) -/* f0e91f4: 11c00128 */ beqz $t6,.L0f0e9698 -/* f0e91f8: afae0034 */ sw $t6,0x34($sp) -/* f0e91fc: 8fac007c */ lw $t4,0x7c($sp) -/* f0e9200: 80e2000b */ lb $v0,0xb($a3) -/* f0e9204: 80e3000c */ lb $v1,0xc($a3) -/* f0e9208: 818d0000 */ lb $t5,0x0($t4) -/* f0e920c: 00022c00 */ sll $a1,$v0,0x10 -/* f0e9210: 00033400 */ sll $a2,$v1,0x10 -/* f0e9214: 0005c403 */ sra $t8,$a1,0x10 -/* f0e9218: 0006cc03 */ sra $t9,$a2,0x10 -/* f0e921c: 03002825 */ or $a1,$t8,$zero -/* f0e9220: 11a00020 */ beqz $t5,.L0f0e92a4 -/* f0e9224: 03203025 */ or $a2,$t9,$zero -/* f0e9228: 240b0008 */ addiu $t3,$zero,0x8 -/* f0e922c: 240a0005 */ addiu $t2,$zero,0x5 -/* f0e9230: 24090002 */ addiu $t1,$zero,0x2 -/* f0e9234: 24070004 */ addiu $a3,$zero,0x4 -/* f0e9238: 24040009 */ addiu $a0,$zero,0x9 -/* f0e923c: 8fae007c */ lw $t6,0x7c($sp) -.L0f0e9240: -/* f0e9240: 81cf0000 */ lb $t7,0x0($t6) -/* f0e9244: 004fc021 */ addu $t8,$v0,$t7 -/* f0e9248: a218000b */ sb $t8,0xb($s0) -/* f0e924c: 8202000b */ lb $v0,0xb($s0) -/* f0e9250: 04430004 */ bgezl $v0,.L0f0e9264 -/* f0e9254: 2841000a */ slti $at,$v0,0xa -/* f0e9258: a204000b */ sb $a0,0xb($s0) -/* f0e925c: 8202000b */ lb $v0,0xb($s0) -/* f0e9260: 2841000a */ slti $at,$v0,0xa -.L0f0e9264: -/* f0e9264: 54200003 */ bnezl $at,.L0f0e9274 -/* f0e9268: 8203000c */ lb $v1,0xc($s0) -/* f0e926c: a200000b */ sb $zero,0xb($s0) -/* f0e9270: 8203000c */ lb $v1,0xc($s0) -.L0f0e9274: -/* f0e9274: 54e3000c */ bnel $a3,$v1,.L0f0e92a8 -/* f0e9278: 8fac007c */ lw $t4,0x7c($sp) -/* f0e927c: 8202000b */ lb $v0,0xb($s0) -/* f0e9280: 50400009 */ beqzl $v0,.L0f0e92a8 -/* f0e9284: 8fac007c */ lw $t4,0x7c($sp) -/* f0e9288: 51220007 */ beql $t1,$v0,.L0f0e92a8 -/* f0e928c: 8fac007c */ lw $t4,0x7c($sp) -/* f0e9290: 51420005 */ beql $t2,$v0,.L0f0e92a8 -/* f0e9294: 8fac007c */ lw $t4,0x7c($sp) -/* f0e9298: 8119000b */ lb $t9,0xb($t0) -/* f0e929c: 5579ffe8 */ bnel $t3,$t9,.L0f0e9240 -/* f0e92a0: 8fae007c */ lw $t6,0x7c($sp) -.L0f0e92a4: -/* f0e92a4: 8fac007c */ lw $t4,0x7c($sp) -.L0f0e92a8: -/* f0e92a8: 24040009 */ addiu $a0,$zero,0x9 -/* f0e92ac: 24070004 */ addiu $a3,$zero,0x4 -/* f0e92b0: 81820001 */ lb $v0,0x1($t4) -/* f0e92b4: 24090002 */ addiu $t1,$zero,0x2 -/* f0e92b8: 240a0005 */ addiu $t2,$zero,0x5 -/* f0e92bc: 10400025 */ beqz $v0,.L0f0e9354 -/* f0e92c0: 240b0008 */ addiu $t3,$zero,0x8 -/* f0e92c4: 00626821 */ addu $t5,$v1,$v0 -/* f0e92c8: a20d000c */ sb $t5,0xc($s0) -/* f0e92cc: 8203000c */ lb $v1,0xc($s0) -/* f0e92d0: 04630004 */ bgezl $v1,.L0f0e92e4 -/* f0e92d4: 28610005 */ slti $at,$v1,0x5 -/* f0e92d8: a207000c */ sb $a3,0xc($s0) -/* f0e92dc: 8203000c */ lb $v1,0xc($s0) -/* f0e92e0: 28610005 */ slti $at,$v1,0x5 -.L0f0e92e4: -/* f0e92e4: 14200003 */ bnez $at,.L0f0e92f4 -/* f0e92e8: 00000000 */ nop -/* f0e92ec: a200000c */ sb $zero,0xc($s0) -/* f0e92f0: 8203000c */ lb $v1,0xc($s0) -.L0f0e92f4: -/* f0e92f4: 14e30017 */ bne $a3,$v1,.L0f0e9354 -/* f0e92f8: 24010007 */ addiu $at,$zero,0x7 -/* f0e92fc: 8202000b */ lb $v0,0xb($s0) -/* f0e9300: 14820003 */ bne $a0,$v0,.L0f0e9310 -/* f0e9304: 00000000 */ nop -/* f0e9308: a20b000b */ sb $t3,0xb($s0) -/* f0e930c: 8202000b */ lb $v0,0xb($s0) -.L0f0e9310: -/* f0e9310: 10410003 */ beq $v0,$at,.L0f0e9320 -/* f0e9314: 24010006 */ addiu $at,$zero,0x6 -/* f0e9318: 54410004 */ bnel $v0,$at,.L0f0e932c -/* f0e931c: 24010003 */ addiu $at,$zero,0x3 -.L0f0e9320: -/* f0e9320: a20a000b */ sb $t2,0xb($s0) -/* f0e9324: 8202000b */ lb $v0,0xb($s0) -/* f0e9328: 24010003 */ addiu $at,$zero,0x3 -.L0f0e932c: -/* f0e932c: 50410004 */ beql $v0,$at,.L0f0e9340 -/* f0e9330: a209000b */ sb $t1,0xb($s0) -/* f0e9334: 54e20004 */ bnel $a3,$v0,.L0f0e9348 -/* f0e9338: 24010001 */ addiu $at,$zero,0x1 -/* f0e933c: a209000b */ sb $t1,0xb($s0) -.L0f0e9340: -/* f0e9340: 8202000b */ lb $v0,0xb($s0) -/* f0e9344: 24010001 */ addiu $at,$zero,0x1 -.L0f0e9348: -/* f0e9348: 54410003 */ bnel $v0,$at,.L0f0e9358 -/* f0e934c: 820e000b */ lb $t6,0xb($s0) -/* f0e9350: a200000b */ sb $zero,0xb($s0) -.L0f0e9354: -/* f0e9354: 820e000b */ lb $t6,0xb($s0) -.L0f0e9358: -/* f0e9358: 14ae0004 */ bne $a1,$t6,.L0f0e936c -/* f0e935c: 00000000 */ nop -/* f0e9360: 820f000c */ lb $t7,0xc($s0) -/* f0e9364: 50cf0008 */ beql $a2,$t7,.L0f0e9388 -/* f0e9368: 8fb8007c */ lw $t8,0x7c($sp) -.L0f0e936c: -/* f0e936c: 0fc3c27c */ jal menuPlaySound -/* f0e9370: 2404000c */ addiu $a0,$zero,0xc -/* f0e9374: 24070004 */ addiu $a3,$zero,0x4 -/* f0e9378: 24090002 */ addiu $t1,$zero,0x2 -/* f0e937c: 240a0005 */ addiu $t2,$zero,0x5 -/* f0e9380: 240b0008 */ addiu $t3,$zero,0x8 -/* f0e9384: 8fb8007c */ lw $t8,0x7c($sp) -.L0f0e9388: -/* f0e9388: 240c0001 */ addiu $t4,$zero,0x1 -/* f0e938c: 93190007 */ lbu $t9,0x7($t8) -/* f0e9390: 53200003 */ beqzl $t9,.L0f0e93a0 -/* f0e9394: 8fad007c */ lw $t5,0x7c($sp) -/* f0e9398: afac0060 */ sw $t4,0x60($sp) -/* f0e939c: 8fad007c */ lw $t5,0x7c($sp) -.L0f0e93a0: -/* f0e93a0: 8faf0078 */ lw $t7,0x78($sp) -/* f0e93a4: 81ae000a */ lb $t6,0xa($t5) -/* f0e93a8: 51c00023 */ beqzl $t6,.L0f0e9438 -/* f0e93ac: 8fae007c */ lw $t6,0x7c($sp) -/* f0e93b0: 8df80010 */ lw $t8,0x10($t7) -/* f0e93b4: 5300001e */ beqzl $t8,.L0f0e9430 -/* f0e93b8: 8fad007c */ lw $t5,0x7c($sp) -/* f0e93bc: 0fc3a157 */ jal func0f0e855c -/* f0e93c0: 02002025 */ or $a0,$s0,$zero -/* f0e93c4: 24070004 */ addiu $a3,$zero,0x4 -/* f0e93c8: 24090002 */ addiu $t1,$zero,0x2 -/* f0e93cc: 240a0005 */ addiu $t2,$zero,0x5 -/* f0e93d0: 14400016 */ bnez $v0,.L0f0e942c -/* f0e93d4: 240b0008 */ addiu $t3,$zero,0x8 -/* f0e93d8: 0fc3c27c */ jal menuPlaySound -/* f0e93dc: 24040003 */ addiu $a0,$zero,0x3 -/* f0e93e0: 8fa50078 */ lw $a1,0x78($sp) -/* f0e93e4: afb00064 */ sw $s0,0x64($sp) -/* f0e93e8: 24040012 */ addiu $a0,$zero,0x12 -/* f0e93ec: 8cb90010 */ lw $t9,0x10($a1) -/* f0e93f0: 27a60064 */ addiu $a2,$sp,0x64 -/* f0e93f4: 0320f809 */ jalr $t9 -/* f0e93f8: 00000000 */ nop -/* f0e93fc: 0fc3cdb7 */ jal menuPopDialog -/* f0e9400: 00000000 */ nop -/* f0e9404: 8fa50078 */ lw $a1,0x78($sp) -/* f0e9408: 24040006 */ addiu $a0,$zero,0x6 -/* f0e940c: 27a60064 */ addiu $a2,$sp,0x64 -/* f0e9410: 8cb90010 */ lw $t9,0x10($a1) -/* f0e9414: 0320f809 */ jalr $t9 -/* f0e9418: 00000000 */ nop -/* f0e941c: 24070004 */ addiu $a3,$zero,0x4 -/* f0e9420: 24090002 */ addiu $t1,$zero,0x2 -/* f0e9424: 240a0005 */ addiu $t2,$zero,0x5 -/* f0e9428: 240b0008 */ addiu $t3,$zero,0x8 -.L0f0e942c: -/* f0e942c: 8fad007c */ lw $t5,0x7c($sp) -.L0f0e9430: -/* f0e9430: a1a0000a */ sb $zero,0xa($t5) -/* f0e9434: 8fae007c */ lw $t6,0x7c($sp) -.L0f0e9438: -/* f0e9438: 91cf0002 */ lbu $t7,0x2($t6) -/* f0e943c: 51e00082 */ beqzl $t7,.L0f0e9648 -/* f0e9440: 8fae0060 */ lw $t6,0x60($sp) -/* f0e9444: 8218000c */ lb $t8,0xc($s0) -/* f0e9448: 54f80046 */ bnel $a3,$t8,.L0f0e9564 -/* f0e944c: 920f0009 */ lbu $t7,0x9($s0) -/* f0e9450: 8202000b */ lb $v0,0xb($s0) -/* f0e9454: 240c0001 */ addiu $t4,$zero,0x1 -/* f0e9458: 14400002 */ bnez $v0,.L0f0e9464 -/* f0e945c: 00000000 */ nop -/* f0e9460: afac0060 */ sw $t4,0x60($sp) -.L0f0e9464: -/* f0e9464: 1522000a */ bne $t1,$v0,.L0f0e9490 -/* f0e9468: 00000000 */ nop -/* f0e946c: 9203000d */ lbu $v1,0xd($s0) -/* f0e9470: 240d0001 */ addiu $t5,$zero,0x1 -/* f0e9474: 8202000b */ lb $v0,0xb($s0) -/* f0e9478: 0003c9c2 */ srl $t9,$v1,0x7 -/* f0e947c: 01b97823 */ subu $t7,$t5,$t9 -/* f0e9480: 000f61c0 */ sll $t4,$t7,0x7 -/* f0e9484: 306dff7f */ andi $t5,$v1,0xff7f -/* f0e9488: 018dc825 */ or $t9,$t4,$t5 -/* f0e948c: a219000d */ sb $t9,0xd($s0) -.L0f0e9490: -/* f0e9490: 15620012 */ bne $t3,$v0,.L0f0e94dc -/* f0e9494: 8fae0078 */ lw $t6,0x78($sp) -/* f0e9498: 8dcf0010 */ lw $t7,0x10($t6) -/* f0e949c: 51e00010 */ beqzl $t7,.L0f0e94e0 -/* f0e94a0: 8202000b */ lb $v0,0xb($s0) -/* f0e94a4: 0fc3a157 */ jal func0f0e855c -/* f0e94a8: 02002025 */ or $a0,$s0,$zero -/* f0e94ac: 240a0005 */ addiu $t2,$zero,0x5 -/* f0e94b0: 1440000a */ bnez $v0,.L0f0e94dc -/* f0e94b4: 240b0008 */ addiu $t3,$zero,0x8 -/* f0e94b8: 8fa50078 */ lw $a1,0x78($sp) -/* f0e94bc: afb00064 */ sw $s0,0x64($sp) -/* f0e94c0: 24040012 */ addiu $a0,$zero,0x12 -/* f0e94c4: 8cb90010 */ lw $t9,0x10($a1) -/* f0e94c8: 27a60064 */ addiu $a2,$sp,0x64 -/* f0e94cc: 0320f809 */ jalr $t9 -/* f0e94d0: 00000000 */ nop -/* f0e94d4: 240a0005 */ addiu $t2,$zero,0x5 -/* f0e94d8: 240b0008 */ addiu $t3,$zero,0x8 -.L0f0e94dc: -/* f0e94dc: 8202000b */ lb $v0,0xb($s0) -.L0f0e94e0: -/* f0e94e0: 01621826 */ xor $v1,$t3,$v0 -/* f0e94e4: 2c630001 */ sltiu $v1,$v1,0x1 -/* f0e94e8: 14600003 */ bnez $v1,.L0f0e94f8 -/* f0e94ec: 00000000 */ nop -/* f0e94f0: 55420055 */ bnel $t2,$v0,.L0f0e9648 -/* f0e94f4: 8fae0060 */ lw $t6,0x60($sp) -.L0f0e94f8: -/* f0e94f8: 11420005 */ beq $t2,$v0,.L0f0e9510 -/* f0e94fc: afa30058 */ sw $v1,0x58($sp) -/* f0e9500: 0fc3a157 */ jal func0f0e855c -/* f0e9504: 02002025 */ or $a0,$s0,$zero -/* f0e9508: 5440004f */ bnezl $v0,.L0f0e9648 -/* f0e950c: 8fae0060 */ lw $t6,0x60($sp) -.L0f0e9510: -/* f0e9510: 0fc3cdb7 */ jal menuPopDialog -/* f0e9514: 00000000 */ nop -/* f0e9518: 8fac0058 */ lw $t4,0x58($sp) -/* f0e951c: 8fa50078 */ lw $a1,0x78($sp) -/* f0e9520: 1180000a */ beqz $t4,.L0f0e954c -/* f0e9524: 00000000 */ nop -/* f0e9528: 8cb90010 */ lw $t9,0x10($a1) -/* f0e952c: 24040006 */ addiu $a0,$zero,0x6 -/* f0e9530: 27a60064 */ addiu $a2,$sp,0x64 -/* f0e9534: 0320f809 */ jalr $t9 -/* f0e9538: 00000000 */ nop -/* f0e953c: 0fc3c27c */ jal menuPlaySound -/* f0e9540: 24040003 */ addiu $a0,$zero,0x3 -/* f0e9544: 10000004 */ b .L0f0e9558 -/* f0e9548: 8fae007c */ lw $t6,0x7c($sp) -.L0f0e954c: -/* f0e954c: 0fc3c27c */ jal menuPlaySound -/* f0e9550: 2404000d */ addiu $a0,$zero,0xd -/* f0e9554: 8fae007c */ lw $t6,0x7c($sp) -.L0f0e9558: -/* f0e9558: 1000003a */ b .L0f0e9644 -/* f0e955c: a1c00002 */ sb $zero,0x2($t6) -/* f0e9560: 920f0009 */ lbu $t7,0x9($s0) -.L0f0e9564: -/* f0e9564: 00002825 */ or $a1,$zero,$zero -/* f0e9568: 02002025 */ or $a0,$s0,$zero -/* f0e956c: 15e00035 */ bnez $t7,.L0f0e9644 -/* f0e9570: 3c068007 */ lui $a2,%hi(var800711ac) -/* f0e9574: 24c611ac */ addiu $a2,$a2,%lo(var800711ac) -.L0f0e9578: -/* f0e9578: 90980000 */ lbu $t8,0x0($a0) -/* f0e957c: 17000017 */ bnez $t8,.L0f0e95dc -/* f0e9580: 00000000 */ nop -/* f0e9584: 820c000c */ lb $t4,0xc($s0) -/* f0e9588: 820e000b */ lb $t6,0xb($s0) -/* f0e958c: 9218000d */ lbu $t8,0xd($s0) -/* f0e9590: 000c6880 */ sll $t5,$t4,0x2 -/* f0e9594: 01ac6821 */ addu $t5,$t5,$t4 -/* f0e9598: 000d6840 */ sll $t5,$t5,0x1 -/* f0e959c: 00cdc821 */ addu $t9,$a2,$t5 -/* f0e95a0: 032e7821 */ addu $t7,$t9,$t6 -/* f0e95a4: 00186e40 */ sll $t5,$t8,0x19 -/* f0e95a8: 91e20000 */ lbu $v0,0x0($t7) -/* f0e95ac: 05a0000a */ bltz $t5,.L0f0e95d8 -/* f0e95b0: 24050001 */ addiu $a1,$zero,0x1 -/* f0e95b4: 28410041 */ slti $at,$v0,0x41 -/* f0e95b8: 14200007 */ bnez $at,.L0f0e95d8 -/* f0e95bc: 00401825 */ or $v1,$v0,$zero -/* f0e95c0: 2861005b */ slti $at,$v1,0x5b -/* f0e95c4: 50200005 */ beqzl $at,.L0f0e95dc -/* f0e95c8: a0820000 */ sb $v0,0x0($a0) -/* f0e95cc: 24620020 */ addiu $v0,$v1,0x20 -/* f0e95d0: 305900ff */ andi $t9,$v0,0xff -/* f0e95d4: 03201025 */ or $v0,$t9,$zero -.L0f0e95d8: -/* f0e95d8: a0820000 */ sb $v0,0x0($a0) -.L0f0e95dc: -/* f0e95dc: 10a0ffe6 */ beqz $a1,.L0f0e9578 -/* f0e95e0: 24840001 */ addiu $a0,$a0,0x1 -/* f0e95e4: 3c0e8008 */ lui $t6,%hi(var8007fb0c) -/* f0e95e8: 8dcefb0c */ lw $t6,%lo(var8007fb0c)($t6) -/* f0e95ec: 3c078008 */ lui $a3,%hi(var8007fb10) -/* f0e95f0: 8ce7fb10 */ lw $a3,%lo(var8007fb10)($a3) -/* f0e95f4: 27a40048 */ addiu $a0,$sp,0x48 -/* f0e95f8: 27a5004c */ addiu $a1,$sp,0x4c -/* f0e95fc: 02003025 */ or $a2,$s0,$zero -/* f0e9600: afa00014 */ sw $zero,0x14($sp) -/* f0e9604: 0fc55cbe */ jal textMeasure -/* f0e9608: afae0010 */ sw $t6,0x10($sp) -/* f0e960c: 8faf0078 */ lw $t7,0x78($sp) -/* f0e9610: 8fac004c */ lw $t4,0x4c($sp) -/* f0e9614: 8df8000c */ lw $t8,0xc($t7) -/* f0e9618: 2981003b */ slti $at,$t4,0x3b -/* f0e961c: 57000005 */ bnezl $t8,.L0f0e9634 -/* f0e9620: 8fb90060 */ lw $t9,0x60($sp) -/* f0e9624: 14200002 */ bnez $at,.L0f0e9630 -/* f0e9628: 240d0001 */ addiu $t5,$zero,0x1 -/* f0e962c: afad0060 */ sw $t5,0x60($sp) -.L0f0e9630: -/* f0e9630: 8fb90060 */ lw $t9,0x60($sp) -.L0f0e9634: -/* f0e9634: 57200004 */ bnezl $t9,.L0f0e9648 -/* f0e9638: 8fae0060 */ lw $t6,0x60($sp) -/* f0e963c: 0fc3c27c */ jal menuPlaySound -/* f0e9640: 24040002 */ addiu $a0,$zero,0x2 -.L0f0e9644: -/* f0e9644: 8fae0060 */ lw $t6,0x60($sp) -.L0f0e9648: -/* f0e9648: 51c00014 */ beqzl $t6,.L0f0e969c -/* f0e964c: 8fb90034 */ lw $t9,0x34($sp) -/* f0e9650: 920f0000 */ lbu $t7,0x0($s0) -/* f0e9654: 2418000a */ addiu $t8,$zero,0xa -/* f0e9658: 24040002 */ addiu $a0,$zero,0x2 -/* f0e965c: 51e0000f */ beqzl $t7,.L0f0e969c -/* f0e9660: 8fb90034 */ lw $t9,0x34($sp) -/* f0e9664: afb8003c */ sw $t8,0x3c($sp) -/* f0e9668: 0fc3c27c */ jal menuPlaySound -/* f0e966c: afa00040 */ sw $zero,0x40($sp) -/* f0e9670: 8fac003c */ lw $t4,0x3c($sp) -/* f0e9674: 8fa30040 */ lw $v1,0x40($sp) -/* f0e9678: 020c1021 */ addu $v0,$s0,$t4 -.L0f0e967c: -/* f0e967c: 904d0000 */ lbu $t5,0x0($v0) -/* f0e9680: 11a00003 */ beqz $t5,.L0f0e9690 -/* f0e9684: 00000000 */ nop -/* f0e9688: a0400000 */ sb $zero,0x0($v0) -/* f0e968c: 24030001 */ addiu $v1,$zero,0x1 -.L0f0e9690: -/* f0e9690: 1060fffa */ beqz $v1,.L0f0e967c -/* f0e9694: 2442ffff */ addiu $v0,$v0,-1 -.L0f0e9698: -/* f0e9698: 8fb90034 */ lw $t9,0x34($sp) -.L0f0e969c: -/* f0e969c: 53200025 */ beqzl $t9,.L0f0e9734 -/* f0e96a0: 8fbf0024 */ lw $ra,0x24($sp) -/* f0e96a4: 9203000d */ lbu $v1,0xd($s0) -/* f0e96a8: 000379c2 */ srl $t7,$v1,0x7 -/* f0e96ac: 000fc180 */ sll $t8,$t7,0x6 -/* f0e96b0: 330c0040 */ andi $t4,$t8,0x40 -/* f0e96b4: 00032640 */ sll $a0,$v1,0x19 -/* f0e96b8: 306dffbf */ andi $t5,$v1,0xffbf -/* f0e96bc: 000477c2 */ srl $t6,$a0,0x1f -/* f0e96c0: 018dc825 */ or $t9,$t4,$t5 -/* f0e96c4: 01c02025 */ or $a0,$t6,$zero -/* f0e96c8: a219000d */ sb $t9,0xd($s0) -/* f0e96cc: 8fae007c */ lw $t6,0x7c($sp) -/* f0e96d0: 0019c640 */ sll $t8,$t9,0x19 -/* f0e96d4: 001867c2 */ srl $t4,$t8,0x1f -/* f0e96d8: 91cf0006 */ lbu $t7,0x6($t6) -/* f0e96dc: 240d0001 */ addiu $t5,$zero,0x1 -/* f0e96e0: 01ac7023 */ subu $t6,$t5,$t4 -/* f0e96e4: 11e00005 */ beqz $t7,.L0f0e96fc -/* f0e96e8: 332dffbf */ andi $t5,$t9,0xffbf -/* f0e96ec: 000e7980 */ sll $t7,$t6,0x6 -/* f0e96f0: 31f80040 */ andi $t8,$t7,0x40 -/* f0e96f4: 030d6025 */ or $t4,$t8,$t5 -/* f0e96f8: a20c000d */ sb $t4,0xd($s0) -.L0f0e96fc: -/* f0e96fc: 9202000d */ lbu $v0,0xd($s0) -/* f0e9700: 0002ce40 */ sll $t9,$v0,0x19 -/* f0e9704: 001977c2 */ srl $t6,$t9,0x1f -/* f0e9708: 508e000a */ beql $a0,$t6,.L0f0e9734 -/* f0e970c: 8fbf0024 */ lw $ra,0x24($sp) -/* f0e9710: 11c00005 */ beqz $t6,.L0f0e9728 -/* f0e9714: 00000000 */ nop -/* f0e9718: 0fc3c27c */ jal menuPlaySound -/* f0e971c: 24040008 */ addiu $a0,$zero,0x8 -/* f0e9720: 10000004 */ b .L0f0e9734 -/* f0e9724: 8fbf0024 */ lw $ra,0x24($sp) -.L0f0e9728: -/* f0e9728: 0fc3c27c */ jal menuPlaySound -/* f0e972c: 24040009 */ addiu $a0,$zero,0x9 -/* f0e9730: 8fbf0024 */ lw $ra,0x24($sp) -.L0f0e9734: -/* f0e9734: 8fb00020 */ lw $s0,0x20($sp) -/* f0e9738: 27bd0078 */ addiu $sp,$sp,0x78 -/* f0e973c: 03e00008 */ jr $ra -/* f0e9740: 24020001 */ addiu $v0,$zero,0x1 -); +/** + * Keyboard reference: + * +---------------------------------------+ + * | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | + * |---+---+---+---+---+---+---+---+---+---| + * | 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 | | ? | ! | . | + * |-------+-----------+-----------+-------| + * | DEL | CAPS | CANCEL | OK | + * +-------+-----------+-----------+-------+ + */ +bool menuTickItemKeyboard(struct menuitem *item, struct menuinputs *inputs, u32 arg2, union menuitemtickdata *data) +{ + struct menuitemtickdata_keyboard *kb = &data->keyboard; + union handlerdata handlerdata; + s32 delete = false; + + if (arg2 & 2) { + s16 prevcol = kb->col; + s16 prevrow = kb->row; + + // Handle left/right movement + // In most cases the loop only runs once, but on row 4 the buttons span + // across multiple columns so the loop will run again until the column + // number is valid. + if (inputs->leftright != 0) { + do { + kb->col += inputs->leftright; + + if (kb->col < 0) { + kb->col = 9; + } + + if (kb->col > 9) { + kb->col = 0; + } + } while (kb->row == 4 && kb->col != 0 && kb->col != 2 && kb->col != 5 && kb->col != 8); + } + + // Handle up/down movement + if (inputs->updown) { + kb->row += inputs->updown; + + if (kb->row < 0) { + kb->row = 4; + } + + if (kb->row > 4) { + kb->row = 0; + } + + // If moving onto row 4, bump column to a valid one + if (kb->row == 4) { + if (kb->col == 9) { + kb->col = 8; + } + + if (kb->col == 7 || kb->col == 6) { + kb->col = 5; + } + + if (kb->col == 3 || kb->col == 4) { + kb->col = 2; + } + + if (kb->col == 1) { + kb->col = 0; + } + } + } + + if (prevcol != kb->col || prevrow != kb->row) { + menuPlaySound(MENUSOUND_KEYBOARDFOCUS); + } + + if (inputs->back2) { + delete = true; + } + + if (inputs->start) { + if (item->handler && func0f0e855c(kb->string) == 0) { + menuPlaySound(MENUSOUND_SELECT); + + handlerdata.keyboard.string = kb->string; + item->handler(MENUOP_SETTEXT, item, &handlerdata); + + menuPopDialog(); + + item->handler(MENUOP_SET, item, &handlerdata); + } + + inputs->start = false; + } + + if (inputs->select) { + if (kb->row == 4) { + // DEL + if (kb->col == 0) { + delete = true; + } + + // CAPS + if (kb->col == 2) { + kb->capslock = 1 - kb->capslock; + } + + // OK + if (kb->col == 8) { + if (item->handler && func0f0e855c(kb->string) == 0) { + handlerdata.keyboard.string = kb->string; + item->handler(MENUOP_SETTEXT, item, &handlerdata); + } + } + + // OK or CANCEL + if (kb->col == 8 || kb->col == 5) { + s32 ok = (kb->col == 8); + + if (kb->col == 5 || func0f0e855c(kb->string) == 0) { + menuPopDialog(); + + if (ok) { + item->handler(MENUOP_SET, item, &handlerdata); + menuPlaySound(MENUSOUND_SELECT); + } else { + menuPlaySound(MENUSOUND_KEYBOARDCANCEL); + } + + inputs->select = false; + } + } + } else { + // Pressed A on number or letter + s32 appended = false; + s32 i; + s32 textwidth; + s32 textheight; + + if (kb->string[9] == '\0') { + // String is not full + i = 0; + + while (!appended) { + if (kb->string[i] == '\0') { + u8 key = g_KeyboardKeys[kb->row][kb->col]; + appended = true; + + if (kb->capseffective == 0 && key >= 'A' && key <= 'Z') { + // Make lowercase + key += 32; + } + + kb->string[i] = key; + } + + i++; + } + + textMeasure(&textheight, &textwidth, kb->string, var8007fb10, var8007fb0c, 0); + + if (item->param3 == 0 && textwidth > 58) { + delete = true; + } + + if (!delete) { + menuPlaySound(MENUSOUND_FOCUS); + } + } + } + } + + // Handle deleting + if (delete && kb->string[0] != '\0') { + s32 deleted = false; + s32 i = 10; + + menuPlaySound(MENUSOUND_FOCUS); + + while (!deleted) { + if (kb->string[i] != '\0') { + kb->string[i] = '\0'; + deleted = true; + } + + i--; + } + } + } + + // Update caps + if (arg2 & 2) { + u32 prev = kb->capseffective; + kb->capseffective = kb->capslock; + + if (inputs->shoulder) { + // Invert + kb->capseffective = 1 - kb->capseffective; + } + + if (kb->capseffective != prev) { + if (kb->capseffective) { + menuPlaySound(MENUSOUND_TOGGLEON); + } else { + menuPlaySound(MENUSOUND_TOGGLEOFF); + } + } + } + + return true; +} void menuInitItemKeyboard(struct menuitem *item, union menuitemtickdata *data) { @@ -3873,10 +3687,10 @@ void menuInitItemKeyboard(struct menuitem *item, union menuitemtickdata *data) item->handler(MENUOP_GETTEXT, item, &handlerdata); } - data->keyboard.unk0b = 0; - data->keyboard.unk0c = 4; - data->keyboard.unk0d_02 = 0; - data->keyboard.unk0d_01 = 0; + data->keyboard.col = 0; + data->keyboard.row = 4; + data->keyboard.capseffective = 0; + data->keyboard.capslock = 0; } Gfx *menuRenderItemSeparator(Gfx *gdl, struct menurenderthing *thing) diff --git a/src/include/game/data/data_0160b0.h b/src/include/game/data/data_0160b0.h index b20ba1254..2f20607c1 100644 --- a/src/include/game/data/data_0160b0.h +++ b/src/include/game/data/data_0160b0.h @@ -145,7 +145,7 @@ extern s32 var80071198; extern s32 var8007119c; extern s32 var800711a0; extern s32 var800711a4; -extern u32 var800711ac; +extern u8 g_KeyboardKeys[5][10]; extern u32 var800711e0; extern u32 var800711e8; extern u32 var800711f4; diff --git a/src/include/game/game_0e5ce0.h b/src/include/game/game_0e5ce0.h index 03b0d9c11..284344beb 100644 --- a/src/include/game/game_0e5ce0.h +++ b/src/include/game/game_0e5ce0.h @@ -15,7 +15,7 @@ Gfx *menuRenderItemDropdown(Gfx *gdl); bool menuTickItemDropdown(struct menuitem *item, struct menuframe *frame, struct menuinputs *inputs, u32 arg3, union menuitemtickdata *data); Gfx *func0f0e8290(Gfx *gdl, s16 x, s16 y, s16 x2, s16 y2, struct menuitem *item, u32 arg6, u32 arg7); -u32 func0f0e855c(void); +u32 func0f0e855c(char *text); Gfx *menuRenderItemKeyboard(Gfx *gdl); bool menuTickItemKeyboard(struct menuitem *item, struct menuinputs *inputs, u32 arg2, union menuitemtickdata *data); void menuInitItemKeyboard(struct menuitem *item, union menuitemtickdata *data); diff --git a/src/include/types.h b/src/include/types.h index fc68d48b1..8391fbc28 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -3269,10 +3269,10 @@ struct menuitemtickdata_dropdown { struct menuitemtickdata_keyboard { char string[11]; - u8 unk0b; - u8 unk0c; - u8 unk0d_01 : 1; - u8 unk0d_02 : 1; + s8 col; + s8 row; + u8 capslock : 1; // Pressed A on caps button + u8 capseffective : 1; // Same as above, but inverted if holding L or R }; struct menuitemtickdata_list { @@ -6118,13 +6118,13 @@ struct var800a4cf0 { struct menuinputs { /*0x00*/ s8 leftright; // Both control stick and C/D buttons - set on initial press and key repeat - /*0x01*/ s8 unk01; - /*0x02*/ u8 select; // A button + /*0x01*/ s8 updown; // As above + /*0x02*/ u8 select; // A/Z buttons /*0x03*/ u8 back; // B button /*0x04*/ s8 xaxis; // Control stick's current left/right position /*0x05*/ s8 yaxis; // Control stick's current up/down position /*0x06*/ u8 shoulder; // L or R buttons - /*0x07*/ u8 unk07; + /*0x07*/ u8 back2; // Used in keyboard /*0x08*/ s8 unk08; /*0x09*/ s8 unk09; /*0x0a*/ s8 start;