WhatIsYourNameData: textitem 1, 1, WhatIsYourNameText db $ff ; [Deck1Data ~ Deck4Data] ; These are directed from InputCurDeckName, ; without any bank description. ; That is, the developers hard-coded it. -_-;; Deck1Data: textitem 2, 1, Deck1Text textitem 14, 1, DeckText db $ff Deck2Data: textitem 2, 1, Deck2Text textitem 14, 1, DeckText db $ff Deck3Data: textitem 2, 1, Deck3Text textitem 14, 1, DeckText db $ff Deck4Data: textitem 2, 1, Deck4Text textitem 14, 1, DeckText db $ff ; set each byte zero from hl for b bytes. ClearMemory: push af push bc push hl ld b, a xor a .loop ld [hli], a dec b jr nz, .loop pop hl pop bc pop af ret ; play different sfx by a. ; if a is 0xff play SFX_03 (usually following a B press), ; else play SFX_02 (usually following an A press). PlayAcceptOrDeclineSFX: push af inc a jr z, .sfx_decline ld a, SFX_02 jr .sfx_accept .sfx_decline ld a, SFX_03 .sfx_accept call PlaySFX pop af ret ; get player name from the user ; into hl InputPlayerName: ld e, l ld d, h ld a, MAX_PLAYER_NAME_LENGTH ld hl, WhatIsYourNameData lb bc, 12, 1 call InitializeInputName call Set_OBJ_8x8 xor a ld [wTileMapFill], a call EmptyScreen call ZeroObjectPositions ld a, $01 ld [wVBlankOAMCopyToggle], a call LoadSymbolsFont lb de, $38, $bf call SetupText call LoadTextCursorTile ld a, $02 ld [wd009], a call DrawNamingScreenBG xor a ld [wNamingScreenCursorX], a ld [wNamingScreenCursorY], a ld a, $09 ld [wNamingScreenNumColumns], a ld a, $06 ld [wNamingScreenKeyboardHeight], a ld a, $0f ld [wVisibleCursorTile], a ld a, $00 ld [wInvisibleCursorTile], a .loop ld a, $01 ld [wVBlankOAMCopyToggle], a call DoFrame call UpdateRNGSources ldh a, [hDPadHeld] and START jr z, .else ; if pressed start button. ld a, $01 call PlayAcceptOrDeclineSFX call Func_1aa07 ld a, 6 ld [wNamingScreenCursorX], a ld a, 5 ld [wNamingScreenCursorY], a call Func_1aa23 jr .loop .else call NamingScreen_CheckButtonState jr nc, .loop ; if not pressed, go back to the loop. cp $ff jr z, .on_b_button ; on A button. call NamingScreen_ProcessInput jr nc, .loop ; if the player selected the end button, ; end its naming. call FinalizeInputName ret .on_b_button ld a, [wNamingScreenBufferLength] or a jr z, .loop ; empty string? ; erase one character. ld e, a ld d, 0 ld hl, wNamingScreenBuffer add hl, de dec hl dec hl ld [hl], TX_END ld hl, wNamingScreenBufferLength ; note that its unit is byte, not word. dec [hl] dec [hl] call PrintPlayerNameFromInput jr .loop ; it's called when naming(either player's or deck's) starts. ; a: maximum length of name(depending on whether player's or deck's). ; bc: position of name. ; de: dest. pointer. ; hl: pointer to text item of the question. InitializeInputName: ld [wNamingScreenBufferMaxLength], a push hl ld hl, wNamingScreenNamePosition ld [hl], b inc hl ld [hl], c pop hl ld b, h ld c, l ; set the question string. ld hl, wNamingScreenQuestionPointer ld [hl], c inc hl ld [hl], b ; set the destination buffer. ld hl, wNamingScreenDestPointer ld [hl], e inc hl ld [hl], d ; clear the name buffer. ld a, NAMING_SCREEN_BUFFER_LENGTH ld hl, wNamingScreenBuffer call ClearMemory ld hl, wNamingScreenBuffer ld a, [wNamingScreenBufferMaxLength] ld b, a inc b .loop ; copy data from de to hl ; for b bytes. ld a, [de] inc de ld [hli], a dec b jr nz, .loop ld hl, wNamingScreenBuffer call GetTextLengthInTiles ld a, c ld [wNamingScreenBufferLength], a ret FinalizeInputName: ld hl, wNamingScreenDestPointer ld e, [hl] inc hl ld d, [hl] ld l, e ld h, d ld de, wNamingScreenBuffer ld a, [wNamingScreenBufferMaxLength] ld b, a inc b jr InitializeInputName.loop ; draws the keyboard frame ; and the question if it exists. DrawNamingScreenBG: call DrawTextboxForKeyboard call PrintPlayerNameFromInput ld hl, wNamingScreenQuestionPointer ld c, [hl] inc hl ld a, [hl] ld h, a or c jr z, .put_text_end ; print the question string. ; ex) "What is your name?" ld l, c call PlaceTextItems .put_text_end ; print "End". ld hl, .data call PlaceTextItems ldtx hl, PlayerNameKeyboardText lb de, 2, 4 call InitTextPrinting call ProcessTextFromID call EnableLCD ret .data textitem $0f, $10, EndText ; "End" db $ff DrawTextboxForKeyboard: lb de, 0, 3 ; x, y lb bc, 20, 15 ; w, h call DrawRegularTextBox ret PrintPlayerNameFromInput: ld hl, wNamingScreenNamePosition ld d, [hl] inc hl ld e, [hl] push de call InitTextPrinting ld a, [wNamingScreenBufferMaxLength] ld e, a ld a, $14 sub e inc a ld e, a ld d, 0 ; print the underbars ; before print the input. ld hl, .char_underbar add hl, de call ProcessText pop de call InitTextPrinting ; print the input from the user. ld hl, wNamingScreenBuffer call ProcessText ret .char_underbar db $56 rept 10 textfw3 "_" endr done ; check if button pressed. ; if pressed, set the carry bit on. NamingScreen_CheckButtonState: xor a ld [wPlaysSfx], a ldh a, [hDPadHeld] or a jp z, .no_press ; detected any button press. ld b, a ld a, [wNamingScreenKeyboardHeight] ld c, a ld a, [wNamingScreenCursorX] ld h, a ld a, [wNamingScreenCursorY] ld l, a bit D_UP_F, b jr z, .asm_692c ; up dec a bit D_DOWN_F, a jr z, .asm_69a7 ld a, c dec a jr .asm_69a7 .asm_692c bit D_DOWN_F, b jr z, .asm_6937 ; down inc a cp c jr c, .asm_69a7 xor a jr .asm_69a7 .asm_6937 ld a, [wNamingScreenNumColumns] ld c, a ld a, h bit D_LEFT_F, b jr z, .asm_6974 ; left ld d, a ld a, $06 cp l ld a, d jr nz, .asm_696b push hl push bc push af call GetCharInfoFromPos_Player inc hl inc hl inc hl inc hl inc hl ld a, [hl] dec a ld d, a pop af pop bc pop hl sub d cp $ff jr nz, .asm_6962 ld a, c sub $02 jr .asm_69aa .asm_6962 cp $fe jr nz, .asm_696b ld a, c sub $03 jr .asm_69aa .asm_696b dec a bit D_DOWN_F, a jr z, .asm_69aa ld a, c dec a jr .asm_69aa .asm_6974 bit D_RIGHT_F, b jr z, .no_press ld d, a ld a, $06 cp l ld a, d jr nz, .asm_6990 push hl push bc push af call GetCharInfoFromPos_Player inc hl inc hl inc hl inc hl ld a, [hl] dec a ld d, a pop af pop bc pop hl add d .asm_6990 inc a cp c jr c, .asm_69aa inc c cp c jr c, .asm_69a4 inc c cp c jr c, .asm_69a0 ld a, $02 jr .asm_69aa .asm_69a0 ld a, $01 jr .asm_69aa .asm_69a4 xor a jr .asm_69aa .asm_69a7 ld l, a jr .asm_69ab .asm_69aa ld h, a .asm_69ab push hl call GetCharInfoFromPos_Player inc hl inc hl inc hl ld a, [wd009] cp $02 jr nz, .asm_69bb inc hl inc hl .asm_69bb ld d, [hl] push de call Func_1aa07 pop de pop hl ld a, l ld [wNamingScreenCursorY], a ld a, h ld [wNamingScreenCursorX], a xor a ld [wCheckMenuCursorBlinkCounter], a ld a, $06 cp d jp z, NamingScreen_CheckButtonState ld a, $01 ld [wPlaysSfx], a .no_press ldh a, [hKeysPressed] and A_BUTTON | B_BUTTON jr z, .asm_69ef and A_BUTTON jr nz, .asm_69e5 ld a, $ff .asm_69e5 call PlayAcceptOrDeclineSFX push af call Func_1aa23 pop af scf ret .asm_69ef ld a, [wPlaysSfx] or a jr z, .asm_69f8 call PlaySFX .asm_69f8 ld hl, wCheckMenuCursorBlinkCounter ld a, [hl] inc [hl] and $0f ret nz ld a, [wVisibleCursorTile] bit 4, [hl] jr z, Func_1aa07.asm_6a0a Func_1aa07: ld a, [wInvisibleCursorTile] .asm_6a0a ld e, a ld a, [wNamingScreenCursorX] ld h, a ld a, [wNamingScreenCursorY] ld l, a call GetCharInfoFromPos_Player ld a, [hli] ld c, a ld b, [hl] dec b ld a, e call Func_1aa28 call WriteByteToBGMap0 or a ret Func_1aa23: ld a, [wVisibleCursorTile] jr Func_1aa07.asm_6a0a Func_1aa28: push af push bc push de push hl push af call ZeroObjectPositions pop af ld b, a ld a, [wInvisibleCursorTile] cp b jr z, .asm_6a60 ld a, [wNamingScreenBufferLength] srl a ld d, a ld a, [wNamingScreenBufferMaxLength] srl a ld e, a ld a, d cp e jr nz, .asm_6a49 dec a .asm_6a49 ld hl, wNamingScreenNamePosition add [hl] ld d, a ld h, $08 ld l, d call HtimesL ld a, l add $08 ld d, a ld e, $18 ld bc, $0000 call SetOneObjectAttributes .asm_6a60 pop hl pop de pop bc pop af ret ; load, to the first tile of v0Tiles0, the graphics for the ; blinking black square used in name input screens. ; for inputting full width text. LoadTextCursorTile: ld hl, v0Tiles0 + $00 tiles ld de, .data ld b, 0 .loop ld a, TILE_SIZE cp b ret z inc b ld a, [de] inc de ld [hli], a jr .loop .data rept TILE_SIZE db $ff endr ; set the carry bit on, ; if "End" was selected. NamingScreen_ProcessInput: ld a, [wNamingScreenCursorX] ld h, a ld a, [wNamingScreenCursorY] ld l, a call GetCharInfoFromPos_Player inc hl inc hl ; load types into de. ld e, [hl] inc hl ld a, [hli] ld d, a cp $09 jp z, .on_end cp $07 jr nz, .asm_6ab8 ld a, [wd009] or a jr nz, .asm_6aac ld a, $01 jp .asm_6ace .asm_6aac dec a jr nz, .asm_6ab4 ld a, $02 jp .asm_6ace .asm_6ab4 xor a jp .asm_6ace .asm_6ab8 cp $08 jr nz, .asm_6ad6 ld a, [wd009] or a jr nz, .asm_6ac6 ld a, $02 jr .asm_6ace .asm_6ac6 dec a jr nz, .asm_6acc xor a jr .asm_6ace .asm_6acc ld a, $01 .asm_6ace ld [wd009], a call DrawNamingScreenBG or a ret .asm_6ad6 ld a, [wd009] cp $02 jr z, .read_char ldfw3 bc, "゛" ld a, d cp b jr nz, .asm_6af4 ld a, e cp c jr nz, .asm_6af4 push hl ld hl, TransitionTable1 ; from 55th. call TransformCharacter pop hl jr c, .nothing jr .asm_6b09 .asm_6af4 ldfw3 bc, "゜" ld a, d cp b jr nz, .asm_6b1d ld a, e cp c jr nz, .asm_6b1d push hl ld hl, TransitionTable2 ; from 72th. call TransformCharacter pop hl jr c, .nothing .asm_6b09 ld a, [wNamingScreenBufferLength] dec a dec a ld [wNamingScreenBufferLength], a ld hl, wNamingScreenBuffer push de ld d, 0 ld e, a add hl, de pop de ld a, [hl] jr .asm_6b37 .asm_6b1d ld a, d or a jr nz, .asm_6b37 ld a, [wd009] or a jr nz, .asm_6b2b ld a, TX_HIRAGANA jr .asm_6b37 .asm_6b2b ld a, TX_KATAKANA jr .asm_6b37 ; read character code from info. to register. ; hl: pointer. .read_char ld e, [hl] inc hl ld a, [hl] ; a: first byte of the code. or a ; if 2 bytes code, jump. jr nz, .asm_6b37 ; if 1 byte code(ascii), ; set first byte to $0e. ld a, $0e ; on 2 bytes code. .asm_6b37 ld d, a ; de: character code. ld hl, wNamingScreenBufferLength ld a, [hl] ld c, a push hl ld hl, wNamingScreenBufferMaxLength cp [hl] pop hl jr nz, .asm_6b4c ; if the buffer is full ; just change the last character of it. ld hl, wNamingScreenBuffer dec hl dec hl jr .asm_6b51 ; increase name length before add the character. .asm_6b4c inc [hl] inc [hl] ld hl, wNamingScreenBuffer ; write 2 bytes character codes to the name buffer. ; de: 2 bytes character codes. ; hl: dest. .asm_6b51 ld b, 0 add hl, bc ld [hl], d inc hl ld [hl], e inc hl ld [hl], TX_END ; null terminator. call PrintPlayerNameFromInput .nothing or a ret .on_end scf ret ; this transforms the last japanese character ; in the name buffer into its dakuon shape or something. ; it seems to have been deprecated as the game was translated into english. ; but it can still be applied to english, such as upper-lower case transition. ; hl: info. pointer. TransformCharacter: ld a, [wNamingScreenBufferLength] or a jr z, .return ; if the length is zero, just return. dec a dec a push hl ld hl, wNamingScreenBuffer ld d, 0 ld e, a add hl, de ld e, [hl] inc hl ld d, [hl] ; de: last character in the buffer, ; but byte-wise swapped. ld a, TX_KATAKANA cp e jr nz, .hiragana ; if it's katakana, ; make it hiragana by decreasing its high byte. dec e .hiragana pop hl .loop ld a, [hli] or a jr z, .return cp d jr nz, .next ld a, [hl] cp e jr nz, .next inc hl ld e, [hl] inc hl ld d, [hl] or a ret .next inc hl inc hl inc hl jr .loop .return scf ret ; given the position of the current cursor, ; it returns the pointer to the proper information. ; h: position x. ; l: position y. GetCharInfoFromPos_Player: push de ; (information index) = (x) * (height) + (y) ; (height) = 0x05(Deck) or 0x06(Player) ld e, l ld d, h ld a, [wNamingScreenKeyboardHeight] ld l, a call HtimesL ld a, l add e ld hl, KeyboardData_Player pop de or a ret z .loop inc hl inc hl inc hl inc hl inc hl inc hl dec a jr nz, .loop ret ; a set of keyboard datum. ; unit: 6 bytes. ; structure: ; abs. y pos. (1) / abs. x pos. (1) / type 1 (1) / type 2 (1) / char. code (2) ; unused data contains its character code as zero. kbitem: MACRO db \1, \2, \3, \4 if (_NARG == 5) dw \5 elif (\5 == TX_FULLWIDTH3) dw (\5 << 8) | STRCAT("FW3_", \6) else dw (\5 << 8) | \6 endc ENDM KeyboardData_Player: kbitem $04, $02, $11, $00, TX_FULLWIDTH3, "A" kbitem $06, $02, $12, $00, TX_FULLWIDTH3, "J" kbitem $08, $02, $13, $00, TX_FULLWIDTH3, "S" kbitem $0a, $02, $14, $00, "o" kbitem $0c, $02, $15, $00, "d" kbitem $10, $0f, $01, $09, $0000 kbitem $04, $04, $16, $00, TX_FULLWIDTH3, "B" kbitem $06, $04, $17, $00, TX_FULLWIDTH3, "K" kbitem $08, $04, $18, $00, TX_FULLWIDTH3, "T" kbitem $0a, $04, $19, $00, TX_FULLWIDTH3, "&" kbitem $0c, $04, $1a, $00, "e" kbitem $10, $0f, $01, $09, $0000 kbitem $04, $06, $1b, $00, TX_FULLWIDTH3, "C" kbitem $06, $06, $1c, $00, TX_FULLWIDTH3, "L" kbitem $08, $06, $1d, $00, TX_FULLWIDTH3, "U" kbitem $0a, $06, $1e, $00, "j" kbitem $0c, $06, $1f, $00, "f" kbitem $10, $0f, $01, $09, $0000 kbitem $04, $08, $20, $00, TX_FULLWIDTH3, "D" kbitem $06, $08, $21, $00, TX_FULLWIDTH3, "M" kbitem $08, $08, $22, $00, TX_FULLWIDTH3, "V" kbitem $0a, $08, $23, $00, "k" kbitem $0c, $08, $24, $00, "g" kbitem $10, $0f, $01, $09, $0000 kbitem $04, $0a, $25, $00, TX_FULLWIDTH3, "E" kbitem $06, $0a, $26, $00, TX_FULLWIDTH3, "N" kbitem $08, $0a, $27, $00, TX_FULLWIDTH3, "W" kbitem $0a, $0a, $28, $00, "w" kbitem $0c, $0a, $29, $00, "h" kbitem $10, $0f, $01, $09, $0000 kbitem $04, $0c, $2a, $00, TX_FULLWIDTH3, "F" kbitem $06, $0c, $2b, $00, TX_FULLWIDTH3, "O" kbitem $08, $0c, $2c, $00, TX_FULLWIDTH3, "X" kbitem $0a, $0c, $2d, $00, "`" kbitem $0c, $0c, $2e, $00, "i" kbitem $10, $0f, $01, $09, $0000 kbitem $04, $0e, $2f, $00, TX_FULLWIDTH3, "G" kbitem $06, $0e, $30, $00, TX_FULLWIDTH3, "P" kbitem $08, $0e, $31, $00, TX_FULLWIDTH3, "Y" kbitem $0a, $0e, $32, $00, "a" kbitem $0c, $0e, $33, $00, TX_SYMBOL, SYM_No kbitem $10, $0f, $01, $09, $0000 kbitem $04, $10, $34, $00, TX_FULLWIDTH3, "H" kbitem $06, $10, $35, $00, TX_FULLWIDTH3, "Q" kbitem $08, $10, $36, $00, TX_FULLWIDTH3, "Z" kbitem $0a, $10, $3c, $00, "b" kbitem $0c, $10, $3d, $00, TX_SYMBOL, SYM_Lv kbitem $10, $0f, $01, $09, $0000 kbitem $04, $12, $37, $00, TX_FULLWIDTH3, "I" kbitem $06, $12, $38, $00, TX_FULLWIDTH3, "R" kbitem $08, $12, $39, $00, "n" kbitem $0a, $12, $3a, $00, "c" kbitem $0c, $12, $3b, $00, "p" kbitem $10, $0f, $01, $09, $0000 kbitem $00, $00, $00, $00, $0000 ; a set of transition datum. ; unit: 4 bytes. ; structure: ; previous char. code (2) / translated char. code (2) ; - the former char. code contains 0x0e in high byte. ; - the latter char. code contains only low byte. TransitionTable1: dw $0e16, $003e dw $0e17, $003f dw $0e18, $0040 dw $0e19, $0041 dw $0e1a, $0042 dw $0e1b, $0043 dw $0e1c, $0044 dw $0e1d, $0045 dw $0e1e, $0046 dw $0e1f, $0047 dw $0e20, $0048 dw $0e21, $0049 dw $0e22, $004a dw $0e23, $004b dw $0e24, $004c dw $0e2a, $004d dw $0e2b, $004e dw $0e2c, $004f dw $0e2d, $0050 dw $0e2e, $0051 dw $0e52, $004d dw $0e53, $004e dw $0e54, $004f dw $0e55, $0050 dw $0e56, $0051 dw $0000 TransitionTable2: dw $0e2a, $0052 dw $0e2b, $0053 dw $0e2c, $0054 dw $0e2d, $0055 dw $0e2e, $0056 dw $0e4d, $0052 dw $0e4e, $0053 dw $0e4f, $0054 dw $0e50, $0055 dw $0e51, $0056 dw $0000 ; get deck name from the user into de. ; function description is similar to the player's. ; refer to 'InputPlayerName'. InputDeckName: push af ; check if the buffer is empty. ld a, [de] or a jr nz, .not_empty ; this buffer will contain half-width chars. ld a, TX_HALFWIDTH ld [de], a .not_empty pop af inc a call InitializeInputName call Set_OBJ_8x8 xor a ld [wTileMapFill], a call EmptyScreen call ZeroObjectPositions ld a, $01 ld [wVBlankOAMCopyToggle], a call LoadSymbolsFont lb de, $38, $bf call SetupText call LoadHalfWidthTextCursorTile xor a ld [wd009], a call Func_1ae99 xor a ld [wNamingScreenCursorX], a ld [wNamingScreenCursorY], a ld a, $09 ld [wNamingScreenNumColumns], a ld a, $07 ld [wNamingScreenKeyboardHeight], a ld a, $0f ld [wVisibleCursorTile], a ld a, $00 ld [wInvisibleCursorTile], a .loop ld a, $01 ld [wVBlankOAMCopyToggle], a call DoFrame call UpdateRNGSources ldh a, [hDPadHeld] and START jr z, .on_start ld a, $01 call PlayAcceptOrDeclineSFX call Func_1afa1 ld a, 6 ld [wNamingScreenCursorX], a ld [wNamingScreenCursorY], a call Func_1afbd jr .loop .on_start call Func_1aefb jr nc, .loop cp $ff jr z, .asm_6e1c call Func_1aec3 jr nc, .loop call FinalizeInputName ld hl, wNamingScreenDestPointer ld a, [hli] ld h, [hl] ld l, a inc hl ld a, [hl] or a jr nz, .return dec hl ld [hl], TX_END .return ret .asm_6e1c ld a, [wNamingScreenBufferLength] cp $02 jr c, .loop ld e, a ld d, 0 ld hl, wNamingScreenBuffer add hl, de dec hl ld [hl], TX_END ld hl, wNamingScreenBufferLength dec [hl] call ProcessTextWithUnderbar jp .loop ; load, to the first tile of v0Tiles0, the graphics for the ; blinking black square used in name input screens. ; for inputting half width text. LoadHalfWidthTextCursorTile: ld hl, v0Tiles0 + $00 tiles ld de, .data ld b, 0 .loop ld a, TILE_SIZE cp b ret z inc b ld a, [de] inc de ld [hli], a jr .loop .data rept TILE_SIZE db $f0 endr ; it's only for naming the deck. ProcessTextWithUnderbar: ld hl, wNamingScreenNamePosition ld d, [hl] inc hl ld e, [hl] call InitTextPrinting ld hl, .underbar_data ld de, wDefaultText .loop ; copy the underbar string. ld a, [hli] ld [de], a inc de or a jr nz, .loop ld hl, wNamingScreenBuffer ld de, wDefaultText .loop2 ; copy the input from the user. ld a, [hli] or a jr z, .print_name ld [de], a inc de jr .loop2 .print_name ld hl, wDefaultText call ProcessText ret .underbar_data db TX_HALFWIDTH rept MAX_DECK_NAME_LENGTH db "_" endr db TX_END Func_1ae99: call DrawTextboxForKeyboard call ProcessTextWithUnderbar ld hl, wNamingScreenQuestionPointer ld c, [hl] inc hl ld a, [hl] ld h, a or c jr z, .print ; print the question string. ld l, c call PlaceTextItems .print ; print "End" ld hl, DrawNamingScreenBG.data call PlaceTextItems ; print the keyboard characters. ldtx hl, DeckNameKeyboardText ; "A B C D..." lb de, 2, 4 call InitTextPrinting call ProcessTextFromID call EnableLCD ret Func_1aec3: ld a, [wNamingScreenCursorX] ld h, a ld a, [wNamingScreenCursorY] ld l, a call GetCharInfoFromPos_Deck inc hl inc hl ld a, [hl] cp $01 jr nz, .asm_6ed7 scf ret .asm_6ed7 ld d, a ld hl, wNamingScreenBufferLength ld a, [hl] ld c, a push hl ld hl, wNamingScreenBufferMaxLength cp [hl] pop hl jr nz, .asm_6eeb ld hl, wNamingScreenBuffer dec hl jr .asm_6eef .asm_6eeb inc [hl] ld hl, wNamingScreenBuffer .asm_6eef ld b, 0 add hl, bc ld [hl], d inc hl ld [hl], TX_END call ProcessTextWithUnderbar or a ret Func_1aefb: xor a ld [wPlaysSfx], a ldh a, [hDPadHeld] or a jp z, .asm_6f73 ld b, a ld a, [wNamingScreenKeyboardHeight] ld c, a ld a, [wNamingScreenCursorX] ld h, a ld a, [wNamingScreenCursorY] ld l, a bit 6, b jr z, .asm_6f1f dec a bit 7, a jr z, .asm_6f4b ld a, c dec a jr .asm_6f4b .asm_6f1f bit 7, b jr z, .asm_6f2a inc a cp c jr c, .asm_6f4b xor a jr .asm_6f4b .asm_6f2a cp $06 jr z, .asm_6f73 ld a, [wNamingScreenNumColumns] ld c, a ld a, h bit 5, b jr z, .asm_6f40 dec a bit 7, a jr z, .asm_6f4e ld a, c dec a jr .asm_6f4e .asm_6f40 bit 4, b jr z, .asm_6f73 inc a cp c jr c, .asm_6f4e xor a jr .asm_6f4e .asm_6f4b ld l, a jr .asm_6f4f .asm_6f4e ld h, a .asm_6f4f push hl call GetCharInfoFromPos_Deck inc hl inc hl ld d, [hl] push de call Func_1afa1 pop de pop hl ld a, l ld [wNamingScreenCursorY], a ld a, h ld [wNamingScreenCursorX], a xor a ld [wCheckMenuCursorBlinkCounter], a ld a, $02 cp d jp z, Func_1aefb ld a, $01 ld [wPlaysSfx], a .asm_6f73 ldh a, [hKeysPressed] and $03 jr z, .asm_6f89 and $01 jr nz, .asm_6f7f ld a, $ff .asm_6f7f call PlayAcceptOrDeclineSFX push af call Func_1afbd pop af scf ret .asm_6f89 ld a, [wPlaysSfx] or a jr z, .asm_6f92 call PlaySFX .asm_6f92 ld hl, wCheckMenuCursorBlinkCounter ld a, [hl] inc [hl] and $0f ret nz ld a, [wVisibleCursorTile] bit 4, [hl] jr z, Func_1afa1.asm_6fa4 Func_1afa1: ld a, [wInvisibleCursorTile] .asm_6fa4 ld e, a ld a, [wNamingScreenCursorX] ld h, a ld a, [wNamingScreenCursorY] ld l, a call GetCharInfoFromPos_Deck ld a, [hli] ld c, a ld b, [hl] dec b ld a, e call Func_1afc2 call WriteByteToBGMap0 or a ret Func_1afbd: ld a, [wVisibleCursorTile] jr Func_1afa1.asm_6fa4 Func_1afc2: push af push bc push de push hl push af call ZeroObjectPositions pop af ld b, a ld a, [wInvisibleCursorTile] cp b jr z, .asm_6ffb ld a, [wNamingScreenBufferLength] ld d, a ld a, [wNamingScreenBufferMaxLength] ld e, a ld a, d cp e jr nz, .asm_6fdf dec a .asm_6fdf dec a ld d, a ld hl, wNamingScreenNamePosition ld a, [hl] sla a add d ld d, a ld h, $04 ld l, d call HtimesL ld a, l add $08 ld d, a ld e, $18 ld bc, $0000 call SetOneObjectAttributes .asm_6ffb pop hl pop de pop bc pop af ret ; given the cursor position, ; returns the character information which the cursor directs. ; it's similar to "GetCharInfoFromPos_Player", ; but the data structure is different in its unit size. ; its unit size is 3, and player's is 6. ; h: x ; l: y GetCharInfoFromPos_Deck: push de ld e, l ld d, h ld a, [wNamingScreenKeyboardHeight] ld l, a call HtimesL ld a, l add e ; x * h + y ld hl, KeyboardData_Deck pop de or a ret z .loop inc hl inc hl inc hl dec a jr nz, .loop ret KeyboardData_Deck: db $04, $02, "A" db $06, $02, "J" db $08, $02, "S" db $0a, $02, "?" db $0c, $02, "4" db $0e, $02, $02 db $10, $0f, $01 db $04, $04, "B" db $06, $04, "K" db $08, $04, "T" db $0a, $04, "&" db $0c, $04, "5" db $0e, $04, $02 db $10, $0f, $01 db $04, $06, "C" db $06, $06, "L" db $08, $06, "U" db $0a, $06, "+" db $0c, $06, "6" db $0e, $06, $02 db $10, $0f, $01 db $04, $08, "D" db $06, $08, "M" db $08, $08, "V" db $0a, $08, "-" db $0c, $08, "7" db $0e, $08, $02 db $10, $0f, $01 db $04, $0a, "E" db $06, $0a, "N" db $08, $0a, "W" db $0a, $0a, "'" db $0c, $0a, "8" db $0e, $0a, $02 db $10, $0f, $01 db $04, $0c, "F" db $06, $0c, "O" db $08, $0c, "X" db $0a, $0c, "0" db $0c, $0c, "9" db $0e, $0c, $02 db $10, $0f, $01 db $04, $0e, "G" db $06, $0e, "P" db $08, $0e, "Y" db $0a, $0e, "1" db $0c, $0e, " " db $0e, $0e, $02 db $10, $0f, $01 db $04, $10, "H" db $06, $10, "Q" db $08, $10, "Z" db $0a, $10, "2" db $0c, $10, " " db $0e, $10, $02 db $10, $0f, $01 db $04, $12, "I" db $06, $12, "R" db $08, $12, "!" db $0a, $12, "3" db $0c, $12, " " db $0e, $12, $02 db $10, $0f, $01 ds 4 ; empty