Port pokecrystal's formatting of text commands and special characters

This commit is contained in:
Rangi 2020-07-04 17:09:35 -04:00
parent 2718c36065
commit 139a28ff99
397 changed files with 7398 additions and 7026 deletions

View file

@ -5,9 +5,9 @@ TextBoxBorder::
push hl
ld a, "┌"
ld [hli], a
inc a ;
call NPlaceChar
inc a ;
inc a ; "─"
call .PlaceChars
inc a ; "┐"
ld [hl], a
pop hl
@ -20,7 +20,7 @@ TextBoxBorder::
ld a, "│"
ld [hli], a
ld a, " "
call NPlaceChar
call .PlaceChars
ld [hl], "│"
pop hl
@ -33,11 +33,11 @@ TextBoxBorder::
ld a, "└"
ld [hli], a
ld a, "─"
call NPlaceChar
call .PlaceChars
ld [hl], "┘"
ret
NPlaceChar::
.PlaceChars::
; Place char a c times.
ld d, c
.loop
@ -48,19 +48,19 @@ NPlaceChar::
PlaceString::
push hl
PlaceNextChar::
ld a, [de]
cp "@"
jr nz, Char4ETest
jr nz, .NotTerminator
ld b, h
ld c, l
pop hl
ret
Char4ETest::
cp $4E ; next
jr nz, .char4FTest
.NotTerminator
cp "<NEXT>"
jr nz, .NotNext
ld bc, 2 * SCREEN_WIDTH
ld a, [hFlagsFFF6]
bit 2, a
@ -70,142 +70,101 @@ Char4ETest::
pop hl
add hl, bc
push hl
jp PlaceNextChar_inc
jp NextChar
.char4FTest
cp $4F ; line
jr nz, .next3
.NotNext
cp "<LINE>"
jr nz, .NotLine
pop hl
coord hl, 1, 16
push hl
jp PlaceNextChar_inc
jp NextChar
.next3 ; Check against a dictionary
dict: macro
if \1 == 0
and a
else
cp \1
endc
jp z, \2
endm
.NotLine
dict $00, Char00 ; error
dict $4C, Char4C ; autocont
dict $4B, Char4B ; cont_
dict $51, Char51 ; para
dict $49, Char49 ; page
dict $52, Char52 ; player
dict $53, Char53 ; rival
dict $54, Char54 ; POKé
dict $5B, Char5B ; PC
dict $5E, Char5E ; ROCKET
dict $5C, Char5C ; TM
dict $5D, Char5D ; TRAINER
dict $55, Char55 ; cont
dict $56, Char56 ; 6 dots
dict $57, Char57 ; done
dict $58, Char58 ; prompt
dict $4A, Char4A ; PKMN
dict $5F, Char5F ; dex
dict $59, Char59 ; TARGET
dict $5A, Char5A ; USER
; Check against a dictionary
dict "<NULL>", NullChar
dict "<SCROLL>", _ContTextNoPause
dict "<_CONT>", _ContText
dict "<PARA>", Paragraph
dict "<PAGE>", PageChar
dict "<PLAYER>", PrintPlayerName
dict "<RIVAL>", PrintRivalName
dict "#", PlacePOKe
dict "<PC>", PCChar
dict "<ROCKET>", RocketChar
dict "<TM>", TMChar
dict "<TRAINER>", TrainerChar
dict "<CONT>", ContText
dict "<……>", SixDotsChar
dict "<DONE>", DoneText
dict "<PROMPT>", PromptText
dict "<PKMN>", PlacePKMN
dict "<DEXEND>", PlaceDexEnd
dict "<TARGET>", PlaceMoveTargetsName
dict "<USER>", PlaceMoveUsersName
ld [hli], a
call PrintLetterDelay
PlaceNextChar_inc::
NextChar::
inc de
jp PlaceNextChar
Char00::
NullChar::
ld b, h
ld c, l
pop hl
ld de, Char00Text
ld de, TextIDErrorText
dec de
ret
Char00Text:: ; “%d ERROR.”
TX_FAR _Char00Text
db "@"
TextIDErrorText:: ; "[hSpriteIndexOrTextID] ERROR."
text_far _TextIDErrorText
text_end
Char52:: ; players name
print_name: MACRO
push de
ld de, wPlayerName
jr FinishDTE
ld de, \1
jr PlaceCommandCharacter
ENDM
Char53:: ; rivals name
push de
ld de, wRivalName
jr FinishDTE
PrintPlayerName:: print_name wPlayerName
PrintRivalName:: print_name wRivalName
Char5D:: ; TRAINER
push de
ld de, Char5DText
jr FinishDTE
TrainerChar:: print_name TrainerCharText
TMChar:: print_name TMCharText
PCChar:: print_name PCCharText
RocketChar:: print_name RocketCharText
PlacePOKe:: print_name PlacePOKeText
SixDotsChar:: print_name SixDotsCharText
PlacePKMN:: print_name PlacePKMNText
Char5C:: ; TM
push de
ld de, Char5CText
jr FinishDTE
Char5B:: ; PC
push de
ld de, Char5BText
jr FinishDTE
Char5E:: ; ROCKET
push de
ld de, Char5EText
jr FinishDTE
Char54:: ; POKé
push de
ld de, Char54Text
jr FinishDTE
Char56:: ; ……
push de
ld de, Char56Text
jr FinishDTE
Char4A:: ; PKMN
push de
ld de, Char4AText
jr FinishDTE
Char59::
; depending on whose turn it is, print
; enemy active monsters name, prefixed with “Enemy ”
; or
; player active monsters name
; (like Char5A but flipped)
PlaceMoveTargetsName::
ld a, [hWhoseTurn]
xor 1
jr MonsterNameCharsCommon
jr PlaceMoveUsersName.place
Char5A::
; depending on whose turn it is, print
; player active monsters name
; or
; enemy active monsters name, prefixed with “Enemy ”
PlaceMoveUsersName::
ld a, [hWhoseTurn]
MonsterNameCharsCommon::
.place:
push de
and a
jr nz, .Enemy
ld de, wBattleMonNick ; player active monster name
jr FinishDTE
jr nz, .enemy
.Enemy
; print “Enemy ”
ld de, Char5AText
ld de, wBattleMonNick
jr PlaceCommandCharacter
.enemy
ld de, EnemyText
call PlaceString
ld h, b
ld l, c
ld de, wEnemyMonNick ; enemy active monster name
ld de, wEnemyMonNick
; fallthrough
FinishDTE::
PlaceCommandCharacter::
call PlaceString
ld h, b
ld l, c
@ -213,28 +172,20 @@ FinishDTE::
inc de
jp PlaceNextChar
Char5CText::
db "TM@"
Char5DText::
db "TRAINER@"
Char5BText::
db "PC@"
Char5EText::
db "ROCKET@"
Char54Text::
db "POKé@"
Char56Text::
db "……@"
Char5AText::
db "Enemy @"
Char4AText::
db $E1,$E2,"@" ; PKMN
TMCharText:: db "TM@"
TrainerCharText:: db "TRAINER@"
PCCharText:: db "PC@"
RocketCharText:: db "ROCKET@"
PlacePOKeText:: db "POKé@"
SixDotsCharText:: db "……@"
EnemyText:: db "Enemy @"
PlacePKMNText:: db "<PK><MN>@"
Char55::
ContText::
push de
ld b, h
ld c, l
ld hl, Char55Text
ld hl, ContCharText
call TextCommandProcessor
ld h, b
ld l, c
@ -242,18 +193,16 @@ Char55::
inc de
jp PlaceNextChar
Char55Text::
; equivalent to Char4B
TX_FAR _Char55Text
db "@"
ContCharText::
text_far _ContCharText
text_end
Char5F::
; ends a Pokédex entry
PlaceDexEnd::
ld [hl], "."
pop hl
ret
Char58:: ; prompt
PromptText::
ld a, [wLinkState]
cp LINK_STATE_BATTLING
jp z, .ok
@ -264,16 +213,17 @@ Char58:: ; prompt
call ManualTextScroll
ld a, " "
Coorda 18, 16
Char57:: ; done
DoneText::
pop hl
ld de, Char58Text
ld de, .stop
dec de
ret
Char58Text::
db "@"
.stop:
text_end
Char51:: ; para
Paragraph::
push de
ld a, "▼"
Coorda 18, 16
@ -286,9 +236,9 @@ Char51:: ; para
call DelayFrames
pop de
coord hl, 1, 14
jp PlaceNextChar_inc
jp NextChar
Char49::
PageChar::
push de
ld a, "▼"
Coorda 18, 16
@ -303,9 +253,9 @@ Char49::
pop hl
coord hl, 1, 11
push hl
jp PlaceNextChar_inc
jp NextChar
Char4B::
_ContText::
ld a, "▼"
Coorda 18, 16
call ProtectedDelay3
@ -314,14 +264,13 @@ Char4B::
pop de
ld a, " "
Coorda 18, 16
;fall through
Char4C::
_ContTextNoPause::
push de
call ScrollTextUpOneLine
call ScrollTextUpOneLine
coord hl, 1, 16
pop de
jp PlaceNextChar_inc
jp NextChar
; move both rows of text in the normal text box up one row
; always called twice in a row
@ -345,7 +294,6 @@ ScrollTextUpOneLine::
dec b
jr nz, .clearText
; wait five frames
ld b, 5
.WaitFrame
call DelayFrame
@ -375,18 +323,18 @@ TextCommandProcessor::
NextTextCommand::
ld a, [hli]
cp "@" ; terminator
jr nz, .doTextCommand
cp TX_END
jr nz, .TextCommand
pop af
ld [wLetterPrintingDelayFlags], a
ret
.doTextCommand
.TextCommand:
push hl
cp $17
jp z, TextCommand17
cp $0e
jp nc, TextCommand0B ; if a != 0x17 and a >= 0xE, go to command 0xB
; if a < 0xE, use a jump table
cp TX_FAR
jp z, TextCommand_FAR
cp TX_SOUND_POKEDEX_RATING
jp nc, TextCommand_SOUND
ld hl, TextCommandJumpTable
push bc
add a
@ -399,12 +347,8 @@ NextTextCommand::
ld l, a
jp hl
; draw box
; 04AAAABBCC
; AAAA = address of upper left corner
; BB = height
; CC = width
TextCommand04::
TextCommand_BOX::
; draw a box (height, width)
pop hl
ld a, [hli]
ld e, a
@ -421,9 +365,8 @@ TextCommand04::
pop hl
jr NextTextCommand
; place string inline
; 00{string}
TextCommand00::
TextCommand_START::
; write text until "@"
pop hl
ld d, h
ld e, l
@ -435,10 +378,8 @@ TextCommand00::
inc hl
jr NextTextCommand
; place string from RAM
; 01AAAA
; AAAA = address of string
TextCommand01::
TextCommand_RAM::
; write text from a ram address (little endian)
pop hl
ld a, [hli]
ld e, a
@ -451,13 +392,8 @@ TextCommand01::
pop hl
jr NextTextCommand
; print BCD number
; 02AAAABB
; AAAA = address of BCD number
; BB
; bits 0-4 = length in bytes
; bits 5-7 = unknown flags
TextCommand02::
TextCommand_BCD::
; write bcd from address, typically ram
pop hl
ld a, [hli]
ld e, a
@ -474,10 +410,8 @@ TextCommand02::
pop hl
jr NextTextCommand
; repoint destination address
; 03AAAA
; AAAA = new destination address
TextCommand03::
TextCommand_MOVE::
; move to a new tile
pop hl
ld a, [hli]
ld [wTextDest], a
@ -487,21 +421,17 @@ TextCommand03::
ld b, a
jp NextTextCommand
; repoint destination to second line of dialogue text box
; 05
; (no arguments)
TextCommand05::
TextCommand_LOW::
; write text at (1,16)
pop hl
coord bc, 1, 16 ; address of second line of dialogue text box
coord bc, 1, 16 ; second line of dialogue text box
jp NextTextCommand
; blink arrow and wait for A or B to be pressed
; 06
; (no arguments)
TextCommand06::
TextCommand_PROMPT_BUTTON::
; wait for button press; show arrow
ld a, [wLinkState]
cp LINK_STATE_BATTLING
jp z, TextCommand0D
jp z, TextCommand_LINK_PROMPT_BUTTON
ld a, "▼"
Coorda 18, 16 ; place down arrow in lower right corner of dialogue text box
push bc
@ -512,33 +442,26 @@ TextCommand06::
pop hl
jp NextTextCommand
; scroll text up one line
; 07
; (no arguments)
TextCommand07::
TextCommand_SCROLL::
; pushes text up two lines and sets the BC cursor to the border tile
; below the first character column of the text box.
ld a, " "
Coorda 18, 16 ; place blank space in lower right corner of dialogue text box
call ScrollTextUpOneLine
call ScrollTextUpOneLine
pop hl
coord bc, 1, 16 ; address of second line of dialogue text box
coord bc, 1, 16 ; second line of dialogue text box
jp NextTextCommand
; execute asm inline
; 08{code}
TextCommand08::
TextCommand_START_ASM::
; run assembly code
pop hl
ld de, NextTextCommand
push de ; return address
push de
jp hl
; print decimal number (converted from binary number)
; 09AAAABB
; AAAA = address of number
; BB
; bits 0-3 = how many digits to display
; bits 4-7 = how long the number is in bytes
TextCommand09::
TextCommand_NUM::
; print a number
pop hl
ld a, [hli]
ld e, a
@ -554,7 +477,7 @@ TextCommand09::
ld a, b
and $f0
swap a
set BIT_LEFT_ALIGN,a
set BIT_LEFT_ALIGN, a
ld b, a
call PrintNumber
ld b, h
@ -562,45 +485,42 @@ TextCommand09::
pop hl
jp NextTextCommand
; wait half a second if the user doesn't hold A or B
; 0A
; (no arguments)
TextCommand0A::
TextCommand_PAUSE::
; wait for button press or 30 frames
push bc
call Joypad
ld a, [hJoyHeld]
and A_BUTTON | B_BUTTON
jr nz, .skipDelay
ld c, 30
jr nz, .done
ld c, 30 ; half a second
call DelayFrames
.skipDelay
.done
pop bc
pop hl
jp NextTextCommand
; plays sounds
; this actually handles various command ID's, not just 0B
; (no arguments)
TextCommand0B::
TextCommand_SOUND::
; play a sound effect from TextCommandSounds
pop hl
push bc
dec hl
ld a, [hli]
ld b, a ; b = command number that got us here
ld b, a ; b = text command number that got us here
push hl
ld hl, TextCommandSounds
.loop
ld a, [hli]
cp b
jr z, .matchFound
jr z, .play
inc hl
jr .loop
.matchFound
cp $14
.play
cp TX_SOUND_CRY_NIDORINA
jr z, .pokemonCry
cp $15
cp TX_SOUND_CRY_PIDGEOT
jr z, .pokemonCry
cp $16
cp TX_SOUND_CRY_DEWGONG
jr z, .pokemonCry
ld a, [hl]
call PlaySound
@ -608,6 +528,7 @@ TextCommand0B::
pop hl
pop bc
jp NextTextCommand
.pokemonCry
push de
ld a, [hl]
@ -617,29 +538,27 @@ TextCommand0B::
pop bc
jp NextTextCommand
; format: text command ID, sound ID or cry ID
TextCommandSounds::
db $0B, SFX_GET_ITEM_1 ; actually plays SFX_LEVEL_UP when the battle music engine is loaded
db $12, SFX_CAUGHT_MON
db $0E, SFX_POKEDEX_RATING ; unused?
db $0F, SFX_GET_ITEM_1 ; unused?
db $10, SFX_GET_ITEM_2
db $11, SFX_GET_KEY_ITEM
db $13, SFX_DEX_PAGE_ADDED
db $14, NIDORINA ; used in OakSpeech
db $15, PIDGEOT ; used in SaffronCityText12
db $16, DEWGONG ; unused?
db TX_SOUND_GET_ITEM_1, SFX_GET_ITEM_1 ; actually plays SFX_LEVEL_UP when the battle music engine is loaded
db TX_SOUND_CAUGHT_MON, SFX_CAUGHT_MON
db TX_SOUND_POKEDEX_RATING, SFX_POKEDEX_RATING ; unused
db TX_SOUND_GET_ITEM_1_DUPLICATE, SFX_GET_ITEM_1 ; unused
db TX_SOUND_GET_ITEM_2, SFX_GET_ITEM_2
db TX_SOUND_GET_KEY_ITEM, SFX_GET_KEY_ITEM
db TX_SOUND_DEX_PAGE_ADDED, SFX_DEX_PAGE_ADDED
db TX_SOUND_CRY_NIDORINA, NIDORINA ; used in OakSpeech
db TX_SOUND_CRY_PIDGEOT, PIDGEOT ; used in SaffronCityText12
db TX_SOUND_CRY_DEWGONG, DEWGONG ; unused
; draw ellipses
; 0CAA
; AA = number of ellipses to draw
TextCommand0C::
TextCommand_DOTS::
; wait for button press or 30 frames while printing "…"s
pop hl
ld a, [hli]
ld d, a
push hl
ld h, b
ld l, c
.loop
ld a, "…"
ld [hli], a
@ -648,64 +567,66 @@ TextCommand0C::
pop de
ld a, [hJoyHeld] ; joypad state
and A_BUTTON | B_BUTTON
jr nz, .skipDelay ; if so, skip the delay
jr nz, .next ; if so, skip the delay
ld c, 10
call DelayFrames
.skipDelay
.next
dec d
jr nz, .loop
ld b, h
ld c, l
pop hl
jp NextTextCommand
; wait for A or B to be pressed
; 0D
; (no arguments)
TextCommand0D::
TextCommand_LINK_PROMPT_BUTTON::
; wait for button press; display arrow
push bc
call ManualTextScroll ; wait for A or B to be pressed
call ManualTextScroll
pop bc
pop hl
jp NextTextCommand
; process text commands in another ROM bank
; 17AAAABB
; AAAA = address of text commands
; BB = bank
TextCommand17::
TextCommand_FAR::
; write text from a different bank (little endian)
pop hl
ld a, [hLoadedROMBank]
push af
ld a, [hli]
ld e, a
ld a, [hli]
ld d, a
ld a, [hli]
ld [hLoadedROMBank], a
ld [MBC1RomBank], a
push hl
ld l, e
ld h, d
call TextCommandProcessor
pop hl
pop af
ld [hLoadedROMBank], a
ld [MBC1RomBank], a
jp NextTextCommand
TextCommandJumpTable::
dw TextCommand00
dw TextCommand01
dw TextCommand02
dw TextCommand03
dw TextCommand04
dw TextCommand05
dw TextCommand06
dw TextCommand07
dw TextCommand08
dw TextCommand09
dw TextCommand0A
dw TextCommand0B
dw TextCommand0C
dw TextCommand0D
; entries correspond to TX_* constants (see macros/scripts/text.asm)
dw TextCommand_START ; TX_START
dw TextCommand_RAM ; TX_RAM
dw TextCommand_BCD ; TX_BCD
dw TextCommand_MOVE ; TX_MOVE
dw TextCommand_BOX ; TX_BOX
dw TextCommand_LOW ; TX_LOW
dw TextCommand_PROMPT_BUTTON ; TX_PROMPT_BUTTON
dw TextCommand_SCROLL ; TX_SCROLL
dw TextCommand_START_ASM ; TX_START_ASM
dw TextCommand_NUM ; TX_NUM
dw TextCommand_PAUSE ; TX_PAUSE
dw TextCommand_SOUND ; TX_SOUND_GET_ITEM_1 (also handles other TX_SOUND_* commands)
dw TextCommand_DOTS ; TX_DOTS
dw TextCommand_LINK_PROMPT_BUTTON ; TX_LINK_PROMPT_BUTTON
; greater TX_* constants are handled directly by NextTextCommand