68 lines
1.6 KiB
GDScript
68 lines
1.6 KiB
GDScript
extends MaskAbility
|
|
|
|
@export var max_bounces := 5
|
|
@export var speed := 1.4
|
|
@export var max_height = 100.
|
|
@export var explosion : PackedScene
|
|
|
|
@onready var sprite : Sprite2D = $Sprite2D
|
|
var traveled: float = 0.0
|
|
|
|
var bouncing = false
|
|
var target : Enemy = null
|
|
var bounces := max_bounces
|
|
var already_hit : Array[Enemy] = []
|
|
|
|
func mask_ready():
|
|
super.mask_ready()
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if traveled < 1:
|
|
if target:
|
|
target_position = target.position
|
|
traveled += speed * delta
|
|
|
|
global_position = start_position.lerp(target_position, traveled)
|
|
|
|
var arc_y = 4 * max_height * traveled * (1 - traveled)
|
|
|
|
sprite.position.y = -arc_y
|
|
elif bouncing and bounces > 0:
|
|
if target:
|
|
target.damage()
|
|
change_target()
|
|
else:
|
|
global_position = target_position
|
|
sprite.position.y = 0
|
|
|
|
func change_target():
|
|
var enemies = get_tree().get_nodes_in_group("enemy")
|
|
var dist := 100000.
|
|
var closest : Entity = null
|
|
for e : Enemy in enemies:
|
|
if e in already_hit: continue
|
|
var e_dist = e.global_position.distance_to(global_position)
|
|
if e_dist < dist:
|
|
dist = e_dist
|
|
closest = e
|
|
bounces -= 1
|
|
target = null
|
|
if dist < 60:
|
|
target = closest
|
|
already_hit.append(closest)
|
|
start_position = global_position
|
|
target_position = closest.global_position
|
|
traveled = 0
|
|
var explo = explosion.instantiate()
|
|
explo.emitting = true
|
|
add_child(explo)
|
|
|
|
func _on_hitbox_hit_entity(entity : Entity) -> void:
|
|
if from_player:
|
|
for c in _get_all_children(self):
|
|
if c is Hitbox:
|
|
c.enabled = false
|
|
bouncing = true
|
|
target = entity
|
|
already_hit = [entity]
|
|
#change_target()
|