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.

316 lines
4.9 KiB

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