missable_objects.asm 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. MarkTownVisitedAndLoadMissableObjects:
  2. ld a, [wCurMap]
  3. cp ROUTE_1
  4. jr nc, .notInTown
  5. ld c, a
  6. ld b, FLAG_SET
  7. ld hl, wTownVisitedFlag ; mark town as visited (for flying)
  8. predef FlagActionPredef
  9. .notInTown
  10. ld hl, MapHSPointers
  11. ld a, [wCurMap]
  12. ld b, $0
  13. ld c, a
  14. add hl, bc
  15. add hl, bc
  16. ld a, [hli] ; load missable objects pointer in hl
  17. ld h, [hl]
  18. ; fall through
  19. LoadMissableObjects:
  20. ld l, a
  21. push hl
  22. ld de, MapHS00 ; calculate difference between out pointer and the base pointer
  23. ld a, l
  24. sub e
  25. jr nc, .asm_f13c
  26. dec h
  27. .asm_f13c
  28. ld l, a
  29. ld a, h
  30. sub d
  31. ld h, a
  32. ld a, h
  33. ld [H_DIVIDEND], a
  34. ld a, l
  35. ld [H_DIVIDEND+1], a
  36. xor a
  37. ld [H_DIVIDEND+2], a
  38. ld [H_DIVIDEND+3], a
  39. ld a, $3
  40. ld [H_DIVISOR], a
  41. ld b, $2
  42. call Divide ; divide difference by 3, resulting in the global offset (number of missable items before ours)
  43. ld a, [wCurMap]
  44. ld b, a
  45. ld a, [H_DIVIDEND+3]
  46. ld c, a ; store global offset in c
  47. ld de, wMissableObjectList
  48. pop hl
  49. .writeMissableObjectsListLoop
  50. ld a, [hli]
  51. cp $ff
  52. jr z, .done ; end of list
  53. cp b
  54. jr nz, .done ; not for current map anymore
  55. ld a, [hli]
  56. inc hl
  57. ld [de], a ; write (map-local) sprite ID
  58. inc de
  59. ld a, c
  60. inc c
  61. ld [de], a ; write (global) missable object index
  62. inc de
  63. jr .writeMissableObjectsListLoop
  64. .done
  65. ld a, $ff
  66. ld [de], a ; write sentinel
  67. ret
  68. InitializeMissableObjectsFlags:
  69. ld hl, wMissableObjectFlags
  70. ld bc, wMissableObjectFlagsEnd - wMissableObjectFlags
  71. xor a
  72. call FillMemory ; clear missable objects flags
  73. ld hl, MapHS00
  74. xor a
  75. ld [wMissableObjectCounter], a
  76. .missableObjectsLoop
  77. ld a, [hli]
  78. cp $ff ; end of list
  79. ret z
  80. push hl
  81. inc hl
  82. ld a, [hl]
  83. cp Hide
  84. jr nz, .skip
  85. ld hl, wMissableObjectFlags
  86. ld a, [wMissableObjectCounter]
  87. ld c, a
  88. ld b, FLAG_SET
  89. call MissableObjectFlagAction ; set flag if Item is hidden
  90. .skip
  91. ld hl, wMissableObjectCounter
  92. inc [hl]
  93. pop hl
  94. inc hl
  95. inc hl
  96. jr .missableObjectsLoop
  97. ; tests if current sprite is a missable object that is hidden/has been removed
  98. IsObjectHidden:
  99. ld a, [H_CURRENTSPRITEOFFSET]
  100. swap a
  101. ld b, a
  102. ld hl, wMissableObjectList
  103. .loop
  104. ld a, [hli]
  105. cp $ff
  106. jr z, .notHidden ; not missable -> not hidden
  107. cp b
  108. ld a, [hli]
  109. jr nz, .loop
  110. ld c, a
  111. ld b, FLAG_TEST
  112. ld hl, wMissableObjectFlags
  113. call MissableObjectFlagAction
  114. ld a, c
  115. and a
  116. jr nz, .hidden
  117. .notHidden
  118. xor a
  119. .hidden
  120. ld [$ffe5], a
  121. ret
  122. ; adds missable object (items, leg. pokemon, etc.) to the map
  123. ; [wMissableObjectIndex]: index of the missable object to be added (global index)
  124. ShowObject:
  125. ShowObject2:
  126. ld hl, wMissableObjectFlags
  127. ld a, [wMissableObjectIndex]
  128. ld c, a
  129. ld b, FLAG_RESET
  130. call MissableObjectFlagAction ; reset "removed" flag
  131. jp UpdateSprites
  132. ; removes missable object (items, leg. pokemon, etc.) from the map
  133. ; [wMissableObjectIndex]: index of the missable object to be removed (global index)
  134. HideObject:
  135. ld hl, wMissableObjectFlags
  136. ld a, [wMissableObjectIndex]
  137. ld c, a
  138. ld b, FLAG_SET
  139. call MissableObjectFlagAction ; set "removed" flag
  140. jp UpdateSprites
  141. MissableObjectFlagAction:
  142. ; identical to FlagAction
  143. push hl
  144. push de
  145. push bc
  146. ; bit
  147. ld a, c
  148. ld d, a
  149. and 7
  150. ld e, a
  151. ; byte
  152. ld a, d
  153. srl a
  154. srl a
  155. srl a
  156. add l
  157. ld l, a
  158. jr nc, .ok
  159. inc h
  160. .ok
  161. ; d = 1 << e (bitmask)
  162. inc e
  163. ld d, 1
  164. .shift
  165. dec e
  166. jr z, .shifted
  167. sla d
  168. jr .shift
  169. .shifted
  170. ld a, b
  171. and a
  172. jr z, .reset
  173. cp 2
  174. jr z, .read
  175. .set
  176. ld a, [hl]
  177. ld b, a
  178. ld a, d
  179. or b
  180. ld [hl], a
  181. jr .done
  182. .reset
  183. ld a, [hl]
  184. ld b, a
  185. ld a, d
  186. xor $ff
  187. and b
  188. ld [hl], a
  189. jr .done
  190. .read
  191. ld a, [hl]
  192. ld b, a
  193. ld a, d
  194. and b
  195. .done
  196. pop bc
  197. pop de
  198. pop hl
  199. ld c, a
  200. ret