Files
Super-Mario-Bros.-Remastere…/Scripts/Classes/Entities/Enemies/Lakitu.gd

98 lines
2.7 KiB
GDScript

class_name Lakitu
extends Enemy
static var present := false:
set(value):
if value == true:
pass
present = value
var screen_center := Vector2.ZERO
var lakitu_point := Vector2.ZERO
const BLOCK_DISTANCE := 64
static var fixed_throw := true
var player: Player = null
var retreat := false
var can_enter := false
static var spiny_amount := 0
@export var item: PackedScene = null
@export var retreat_x := 3072
func _ready() -> void:
can_enter = false
$ThrowTimer.start()
lakitu_point = to_local(global_position)
fixed_throw = Settings.file.difficulty.lakitu_style == 1
get_parent().move_child(self, 0)
func _process(_delta: float) -> void:
screen_center = get_viewport().get_camera_2d().get_screen_center_position()
func _physics_process(delta: float) -> void:
player = get_tree().get_first_node_in_group("Players")
handle_movement(delta)
func handle_movement(_delta: float) -> void:
retreat = get_viewport().get_camera_2d().get_screen_center_position().x >= retreat_x
var player_x = player.global_position.x + ((player.velocity.x))
var distance = abs(global_position.x - player_x)
get_direction(player_x)
if direction == 1:
velocity.x = int(clamp((distance - 16) * 2, 48, INF))
else:
velocity.x = -48
$Cloud.scale.x = direction
move_and_slide()
func get_direction(player_x := 0.0) -> void:
if retreat:
present = false
direction = -1
return
if direction == -1 and global_position.x < player_x - BLOCK_DISTANCE:
direction = 1
elif direction == 1 and global_position.x > player_x + BLOCK_DISTANCE:
direction = -1
func summon_cloud_particle() -> void:
var node = preload("res://Scenes/Prefabs/Particles/LakituCloudBurst.tscn").instantiate()
node.global_position = $Cloud.global_position
add_sibling(node)
func on_timeout() -> void:
if spiny_amount >= 3 or retreat or $WallCheck.is_colliding():
return
$Cloud/Sprite.play("Throw")
await get_tree().create_timer(0.5, false).timeout
if $WallCheck.is_colliding() == false:
throw_spiny()
$Cloud/Sprite.play("Idle")
func throw_spiny() -> void:
var node = item.instantiate()
spiny_amount += 1
node.set("in_egg", true)
node.global_position = $Cloud/Sprite.global_position
node.velocity = Vector2(0, -150)
if fixed_throw:
node.velocity.x = 50 * (sign(player.global_position.x - global_position.x))
node.set("direction", sign(node.velocity.x))
add_sibling(node)
if Settings.file.audio.extra_sfx == 1:
AudioManager.play_sfx("lakitu_throw", global_position)
node.tree_exited.connect(func(): spiny_amount -= 1)
func on_screen_entered() -> void:
if Global.level_editor != null:
if Global.level_editor.playing_level == false:
return
add_to_group("Lakitus")
if get_tree().get_node_count_in_group("Lakitus") >= 2:
queue_free()