You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

323 lines
4.8 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. INCLUDE "hardware.inc"
  2. INCLUDE "input.inc"
  3. INCLUDE "oam.inc"
  4. INCLUDE "util.inc"
  5. Section "Player Data", WRAM0
  6. playerWorldX: dw
  7. playerWorldY: dw
  8. ; player data
  9. PLAYER_X:: db
  10. PLAYER_Y:: dw
  11. PLAYER_DIR:: db
  12. PLAYER_JUMPING:: db
  13. PLAYER_VY:: dw
  14. Section "Player Code", ROM0
  15. spriteData:
  16. INCBIN "png/sprite/player.2bpp"
  17. DEF SPRITE_OAM_IDX EQU 0
  18. DEF SPRITE_IDX EQU 32 ; tile index, rename later
  19. DEF SPRITE_WIDTH EQU 2
  20. DEF SPRITE_HEIGHT EQU 2
  21. DEF PLAYER_SPEED EQU 2
  22. DEF GRAVITY EQU (0 << 8) | $2e ; 0.18
  23. DEF INIT_VY EQU (3 << 8) | $99 ; 3.60
  24. DEF INIT_FALL_VY EQU ($ff << 8) | $1a ; a.b
  25. Player_Init::
  26. ; Clear player data
  27. ld hl, PLAYER_X
  28. ld [hl], 0
  29. inc hl
  30. ld [hl], 144-32
  31. inc hl
  32. ld [hl], 0
  33. inc hl
  34. ld [hl], 0
  35. inc hl
  36. ld [hl], 0
  37. inc hl
  38. ld [hl], 0
  39. inc hl
  40. ld [hl], 0
  41. ; Copy sprite to VRAM
  42. ld bc, _VRAM8000 + SPRITE_IDX * 16
  43. ld hl, spriteData
  44. ld d, 16 * (SPRITE_WIDTH * SPRITE_HEIGHT)
  45. call memcpy
  46. ; Initialize OAM entries with player state
  47. call update_oam
  48. ret
  49. Player_Update::
  50. ld hl, keys
  51. ld b, [hl]
  52. ; check for jump
  53. ld a, b
  54. and BTN_UP
  55. jr z, .jump_update_check
  56. ; initialize jump state if not already jumping
  57. ld hl, PLAYER_JUMPING
  58. ld a, [hl]
  59. or a
  60. jr nz, .jump_update
  61. ld [hl], 1
  62. ld hl, PLAYER_VY
  63. STORE16 INIT_VY
  64. ; todo: deduplicate
  65. .jump_update_check:
  66. ld hl, PLAYER_JUMPING
  67. ld a, [hl]
  68. or a
  69. jr z, .right
  70. .jump_update:
  71. ; load y velocity into bc
  72. ld hl, PLAYER_VY
  73. ld b, [hl]
  74. inc hl
  75. ld c, [hl]
  76. ; adjust velocity by gravity
  77. ld a, c
  78. sub LOW(GRAVITY)
  79. ld c, a
  80. ld a, b
  81. sbc HIGH(GRAVITY)
  82. ld b, a
  83. ld hl, PLAYER_VY
  84. STORE16 bc
  85. ; y -= floor(vy)
  86. ld hl, PLAYER_Y + 1
  87. ld a, [hl]
  88. sub c
  89. ld [hl-], a
  90. ld a, [hl]
  91. sbc b
  92. ld [hl], a
  93. ; roll back jump if there was a collision
  94. call player_bg_collides
  95. jr z, .jump_update_oam
  96. .jump_rollback:
  97. ld hl, PLAYER_VY
  98. bit 7, [hl]
  99. ld hl, PLAYER_Y
  100. jr z, .jump_rollback_down
  101. dec [hl]
  102. jr .jump_rollback_check
  103. .jump_rollback_down:
  104. inc [hl]
  105. .jump_rollback_check:
  106. call player_bg_collides
  107. jr nz, .jump_rollback
  108. ; set PLAYER_JUMPING = 0 if VY < 0 (fell into ground)
  109. ld hl, PLAYER_VY
  110. bit 7, [hl]
  111. ; either way, set VY = 0
  112. ld [hl], 0
  113. ld hl, PLAYER_VY + 1
  114. ld [hl], 0
  115. jr z, .jump_update_oam
  116. ld hl, PLAYER_JUMPING
  117. ld [hl], 0
  118. .jump_update_oam:
  119. call update_oam
  120. ; check for move right
  121. .right:
  122. ld hl, keys
  123. ld a, [hl]
  124. and BTN_RIGHT
  125. jr z, .left
  126. ; check for right boundary
  127. ld hl, PLAYER_X
  128. ld a, [hl]
  129. add 16
  130. cp SCRN_X
  131. jr nc, .left
  132. inc [hl]
  133. inc [hl]
  134. call player_bg_collides
  135. jr nz, .right_rollback
  136. ld hl, PLAYER_DIR
  137. ld [hl], 0
  138. call update_oam
  139. ret
  140. .right_rollback:
  141. ld hl, PLAYER_X
  142. dec [hl]
  143. dec [hl]
  144. ret
  145. .left:
  146. ; check for left button
  147. ld hl, keys
  148. ld a, [hl]
  149. and BTN_LEFT
  150. jr z, .fall
  151. ; check for left boundary
  152. ld hl, PLAYER_X
  153. ld a, [hl]
  154. or a
  155. jr z, .fall
  156. sub PLAYER_SPEED
  157. ld [hl], a
  158. call player_bg_collides
  159. jr nz, .left_rollback
  160. ld hl, PLAYER_DIR
  161. ld [hl], $ff
  162. call update_oam
  163. jr .fall
  164. .left_rollback:
  165. ld hl, PLAYER_X
  166. inc [hl]
  167. inc [hl]
  168. .fall:
  169. call player_in_air
  170. ret nz
  171. ; only set jump state if not already jumping
  172. ld hl, PLAYER_JUMPING
  173. ld a, [hl]
  174. or a
  175. ret nz
  176. ld [hl], 1
  177. ld hl, PLAYER_VY
  178. STORE16 INIT_FALL_VY
  179. ret
  180. ; Update player metasprite with positional data
  181. update_oam:
  182. ld hl, PLAYER_DIR
  183. ld a, [hl-] ; dir (0 = right , $ff = left)
  184. and OAMF_XFLIP
  185. ld c, a
  186. dec hl ; skip fractional part
  187. ld a, [hl-] ; y
  188. add 16
  189. ld d, a
  190. ld a, [hl] ; x
  191. add 8
  192. ld b, a
  193. ld a, d
  194. ld_OAM_y hl, SPRITE_OAM_IDX
  195. ; top left sprite
  196. ld [hli], a
  197. ld [hl], b
  198. inc hl
  199. ld [hl], SPRITE_IDX
  200. inc hl
  201. ld [hl], c
  202. inc hl
  203. ; top right
  204. ld d, a
  205. ld a, b
  206. add 8
  207. ld b, a
  208. ld a, d
  209. ld [hli], a
  210. ld [hl], b
  211. inc hl
  212. ld [hl], SPRITE_IDX + 1
  213. inc hl
  214. ld [hl], c
  215. inc hl
  216. ; bottom left
  217. add 8
  218. ld d, a
  219. ld a, b
  220. sub 8
  221. ld b, a
  222. ld a, d
  223. ld [hli], a
  224. ld [hl], b
  225. inc hl
  226. ld [hl], SPRITE_IDX + 2
  227. inc hl
  228. ld [hl], c
  229. inc hl
  230. ; bottom right
  231. ld d, a
  232. ld a, b
  233. add 8
  234. ld b, a
  235. ld a, d
  236. ld [hli], a
  237. ld [hl], b
  238. inc hl
  239. ld [hl], SPRITE_IDX + 3
  240. inc hl
  241. ld [hl], c
  242. ; flip tile indices if necessary
  243. ld a, c
  244. or c
  245. jr z, .done
  246. ld_OAM_tile hl, SPRITE_OAM_IDX
  247. ld [hl], SPRITE_IDX + 1
  248. ld_OAM_tile hl, SPRITE_OAM_IDX + 1
  249. ld [hl], SPRITE_IDX
  250. ld_OAM_tile hl, SPRITE_OAM_IDX + 2
  251. ld [hl], SPRITE_IDX + 3
  252. ld_OAM_tile hl, SPRITE_OAM_IDX + 3
  253. ld [hl], SPRITE_IDX + 2
  254. .done:
  255. ret