| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- extends Enemy
- const BOWSER_FLAME = preload("res://Scenes/Prefabs/Entities/Enemies/BowserFlame.tscn")
- const HAMMER = preload("res://Scenes/Prefabs/Entities/Items/Hammer.tscn")
- @onready var sprite: BetterAnimatedSprite2D = $SpriteScaleJoint/Sprite
- @export var can_hammer := false
- @export var can_fire := true
- @export var music_enabled := true
- var target_player: Player = null
- var can_move := true
- var can_fall := true
- var health := 5
- var move_dir := -1
- func _ready() -> void:
- for i in [$JumpTimer, $HammerTime, $FlameTimer]:
- i.start()
- func _physics_process(delta: float) -> void:
- target_player = get_tree().get_nodes_in_group("Players")[0]
- if is_on_floor():
- direction = sign(target_player.global_position.x - global_position.x)
- velocity.x = 0
- sprite.scale.x = direction
- if can_fall:
- apply_enemy_gravity(delta)
- move_and_slide()
- if Input.is_action_just_pressed("editor_move_player") and Global.debug_mode:
- die()
- func jump() -> void:
- if is_on_floor():
- velocity.y = -100
- $JumpTimer.start(randf_range(1, 2.5))
- func apply_enemy_gravity(delta: float) -> void:
- velocity.y += (2.5 / delta) * delta
- velocity.y = clamp(velocity.y, -INF, Global.entity_max_fall_speed)
- func get_target_y(player: Player) -> float:
- if player.global_position.y + 16 < global_position.y:
- return player.global_position.y - 32
- else:
- return player.global_position.y - 8
- func show_smoke() -> void:
- if has_meta("is_real"):
- return
- var smoke = preload("res://Scenes/Prefabs/Particles/SmokeParticle.tscn").instantiate()
- smoke.scale = Vector2(2, 2)
- smoke.global_position =global_position
- AudioManager.play_sfx("magic", global_position)
- add_sibling(smoke)
- func breathe_fire() -> void:
- if can_fire == false:
- return
- sprite.play("FireCharge")
- await get_tree().create_timer(1, false).timeout
- var flame = BOWSER_FLAME.instantiate()
- flame.global_position = global_position + Vector2(18 * direction, -20)
- flame.mode = 1
- flame.direction = direction
- flame.target_y = get_target_y(target_player)
- if $TrackJoint.is_attached:
- get_parent().owner.add_sibling(flame)
- else:
- add_sibling(flame)
- sprite.play("FireBreathe")
- if is_instance_valid(get_node_or_null("FlameTimer")):
- $FlameTimer.start(randf_range(1.5, 4.5))
- await get_tree().create_timer(0.5, false).timeout
- sprite.play("Idle")
- func bridge_fall() -> void:
- process_mode = Node.PROCESS_MODE_ALWAYS
- direction = 1
- $FlameTimer.queue_free()
- $HammerTime.queue_free()
- $JumpTimer.queue_free()
- sprite.play("Fall")
- sprite.reset_physics_interpolation()
- $MoveAnimation.queue_free()
- can_fall = false
- velocity.y = 0
- await get_tree().create_timer(2).timeout
- $FallSFX.play()
- can_fall = true
- $Collision.queue_free()
- await get_tree().create_timer(2).timeout
- queue_free()
- func throw_hammers() -> void:
- if can_hammer == false:
- return
- $Hammer.show()
- await get_tree().create_timer(0.5, false).timeout
- for i in randi_range(3, 6):
- $Hammer.show()
- await get_tree().create_timer(0.1, false).timeout
- var node = HAMMER.instantiate()
- node.velocity.y = -200
- node.global_position = $Hammer.global_position
- node.direction = direction
- if $TrackJoint.is_attached:
- get_parent().owner.add_sibling(node)
- else:
- add_sibling(node)
- sprite.play("Idle")
- $Hammer.hide()
- await get_tree().create_timer(0.1, false).timeout
- if get_node_or_null("HammerTime") != null:
- $HammerTime.start()
- func fireball_hit() -> void:
- health -= 1
- AudioManager.play_sfx("bump", global_position)
- if health <= 0:
- die()
- else:
- $SpriteScaleJoint/HurtAnimation.stop()
- $SpriteScaleJoint/HurtAnimation.play("Hurt")
- AudioManager.play_sfx("kick", global_position)
- func play_music() -> void:
- for i: EntityGenerator in get_tree().get_nodes_in_group("EntityGenerators"):
- if i.entity_scene != null:
- if i.entity_scene.resource_path == "res://Scenes/Prefabs/Entities/Enemies/BowserFlame.tscn":
- i.queue_free()
- if Settings.file.audio.extra_bgm == 0: return
- if Global.level_editor != null:
- return
- if music_enabled:
- AudioManager.set_music_override(AudioManager.MUSIC_OVERRIDES.BOWSER, 5, false)
- func on_timeout() -> void:
- move_dir = [-1, 1].pick_random()
|