summaryrefslogtreecommitdiff
path: root/source/bank_02.asm
blob: a98d5dc58ebc296bd8137ce56eda467dc9dd93bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
INCLUDE "charmap.inc"
INCLUDE "code_macros.inc"

SECTION "text_char", ROMX[$4bf7], BANK[$02]
far_textbox_print_char::
    farcall textbox_print_char
    jp farcall_ret

; Returns:
; flags - z if reached end of string
textbox_print_char::
    ld a, [w_c342]
    bit 0, a
    jp nz, farcall_ret

    ld a, [w_textbox_cur_string + 0]
    ld l, a
    ld a, [w_textbox_cur_string + 1]
    ld h, a
    ld a, [w_textbox_cur_x]
    ld b, a
    ld a, [w_textbox_cur_y]
    ld c, a
    ld a, [hl+]
    ld e, a
    ld a, [hl+]

    ; Check if we've reached the end of the string
    ld d, a
    and e
    cp TX_END
    jp z, farcall_ret
    push hl

    ; Check for line feed
    ld a, e
    cp LOW(TX_LF)
    jr nz, .not_line_feed
    ld a, d
    cp HIGH(TX_LF)
    jr z, .line_feed
.not_line_feed

    ; Draw ピ one pixel higher
    ld a, e
    cp "ピ"
    jr nz, .not_pi
    ld a, d
    and a
    jr nz, .not_pi
    dec c
.not_pi

    ; Draw character
    farcall textbox_draw_char

    ; Leave two pixels space between each character
    ld hl, w_textbox_cur_x
    add 2
    add [hl]
    ld [hl], a
    jr .done

.line_feed
    ; Advance to the next line
    ld a, [w_textbox_x]
    ld [w_textbox_cur_x], a
    ld a, [w_textbox_cur_y]
    add 11
    ld [w_textbox_cur_y], a

.done
    ; Back up string pointer
    pop hl
    ld16 w_textbox_cur_string, hl

    ; Check if the next character is a terminator
    ld a, [hl+]
    and [hl]
    cp TX_END
    jp farcall_ret

; Returns:
; a - character width
; Parameters:
; de - character to print
; b - x position
; c - y position
textbox_draw_char::
    push de

    ; Get char address
    sla e
    rl d
    ld hl, text_chars_offsets
    add hl, de
    ld e, [hl]
    inc hl
    ld d, [hl]
    ld hl, gfx_text_chars_dark
    add hl, de
    ld16 w_vwf_char_addr, hl
    ld a, BANK(gfx_text_chars_dark)
    ld [w_vwf_char_bank], a

    ld a, b
    ld [w_vwf_char_start_x], a

    ; Get character width
    pop de
    ld hl, text_chars_widths
    add hl, de
    ld a, [hl]
    and a
    jp z, farcall_ret

    ; Check we aren't drawing outside the textbox
    push af
    add b
    ld hl, w_textbox_width
    cp [hl]
    jr c, .inside_width
    pop af
    jp farcall_ret
.inside_width
    ld [w_vwf_char_end_x], a

    ld a, c
    ld [w_vwf_char_start_y], a
    add 9
    ld hl, w_textbox_height
    cp [hl]
    jr c, .inside_height
    pop af
    jp farcall_ret
.inside_height
    ld [w_vwf_char_end_y], a

    call vwf_char_draw
    pop af
    jp farcall_ret

SECTION "textbox_delay", ROMX[$5b7a], BANK[$02]
textbox_delay::
    ld a, [w_c343]
    bit 4, a
    jr nz, .no_blink
    ld a, [w_textbox_cur_x]
    sub 3
    ld b, a
    ld a, [w_textbox_cur_y]
    inc a
    ld c, a
    ld a, $e9
    call function_00_208c
.no_blink
    ld hl, w_textbox_delay_timer
    dec [hl]
    jp farcall_ret