shithub: pokecrystal

ref: 6c3000efd2818f8d5cb0a01770d1b92991b80340
dir: /home/text.asm/

View raw version
BORDER_WIDTH   EQU 2
TEXTBOX_WIDTH  EQU SCREEN_WIDTH
TEXTBOX_INNERW EQU TEXTBOX_WIDTH - BORDER_WIDTH
TEXTBOX_HEIGHT EQU 6
TEXTBOX_INNERH EQU TEXTBOX_HEIGHT - BORDER_WIDTH
TEXTBOX_X      EQU 0
TEXTBOX_INNERX EQU TEXTBOX_X + 1
TEXTBOX_Y      EQU SCREEN_HEIGHT - TEXTBOX_HEIGHT
TEXTBOX_INNERY EQU TEXTBOX_Y + 2

TEXTBOX_PAL EQU 7


ClearBox:: ; fb6
; Fill a c*b box at hl with blank tiles.

	ld a, " "

Functionfb8::
.col
	push bc
	push hl
.row
	ld [hli], a
	dec c
	jr nz, .row
	pop hl
	ld bc, SCREEN_WIDTH
	add hl, bc
	pop bc
	dec b
	jr nz, .col
	ret
; fc8


ClearTileMap:: ; fc8
; Fill TileMap with blank tiles.

	hlcoord 0, 0
	ld a, " "
	ld bc, TileMapEnd - TileMap
	call ByteFill
	
	; Update the BG Map.
	ld a, [rLCDC]
	bit 7, a
	ret z
	jp WaitBGMap
; fdb


ClearScreen:: ; fdb
	ld a, TEXTBOX_PAL
	hlcoord 0, 0, AttrMap
	ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
	call ByteFill
	jr ClearTileMap
; fe8



TextBox:: ; fe8
; Draw a text box width c height b at hl.
; Dimensions do not include the border.
	push bc
	push hl
	call TextBoxBorder
	pop hl
	pop bc
	jr TextBoxPalette
; ff1


TextBoxBorder:: ; ff1

	; Top
	push hl
	ld a, "┌"
	ld [hli], a
	inc a ; "─"
	call .PlaceChars
	inc a ; "┐"
	ld [hl], a
	pop hl

	; Middle
	ld de, SCREEN_WIDTH
	add hl, de
.row
	push hl
	ld a, "│"
	ld [hli], a
	ld a, " "
	call .PlaceChars
	ld [hl], "│"
	pop hl

	ld de, SCREEN_WIDTH
	add hl, de
	dec b
	jr nz, .row

	; Bottom
	ld a, "└"
	ld [hli], a
	ld a, "─"
	call .PlaceChars
	ld [hl], "┘"

	ret
; 101e

.PlaceChars: ; 101e
; Place char a c times.
	ld d, c
.loop
	ld [hli], a
	dec d
	jr nz, .loop
	ret
; 1024


TextBoxPalette:: ; 1024
; Fill text box width c height b at hl with pal 7
	ld de, AttrMap - TileMap
	add hl, de
rept 2
	inc b
endr
rept 2
	inc c
endr
	ld a, TEXTBOX_PAL
.col
	push bc
	push hl
.row
	ld [hli], a
	dec c
	jr nz, .row
	pop hl
	ld de, SCREEN_WIDTH
	add hl, de
	pop bc
	dec b
	jr nz, .col
	ret
; 103e


SpeechTextBox:: ; 103e
; Standard textbox.
	hlcoord TEXTBOX_X, TEXTBOX_Y
	ld b, TEXTBOX_INNERH
	ld c, TEXTBOX_INNERW
	jp TextBox
; 1048

TestText:: ; 1048
	text "ゲームフりーク!"
	done
; 1052

RadioTerminator:: ; 1052
	ld hl, .stop
	ret
.stop	db "@"
; 1057


PrintText:: ; 1057
	call SetUpTextBox
Function105a:: ; 105a
	push hl
	hlcoord TEXTBOX_INNERX, TEXTBOX_INNERY
	lb bc, TEXTBOX_INNERH - 1, TEXTBOX_INNERW
	call ClearBox
	pop hl

PrintTextBoxText:: ; 1065
	bccoord TEXTBOX_INNERX, TEXTBOX_INNERY
	call PlaceWholeStringInBoxAtOnce
	ret
; 106c

SetUpTextBox:: ; 106c
	push hl
	call SpeechTextBox
	call UpdateSprites
	call Function321c
	pop hl
	ret
; 1078


PlaceString:: ; 1078
	push hl

PlaceNextChar:: ; 1079
	ld a, [de]
	cp "@"
	jr nz, CheckDict
	ld b, h
	ld c, l
	pop hl
	ret
	pop de

NextChar:: ; 1083
	inc de
	jp PlaceNextChar

CheckDict:: ; 1087
dict: macro
if \1 == 0
	and a
else
	cp \1
endc
	jp z, \2
endm
	dict $15, Char15
	dict $4f, Line
	dict $4e, NextLine
	dict $16, Char16
	dict $00, NullChar
	dict $4c, Function1337
	dict $4b, Char4B
	dict $51, Paragraph
	dict $49, PrintMomsName
	dict $52, PrintPlayerName
	dict $53, PrintRivalName
	dict $35, Char35
	dict $36, Char36
	dict $37, Char37
	dict $38, PrintRedsName
	dict $39, PrintGreensName
	dict $54, Char54
	dict $5b, Char5B
	dict $5e, Char5E
	dict $5c, Char5C
	dict $5d, Char5D
	dict $23, Char23
	dict $22, Char22
	dict $55, ContText
	dict $56, Char56
	dict $57, DoneText
	dict $58, PromptText
	dict $4a, Char4A
	dict $24, Char24
	dict $25, NextChar
	cp $1f
	jr nz, .ok
	ld a, $7f
.ok
	dict $5f, Char5F
	dict $59, Char59
	dict $5a, Char5A
	dict $3f, Char3F
	dict $14, Char14
	cp $e4 ; handakuten
	jr z, .place
	cp $e5 ; dakuten
	jr z, .place

	jr .nope
	ld b, a
	call Diacritic
	jp NextChar
.nope

	cp $60
	jr nc, .place

	cp $40
	jr nc, .handakuten

.dakuten

	cp $20
	jr nc, .daku1
	add $80
	jr .daku2
.daku1
	add $90
.daku2
	ld b, $e5 ; dakuten
	call Diacritic
	jr .place

.handakuten
	cp "ぱ"
	jr nc, .han1
	add "ハ" - "パ"
	jr .han2
.han1
	add "は" - "ぱ"
.han2
	ld b, $e4 ; handakuten
	call Diacritic

.place
	ld [hli], a
	call PrintLetterDelay
	jp NextChar
; 0x117b


Char15:: ; 117b
	ld c, l
	ld b, h
	callba Function17f036
	jp PlaceNextChar
; 1186


print_name: macro
	push de
	ld de, \1
	jp Function126a
endm

PrintMomsName:   print_name MomsName   ; 1186
PrintPlayerName: print_name PlayerName ; 118d
PrintRivalName:  print_name RivalName  ; 1194
PrintRedsName:   print_name RedsName   ; 119b
PrintGreensName: print_name GreensName ; 11a2

Char5D: print_name Char5DText ; 11a9
Char5C: print_name Char5CText ; 11b0
Char5B: print_name Char5BText ; 11b7
Char5E: print_name Char5EText ; 11be
Char54: print_name Char54Text ; 11c5
Char23: print_name Char23Text ; 11cc
Char56: print_name Char56Text ; 11d3
Char4A: print_name Char4AText ; 11da
Char24: print_name Char24Text ; 11e1
Char35: print_name Char35Text ; 11e8
Char36: print_name Char36Text ; 11ef
Char37: print_name Char37Text ; 11f6


Char59:: ; 11fd
	ld a, [hBattleTurn]
	xor 1
	jr Char59_5A

Char5A:: ; 1203
	ld a, [hBattleTurn]

Char59_5A: ; 1205
	push de
	and a
	jr nz, .enemy

	ld de, BattleMonNick
	jr Function126a

.enemy
	ld de, Char5AText ; Enemy
	call PlaceString
	ld h, b
	ld l, c
	ld de, EnemyMonNick
	jr Function126a


Char3F:: ; 121b
	push de

	ld a, [InLinkBattle]
	and a
	jr nz, .linkbattle

	ld a, [TrainerClass]
	cp RIVAL1
	jr z, .rival
	cp RIVAL2
	jr z, .rival

	ld de, OTName
	call PlaceString
	ld h, b
	ld l, c
	ld de, String12a2
	call PlaceString
	push bc
	callab Battle_GetTrainerName
	pop hl
	ld de, StringBuffer1
	jr Function126a

.rival
	ld de, RivalName
	jr Function126a

.linkbattle
	ld de, OTName
	jr Function126a


Char14:: ; 1252
	push de
	ld de, PlayerName
	call PlaceString
	ld h, b
	ld l, c
	ld a, [PlayerGender]
	bit 0, a
	ld de, String12a5
	jr z, Function126a
	ld de, String12a6
	jr Function126a


Function126a:: ; 126a
	call PlaceString
	ld h, b
	ld l, c
	pop de
	jp NextChar
; 0x1273

Char5CText:: db "TM@" ; 1273
Char5DText:: db "TRAINER@" ; 1276
Char5BText:: db "PC@" ; 127e
Char5EText:: db "ROCKET@" ; 1281
Char54Text:: db "POKé@" ; 1288
Char23Text:: db "こうげき@" ; 128d
Char56Text:: db "……@" ; 1292
Char5AText:: db "Enemy @" ; 1295
Char4AText:: db $e1, $e2, "@" ; PK MN ; 129c
Char24Text:: db $70, $71, "@" ; PO KE ; 129f
String12a2:: db " @" ; 12a2
Char35Text::
Char36Text::
Char37Text:: db "@" ; 12a4
String12a5:: db "@" ; 12a5
String12a6:: db "@" ; 12a6
; 12a7

NextLine:: ; 12a7
	pop hl
	ld bc, SCREEN_WIDTH * 2
	add hl, bc
	push hl
	jp NextChar
; 12b0

Char22:: ; 12b0
	pop hl
	ld bc, SCREEN_WIDTH
	add hl, bc
	push hl
	jp NextChar
; 12b9

Char16:: ; 12b9
	pop hl
	push de
	ld bc, -TileMap + $10000
	add hl, bc
	ld de, -SCREEN_WIDTH
	ld c, 1
.asm_12c4
	ld a, h
	and a
	jr nz, .asm_12cd
	ld a, l
	cp SCREEN_WIDTH
	jr c, .asm_12d1

.asm_12cd
	add hl, de
	inc c
	jr .asm_12c4

.asm_12d1
	hlcoord 0, 0
	ld de, SCREEN_WIDTH
	ld a, c
.asm_12d8
	and a
	jr z, .asm_12df
	add hl, de
	dec a
	jr .asm_12d8

.asm_12df
	pop de
	inc de
	ld a, [de]
	ld c, a
	ld b, 0
	add hl, bc
	push hl
	jp NextChar
; 12ea


Line:: ; 12ea
	pop hl
	hlcoord TEXTBOX_INNERX, TEXTBOX_INNERY + 2
	push hl
	jp NextChar
; 0x12f2

Paragraph:: ; 12f2
	push de

	ld a, [InLinkBattle]
	cp $3
	jr z, .asm_1301
	cp $4
	jr z, .asm_1301
	call Function13c7
.asm_1301

	call Function13b6
	call KeepTextOpen
	hlcoord TEXTBOX_INNERX, TEXTBOX_INNERY
	lb bc, TEXTBOX_INNERH - 1, TEXTBOX_INNERW
	call ClearBox
	call Function13cd
	ld c, 20
	call DelayFrames
	hlcoord TEXTBOX_INNERX, TEXTBOX_INNERY
	pop de
	jp NextChar
; 131f


Char4B:: ; 131f
	ld a, [InLinkBattle]
	or a
	jr nz, .asm_1328
	call Function13c7
.asm_1328

	call Function13b6

	push de
	call KeepTextOpen
	pop de

	ld a, [InLinkBattle]
	or a
	call z, Function13cd

Function1337:: ; 1337
	push de
	call Function138c
	call Function138c
	hlcoord TEXTBOX_INNERX, TEXTBOX_INNERY + 2
	pop de
	jp NextChar
; 1345


ContText:: ; 1345
	push de
	ld de, .cont
	ld b, h
	ld c, l
	call PlaceString
	ld h, b
	ld l, c
	pop de
	jp NextChar

.cont	db $4b, "@"
; 1356


Char5F:: ; 1356
; Legacy: ends a Pokédex entry (Red).
; Dex entries are now regular strings.
	ld [hl], "."
	pop hl
	ret
; 135a

PromptText:: ; 135a
	ld a, [InLinkBattle]
	cp $3
	jr z, .ok
	cp $4
	jr z, .ok
	call Function13c7
.ok

	call Function13b6
	call KeepTextOpen
	ld a, [InLinkBattle]
	cp $3
	jr z, DoneText
	cp $4
	jr z, DoneText
	call Function13cd

DoneText:: ; 137c
	pop hl
	ld de, .stop
	dec de
	ret
.stop	db "@"
; 1383

NullChar:: ; 1383
	ld a, "?"
	ld [hli], a
	call PrintLetterDelay
	jp NextChar
; 138c

Function138c:: ; 138c
	hlcoord TEXTBOX_INNERX, TEXTBOX_INNERY
	decoord TEXTBOX_INNERX, TEXTBOX_INNERY - 1
	ld a, TEXTBOX_INNERH - 1
.col
	push af
	ld c, TEXTBOX_INNERW
.row
	ld a, [hli]
	ld [de], a
	inc de
	dec c
	jr nz, .row
rept 2
	inc de
endr
rept 2
	inc hl
endr
	pop af
	dec a
	jr nz, .col
	hlcoord TEXTBOX_INNERX, TEXTBOX_INNERY + 2
	ld a, " "
	ld bc, TEXTBOX_INNERW
	call ByteFill
	ld c, 5
	call DelayFrames
	ret
; 13b6

Function13b6:: ; 13b6
	push bc
	ld a, [hOAMUpdate]
	push af
	ld a, 1
	ld [hOAMUpdate], a
	call WaitBGMap
	pop af
	ld [hOAMUpdate], a
	pop bc
	ret
; 13c6

Diacritic:: ; 13c6
	ret
; 13c7

Function13c7:: ; 13c7
	ld a, "▼"
	ld [TileMap + 18 + 17 * SCREEN_WIDTH], a
	ret
; 13cd

Function13cd:: ; 13cd
	ld a, [TileMap + 17 + 17 * SCREEN_WIDTH]
	ld [TileMap + 18 + 17 * SCREEN_WIDTH], a
	ret
; 13d4

FarString:: ; 13d4
	ld b, a
	ld a, [hROMBank]
	push af

	ld a, b
	rst Bankswitch
	call PlaceString

	pop af
	rst Bankswitch
	ret
; 13e0

Function13e0:: ; 13e0
	ld hl, .stop
	ret

.stop	db "@"
; 13e5


PlaceWholeStringInBoxAtOnce:: ; 13e5
	ld a, [TextBoxFrame + 1]
	push af
	set 1, a
	ld [TextBoxFrame + 1], a

	call Function13f6

	pop af
	ld [TextBoxFrame + 1], a
	ret
; 13f6

Function13f6:: ; 13f6
	ld a, [hli]
	cp "@"
	ret z
	call .TextCommand
	jr Function13f6

.TextCommand:
	push hl
	push bc
	ld c, a
	ld b, 0
	ld hl, TextCommands
rept 2
	add hl, bc
endr
	ld e, [hl]
	inc hl
	ld d, [hl]
	pop bc
	pop hl

	; jp de
	push de
	ret
; 1410

TextCommands:: ; 1410
	dw Text_00
	dw Text_01
	dw Text_02
	dw Text_03
	dw Text_04
	dw Text_05
	dw Text_06
	dw Text_07
	dw Text_08
	dw Text_09
	dw Text_0A
	dw Text_PlaySound ; $0b
	dw Text_0C
	dw Text_0D
	dw Text_PlaySound ; $0e
	dw Text_PlaySound ; $0f
	dw Text_PlaySound ; $10
	dw Text_PlaySound ; $11
	dw Text_PlaySound ; $12
	dw Text_PlaySound ; $13
	dw Text_14
	dw Text_15
	dw Text_16
; 143e

Text_00:: ; 143e
; TX
; write text until "@"
; [$00]["...@"]

	ld d, h
	ld e, l
	ld h, b
	ld l, c
	call PlaceString
	ld h, d
	ld l, e
	inc hl
	ret
; 1449

Text_01:: ; 1449
; text_from_ram
; write text from a ram address
; little endian
; [$01][addr]

	ld a, [hli]
	ld e, a
	ld a, [hli]
	ld d, a
	push hl
	ld h, b
	ld l, c
	call PlaceString
	pop hl
	ret
; 1455

Text_16:: ; 1455
; text_jump
; write text from a different bank
; little endian
; [$16][addr][bank]

	ld a, [hROMBank]
	push af

	ld a, [hli]
	ld e, a
	ld a, [hli]
	ld d, a
	ld a, [hli]

	ld [hROMBank], a
	ld [MBC3RomBank], a

	push hl
	ld h, d
	ld l, e
	call Function13f6
	pop hl

	pop af
	ld [hROMBank], a
	ld [MBC3RomBank], a
	ret
; 1470

Text_02:: ; 1470
; TX_BCD
; write bcd from address, typically ram
; [$02][addr][flags]
; flags: see PrintBCDNumber

	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
	ret
; 1480

Text_03:: ; 1480
; TX_MOVE
; move to a new tile
; [$03][addr]

	ld a, [hli]
	ld [wd0e4 + 2], a
	ld c, a
	ld a, [hli]
	ld [wd0e4 + 2 + 1], a
	ld b, a
	ret
; 148b

Text_04:: ; 148b
; TX_BOX
; draw a box
; little endian
; [$04][addr][height][width]

	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 TextBox
	pop hl
	ret
; 149b

Text_05:: ; 149b
; TX_LOW
; write text at (1,16)
; [$05]

	bccoord TEXTBOX_INNERX, TEXTBOX_INNERY + 2
	ret
; 149f

Text_06:: ; 149f
; TX_WAITBUTTON
; wait for button press
; show arrow
; [06]

	ld a, [InLinkBattle]
	cp $3
	jp z, Text_0D
	cp $4
	jp z, Text_0D

	push hl
	call Function13c7
	push bc
	call KeepTextOpen
	pop bc
	call Function13cd
	pop hl
	ret
; 14ba

Text_07:: ; 14ba
	push hl
	call Function13cd
	call Function138c
	call Function138c
	pop hl
	bccoord TEXTBOX_INNERX, TEXTBOX_INNERY + 2
	ret
; 14c9

Text_08:: ; 14c9
; TX_ASM

	bit 7, h
	jr nz, .not_rom
	jp [hl]

.not_rom
	ld a, "@"
	ld [hl], a
	ret
; 14d2

Text_09:: ; 14d2
; TX_NUM
; [$09][addr][hi:bytes lo:digits]
	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 $f
	ld c, a
	ld a, b
	and $f0
	swap a
	set 6, a
	ld b, a
	call PrintNum
	ld b, h
	ld c, l
	pop hl
	ret
; 14ed

Text_0A:: ; 14ed
	push hl
	push bc
	call GetJoypad
	ld a, [hJoyDown]
	and A_BUTTON | B_BUTTON
	jr nz, .done
	ld c, 30
	call DelayFrames
.done
	pop bc
	pop hl
	ret
; 1500

Text_PlaySound:: ; 1500
; chars:
;   $0b, $0e, $0f, $10, $11, $12, $13
; see TextSFX

	push bc
	dec hl
	ld a, [hli]
	ld b, a
	push hl
	ld hl, TextSFX
.loop
	ld a, [hli]
	cp -1
	jr z, .done
	cp b
	jr z, .play
rept 2
	inc hl
endr
	jr .loop

.play
	push de
	ld e, [hl]
	inc hl
	ld d, [hl]
	call PlaySFX
	call WaitSFX
	pop de

.done
	pop hl
	pop bc
	ret
; 1522

Function1522:: ; 1522
	push de
	ld e, [hl]
	inc hl
	ld d, [hl]
	call PlayCry
	pop de
	pop hl
	pop bc
	ret
; 152d

TextSFX:: ; 152d
	dbw $0b, SFX_DEX_FANFARE_50_79
	dbw $12, SFX_FANFARE
	dbw $0e, SFX_DEX_FANFARE_20_49
	dbw $0f, SFX_ITEM
	dbw $10, SFX_CAUGHT_MON
	dbw $11, SFX_DEX_FANFARE_80_109
	dbw $13, SFX_SLOT_MACHINE_START
	db -1
; 1543

Text_0C:: ; 1543
; [$0C][num]
	ld a, [hli]
	ld d, a
	push hl
	ld h, b
	ld l, c
.loop
	push de
	ld a, "…"
	ld [hli], a
	call GetJoypad
	ld a, [hJoyDown]
	and A_BUTTON | B_BUTTON
	jr nz, .next
	ld c, 10
	call DelayFrames
.next
	pop de
	dec d
	jr nz, .loop
	ld b, h
	ld c, l
	pop hl
	ret
; 1562

Text_0D:: ; 1562
; wait for key down
; display arrow
	push hl
	push bc
	call KeepTextOpen
	pop bc
	pop hl
	ret
; 156a

Text_14:: ; 156a
; Print a string from one of the following:
; 0: StringBuffer3
; 1: StringBuffer4
; 2: StringBuffer5
; 3: StringBuffer2
; 4: StringBuffer1
; 5: EnemyMonNick
; 6: BattleMonNick
; [$14][id]

	ld a, [hli]
	push hl
	ld e, a
	ld d, 0
	ld hl, Unknown_24000
rept 2
	add hl, de
endr
	ld a, BANK(Unknown_24000)
	call GetFarHalfword
	ld d, h
	ld e, l
	ld h, b
	ld l, c
	call PlaceString
	pop hl
	ret
; 1582

Text_15:: ; 1582
; TX_DAY

	call GetWeekday
	push hl
	push bc
	ld c, a
	ld b, 0
	ld hl, .Days
rept 2
	add hl, bc
endr
	ld a, [hli]
	ld h, [hl]
	ld l, a
	ld d, h
	ld e, l
	pop hl
	call PlaceString
	ld h, b
	ld l, c
	ld de, .Day
	call PlaceString
	pop hl
	ret

.Days ; 15a2
	dw .Sun
	dw .Mon
	dw .Tues
	dw .Wednes
	dw .Thurs
	dw .Fri
	dw .Satur

.Sun    db "SUN@"
.Mon    db "MON@"
.Tues   db "TUES@"
.Wednes db "WEDNES@"
.Thurs  db "THURS@"
.Fri    db "FRI@"
.Satur  db "SATUR@"
.Day    db "DAY@"
; 15d8