mirror of
https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
synced 2025-10-22 15:38:14 +00:00
147 lines
4.3 KiB
GDScript
147 lines
4.3 KiB
GDScript
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 is_real := 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:
|
|
# guzlad: ugly but it'll have to do until we move the metadata stuff to actual variables
|
|
if (((Global.current_game_mode == Global.GameMode.CUSTOM_LEVEL) or (Global.current_game_mode == Global.GameMode.LEVEL_EDITOR)) and !is_real):
|
|
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)
|
|
elif has_meta("is_real"):
|
|
return
|
|
|
|
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()
|