Bowser.gd 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. extends Enemy
  2. const BOWSER_FLAME = preload("res://Scenes/Prefabs/Entities/Enemies/BowserFlame.tscn")
  3. const HAMMER = preload("res://Scenes/Prefabs/Entities/Items/Hammer.tscn")
  4. @onready var sprite: BetterAnimatedSprite2D = $SpriteScaleJoint/Sprite
  5. @export var can_hammer := false
  6. @export var can_fire := true
  7. @export var music_enabled := true
  8. var target_player: Player = null
  9. var can_move := true
  10. var can_fall := true
  11. var health := 5
  12. var move_dir := -1
  13. func _ready() -> void:
  14. for i in [$JumpTimer, $HammerTime, $FlameTimer]:
  15. i.start()
  16. func _physics_process(delta: float) -> void:
  17. target_player = get_tree().get_nodes_in_group("Players")[0]
  18. if is_on_floor():
  19. direction = sign(target_player.global_position.x - global_position.x)
  20. velocity.x = 0
  21. sprite.scale.x = direction
  22. if can_fall:
  23. apply_enemy_gravity(delta)
  24. move_and_slide()
  25. if Input.is_action_just_pressed("editor_move_player") and Global.debug_mode:
  26. die()
  27. func jump() -> void:
  28. if is_on_floor():
  29. velocity.y = -100
  30. $JumpTimer.start(randf_range(1, 2.5))
  31. func apply_enemy_gravity(delta: float) -> void:
  32. velocity.y += (2.5 / delta) * delta
  33. velocity.y = clamp(velocity.y, -INF, Global.entity_max_fall_speed)
  34. func get_target_y(player: Player) -> float:
  35. if player.global_position.y + 16 < global_position.y:
  36. return player.global_position.y - 32
  37. else:
  38. return player.global_position.y - 8
  39. func show_smoke() -> void:
  40. if has_meta("is_real"):
  41. return
  42. var smoke = preload("res://Scenes/Prefabs/Particles/SmokeParticle.tscn").instantiate()
  43. smoke.scale = Vector2(2, 2)
  44. smoke.global_position =global_position
  45. AudioManager.play_sfx("magic", global_position)
  46. add_sibling(smoke)
  47. func breathe_fire() -> void:
  48. if can_fire == false:
  49. return
  50. sprite.play("FireCharge")
  51. await get_tree().create_timer(1, false).timeout
  52. var flame = BOWSER_FLAME.instantiate()
  53. flame.global_position = global_position + Vector2(18 * direction, -20)
  54. flame.mode = 1
  55. flame.direction = direction
  56. flame.target_y = get_target_y(target_player)
  57. if $TrackJoint.is_attached:
  58. get_parent().owner.add_sibling(flame)
  59. else:
  60. add_sibling(flame)
  61. sprite.play("FireBreathe")
  62. if is_instance_valid(get_node_or_null("FlameTimer")):
  63. $FlameTimer.start(randf_range(1.5, 4.5))
  64. await get_tree().create_timer(0.5, false).timeout
  65. sprite.play("Idle")
  66. func bridge_fall() -> void:
  67. process_mode = Node.PROCESS_MODE_ALWAYS
  68. direction = 1
  69. $FlameTimer.queue_free()
  70. $HammerTime.queue_free()
  71. $JumpTimer.queue_free()
  72. sprite.play("Fall")
  73. sprite.reset_physics_interpolation()
  74. $MoveAnimation.queue_free()
  75. can_fall = false
  76. velocity.y = 0
  77. await get_tree().create_timer(2).timeout
  78. $FallSFX.play()
  79. can_fall = true
  80. $Collision.queue_free()
  81. await get_tree().create_timer(2).timeout
  82. queue_free()
  83. func throw_hammers() -> void:
  84. if can_hammer == false:
  85. return
  86. $Hammer.show()
  87. await get_tree().create_timer(0.5, false).timeout
  88. for i in randi_range(3, 6):
  89. $Hammer.show()
  90. await get_tree().create_timer(0.1, false).timeout
  91. var node = HAMMER.instantiate()
  92. node.velocity.y = -200
  93. node.global_position = $Hammer.global_position
  94. node.direction = direction
  95. if $TrackJoint.is_attached:
  96. get_parent().owner.add_sibling(node)
  97. else:
  98. add_sibling(node)
  99. sprite.play("Idle")
  100. $Hammer.hide()
  101. await get_tree().create_timer(0.1, false).timeout
  102. if get_node_or_null("HammerTime") != null:
  103. $HammerTime.start()
  104. func fireball_hit() -> void:
  105. health -= 1
  106. AudioManager.play_sfx("bump", global_position)
  107. if health <= 0:
  108. die()
  109. else:
  110. $SpriteScaleJoint/HurtAnimation.stop()
  111. $SpriteScaleJoint/HurtAnimation.play("Hurt")
  112. AudioManager.play_sfx("kick", global_position)
  113. func play_music() -> void:
  114. for i: EntityGenerator in get_tree().get_nodes_in_group("EntityGenerators"):
  115. if i.entity_scene != null:
  116. if i.entity_scene.resource_path == "res://Scenes/Prefabs/Entities/Enemies/BowserFlame.tscn":
  117. i.queue_free()
  118. if Settings.file.audio.extra_bgm == 0: return
  119. if Global.level_editor != null:
  120. return
  121. if music_enabled:
  122. AudioManager.set_music_override(AudioManager.MUSIC_OVERRIDES.BOWSER, 5, false)
  123. func on_timeout() -> void:
  124. move_dir = [-1, 1].pick_random()