hp_bar.asm 4.4 KB

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