pokecrystal/engine/naming_screen.asm

1468 lines
22 KiB
NASM
Executable File

NAMINGSCREEN_CURSOR EQU $7e
NAMINGSCREEN_BORDER EQUS "\"■\"" ; $60
NAMINGSCREEN_MIDDLELINE EQUS "\"→\"" ; $eb
NAMINGSCREEN_UNDERLINE EQUS "\"<DOT>\"" ; $f2
_NamingScreen: ; 0x116b7
call DisableSpriteUpdates
call NamingScreen
call ReturnToMapWithSpeechTextbox
ret
; 0x116c1
NamingScreen: ; 116c1
ld hl, wNamingScreenDestinationPointer
ld [hl], e
inc hl
ld [hl], d
ld hl, wNamingScreenType
ld [hl], b
ld hl, Options
ld a, [hl]
push af
set NO_TEXT_SCROLL, [hl]
ld a, [hMapAnims]
push af
xor a
ld [hMapAnims], a
ld a, [hInMenu]
push af
ld a, $1
ld [hInMenu], a
call .SetUpNamingScreen
call DelayFrame
.loop
call NamingScreenJoypadLoop
jr nc, .loop
pop af
ld [hInMenu], a
pop af
ld [hMapAnims], a
pop af
ld [Options], a
call ClearJoypad
ret
; 116f8
.SetUpNamingScreen: ; 116f8
call ClearBGPalettes
ld b, SCGB_DIPLOMA
call GetSGBLayout
call DisableLCD
call LoadNamingScreenGFX
call NamingScreen_InitText
ld a, LCDC_DEFAULT
ld [rLCDC], a
call .GetNamingScreenSetup
call WaitBGMap
call WaitTop
call SetPalettes
call NamingScreen_InitNameEntry
ret
; 1171d
.GetNamingScreenSetup: ; 1171d
ld a, [wNamingScreenType]
and 7
ld e, a
ld d, 0
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
; 1172e
.Jumptable: ; 1172e (4:572e)
dw .Pokemon
dw .Player
dw .Rival
dw .Mom
dw .Box
dw .Tomodachi
dw .Pokemon
dw .Pokemon
.Pokemon: ; 1173e (4:573e)
ld a, [CurPartySpecies]
ld [wd265], a
ld hl, LoadMenuMonIcon
ld a, BANK(LoadMenuMonIcon)
ld e, $1
rst FarCall ; ; indirect jump to LoadMenuMonIcon (8e83f (23:683f))
ld a, [CurPartySpecies]
ld [wd265], a
call GetPokemonName
hlcoord 5, 2
call PlaceString
ld l, c
ld h, b
ld de, .NicknameStrings
call PlaceString
inc de
hlcoord 5, 4
call PlaceString
farcall GetGender
jr c, .genderless
ld a, "♂"
jr nz, .place_gender
ld a, "♀"
.place_gender
hlcoord 1, 2
ld [hl], a
.genderless
call .StoreMonIconParams
ret
; 11780 (4:5780)
.NicknameStrings: ; 11780
db "'S@"
db "NICKNAME?@"
; 1178d
.Player: ; 1178d (4:578d)
farcall GetPlayerIcon
call .LoadSprite
hlcoord 5, 2
ld de, .PlayerNameString
call PlaceString
call .StoreSpriteIconParams
ret
; 117a3 (4:57a3)
.PlayerNameString: ; 117a3
db "YOUR NAME?@"
; 117ae
.Rival: ; 117ae (4:57ae)
ld de, SilverSpriteGFX
ld b, BANK(SilverSpriteGFX)
call .LoadSprite
hlcoord 5, 2
ld de, .RivalNameString
call PlaceString
call .StoreSpriteIconParams
ret
; 117c3 (4:57c3)
.RivalNameString: ; 117c3
db "RIVAL'S NAME?@"
; 117d1
.Mom: ; 117d1 (4:57d1)
ld de, MomSpriteGFX
ld b, BANK(MomSpriteGFX)
call .LoadSprite
hlcoord 5, 2
ld de, .MomNameString
call PlaceString
call .StoreSpriteIconParams
ret
; 117e6 (4:57e6)
.MomNameString: ; 117e6
db "MOTHER'S NAME?@"
; 117f5
.Box: ; 117f5 (4:57f5)
ld de, PokeBallSpriteGFX
ld hl, vTiles0 tile $00
lb bc, BANK(PokeBallSpriteGFX), 4
call Request2bpp
xor a
ld hl, wSpriteAnimDict
ld [hli], a
ld [hl], a
depixel 4, 4, 4, 0
ld a, SPRITE_ANIM_INDEX_RED_WALK
call _InitSpriteAnimStruct
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld [hl], $0
hlcoord 5, 2
ld de, .BoxNameString
call PlaceString
call .StoreBoxIconParams
ret
; 11822 (4:5822)
.BoxNameString: ; 11822
db "BOX NAME?@"
; 1182c
.Tomodachi: ; 1182c (4:582c)
hlcoord 3, 2
ld de, .oTomodachi_no_namae_sutoringu
call PlaceString
call .StoreSpriteIconParams
ret
; 11839 (4:5839)
.oTomodachi_no_namae_sutoringu ; 11839
db "おともだち の なまえは?@"
; 11847
.LoadSprite: ; 11847 (4:5847)
push de
ld hl, vTiles0 tile $00
ld c, $4
push bc
call Request2bpp
pop bc
ld hl, 12 tiles
add hl, de
ld e, l
ld d, h
ld hl, vTiles0 tile $04
call Request2bpp
xor a
ld hl, wSpriteAnimDict
ld [hli], a
ld [hl], a
pop de
ld b, SPRITE_ANIM_INDEX_RED_WALK
ld a, d
cp HIGH(KrisSpriteGFX)
jr nz, .not_kris
ld a, e
cp LOW(KrisSpriteGFX)
jr nz, .not_kris
ld b, SPRITE_ANIM_INDEX_BLUE_WALK
.not_kris
ld a, b
depixel 4, 4, 4, 0
call _InitSpriteAnimStruct
ret
.StoreMonIconParams: ; 1187b (4:587b)
ld a, MON_NAME_LENGTH - 1
hlcoord 5, 6
jr .StoreParams
.StoreSpriteIconParams: ; 11882 (4:5882)
ld a, PLAYER_NAME_LENGTH - 1
hlcoord 5, 6
jr .StoreParams
.StoreBoxIconParams: ; 11889 (4:5889)
ld a, BOX_NAME_LENGTH - 1
hlcoord 5, 4
jr .StoreParams
.StoreParams: ; 11890 (4:5890)
ld [wNamingScreenMaxNameLength], a
ld a, l
ld [wNamingScreenStringEntryCoord], a
ld a, h
ld [wNamingScreenStringEntryCoord + 1], a
ret
NamingScreen_IsTargetBox: ; 1189c
push bc
push af
ld a, [wNamingScreenType]
sub $3
ld b, a
pop af
dec b
pop bc
ret
; 118a8
NamingScreen_InitText: ; 118a8
call WaitTop
hlcoord 0, 0
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
ld a, NAMINGSCREEN_BORDER
call ByteFill
hlcoord 1, 1
lb bc, 6, 18
call NamingScreen_IsTargetBox
jr nz, .not_box
lb bc, 4, 18
.not_box
call ClearBox
ld de, NameInputUpper
NamingScreen_ApplyTextInputMode: ; 118ca
call NamingScreen_IsTargetBox
jr nz, .not_box
ld hl, BoxNameInputLower - NameInputLower
add hl, de
ld d, h
ld e, l
.not_box
push de
hlcoord 1, 8
lb bc, 7, 18
call NamingScreen_IsTargetBox
jr nz, .not_box_2
hlcoord 1, 6
lb bc, 9, 18
.not_box_2
call ClearBox
hlcoord 1, 16
lb bc, 1, 18
call ClearBox
pop de
hlcoord 2, 8
ld b, $5
call NamingScreen_IsTargetBox
jr nz, .row
hlcoord 2, 6
ld b, $6
.row
ld c, $11
.col
ld a, [de]
ld [hli], a
inc de
dec c
jr nz, .col
push de
ld de, 2 * SCREEN_WIDTH - $11
add hl, de
pop de
dec b
jr nz, .row
ret
; 11915
NamingScreenJoypadLoop: ; 11915
call JoyTextDelay
ld a, [wJumptableIndex]
bit 7, a
jr nz, .quit
call .RunJumptable
farcall PlaySpriteAnimationsAndDelayFrame
call .UpdateStringEntry
call DelayFrame
and a
ret
.quit
callfar ClearSpriteAnims
call ClearSprites
xor a
ld [hSCX], a
ld [hSCY], a
scf
ret
; 11940
.UpdateStringEntry: ; 11940
xor a
ld [hBGMapMode], a
hlcoord 1, 5
call NamingScreen_IsTargetBox
jr nz, .got_coords
hlcoord 1, 3
.got_coords
lb bc, 1, 18
call ClearBox
ld hl, wNamingScreenDestinationPointer
ld e, [hl]
inc hl
ld d, [hl]
ld hl, wNamingScreenStringEntryCoord
ld a, [hli]
ld h, [hl]
ld l, a
call PlaceString
ld a, $1
ld [hBGMapMode], a
ret
; 11968
.RunJumptable: ; 11968
ld a, [wJumptableIndex]
ld e, a
ld d, $0
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
; 11977
.Jumptable: ; 11977 (4:5977)
dw .InitCursor
dw .ReadButtons
.InitCursor: ; 1197b (4:597b)
depixel 10, 3
call NamingScreen_IsTargetBox
jr nz, .got_cursor_position
ld d, 8 * 8
.got_cursor_position
ld a, SPRITE_ANIM_INDEX_NAMING_SCREEN_CURSOR
call _InitSpriteAnimStruct
ld a, c
ld [wNamingScreenCursorObjectPointer], a
ld a, b
ld [wNamingScreenCursorObjectPointer + 1], a
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld a, [hl]
ld hl, SPRITEANIMSTRUCT_0E
add hl, bc
ld [hl], a
ld hl, wJumptableIndex
inc [hl]
ret
.ReadButtons: ; 119a1 (4:59a1)
ld hl, hJoyPressed ; $ffa7
ld a, [hl]
and A_BUTTON
jr nz, .a
ld a, [hl]
and B_BUTTON
jr nz, .b
ld a, [hl]
and START
jr nz, .start
ld a, [hl]
and SELECT
jr nz, .select
ret
.a
call .GetCursorPosition
cp $1
jr z, .select
cp $2
jr z, .b
cp $3
jr z, .end
call NamingScreen_GetLastCharacter
call NamingScreen_TryAddCharacter
ret nc
.start
ld hl, wNamingScreenCursorObjectPointer
ld c, [hl]
inc hl
ld b, [hl]
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld [hl], $8
ld hl, SPRITEANIMSTRUCT_0D
add hl, bc
ld [hl], $4
call NamingScreen_IsTargetBox
ret nz
inc [hl]
ret
.b
call NamingScreen_DeleteCharacter
ret
.end
call NamingScreen_StoreEntry
ld hl, wJumptableIndex
set 7, [hl]
ret
.select
ld hl, wNamingScreenLetterCase
ld a, [hl]
xor 1
ld [hl], a
jr z, .upper
ld de, NameInputLower
call NamingScreen_ApplyTextInputMode
ret
.upper
ld de, NameInputUpper
call NamingScreen_ApplyTextInputMode
ret
.GetCursorPosition: ; 11a0b (4:5a0b)
ld hl, wNamingScreenCursorObjectPointer
ld c, [hl]
inc hl
ld b, [hl]
NamingScreen_GetCursorPosition: ; 11a11 (4:5a11)
ld hl, SPRITEANIMSTRUCT_0D
add hl, bc
ld a, [hl]
push bc
ld b, $4
call NamingScreen_IsTargetBox
jr nz, .not_box
inc b
.not_box
cp b
pop bc
jr nz, .not_bottom_row
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld a, [hl]
cp $3
jr c, .case_switch
cp $6
jr c, .delete
ld a, $3
ret
.case_switch
ld a, $1
ret
.delete
ld a, $2
ret
.not_bottom_row
xor a
ret
NamingScreen_AnimateCursor: ; 11a3b (4:5a3b)
call .GetDPad
ld hl, SPRITEANIMSTRUCT_0D
add hl, bc
ld a, [hl]
ld e, a
swap e
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], e
ld d, $4
call NamingScreen_IsTargetBox
jr nz, .ok
inc d
.ok
cp d
ld de, .LetterEntries
ld a, SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR - SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR ; 0
jr nz, .ok2
ld de, .CaseDelEnd
ld a, SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR_BIG - SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR ; 1
.ok2
ld hl, SPRITEANIMSTRUCT_0E
add hl, bc
add [hl] ; default SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld [hl], a
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld l, [hl]
ld h, $0
add hl, de
ld a, [hl]
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
; 11a79 (4:5a79)
.LetterEntries: ; 11a79
db $00, $10, $20, $30, $40, $50, $60, $70, $80
.CaseDelEnd: ; 11a82
db $00, $00, $00, $30, $30, $30, $60, $60, $60
; 11a8b
.GetDPad: ; 11a8b (4:5a8b)
ld hl, hJoyLast
ld a, [hl]
and D_UP
jr nz, .up
ld a, [hl]
and D_DOWN
jr nz, .down
ld a, [hl]
and D_LEFT
jr nz, .left
ld a, [hl]
and D_RIGHT
jr nz, .right
ret
.right
call NamingScreen_GetCursorPosition
and a
jr nz, .asm_11ab7
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld a, [hl]
cp $8
jr nc, .asm_11ab4
inc [hl]
ret
.asm_11ab4
ld [hl], $0
ret
.asm_11ab7
cp $3
jr nz, .asm_11abc
xor a
.asm_11abc
ld e, a
add a
add e
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld [hl], a
ret
.left
call NamingScreen_GetCursorPosition
and a
jr nz, .asm_11ad8
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld a, [hl]
and a
jr z, .asm_11ad5
dec [hl]
ret
.asm_11ad5
ld [hl], $8
ret
.asm_11ad8
cp $1
jr nz, .asm_11ade
ld a, $4
.asm_11ade
dec a
dec a
ld e, a
add a
add e
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld [hl], a
ret
.down
ld hl, SPRITEANIMSTRUCT_0D
add hl, bc
ld a, [hl]
call NamingScreen_IsTargetBox
jr nz, .asm_11af9
cp $5
jr nc, .asm_11aff
inc [hl]
ret
.asm_11af9
cp $4
jr nc, .asm_11aff
inc [hl]
ret
.asm_11aff
ld [hl], $0
ret
.up
ld hl, SPRITEANIMSTRUCT_0D
add hl, bc
ld a, [hl]
and a
jr z, .asm_11b0c
dec [hl]
ret
.asm_11b0c
ld [hl], $4
call NamingScreen_IsTargetBox
ret nz
inc [hl]
ret
NamingScreen_TryAddCharacter: ; 11b14 (4:5b14)
ld a, [wNamingScreenLastCharacter] ; lost
MailComposition_TryAddCharacter: ; 11b17 (4:5b17)
ld a, [wNamingScreenMaxNameLength]
ld c, a
ld a, [wNamingScreenCurrNameLength]
cp c
ret nc
ld a, [wNamingScreenLastCharacter]
NamingScreen_LoadNextCharacter: ; 11b23
call NamingScreen_GetTextCursorPosition
ld [hl], a
NamingScreen_AdvanceCursor_CheckEndOfString: ; 11b27
ld hl, wNamingScreenCurrNameLength
inc [hl]
call NamingScreen_GetTextCursorPosition
ld a, [hl]
cp "@"
jr z, .end_of_string
ld [hl], NAMINGSCREEN_UNDERLINE
and a
ret
.end_of_string
scf
ret
; 11b39 (4:5b39)
; unused
ld a, [wNamingScreenCurrNameLength]
and a
ret z
push hl
ld hl, wNamingScreenCurrNameLength
dec [hl]
call NamingScreen_GetTextCursorPosition
ld c, [hl]
pop hl
.loop
ld a, [hli]
cp $ff
jr z, NamingScreen_AdvanceCursor_CheckEndOfString
cp c
jr z, .done
inc hl
jr .loop
.done
ld a, [hl]
jr NamingScreen_LoadNextCharacter
; 11b56
INCLUDE "data/unused/dakutens.asm"
; 11bbc
NamingScreen_DeleteCharacter: ; 11bbc (4:5bbc)
ld hl, wNamingScreenCurrNameLength
ld a, [hl]
and a
ret z
dec [hl]
call NamingScreen_GetTextCursorPosition
ld [hl], NAMINGSCREEN_UNDERLINE
inc hl
ld a, [hl]
cp NAMINGSCREEN_UNDERLINE
ret nz
ld [hl], NAMINGSCREEN_MIDDLELINE
ret
NamingScreen_GetTextCursorPosition: ; 11bd0 (4:5bd0)
push af
ld hl, wNamingScreenDestinationPointer
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wNamingScreenCurrNameLength]
ld e, a
ld d, 0
add hl, de
pop af
ret
; 11be0
NamingScreen_InitNameEntry: ; 11be0
; load NAMINGSCREEN_UNDERLINE, (NAMINGSCREEN_MIDDLELINE * [wNamingScreenMaxNameLength]), "@" into the dw address at wNamingScreenDestinationPointer
ld hl, wNamingScreenDestinationPointer
ld a, [hli]
ld h, [hl]
ld l, a
ld [hl], NAMINGSCREEN_UNDERLINE
inc hl
ld a, [wNamingScreenMaxNameLength]
dec a
ld c, a
ld a, NAMINGSCREEN_MIDDLELINE
.loop
ld [hli], a
dec c
jr nz, .loop
ld [hl], "@"
ret
; 11bf7
NamingScreen_StoreEntry: ; 11bf7 (4:5bf7)
ld hl, wNamingScreenDestinationPointer
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wNamingScreenMaxNameLength]
ld c, a
.loop
ld a, [hl]
cp NAMINGSCREEN_MIDDLELINE
jr z, .terminator
cp NAMINGSCREEN_UNDERLINE
jr nz, .not_terminator
.terminator
ld [hl], "@"
.not_terminator
inc hl
dec c
jr nz, .loop
ret
NamingScreen_GetLastCharacter: ; 11c11 (4:5c11)
ld hl, wNamingScreenCursorObjectPointer
ld c, [hl]
inc hl
ld b, [hl]
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld a, [hl]
ld hl, SPRITEANIMSTRUCT_XCOORD
add hl, bc
add [hl]
sub $8
srl a
srl a
srl a
ld e, a
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld a, [hl]
ld hl, SPRITEANIMSTRUCT_YCOORD
add hl, bc
add [hl]
sub $10
srl a
srl a
srl a
ld d, a
hlcoord 0, 0
ld bc, SCREEN_WIDTH
.loop
ld a, d
and a
jr z, .done
add hl, bc
dec d
jr .loop
.done
add hl, de
ld a, [hl]
ld [wNamingScreenLastCharacter], a
ret
LoadNamingScreenGFX: ; 11c51
call ClearSprites
callfar ClearSpriteAnims
call LoadStandardFont
call LoadFontsExtra
ld de, NamingScreenGFX_MiddleLine
ld hl, vTiles0 tile NAMINGSCREEN_MIDDLELINE
lb bc, BANK(NamingScreenGFX_MiddleLine), 1
call Get1bpp
ld de, NamingScreenGFX_UnderLine
ld hl, vTiles0 tile NAMINGSCREEN_UNDERLINE
lb bc, BANK(NamingScreenGFX_UnderLine), 1
call Get1bpp
ld de, vTiles2 tile NAMINGSCREEN_BORDER
ld hl, NamingScreenGFX_Border
ld bc, 1 tiles
ld a, BANK(NamingScreenGFX_Border)
call FarCopyBytes
ld de, vTiles0 tile NAMINGSCREEN_CURSOR
ld hl, NamingScreenGFX_Cursor
ld bc, 2 tiles
ld a, BANK(NamingScreenGFX_Cursor)
call FarCopyBytes
ld a, $5
ld hl, wSpriteAnimDict + 9 * 2
ld [hli], a
ld [hl], NAMINGSCREEN_CURSOR
xor a
ld [hSCY], a
ld [wGlobalAnimYOffset], a
ld [hSCX], a
ld [wGlobalAnimXOffset], a
ld [wJumptableIndex], a
ld [wNamingScreenLetterCase], a
ld [hBGMapMode], a
ld [wNamingScreenCurrNameLength], a
ld a, $7
ld [hWX], a
ret
; 11cb7
NamingScreenGFX_Border: ; 11cb7
INCBIN "gfx/naming_screen/border.2bpp"
; 11cc7
NamingScreenGFX_Cursor: ; 11cc7
INCBIN "gfx/naming_screen/cursor.2bpp"
; 11ce7
INCLUDE "data/name_input_chars.asm"
; 11e5d
NamingScreenGFX_End: ; unused
INCBIN "gfx/naming_screen/end.1bpp"
; 11e6d
NamingScreenGFX_MiddleLine:
INCBIN "gfx/naming_screen/middle_line.1bpp"
; 11e6d
NamingScreenGFX_UnderLine: ; 11e6d
INCBIN "gfx/naming_screen/underline.1bpp"
; 11e75
_ComposeMailMessage: ; 11e75 (mail?)
ld hl, wNamingScreenDestinationPointer
ld [hl], e
inc hl
ld [hl], d
ld a, [hMapAnims]
push af
xor a
ld [hMapAnims], a
ld a, [hInMenu]
push af
ld a, $1
ld [hInMenu], a
call .InitBlankMail
call DelayFrame
.loop
call .DoMailEntry
jr nc, .loop
pop af
ld [hInMenu], a
pop af
ld [hMapAnims], a
ret
.InitBlankMail: ; 11e9a (4:5e9a)
call ClearBGPalettes
call DisableLCD
call LoadNamingScreenGFX
ld de, vTiles0 tile $00
ld hl, .MailIcon
ld bc, 8 tiles
ld a, BANK(.MailIcon)
call FarCopyBytes
xor a
ld hl, wSpriteAnimDict
ld [hli], a
ld [hl], a
; init mail icon
depixel 3, 2
ld a, SPRITE_ANIM_INDEX_PARTY_MON
call _InitSpriteAnimStruct
ld hl, SPRITEANIMSTRUCT_ANIM_SEQ_ID
add hl, bc
ld [hl], $0
call .InitCharset
ld a, LCDC_DEFAULT
ld [rLCDC], a
call .initwNamingScreenMaxNameLength
ld b, SCGB_DIPLOMA
call GetSGBLayout
call WaitBGMap
call WaitTop
ld a, %11100100
call DmgToCgbBGPals
ld a, %11100100
call DmgToCgbObjPal0
call NamingScreen_InitNameEntry
ld hl, wNamingScreenDestinationPointer
ld e, [hl]
inc hl
ld d, [hl]
ld hl, MAIL_LINE_LENGTH
add hl, de
ld [hl], "<NEXT>"
ret
; 11ef4 (4:5ef4)
.MailIcon: ; 11ef4
INCBIN "gfx/icons/mail_big.2bpp"
; 11f74
.initwNamingScreenMaxNameLength ; 11f74 (4:5f74)
ld a, MAIL_MSG_LENGTH + 1
ld [wNamingScreenMaxNameLength], a
ret
; 11f7a (4:5f7a)
.UnusedString11f7a:
db "メールを かいてね@"
; 11f84
.InitCharset: ; 11f84 (4:5f84)
call WaitTop
hlcoord 0, 0
ld bc, 6 * SCREEN_WIDTH
ld a, NAMINGSCREEN_BORDER
call ByteFill
hlcoord 0, 6
ld bc, 12 * SCREEN_WIDTH
ld a, " "
call ByteFill
hlcoord 1, 1
lb bc, 4, SCREEN_WIDTH - 2
call ClearBox
ld de, MailEntry_Uppercase
.PlaceMailCharset: ; 11fa9 (4:5fa9)
hlcoord 1, 7
ld b, 6
.next
ld c, SCREEN_WIDTH - 1
.loop_
ld a, [de]
ld [hli], a
inc de
dec c
jr nz, .loop_
push de
ld de, SCREEN_WIDTH + 1
add hl, de
pop de
dec b
jr nz, .next
ret
.DoMailEntry: ; 11fc0 (4:5fc0)
call JoyTextDelay
ld a, [wJumptableIndex]
bit 7, a
jr nz, .exit_mail
call .DoJumptable
farcall PlaySpriteAnimationsAndDelayFrame
call .Update
call DelayFrame
and a
ret
.exit_mail
callfar ClearSpriteAnims
call ClearSprites
xor a
ld [hSCX], a
ld [hSCY], a
scf
ret
.Update: ; 11feb (4:5feb)
xor a
ld [hBGMapMode], a
hlcoord 1, 1
lb bc, 4, 18
call ClearBox
ld hl, wNamingScreenDestinationPointer
ld e, [hl]
inc hl
ld d, [hl]
hlcoord 2, 2
call PlaceString
ld a, $1
ld [hBGMapMode], a
ret
.DoJumptable: ; 12008 (4:6008)
ld a, [wJumptableIndex]
ld e, a
ld d, 0
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.Jumptable: ; 12017 (4:6017)
dw .init_blinking_cursor
dw .process_joypad
.init_blinking_cursor ; 1201b (4:601b)
depixel 9, 2
ld a, SPRITE_ANIM_INDEX_COMPOSE_MAIL_CURSOR
call _InitSpriteAnimStruct
ld a, c
ld [wNamingScreenCursorObjectPointer], a
ld a, b
ld [wNamingScreenCursorObjectPointer + 1], a
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld a, [hl]
ld hl, SPRITEANIMSTRUCT_0E
add hl, bc
ld [hl], a
ld hl, wJumptableIndex
inc [hl]
ret
.process_joypad ; 1203a (4:603a)
ld hl, hJoyPressed ; $ffa7
ld a, [hl]
and A_BUTTON
jr nz, .a
ld a, [hl]
and B_BUTTON
jr nz, .b
ld a, [hl]
and START
jr nz, .start
ld a, [hl]
and SELECT
jr nz, .select
ret
.a
call NamingScreen_PressedA_GetCursorCommand
cp $1
jr z, .select
cp $2
jr z, .b
cp $3
jr z, .finished
call NamingScreen_GetLastCharacter
call MailComposition_TryAddLastCharacter
jr c, .start
ld hl, wNamingScreenCurrNameLength
ld a, [hl]
cp MAIL_LINE_LENGTH
ret nz
inc [hl]
call NamingScreen_GetTextCursorPosition
ld [hl], NAMINGSCREEN_UNDERLINE
dec hl
ld [hl], "<NEXT>"
ret
.start
ld hl, wNamingScreenCursorObjectPointer
ld c, [hl]
inc hl
ld b, [hl]
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld [hl], $9
ld hl, SPRITEANIMSTRUCT_0D
add hl, bc
ld [hl], $5
ret
.b
call NamingScreen_DeleteCharacter
ld hl, wNamingScreenCurrNameLength
ld a, [hl]
cp MAIL_LINE_LENGTH
ret nz
dec [hl]
call NamingScreen_GetTextCursorPosition
ld [hl], NAMINGSCREEN_UNDERLINE
inc hl
ld [hl], "<NEXT>"
ret
.finished
call NamingScreen_StoreEntry
ld hl, wJumptableIndex
set 7, [hl]
ret
.select
ld hl, wNamingScreenLetterCase
ld a, [hl]
xor 1
ld [hl], a
jr nz, .switch_to_lowercase
ld de, MailEntry_Uppercase
call .PlaceMailCharset
ret
.switch_to_lowercase
ld de, MailEntry_Lowercase
call .PlaceMailCharset
ret
; called from engine/sprite_anims.asm
ComposeMail_AnimateCursor: ; 120c1 (4:60c1)
call .GetDPad
ld hl, SPRITEANIMSTRUCT_0D
add hl, bc
ld a, [hl]
ld e, a
swap e
ld hl, SPRITEANIMSTRUCT_YOFFSET
add hl, bc
ld [hl], e
cp $5
ld de, .LetterEntries
ld a, 0
jr nz, .got_pointer
ld de, .CaseDelEnd
ld a, 1
.got_pointer
ld hl, SPRITEANIMSTRUCT_0E
add hl, bc
add [hl]
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
add hl, bc
ld [hl], a
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld l, [hl]
ld h, 0
add hl, de
ld a, [hl]
ld hl, SPRITEANIMSTRUCT_XOFFSET
add hl, bc
ld [hl], a
ret
; 120f8 (4:60f8)
.LetterEntries: ; 120f8
db $00, $10, $20, $30, $40, $50, $60, $70, $80, $90
.CaseDelEnd: ; 12102
db $00, $00, $00, $30, $30, $30, $60, $60, $60, $60
; 1210c
.GetDPad: ; 1210c (4:610c)
ld hl, hJoyLast
ld a, [hl]
and D_UP
jr nz, .up
ld a, [hl]
and D_DOWN
jr nz, .down
ld a, [hl]
and D_LEFT
jr nz, .left
ld a, [hl]
and D_RIGHT
jr nz, .right
ret
.right
call ComposeMail_GetCursorPosition
and a
jr nz, .case_del_done_right
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld a, [hl]
cp $9
jr nc, .wrap_around_letter_right
inc [hl]
ret
.wrap_around_letter_right
ld [hl], $0
ret
.case_del_done_right
cp $3
jr nz, .wrap_around_command_right
xor a
.wrap_around_command_right
ld e, a
add a
add e
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld [hl], a
ret
.left
call ComposeMail_GetCursorPosition
and a
jr nz, .caps_del_done_left
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld a, [hl]
and a
jr z, .wrap_around_letter_left
dec [hl]
ret
.wrap_around_letter_left
ld [hl], $9
ret
.caps_del_done_left
cp $1
jr nz, .wrap_around_command_left
ld a, $4
.wrap_around_command_left
dec a
dec a
ld e, a
add a
add e
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld [hl], a
ret
.down
ld hl, SPRITEANIMSTRUCT_0D
add hl, bc
ld a, [hl]
cp $5
jr nc, .wrap_around_down
inc [hl]
ret
.wrap_around_down
ld [hl], $0
ret
.up
ld hl, SPRITEANIMSTRUCT_0D
add hl, bc
ld a, [hl]
and a
jr z, .wrap_around_up
dec [hl]
ret
.wrap_around_up
ld [hl], $5
ret
NamingScreen_PressedA_GetCursorCommand: ; 12185 (4:6185)
ld hl, wNamingScreenCursorObjectPointer
ld c, [hl]
inc hl
ld b, [hl]
ComposeMail_GetCursorPosition: ; 1218b (4:618b)
ld hl, SPRITEANIMSTRUCT_0D
add hl, bc
ld a, [hl]
cp $5
jr nz, .letter
ld hl, SPRITEANIMSTRUCT_0C
add hl, bc
ld a, [hl]
cp $3
jr c, .case
cp $6
jr c, .del
ld a, $3
ret
.case
ld a, $1
ret
.del
ld a, $2
ret
.letter
xor a
ret
MailComposition_TryAddLastCharacter: ; 121ac (4:61ac)
ld a, [wNamingScreenLastCharacter]
jp MailComposition_TryAddCharacter
; 121b2 (4:61b2)
; unused
ld a, [wNamingScreenCurrNameLength]
and a
ret z
cp $11
jr nz, .asm_121c3
push hl
ld hl, wNamingScreenCurrNameLength
dec [hl]
dec [hl]
jr .asm_121c8
.asm_121c3
push hl
ld hl, wNamingScreenCurrNameLength
dec [hl]
.asm_121c8
call NamingScreen_GetTextCursorPosition
ld c, [hl]
pop hl
.asm_121cd
ld a, [hli]
cp $ff
jp z, NamingScreen_AdvanceCursor_CheckEndOfString
cp c
jr z, .asm_121d9
inc hl
jr .asm_121cd
.asm_121d9
ld a, [hl]
jp NamingScreen_LoadNextCharacter
; 121dd
INCLUDE "data/mail_input_chars.asm"
; 122c1