mirror of
https://github.com/pret/pokered.git
synced 2024-10-24 15:27:10 +00:00
512 lines
9.2 KiB
NASM
Executable file
512 lines
9.2 KiB
NASM
Executable file
AskName:
|
||
call SaveScreenTilesToBuffer1
|
||
call GetPredefRegisters
|
||
push hl
|
||
ld a, [wIsInBattle]
|
||
dec a
|
||
coord hl, 0, 0
|
||
ld b, 4
|
||
ld c, 11
|
||
call z, ClearScreenArea ; only if in wild battle
|
||
ld a, [wcf91]
|
||
ld [wd11e], a
|
||
call GetMonName
|
||
ld hl, DoYouWantToNicknameText
|
||
call PrintText
|
||
coord hl, 14, 7
|
||
lb bc, 8, 15
|
||
ld a, TWO_OPTION_MENU
|
||
ld [wTextBoxID], a
|
||
call DisplayTextBoxID
|
||
pop hl
|
||
ld a, [wCurrentMenuItem]
|
||
and a
|
||
jr nz, .declinedNickname
|
||
ld a, [wUpdateSpritesEnabled]
|
||
push af
|
||
xor a
|
||
ld [wUpdateSpritesEnabled], a
|
||
push hl
|
||
ld a, NAME_MON_SCREEN
|
||
ld [wNamingScreenType], a
|
||
call DisplayNamingScreen
|
||
ld a, [wIsInBattle]
|
||
and a
|
||
jr nz, .inBattle
|
||
call ReloadMapSpriteTilePatterns
|
||
.inBattle
|
||
call LoadScreenTilesFromBuffer1
|
||
pop hl
|
||
pop af
|
||
ld [wUpdateSpritesEnabled], a
|
||
ld a, [wcf4b]
|
||
cp "@"
|
||
ret nz
|
||
.declinedNickname
|
||
ld d, h
|
||
ld e, l
|
||
ld hl, wcd6d
|
||
ld bc, NAME_LENGTH
|
||
jp CopyData
|
||
|
||
DoYouWantToNicknameText:
|
||
TX_FAR _DoYouWantToNicknameText
|
||
db "@"
|
||
|
||
DisplayNameRaterScreen:
|
||
ld hl, wBuffer
|
||
xor a
|
||
ld [wUpdateSpritesEnabled], a
|
||
ld a, NAME_MON_SCREEN
|
||
ld [wNamingScreenType], a
|
||
call DisplayNamingScreen
|
||
call GBPalWhiteOutWithDelay3
|
||
call RestoreScreenTilesAndReloadTilePatterns
|
||
call LoadGBPal
|
||
ld a, [wcf4b]
|
||
cp "@"
|
||
jr z, .playerCancelled
|
||
ld hl, wPartyMonNicks
|
||
ld bc, NAME_LENGTH
|
||
ld a, [wWhichPokemon]
|
||
call AddNTimes
|
||
ld e, l
|
||
ld d, h
|
||
ld hl, wBuffer
|
||
ld bc, NAME_LENGTH
|
||
call CopyData
|
||
and a
|
||
ret
|
||
.playerCancelled
|
||
scf
|
||
ret
|
||
|
||
DisplayNamingScreen:
|
||
push hl
|
||
ld hl, wd730
|
||
set 6, [hl]
|
||
call GBPalWhiteOutWithDelay3
|
||
call ClearScreen
|
||
call UpdateSprites
|
||
ld b, SET_PAL_GENERIC
|
||
call RunPaletteCommand
|
||
call LoadHpBarAndStatusTilePatterns
|
||
call LoadEDTile
|
||
callba LoadMonPartySpriteGfx
|
||
coord hl, 0, 4
|
||
ld b, 9
|
||
ld c, 18
|
||
call TextBoxBorder
|
||
call PrintNamingText
|
||
ld a, 3
|
||
ld [wTopMenuItemY], a
|
||
ld a, 1
|
||
ld [wTopMenuItemX], a
|
||
ld [wLastMenuItem], a
|
||
ld [wCurrentMenuItem], a
|
||
ld a, $ff
|
||
ld [wMenuWatchedKeys], a
|
||
ld a, 7
|
||
ld [wMaxMenuItem], a
|
||
ld a, "@"
|
||
ld [wcf4b], a
|
||
xor a
|
||
ld hl, wNamingScreenSubmitName
|
||
ld [hli], a
|
||
ld [hli], a
|
||
ld [wAnimCounter], a
|
||
.selectReturnPoint
|
||
call PrintAlphabet
|
||
call GBPalNormal
|
||
.ABStartReturnPoint
|
||
ld a, [wNamingScreenSubmitName]
|
||
and a
|
||
jr nz, .submitNickname
|
||
call PrintNicknameAndUnderscores
|
||
.dPadReturnPoint
|
||
call PlaceMenuCursor
|
||
.inputLoop
|
||
ld a, [wCurrentMenuItem]
|
||
push af
|
||
callba AnimatePartyMon_ForceSpeed1
|
||
pop af
|
||
ld [wCurrentMenuItem], a
|
||
call JoypadLowSensitivity
|
||
ld a, [hJoyPressed]
|
||
and a
|
||
jr z, .inputLoop
|
||
ld hl, .namingScreenButtonFunctions
|
||
.checkForPressedButton
|
||
sla a
|
||
jr c, .foundPressedButton
|
||
inc hl
|
||
inc hl
|
||
inc hl
|
||
inc hl
|
||
jr .checkForPressedButton
|
||
.foundPressedButton
|
||
ld a, [hli]
|
||
ld e, a
|
||
ld a, [hli]
|
||
ld d, a
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a
|
||
push de
|
||
jp hl
|
||
|
||
.submitNickname
|
||
pop de
|
||
ld hl, wcf4b
|
||
ld bc, NAME_LENGTH
|
||
call CopyData
|
||
call GBPalWhiteOutWithDelay3
|
||
call ClearScreen
|
||
call ClearSprites
|
||
call RunDefaultPaletteCommand
|
||
call GBPalNormal
|
||
xor a
|
||
ld [wAnimCounter], a
|
||
ld hl, wd730
|
||
res 6, [hl]
|
||
ld a, [wIsInBattle]
|
||
and a
|
||
jp z, LoadTextBoxTilePatterns
|
||
jpab LoadHudTilePatterns
|
||
|
||
.namingScreenButtonFunctions
|
||
dw .dPadReturnPoint
|
||
dw .pressedDown
|
||
dw .dPadReturnPoint
|
||
dw .pressedUp
|
||
dw .dPadReturnPoint
|
||
dw .pressedLeft
|
||
dw .dPadReturnPoint
|
||
dw .pressedRight
|
||
dw .ABStartReturnPoint
|
||
dw .pressedStart
|
||
dw .selectReturnPoint
|
||
dw .pressedSelect
|
||
dw .ABStartReturnPoint
|
||
dw .pressedB
|
||
dw .ABStartReturnPoint
|
||
dw .pressedA
|
||
|
||
.pressedA_changedCase
|
||
pop de
|
||
ld de, .selectReturnPoint
|
||
push de
|
||
.pressedSelect
|
||
ld a, [wAlphabetCase]
|
||
xor $1
|
||
ld [wAlphabetCase], a
|
||
ret
|
||
|
||
.pressedStart
|
||
ld a, 1
|
||
ld [wNamingScreenSubmitName], a
|
||
ret
|
||
|
||
.pressedA
|
||
ld a, [wCurrentMenuItem]
|
||
cp $5 ; "ED" row
|
||
jr nz, .didNotPressED
|
||
ld a, [wTopMenuItemX]
|
||
cp $11 ; "ED" column
|
||
jr z, .pressedStart
|
||
.didNotPressED
|
||
ld a, [wCurrentMenuItem]
|
||
cp $6 ; case switch row
|
||
jr nz, .didNotPressCaseSwtich
|
||
ld a, [wTopMenuItemX]
|
||
cp $1 ; case switch column
|
||
jr z, .pressedA_changedCase
|
||
.didNotPressCaseSwtich
|
||
ld hl, wMenuCursorLocation
|
||
ld a, [hli]
|
||
ld h, [hl]
|
||
ld l, a
|
||
inc hl
|
||
ld a, [hl]
|
||
ld [wNamingScreenLetter], a
|
||
call CalcStringLength
|
||
ld a, [wNamingScreenLetter]
|
||
cp $e5
|
||
ld de, Dakutens
|
||
jr z, .dakutensAndHandakutens
|
||
cp $e4
|
||
ld de, Handakutens
|
||
jr z, .dakutensAndHandakutens
|
||
ld a, [wNamingScreenType]
|
||
cp NAME_MON_SCREEN
|
||
jr nc, .checkMonNameLength
|
||
ld a, [wNamingScreenNameLength]
|
||
cp $7 ; max length of player/rival names
|
||
jr .checkNameLength
|
||
.checkMonNameLength
|
||
ld a, [wNamingScreenNameLength]
|
||
cp $a ; max length of pokemon nicknames
|
||
.checkNameLength
|
||
jr c, .addLetter
|
||
ret
|
||
|
||
.dakutensAndHandakutens
|
||
push hl
|
||
call DakutensAndHandakutens
|
||
pop hl
|
||
ret nc
|
||
dec hl
|
||
.addLetter
|
||
ld a, [wNamingScreenLetter]
|
||
ld [hli], a
|
||
ld [hl], "@"
|
||
ld a, SFX_PRESS_AB
|
||
call PlaySound
|
||
ret
|
||
.pressedB
|
||
ld a, [wNamingScreenNameLength]
|
||
and a
|
||
ret z
|
||
call CalcStringLength
|
||
dec hl
|
||
ld [hl], "@"
|
||
ret
|
||
.pressedRight
|
||
ld a, [wCurrentMenuItem]
|
||
cp $6
|
||
ret z ; can't scroll right on bottom row
|
||
ld a, [wTopMenuItemX]
|
||
cp $11 ; max
|
||
jp z, .wrapToFirstColumn
|
||
inc a
|
||
inc a
|
||
jr .done
|
||
.wrapToFirstColumn
|
||
ld a, $1
|
||
jr .done
|
||
.pressedLeft
|
||
ld a, [wCurrentMenuItem]
|
||
cp $6
|
||
ret z ; can't scroll right on bottom row
|
||
ld a, [wTopMenuItemX]
|
||
dec a
|
||
jp z, .wrapToLastColumn
|
||
dec a
|
||
jr .done
|
||
.wrapToLastColumn
|
||
ld a, $11 ; max
|
||
jr .done
|
||
.pressedUp
|
||
ld a, [wCurrentMenuItem]
|
||
dec a
|
||
ld [wCurrentMenuItem], a
|
||
and a
|
||
ret nz
|
||
ld a, $6 ; wrap to bottom row
|
||
ld [wCurrentMenuItem], a
|
||
ld a, $1 ; force left column
|
||
jr .done
|
||
.pressedDown
|
||
ld a, [wCurrentMenuItem]
|
||
inc a
|
||
ld [wCurrentMenuItem], a
|
||
cp $7
|
||
jr nz, .wrapToTopRow
|
||
ld a, $1
|
||
ld [wCurrentMenuItem], a
|
||
jr .done
|
||
.wrapToTopRow
|
||
cp $6
|
||
ret nz
|
||
ld a, $1
|
||
.done
|
||
ld [wTopMenuItemX], a
|
||
jp EraseMenuCursor
|
||
|
||
LoadEDTile:
|
||
ld de, ED_Tile
|
||
ld hl, vFont + $700
|
||
ld bc, (ED_TileEnd - ED_Tile) / $8
|
||
; to fix the graphical bug on poor emulators
|
||
;lb bc, BANK(ED_Tile), (ED_TileEnd - ED_Tile) / $8
|
||
jp CopyVideoDataDouble
|
||
|
||
ED_Tile:
|
||
INCBIN "gfx/ED_tile.1bpp"
|
||
ED_TileEnd:
|
||
|
||
PrintAlphabet:
|
||
xor a
|
||
ld [H_AUTOBGTRANSFERENABLED], a
|
||
ld a, [wAlphabetCase]
|
||
and a
|
||
ld de, LowerCaseAlphabet
|
||
jr nz, .lowercase
|
||
ld de, UpperCaseAlphabet
|
||
.lowercase
|
||
coord hl, 2, 5
|
||
lb bc, 5, 9 ; 5 rows, 9 columns
|
||
.outerLoop
|
||
push bc
|
||
.innerLoop
|
||
ld a, [de]
|
||
ld [hli], a
|
||
inc hl
|
||
inc de
|
||
dec c
|
||
jr nz, .innerLoop
|
||
ld bc, SCREEN_WIDTH + 2
|
||
add hl, bc
|
||
pop bc
|
||
dec b
|
||
jr nz, .outerLoop
|
||
call PlaceString
|
||
ld a, $1
|
||
ld [H_AUTOBGTRANSFERENABLED], a
|
||
jp Delay3
|
||
|
||
LowerCaseAlphabet:
|
||
db "abcdefghijklmnopqrstuvwxyz ×():;[]",$e1,$e2,"-?!♂♀/⠄,¥UPPER CASE@"
|
||
|
||
UpperCaseAlphabet:
|
||
db "ABCDEFGHIJKLMNOPQRSTUVWXYZ ×():;[]",$e1,$e2,"-?!♂♀/⠄,¥lower case@"
|
||
|
||
PrintNicknameAndUnderscores:
|
||
call CalcStringLength
|
||
ld a, c
|
||
ld [wNamingScreenNameLength], a
|
||
coord hl, 10, 2
|
||
lb bc, 1, 10
|
||
call ClearScreenArea
|
||
coord hl, 10, 2
|
||
ld de, wcf4b
|
||
call PlaceString
|
||
coord hl, 10, 3
|
||
ld a, [wNamingScreenType]
|
||
cp NAME_MON_SCREEN
|
||
jr nc, .pokemon1
|
||
ld b, 7 ; player or rival max name length
|
||
jr .playerOrRival1
|
||
.pokemon1
|
||
ld b, 10 ; pokemon max name length
|
||
.playerOrRival1
|
||
ld a, $76 ; underscore tile id
|
||
.placeUnderscoreLoop
|
||
ld [hli], a
|
||
dec b
|
||
jr nz, .placeUnderscoreLoop
|
||
ld a, [wNamingScreenType]
|
||
cp NAME_MON_SCREEN
|
||
ld a, [wNamingScreenNameLength]
|
||
jr nc, .pokemon2
|
||
cp 7 ; player or rival max name length
|
||
jr .playerOrRival2
|
||
.pokemon2
|
||
cp 10 ; pokemon max name length
|
||
.playerOrRival2
|
||
jr nz, .emptySpacesRemaining
|
||
; when all spaces are filled, force the cursor onto the ED tile
|
||
call EraseMenuCursor
|
||
ld a, $11 ; "ED" x coord
|
||
ld [wTopMenuItemX], a
|
||
ld a, $5 ; "ED" y corrd
|
||
ld [wCurrentMenuItem], a
|
||
ld a, [wNamingScreenType]
|
||
cp NAME_MON_SCREEN
|
||
ld a, 9 ; keep the last underscore raised
|
||
jr nc, .pokemon3
|
||
ld a, 6 ; keep the last underscore raised
|
||
.pokemon3
|
||
.emptySpacesRemaining
|
||
ld c, a
|
||
ld b, $0
|
||
coord hl, 10, 3
|
||
add hl, bc
|
||
ld [hl], $77 ; raised underscore tile id
|
||
ret
|
||
|
||
DakutensAndHandakutens:
|
||
push de
|
||
call CalcStringLength
|
||
dec hl
|
||
ld a, [hl]
|
||
pop hl
|
||
ld de, $2
|
||
call IsInArray
|
||
ret nc
|
||
inc hl
|
||
ld a, [hl]
|
||
ld [wNamingScreenLetter], a
|
||
ret
|
||
|
||
Dakutens:
|
||
db "かが", "きぎ", "くぐ", "けげ", "こご"
|
||
db "さざ", "しじ", "すず", "せぜ", "そぞ"
|
||
db "ただ", "ちぢ", "つづ", "てで", "とど"
|
||
db "はば", "ひび", "ふぶ", "へべ", "ほぼ"
|
||
db "カガ", "キギ", "クグ", "ケゲ", "コゴ"
|
||
db "サザ", "シジ", "スズ", "セゼ", "ソゾ"
|
||
db "タダ", "チヂ", "ツヅ", "テデ", "トド"
|
||
db "ハバ", "ヒビ", "フブ", "へべ", "ホボ"
|
||
db $ff
|
||
|
||
Handakutens:
|
||
db "はぱ", "ひぴ", "ふぷ", "へぺ", "ほぽ"
|
||
db "ハパ", "ヒピ", "フプ", "へぺ", "ホポ"
|
||
db $ff
|
||
|
||
; calculates the length of the string at wcf4b and stores it in c
|
||
CalcStringLength:
|
||
ld hl, wcf4b
|
||
ld c, $0
|
||
.loop
|
||
ld a, [hl]
|
||
cp "@"
|
||
ret z
|
||
inc hl
|
||
inc c
|
||
jr .loop
|
||
|
||
PrintNamingText:
|
||
coord hl, 0, 1
|
||
ld a, [wNamingScreenType]
|
||
ld de, YourTextString
|
||
and a
|
||
jr z, .notNickname
|
||
ld de, RivalsTextString
|
||
dec a
|
||
jr z, .notNickname
|
||
ld a, [wcf91]
|
||
ld [wMonPartySpriteSpecies], a
|
||
push af
|
||
callba WriteMonPartySpriteOAMBySpecies
|
||
pop af
|
||
ld [wd11e], a
|
||
call GetMonName
|
||
coord hl, 4, 1
|
||
call PlaceString
|
||
ld hl, $1
|
||
add hl, bc
|
||
ld [hl], $c9
|
||
coord hl, 1, 3
|
||
ld de, NicknameTextString
|
||
jr .placeString
|
||
.notNickname
|
||
call PlaceString
|
||
ld l, c
|
||
ld h, b
|
||
ld de, NameTextString
|
||
.placeString
|
||
jp PlaceString
|
||
|
||
YourTextString:
|
||
db "YOUR @"
|
||
|
||
RivalsTextString:
|
||
db "RIVAL's @"
|
||
|
||
NameTextString:
|
||
db "NAME?@"
|
||
|
||
NicknameTextString:
|
||
db "NICKNAME?@"
|