Normal.gd 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. extends PlayerState
  2. var swim_up_meter := 0.0
  3. var jump_queued := false
  4. var jump_buffer := 0
  5. var walk_frame := 0
  6. var bubble_meter := 0.0
  7. var wall_pushing := false
  8. var can_wall_push := false
  9. func enter(_msg := {}) -> void:
  10. jump_queued = false
  11. func physics_update(delta: float) -> void:
  12. if player.is_actually_on_floor():
  13. grounded(delta)
  14. else:
  15. in_air()
  16. handle_movement(delta)
  17. handle_animations()
  18. if player.global_position.y > 64 and not Level.in_vine_level and player.auto_death_pit:
  19. player.die(true)
  20. elif player.global_position.y < Global.current_level.vertical_height - 32 and player.gravity_vector == Vector2.UP:
  21. player.die(true)
  22. func handle_movement(delta: float) -> void:
  23. jump_buffer -= 1
  24. if jump_buffer <= 0:
  25. jump_queued = false
  26. player.apply_gravity(delta)
  27. if player.is_actually_on_floor():
  28. var player_transform = player.global_transform
  29. player_transform.origin += Vector2.UP * 1
  30. if player.is_actually_on_floor():
  31. handle_ground_movement(delta)
  32. elif player.in_water or player.flight_meter > 0:
  33. handle_swimming(delta)
  34. else:
  35. handle_air_movement(delta)
  36. player.move_and_slide()
  37. player.moved.emit()
  38. func grounded(delta: float) -> void:
  39. player.jump_cancelled = false
  40. if player.velocity.y >= 0:
  41. player.has_jumped = false
  42. if Global.player_action_just_pressed("jump", player.player_id):
  43. if player.in_water or player.flight_meter > 0:
  44. swim_up()
  45. return
  46. else:
  47. player.jump()
  48. if jump_queued and not (player.in_water or player.flight_meter > 0):
  49. if player.spring_bouncing == false:
  50. player.jump()
  51. jump_queued = false
  52. if not player.crouching:
  53. if Global.player_action_pressed("move_down", player.player_id):
  54. player.crouching = true
  55. else:
  56. can_wall_push = player.test_move(player.global_transform, Vector2.UP * 8 * player.gravity_vector.y) and player.power_state.hitbox_size != "Small"
  57. if Global.player_action_pressed("move_down", player.player_id) == false:
  58. if can_wall_push:
  59. wall_pushing = true
  60. else:
  61. wall_pushing = false
  62. player.crouching = false
  63. else:
  64. player.crouching = true
  65. wall_pushing = false
  66. if wall_pushing:
  67. player.global_position.x += (-50 * player.direction * delta)
  68. func handle_ground_movement(delta: float) -> void:
  69. if player.skidding:
  70. ground_skid(delta)
  71. elif (player.input_direction != player.velocity_direction) and player.input_direction != 0 and abs(player.velocity.x) > 100 and not player.crouching:
  72. print([player.input_direction, player.velocity_direction])
  73. player.skidding = true
  74. elif player.input_direction != 0 and not player.crouching:
  75. ground_acceleration(delta)
  76. else:
  77. deceleration(delta)
  78. func ground_acceleration(delta: float) -> void:
  79. var target_move_speed := player.WALK_SPEED
  80. if player.in_water or player.flight_meter > 0:
  81. target_move_speed = 45
  82. var target_accel := player.GROUND_WALK_ACCEL
  83. if (Global.player_action_pressed("run", player.player_id) and abs(player.velocity.x) >= player.WALK_SPEED) and (not player.in_water and player.flight_meter <= 0) and player.can_run:
  84. target_move_speed = player.RUN_SPEED
  85. target_accel = player.GROUND_RUN_ACCEL
  86. if player.input_direction != player.velocity_direction:
  87. if Global.player_action_pressed("run", player.player_id) and player.can_run:
  88. target_accel = player.RUN_SKID
  89. else:
  90. target_accel = player.WALK_SKID
  91. player.velocity.x = move_toward(player.velocity.x, target_move_speed * player.input_direction, (target_accel / delta) * delta)
  92. func deceleration(delta: float) -> void:
  93. player.velocity.x = move_toward(player.velocity.x, 0, (player.DECEL / delta) * delta)
  94. func ground_skid(delta: float) -> void:
  95. var target_skid := player.RUN_SKID
  96. player.velocity.x = move_toward(player.velocity.x, 1 * player.input_direction, (target_skid / delta) * delta)
  97. if abs(player.velocity.x) < 10 or player.input_direction == player.velocity_direction or player.input_direction == 0:
  98. player.skidding = false
  99. func in_air() -> void:
  100. if Global.player_action_just_pressed("jump", player.player_id):
  101. if player.in_water or player.flight_meter > 0:
  102. swim_up()
  103. else:
  104. jump_queued = true
  105. jump_buffer = 4
  106. func handle_air_movement(delta: float) -> void:
  107. if player.input_direction != 0 and player.velocity_direction != player.input_direction:
  108. air_skid(delta)
  109. if player.input_direction != 0:
  110. air_acceleration(delta)
  111. if Global.player_action_pressed("jump", player.player_id) == false and player.has_jumped and not player.jump_cancelled:
  112. player.jump_cancelled = true
  113. if player.gravity_vector.y > 0:
  114. if player.velocity.y < 0:
  115. player.velocity.y /= 1.5
  116. player.gravity = player.FALL_GRAVITY
  117. elif player.gravity_vector.y < 0:
  118. if player.velocity.y > 0:
  119. player.velocity.y /= 1.5
  120. player.gravity = player.FALL_GRAVITY
  121. func air_acceleration(delta: float) -> void:
  122. var target_speed = player.WALK_SPEED
  123. if abs(player.velocity.x) >= player.WALK_SPEED and Global.player_action_pressed("run", player.player_id) and player.can_run:
  124. target_speed = player.RUN_SPEED
  125. player.velocity.x = move_toward(player.velocity.x, target_speed * player.input_direction, (player.AIR_ACCEL / delta) * delta)
  126. func air_skid(delta: float) -> void:
  127. player.velocity.x = move_toward(player.velocity.x, 1 * player.input_direction, (player.AIR_SKID / delta) * delta)
  128. func handle_swimming(delta: float) -> void:
  129. bubble_meter += delta
  130. if bubble_meter >= 1 and player.flight_meter <= 0:
  131. player.summon_bubble()
  132. bubble_meter = 0
  133. swim_up_meter -= delta
  134. player.skidding = (player.input_direction != player.velocity_direction) and player.input_direction != 0 and abs(player.velocity.x) > 100 and not player.crouching
  135. if player.skidding:
  136. ground_skid(delta)
  137. elif player.input_direction != 0 and not player.crouching:
  138. swim_acceleration(delta)
  139. else:
  140. deceleration(delta)
  141. func swim_acceleration(delta: float) -> void:
  142. player.velocity.x = move_toward(player.velocity.x, player.SWIM_SPEED * player.input_direction, (player.GROUND_WALK_ACCEL / delta) * delta)
  143. func swim_up() -> void:
  144. if player.swim_stroke:
  145. player.play_animation("SwimIdle")
  146. player.velocity.y = -100 * player.gravity_vector.y
  147. AudioManager.play_sfx("swim", player.global_position)
  148. swim_up_meter = 0.5
  149. player.crouching = false
  150. func handle_animations() -> void:
  151. if (player.is_actually_on_floor() or player.in_water or player.flight_meter > 0 or player.can_air_turn) and player.input_direction != 0 and not player.crouching:
  152. player.direction = player.input_direction
  153. var animation = get_animation_name()
  154. player.sprite.speed_scale = 1
  155. if ["Walk", "Move", "Run"].has(animation):
  156. player.sprite.speed_scale = abs(player.velocity.x) / 40
  157. player.play_animation(animation)
  158. if player.sprite.animation == "Move":
  159. walk_frame = player.sprite.frame
  160. player.sprite.scale.x = player.direction * player.gravity_vector.y
  161. func get_animation_name() -> String:
  162. if player.attacking:
  163. if player.crouching:
  164. return "CrouchAttack"
  165. if player.is_actually_on_floor():
  166. return "Attack"
  167. elif player.in_water or player.flight_meter > 0:
  168. return "SwimAttack"
  169. else:
  170. return "AirAttack"
  171. if player.crouching and not wall_pushing:
  172. if player.velocity.y > 0 and player.is_on_floor() == false:
  173. return "CrouchFall"
  174. return "Crouch"
  175. if player.is_actually_on_floor():
  176. if player.skidding:
  177. return "Skid"
  178. elif abs(player.velocity.x) >= 5 and not player.is_actually_on_wall():
  179. if player.in_water or player.flight_meter > 0:
  180. return "WaterMove"
  181. elif abs(player.velocity.x) < player.RUN_SPEED - 10:
  182. return "Walk"
  183. else:
  184. return "Run"
  185. else:
  186. if player.in_water or player.flight_meter > 0:
  187. return "WaterIdle"
  188. if Global.player_action_pressed("move_up", player.player_id):
  189. return "LookUp"
  190. return "Idle"
  191. else:
  192. if player.in_water or player.flight_meter > 0:
  193. if swim_up_meter > 0:
  194. return "SwimUp"
  195. else:
  196. return "SwimIdle"
  197. if player.has_jumped:
  198. if player.velocity.y < 0:
  199. if player.is_invincible:
  200. return "StarJump"
  201. return "Jump"
  202. else:
  203. if player.is_invincible:
  204. return "StarFall"
  205. return "JumpFall"
  206. else:
  207. player.sprite.speed_scale = 0
  208. player.sprite.frame = walk_frame
  209. return "Fall"
  210. func exit() -> void:
  211. player.on_hammer_timeout()
  212. player.skidding = false