ShellClass.gd 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. class_name Shell
  2. extends Enemy
  3. var moving := false
  4. const MOVE_SPEED := 192
  5. const AIR_MOVE_SPEED := 64
  6. var combo := 0
  7. @export var colour := "Green"
  8. var flipped := false
  9. var can_kick := false
  10. var player: Player = null
  11. const COMBO_VALS := [500, 800, 1000, 2000, 4000, 5000, 8000, null]
  12. var wake_meter := 0.0 ## SMB1R IS WOKE
  13. var old_entity: Enemy = null
  14. var can_update := true
  15. var can_air_kick := false
  16. func _ready() -> void:
  17. $Sprite.flip_v = flipped
  18. if flipped:
  19. $Sprite.offset.y = 1
  20. for i in 4:
  21. await get_tree().physics_frame
  22. can_kick = true
  23. $Hitbox/Collision.set_deferred("disabled", false)
  24. func on_player_stomped_on(stomped_player: Player) -> void:
  25. player = stomped_player
  26. if can_kick == false:
  27. return
  28. if not moving:
  29. direction = sign(global_position.x - stomped_player.global_position.x)
  30. kick()
  31. else:
  32. DiscoLevel.combo_meter += 10
  33. moving = false
  34. AudioManager.play_sfx("enemy_stomp", global_position)
  35. stomped_player.enemy_bounce_off()
  36. if Global.current_game_mode == Global.GameMode.CHALLENGE and stomped_player.stomp_combo >= 10:
  37. die_from_object(stomped_player)
  38. func block_bounced(_block: Block) -> void:
  39. velocity.y = -200
  40. wake_meter = 0
  41. func on_player_hit(hit_player: Player) -> void:
  42. player = hit_player
  43. if can_kick == false:
  44. return
  45. if not moving:
  46. direction = sign(global_position.x - hit_player.global_position.x )
  47. kick()
  48. else:
  49. hit_player.damage()
  50. func kick() -> void:
  51. update_hitbox()
  52. DiscoLevel.combo_meter += 25
  53. moving = true
  54. if can_air_kick:
  55. $ScoreNoteSpawner.spawn_note(8000)
  56. else:
  57. $ScoreNoteSpawner.spawn_note(400)
  58. AudioManager.play_sfx("kick", global_position)
  59. func _physics_process(delta: float) -> void:
  60. handle_movement(delta)
  61. handle_waking(delta)
  62. handle_block_collision()
  63. if moving:
  64. wake_meter = 0
  65. $Sprite.play("Spin")
  66. else:
  67. combo = 0
  68. if wake_meter > 5:
  69. $Sprite.play("Wake")
  70. else:
  71. $Sprite.play("Idle")
  72. func handle_waking(delta: float) -> void:
  73. wake_meter += delta * (2 if Global.second_quest else 1)
  74. if wake_meter >= 7:
  75. summon_original_entity()
  76. func summon_original_entity() -> void:
  77. old_entity.global_position = global_position
  78. add_sibling(old_entity)
  79. queue_free()
  80. func handle_block_collision() -> void:
  81. if not moving:
  82. return
  83. for i in $Hitbox.get_overlapping_bodies():
  84. if i is Block and i.global_position.y < global_position.y:
  85. i.shell_block_hit.emit(self)
  86. func add_combo() -> void:
  87. if combo >= 7:
  88. if Global.current_game_mode == Global.GameMode.CHALLENGE or Settings.file.difficulty.inf_lives:
  89. Global.score += 10000
  90. $ScoreNoteSpawner.spawn_note(10000)
  91. else:
  92. AudioManager.play_global_sfx("1_up")
  93. Global.lives += 1
  94. $ScoreNoteSpawner.spawn_one_up_note()
  95. else:
  96. $ScoreNoteSpawner.spawn_note(COMBO_VALS[combo])
  97. combo += 1
  98. func update_hitbox() -> void:
  99. can_kick = false
  100. $Hitbox.get_child(0).set_deferred("disabled", true)
  101. for i in 2:
  102. await get_tree().physics_frame
  103. $Hitbox.get_child(0).set_deferred("disabled", false)
  104. await get_tree().physics_frame
  105. can_kick = true
  106. func handle_movement(delta: float) -> void:
  107. set_collision_layer_value(6, not moving)
  108. if moving:
  109. if is_on_wall():
  110. direction *= -1
  111. AudioManager.play_sfx("bump", global_position)
  112. var speed = MOVE_SPEED
  113. if is_on_floor() == false:
  114. speed = AIR_MOVE_SPEED
  115. velocity.x = ((speed * direction))
  116. elif is_on_floor():
  117. velocity.x = 0
  118. if is_on_floor() and velocity.y >= 0:
  119. can_air_kick = false
  120. velocity.y += (Global.entity_gravity / delta) * delta
  121. velocity.y = clamp(velocity.y, -INF, Global.entity_max_fall_speed)
  122. move_and_slide()