| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- 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()
|