summaryrefslogtreecommitdiff
path: root/src/engine/input_name.asm
diff options
context:
space:
mode:
authorElectroDeoxys <ElectroDeoxys@gmail.com>2021-09-27 11:56:10 +0100
committerElectroDeoxys <ElectroDeoxys@gmail.com>2021-09-27 11:56:10 +0100
commit7825b5ef0f09a877142ea1eb221e895bb60a0253 (patch)
tree9d46dfebd219919f5144786caf3ebfdf7cdab3a7 /src/engine/input_name.asm
parent48f83527c769441b6c123f3382d90e2e962ef9a0 (diff)
Split bank 6
Diffstat (limited to 'src/engine/input_name.asm')
-rw-r--r--src/engine/input_name.asm1417
1 files changed, 1417 insertions, 0 deletions
diff --git a/src/engine/input_name.asm b/src/engine/input_name.asm
new file mode 100644
index 0000000..c9d222e
--- /dev/null
+++ b/src/engine/input_name.asm
@@ -0,0 +1,1417 @@
+WhatIsYourNameData:
+ textitem 1, 1, WhatIsYourNameText
+ db $ff
+; [Deck1Data ~ Deck4Data]
+; These are directed from around (2:4f05),
+; 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, "º(2)"
+ 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