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.

212 lines
3.2 KiB

3 years ago
3 years ago
  1. INCLUDE "hardware.inc"
  2. INCLUDE "input.inc"
  3. INCLUDE "oam.inc"
  4. Section "Player Data", WRAM0
  5. playerWorldX: dw
  6. playerWorldY: dw
  7. ; player data
  8. PLAYER_X:: db
  9. PLAYER_Y:: db
  10. PLAYER_DIR:: db
  11. Section "Player Code", ROM0
  12. spriteData:
  13. INCBIN "png/sprite/player.2bpp"
  14. DEF SPRITE_OAM_IDX EQU 0
  15. DEF SPRITE_IDX EQU 32 ; tile index, rename later
  16. DEF SPRITE_WIDTH EQU 2
  17. DEF SPRITE_HEIGHT EQU 2
  18. Player_Init::
  19. ; clear player data
  20. ld hl, PLAYER_X
  21. ld [hl], 0
  22. inc hl
  23. ld [hl], 144-32
  24. inc hl
  25. ld [hl], 0
  26. ld a, 8
  27. ld hl, _OAM + 1
  28. ld [hl], a
  29. ld bc, _VRAM8000 + SPRITE_IDX * 16
  30. ld hl, spriteData
  31. ld d, 16 * (SPRITE_WIDTH * SPRITE_HEIGHT)
  32. call memcpy
  33. OAM_set SPRITE_OAM_IDX + 0, 8, 144-8-8, SPRITE_IDX, 0
  34. OAM_set SPRITE_OAM_IDX + 1, 16, 144-8-8, SPRITE_IDX + 1, 0
  35. OAM_set SPRITE_OAM_IDX + 2, 8, 144-8, SPRITE_IDX + 2, 0
  36. OAM_set SPRITE_OAM_IDX + 3, 16, 144-8, SPRITE_IDX + 3, 0
  37. ld bc, _OAMRAM
  38. ld hl, _OAM
  39. ld d, 4 * (SPRITE_WIDTH * SPRITE_HEIGHT)
  40. call memcpy
  41. ret
  42. Player_Update::
  43. ; Only update every 2 frames
  44. ; ld hl, frame
  45. ; ld a, [hl]
  46. ; and %1
  47. ; cp %1
  48. ; ret nz
  49. ld hl, keys
  50. ld b, [hl]
  51. ; check for move right
  52. ld a, b
  53. and BTN_RIGHT
  54. jr z, .left
  55. ; check for right boundary
  56. ld hl, PLAYER_X
  57. ld a, [hl]
  58. add 16
  59. cp SCRN_X
  60. jr nc, .left
  61. inc [hl]
  62. call player_bg_collides
  63. jr z, .right_rollback
  64. ld hl, PLAYER_DIR
  65. ld [hl], 0
  66. call update_oam
  67. ret
  68. .right_rollback:
  69. ld hl, PLAYER_X
  70. dec [hl]
  71. ret
  72. .left:
  73. ; check for left button
  74. ld a, b
  75. and BTN_LEFT
  76. ret z
  77. ; check for left boundary
  78. ld hl, PLAYER_X
  79. ld a, [hl]
  80. or a
  81. ret z
  82. dec [hl]
  83. call player_bg_collides
  84. jr z, .left_rollback
  85. ld hl, PLAYER_DIR
  86. ld [hl], $ff
  87. call update_oam
  88. ret
  89. .left_rollback:
  90. ld hl, PLAYER_X
  91. dec [hl]
  92. ret
  93. ; Update player metasprite with positional data
  94. update_oam:
  95. ld hl, PLAYER_DIR
  96. ld a, [hl-] ; dir (0 = right , $ff = left)
  97. and OAMF_XFLIP
  98. ld c, a
  99. ld a, [hl-] ; y
  100. add 16
  101. ld d, a
  102. ld a, [hl] ; x
  103. add 8
  104. ld b, a
  105. ld a, d
  106. ld_OAM_y hl, SPRITE_OAM_IDX
  107. ; top left sprite
  108. ld [hli], a
  109. ld [hl], b
  110. inc hl
  111. ld [hl], SPRITE_IDX
  112. inc hl
  113. ld [hl], c
  114. inc hl
  115. ; top right
  116. ld d, a
  117. ld a, b
  118. add 8
  119. ld b, a
  120. ld a, d
  121. ld [hli], a
  122. ld [hl], b
  123. inc hl
  124. ld [hl], SPRITE_IDX + 1
  125. inc hl
  126. ld [hl], c
  127. inc hl
  128. ; bottom left
  129. add 8
  130. ld d, a
  131. ld a, b
  132. sub 8
  133. ld b, a
  134. ld a, d
  135. ld [hli], a
  136. ld [hl], b
  137. inc hl
  138. ld [hl], SPRITE_IDX + 2
  139. inc hl
  140. ld [hl], c
  141. inc hl
  142. ; bottom right
  143. ld d, a
  144. ld a, b
  145. add 8
  146. ld b, a
  147. ld a, d
  148. ld [hli], a
  149. ld [hl], b
  150. inc hl
  151. ld [hl], SPRITE_IDX + 3
  152. inc hl
  153. ld [hl], c
  154. ; flip tile indices if necessary
  155. ld a, c
  156. or c
  157. jr z, .done
  158. ld_OAM_tile hl, SPRITE_OAM_IDX
  159. ld [hl], SPRITE_IDX + 1
  160. ld_OAM_tile hl, SPRITE_OAM_IDX + 1
  161. ld [hl], SPRITE_IDX
  162. ld_OAM_tile hl, SPRITE_OAM_IDX + 2
  163. ld [hl], SPRITE_IDX + 3
  164. ld_OAM_tile hl, SPRITE_OAM_IDX + 3
  165. ld [hl], SPRITE_IDX + 2
  166. .done:
  167. ret