mirror of
https://github.com/JHDev2006/Super-Mario-Bros.-Remastered-Public.git
synced 2025-10-22 23:48:11 +00:00
added the game
This commit is contained in:
97
Scripts/Classes/Entities/Enemies/Lakitu.gd
Normal file
97
Scripts/Classes/Entities/Enemies/Lakitu.gd
Normal file
@@ -0,0 +1,97 @@
|
||||
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()
|
Reference in New Issue
Block a user