123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712 |
- TextBoxBorder::
- ; Draw a c×b text box at hl.
- ; top row
- push hl
- ld a, "┌"
- ld [hli], a
- inc a ; ─
- call NPlaceChar
- inc a ; ┐
- ld [hl], a
- pop hl
- ld de, SCREEN_WIDTH
- add hl, de
- ; middle rows
- .next
- push hl
- ld a, "│"
- ld [hli], a
- ld a, " "
- call NPlaceChar
- ld [hl], "│"
- pop hl
- ld de, SCREEN_WIDTH
- add hl, de
- dec b
- jr nz, .next
- ; bottom row
- ld a, "└"
- ld [hli], a
- ld a, "─"
- call NPlaceChar
- ld [hl], "┘"
- ret
- NPlaceChar::
- ; Place char a c times.
- ld d, c
- .loop
- ld [hli], a
- dec d
- jr nz, .loop
- ret
- PlaceString::
- push hl
- PlaceNextChar::
- ld a, [de]
- cp "@"
- jr nz, Char4ETest
- ld b, h
- ld c, l
- pop hl
- ret
- Char4ETest::
- cp $4E ; next
- jr nz, .char4FTest
- ld bc, 2 * SCREEN_WIDTH
- ld a, [hFlags_0xFFF6]
- bit 2, a
- jr z, .ok
- ld bc, SCREEN_WIDTH
- .ok
- pop hl
- add hl, bc
- push hl
- jp PlaceNextChar_inc
- .char4FTest
- cp $4F ; line
- jr nz, .next3
- pop hl
- coord hl, 1, 16
- push hl
- jp PlaceNextChar_inc
- .next3 ; Check against a dictionary
- dict: macro
- if \1 == 0
- and a
- else
- cp \1
- endc
- jp z, \2
- endm
- 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
- ld [hli], a
- call PrintLetterDelay
- PlaceNextChar_inc::
- inc de
- jp PlaceNextChar
- Char00::
- ld b, h
- ld c, l
- pop hl
- ld de, Char00Text
- dec de
- ret
- Char00Text:: ; “%d ERROR.”
- TX_FAR _Char00Text
- db "@"
- Char52:: ; player’s name
- push de
- ld de, wPlayerName
- jr FinishDTE
- Char53:: ; rival’s name
- push de
- ld de, wRivalName
- jr FinishDTE
- Char5D:: ; TRAINER
- push de
- ld de, Char5DText
- jr FinishDTE
- 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 monster’s name, prefixed with “Enemy ”
- ; or
- ; player active monster’s name
- ; (like Char5A but flipped)
- ld a, [H_WHOSETURN]
- xor 1
- jr MonsterNameCharsCommon
- Char5A::
- ; depending on whose turn it is, print
- ; player active monster’s name
- ; or
- ; enemy active monster’s name, prefixed with “Enemy ”
- ld a, [H_WHOSETURN]
- MonsterNameCharsCommon::
- push de
- and a
- jr nz, .Enemy
- ld de, wBattleMonNick ; player active monster name
- jr FinishDTE
- .Enemy
- ; print “Enemy ”
- ld de, Char5AText
- call PlaceString
- ld h, b
- ld l, c
- ld de, wEnemyMonNick ; enemy active monster name
- FinishDTE::
- call PlaceString
- ld h, b
- ld l, c
- pop de
- 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
- Char55::
- push de
- ld b, h
- ld c, l
- ld hl, Char55Text
- call TextCommandProcessor
- ld h, b
- ld l, c
- pop de
- inc de
- jp PlaceNextChar
- Char55Text::
- ; equivalent to Char4B
- TX_FAR _Char55Text
- db "@"
- Char5F::
- ; ends a Pokédex entry
- ld [hl], "."
- pop hl
- ret
- Char58:: ; prompt
- ld a, [wLinkState]
- cp LINK_STATE_BATTLING
- jp z, .ok
- ld a, "▼"
- Coorda 18, 16
- .ok
- call ProtectedDelay3
- call ManualTextScroll
- ld a, " "
- Coorda 18, 16
- Char57:: ; done
- pop hl
- ld de, Char58Text
- dec de
- ret
- Char58Text::
- db "@"
- Char51:: ; para
- push de
- ld a, "▼"
- Coorda 18, 16
- call ProtectedDelay3
- call ManualTextScroll
- coord hl, 1, 13
- lb bc, 4, 18
- call ClearScreenArea
- ld c, 20
- call DelayFrames
- pop de
- coord hl, 1, 14
- jp PlaceNextChar_inc
- Char49::
- push de
- ld a, "▼"
- Coorda 18, 16
- call ProtectedDelay3
- call ManualTextScroll
- coord hl, 1, 10
- lb bc, 7, 18
- call ClearScreenArea
- ld c, 20
- call DelayFrames
- pop de
- pop hl
- coord hl, 1, 11
- push hl
- jp PlaceNextChar_inc
- Char4B::
- ld a, "▼"
- Coorda 18, 16
- call ProtectedDelay3
- push de
- call ManualTextScroll
- pop de
- ld a, " "
- Coorda 18, 16
- ;fall through
- Char4C::
- push de
- call ScrollTextUpOneLine
- call ScrollTextUpOneLine
- coord hl, 1, 16
- pop de
- jp PlaceNextChar_inc
- ; move both rows of text in the normal text box up one row
- ; always called twice in a row
- ; first time, copy the two rows of text to the "in between" rows that are usually emtpy
- ; second time, copy the bottom row of text into the top row of text
- ScrollTextUpOneLine::
- coord hl, 0, 14 ; top row of text
- coord de, 0, 13 ; empty line above text
- ld b, SCREEN_WIDTH * 3
- .copyText
- ld a, [hli]
- ld [de], a
- inc de
- dec b
- jr nz, .copyText
- coord hl, 1, 16
- ld a, " "
- ld b, SCREEN_WIDTH - 2
- .clearText
- ld [hli], a
- dec b
- jr nz, .clearText
- ; wait five frames
- ld b, 5
- .WaitFrame
- call DelayFrame
- dec b
- jr nz, .WaitFrame
- ret
- ProtectedDelay3::
- push bc
- call Delay3
- pop bc
- ret
- TextCommandProcessor::
- ld a, [wLetterPrintingDelayFlags]
- push af
- set 1, a
- ld e, a
- ld a, [$fff4]
- xor e
- ld [wLetterPrintingDelayFlags], a
- ld a, c
- ld [wTextDest], a
- ld a, b
- ld [wTextDest + 1], a
- NextTextCommand::
- ld a, [hli]
- cp "@" ; terminator
- jr nz, .doTextCommand
- pop af
- ld [wLetterPrintingDelayFlags], a
- ret
- .doTextCommand
- 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
- ld hl, TextCommandJumpTable
- push bc
- add a
- ld b, 0
- ld c, a
- add hl, bc
- pop bc
- ld a, [hli]
- ld h, [hl]
- ld l, a
- jp hl
- ; draw box
- ; 04AAAABBCC
- ; AAAA = address of upper left corner
- ; BB = height
- ; CC = width
- TextCommand04::
- pop hl
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- ld b, a
- ld a, [hli]
- ld c, a
- push hl
- ld h, d
- ld l, e
- call TextBoxBorder
- pop hl
- jr NextTextCommand
- ; place string inline
- ; 00{string}
- TextCommand00::
- pop hl
- ld d, h
- ld e, l
- ld h, b
- ld l, c
- call PlaceString
- ld h, d
- ld l, e
- inc hl
- jr NextTextCommand
- ; place string from RAM
- ; 01AAAA
- ; AAAA = address of string
- TextCommand01::
- pop hl
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- push hl
- ld h, b
- ld l, c
- call PlaceString
- 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::
- pop hl
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- push hl
- ld h, b
- ld l, c
- ld c, a
- call PrintBCDNumber
- ld b, h
- ld c, l
- pop hl
- jr NextTextCommand
- ; repoint destination address
- ; 03AAAA
- ; AAAA = new destination address
- TextCommand03::
- pop hl
- ld a, [hli]
- ld [wTextDest], a
- ld c, a
- ld a, [hli]
- ld [wTextDest + 1], a
- ld b, a
- jp NextTextCommand
- ; repoint destination to second line of dialogue text box
- ; 05
- ; (no arguments)
- TextCommand05::
- pop hl
- coord bc, 1, 16 ; address of second line of dialogue text box
- jp NextTextCommand
- ; blink arrow and wait for A or B to be pressed
- ; 06
- ; (no arguments)
- TextCommand06::
- ld a, [wLinkState]
- cp LINK_STATE_BATTLING
- jp z, TextCommand0D
- ld a, "▼"
- Coorda 18, 16 ; place down arrow in lower right corner of dialogue text box
- push bc
- call ManualTextScroll ; blink arrow and wait for A or B to be pressed
- pop bc
- ld a, " "
- Coorda 18, 16 ; overwrite down arrow with blank space
- pop hl
- jp NextTextCommand
- ; scroll text up one line
- ; 07
- ; (no arguments)
- TextCommand07::
- 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
- jp NextTextCommand
- ; execute asm inline
- ; 08{code}
- TextCommand08::
- pop hl
- ld de, NextTextCommand
- push de ; return address
- 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::
- pop hl
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- push hl
- ld h, b
- ld l, c
- ld b, a
- and $0f
- ld c, a
- ld a, b
- and $f0
- swap a
- set BIT_LEFT_ALIGN,a
- ld b, a
- call PrintNumber
- ld b, h
- ld c, l
- pop hl
- jp NextTextCommand
- ; wait half a second if the user doesn't hold A or B
- ; 0A
- ; (no arguments)
- TextCommand0A::
- push bc
- call Joypad
- ld a, [hJoyHeld]
- and A_BUTTON | B_BUTTON
- jr nz, .skipDelay
- ld c, 30
- call DelayFrames
- .skipDelay
- pop bc
- pop hl
- jp NextTextCommand
- ; plays sounds
- ; this actually handles various command ID's, not just 0B
- ; (no arguments)
- TextCommand0B::
- pop hl
- push bc
- dec hl
- ld a, [hli]
- ld b, a ; b = command number that got us here
- push hl
- ld hl, TextCommandSounds
- .loop
- ld a, [hli]
- cp b
- jr z, .matchFound
- inc hl
- jr .loop
- .matchFound
- cp $14
- jr z, .pokemonCry
- cp $15
- jr z, .pokemonCry
- cp $16
- jr z, .pokemonCry
- ld a, [hl]
- call PlaySound
- call WaitForSoundToFinish
- pop hl
- pop bc
- jp NextTextCommand
- .pokemonCry
- push de
- ld a, [hl]
- call PlayCry
- pop de
- pop hl
- 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?
- ; draw ellipses
- ; 0CAA
- ; AA = number of ellipses to draw
- TextCommand0C::
- pop hl
- ld a, [hli]
- ld d, a
- push hl
- ld h, b
- ld l, c
- .loop
- ld a, "…"
- ld [hli], a
- push de
- call Joypad
- pop de
- ld a, [hJoyHeld] ; joypad state
- and A_BUTTON | B_BUTTON
- jr nz, .skipDelay ; if so, skip the delay
- ld c, 10
- call DelayFrames
- .skipDelay
- 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::
- push bc
- call ManualTextScroll ; wait for A or B to be pressed
- pop bc
- pop hl
- jp NextTextCommand
- ; process text commands in another ROM bank
- ; 17AAAABB
- ; AAAA = address of text commands
- ; BB = bank
- TextCommand17::
- pop hl
- ld a, [H_LOADEDROMBANK]
- push af
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- ld a, [hli]
- ld [H_LOADEDROMBANK], a
- ld [MBC1RomBank], a
- push hl
- ld l, e
- ld h, d
- call TextCommandProcessor
- pop hl
- pop af
- ld [H_LOADEDROMBANK], 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
|