Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pret
GitHub Repository: pret/pokered
Path: blob/master/engine/gfx/hp_bar.asm
1271 views
1
HPBarLength:
2
call GetPredefRegisters
3
4
; calculates bc * 48 / de, the number of pixels the HP bar has
5
; the result is always at least 1
6
GetHPBarLength:
7
push hl
8
xor a
9
ld hl, hMultiplicand
10
ld [hli], a
11
ld a, b
12
ld [hli], a
13
ld a, c
14
ld [hli], a
15
ld [hl], $30
16
call Multiply ; 48 * bc (hp bar is 48 pixels long)
17
ld a, d
18
and a
19
jr z, .maxHPSmaller256
20
srl d ; make HP in de fit into 1 byte by dividing by 4
21
rr e
22
srl d
23
rr e
24
ldh a, [hMultiplicand+1]
25
ld b, a
26
ldh a, [hMultiplicand+2]
27
srl b ; divide multiplication result as well
28
rr a
29
srl b
30
rr a
31
ldh [hMultiplicand+2], a
32
ld a, b
33
ldh [hMultiplicand+1], a
34
.maxHPSmaller256
35
ld a, e
36
ldh [hDivisor], a
37
ld b, $4
38
call Divide
39
ldh a, [hMultiplicand+2]
40
ld e, a ; e = bc * 48 / de (num of pixels of HP bar)
41
pop hl
42
and a
43
ret nz
44
ld e, $1 ; make result at least 1
45
ret
46
47
; predef $48
48
UpdateHPBar:
49
UpdateHPBar2:
50
push hl
51
ld hl, wHPBarOldHP
52
ld a, [hli]
53
ld c, a ; old HP into bc
54
ld a, [hli]
55
ld b, a
56
ld a, [hli]
57
ld e, a ; new HP into de
58
ld d, [hl]
59
pop hl
60
push de
61
push bc
62
call UpdateHPBar_CalcHPDifference
63
ld a, e
64
ld [wHPBarHPDifference+1], a
65
ld a, d
66
ld [wHPBarHPDifference], a
67
pop bc
68
pop de
69
call UpdateHPBar_CompareNewHPToOldHP
70
ret z
71
ld a, $ff
72
jr c, .HPdecrease
73
ld a, $1
74
.HPdecrease
75
ld [wHPBarDelta], a
76
call GetPredefRegisters
77
ld a, [wHPBarNewHP]
78
ld e, a
79
ld a, [wHPBarNewHP+1]
80
ld d, a
81
.animateHPBarLoop
82
push de
83
ld a, [wHPBarOldHP]
84
ld c, a
85
ld a, [wHPBarOldHP+1]
86
ld b, a
87
call UpdateHPBar_CompareNewHPToOldHP
88
jr z, .animateHPBarDone
89
jr nc, .HPIncrease
90
; HP decrease
91
dec bc ; subtract 1 HP
92
ld a, c
93
ld [wHPBarNewHP], a
94
ld a, b
95
ld [wHPBarNewHP+1], a
96
call UpdateHPBar_CalcOldNewHPBarPixels
97
ld a, e
98
sub d ; calc pixel difference
99
jr .ok
100
.HPIncrease
101
inc bc ; add 1 HP
102
ld a, c
103
ld [wHPBarNewHP], a
104
ld a, b
105
ld [wHPBarNewHP+1], a
106
call UpdateHPBar_CalcOldNewHPBarPixels
107
ld a, d
108
sub e ; calc pixel difference
109
.ok
110
call UpdateHPBar_PrintHPNumber
111
and a
112
jr z, .noPixelDifference
113
call UpdateHPBar_AnimateHPBar
114
.noPixelDifference
115
ld a, [wHPBarNewHP]
116
ld [wHPBarOldHP], a
117
ld a, [wHPBarNewHP+1]
118
ld [wHPBarOldHP+1], a
119
pop de
120
jr .animateHPBarLoop
121
.animateHPBarDone
122
pop de
123
ld a, e
124
ld [wHPBarOldHP], a
125
ld a, d
126
ld [wHPBarOldHP+1], a
127
or e
128
jr z, .monFainted
129
call UpdateHPBar_CalcOldNewHPBarPixels
130
ld d, e
131
.monFainted
132
call UpdateHPBar_PrintHPNumber
133
ld a, $1
134
call UpdateHPBar_AnimateHPBar
135
jp Delay3
136
137
; animates the HP bar going up or down for (a) ticks (two waiting frames each)
138
; stops prematurely if bar is filled up
139
; e: current health (in pixels) to start with
140
UpdateHPBar_AnimateHPBar:
141
push hl
142
.barAnimationLoop
143
push af
144
push de
145
ld d, $6
146
call DrawHPBar
147
ld c, 2
148
call DelayFrames
149
pop de
150
ld a, [wHPBarDelta] ; +1 or -1
151
add e
152
cp $31
153
jr nc, .barFilledUp
154
ld e, a
155
pop af
156
dec a
157
jr nz, .barAnimationLoop
158
pop hl
159
ret
160
.barFilledUp
161
pop af
162
pop hl
163
ret
164
165
; compares old HP and new HP and sets c and z flags accordingly
166
UpdateHPBar_CompareNewHPToOldHP:
167
ld a, d
168
sub b
169
ret nz
170
ld a, e
171
sub c
172
ret
173
174
; calcs HP difference between bc and de (into de)
175
UpdateHPBar_CalcHPDifference:
176
ld a, d
177
sub b
178
jr c, .oldHPGreater
179
jr z, .testLowerByte
180
.newHPGreater
181
ld a, e
182
sub c
183
ld e, a
184
ld a, d
185
sbc b
186
ld d, a
187
ret
188
.oldHPGreater
189
ld a, c
190
sub e
191
ld e, a
192
ld a, b
193
sbc d
194
ld d, a
195
ret
196
.testLowerByte
197
ld a, e
198
sub c
199
jr c, .oldHPGreater
200
jr nz, .newHPGreater
201
ld de, $0
202
ret
203
204
UpdateHPBar_PrintHPNumber:
205
push af
206
push de
207
ld a, [wHPBarType]
208
and a
209
jr z, .done ; don't print number in enemy HUD
210
; convert from little-endian to big-endian for PrintNumber
211
ld a, [wHPBarOldHP]
212
ld [wHPBarTempHP + 1], a
213
ld a, [wHPBarOldHP + 1]
214
ld [wHPBarTempHP], a
215
push hl
216
ldh a, [hUILayoutFlags]
217
bit BIT_PARTY_MENU_HP_BAR, a
218
jr z, .hpBelowBar
219
ld de, $9
220
jr .next
221
.hpBelowBar
222
ld de, $15
223
.next
224
add hl, de
225
push hl
226
ld a, " "
227
ld [hli], a
228
ld [hli], a
229
ld [hli], a
230
pop hl
231
ld de, wHPBarTempHP
232
lb bc, 2, 3
233
call PrintNumber
234
call DelayFrame
235
pop hl
236
.done
237
pop de
238
pop af
239
ret
240
241
; calcs number of HP bar pixels for old and new HP value
242
; d: new pixels
243
; e: old pixels
244
UpdateHPBar_CalcOldNewHPBarPixels:
245
push hl
246
ld hl, wHPBarMaxHP
247
ld a, [hli] ; max HP into de
248
ld e, a
249
ld a, [hli]
250
ld d, a
251
ld a, [hli] ; old HP into bc
252
ld c, a
253
ld a, [hli]
254
ld b, a
255
ld a, [hli] ; new HP into hl
256
ld h, [hl]
257
ld l, a
258
push hl
259
push de
260
call GetHPBarLength ; calc num pixels for old HP
261
ld a, e
262
pop de
263
pop bc
264
push af
265
call GetHPBarLength ; calc num pixels for new HP
266
pop af
267
ld d, e
268
ld e, a
269
pop hl
270
ret
271
272