push_boulder.asm 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. TryPushingBoulder:
  2. ld a, [wd728]
  3. bit 0, a ; using Strength?
  4. ret z
  5. ld a, [wFlags_0xcd60]
  6. bit 1, a ; has boulder dust animation from previous push played yet?
  7. ret nz
  8. xor a
  9. ld [hSpriteIndexOrTextID], a
  10. call IsSpriteInFrontOfPlayer
  11. ld a, [hSpriteIndexOrTextID]
  12. ld [wBoulderSpriteIndex], a
  13. and a
  14. jp z, ResetBoulderPushFlags
  15. ld hl, wSpriteStateData1 + 1
  16. ld d, $0
  17. ld a, [hSpriteIndexOrTextID]
  18. swap a
  19. ld e, a
  20. add hl, de
  21. res 7, [hl]
  22. call GetSpriteMovementByte2Pointer
  23. ld a, [hl]
  24. cp BOULDER_MOVEMENT_BYTE_2
  25. jp nz, ResetBoulderPushFlags
  26. ld hl, wFlags_0xcd60
  27. bit 6, [hl]
  28. set 6, [hl] ; indicate that the player has tried pushing
  29. ret z ; the player must try pushing twice before the boulder will move
  30. ld a, [hJoyHeld]
  31. and D_RIGHT | D_LEFT | D_UP | D_DOWN
  32. ret z
  33. predef CheckForCollisionWhenPushingBoulder
  34. ld a, [wTileInFrontOfBoulderAndBoulderCollisionResult]
  35. and a ; was there a collision?
  36. jp nz, ResetBoulderPushFlags
  37. ld a, [hJoyHeld]
  38. ld b, a
  39. ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
  40. cp SPRITE_FACING_UP
  41. jr z, .pushBoulderUp
  42. cp SPRITE_FACING_LEFT
  43. jr z, .pushBoulderLeft
  44. cp SPRITE_FACING_RIGHT
  45. jr z, .pushBoulderRight
  46. .pushBoulderDown
  47. bit 7, b
  48. ret z
  49. ld de, PushBoulderDownMovementData
  50. jr .done
  51. .pushBoulderUp
  52. bit 6, b
  53. ret z
  54. ld de, PushBoulderUpMovementData
  55. jr .done
  56. .pushBoulderLeft
  57. bit 5, b
  58. ret z
  59. ld de, PushBoulderLeftMovementData
  60. jr .done
  61. .pushBoulderRight
  62. bit 4, b
  63. ret z
  64. ld de, PushBoulderRightMovementData
  65. .done
  66. call MoveSprite
  67. ld a, SFX_PUSH_BOULDER
  68. call PlaySound
  69. ld hl, wFlags_0xcd60
  70. set 1, [hl]
  71. ret
  72. PushBoulderUpMovementData:
  73. db NPC_MOVEMENT_UP,$FF
  74. PushBoulderDownMovementData:
  75. db NPC_MOVEMENT_DOWN,$FF
  76. PushBoulderLeftMovementData:
  77. db NPC_MOVEMENT_LEFT,$FF
  78. PushBoulderRightMovementData:
  79. db NPC_MOVEMENT_RIGHT,$FF
  80. DoBoulderDustAnimation:
  81. ld a, [wd730]
  82. bit 0, a
  83. ret nz
  84. callab AnimateBoulderDust
  85. call DiscardButtonPresses
  86. ld [wJoyIgnore], a
  87. call ResetBoulderPushFlags
  88. set 7, [hl]
  89. ld a, [wBoulderSpriteIndex]
  90. ld [H_SPRITEINDEX], a
  91. call GetSpriteMovementByte2Pointer
  92. ld [hl], $10
  93. ld a, SFX_CUT
  94. jp PlaySound
  95. ResetBoulderPushFlags:
  96. ld hl, wFlags_0xcd60
  97. res 1, [hl]
  98. res 6, [hl]
  99. ret