choose single unit for attack

This commit is contained in:
2026-04-22 23:23:17 +03:00
parent 5ff0b1108e
commit 95bd7bb3be
+20 -7
View File
@@ -136,9 +136,9 @@ func _do_kick() -> void:
forward.y = 0.0 forward.y = 0.0
forward = forward.normalized() if forward.length() > 0.01 else Vector3(0.0, 0.0, -1.0) forward = forward.normalized() if forward.length() > 0.01 else Vector3(0.0, 0.0, -1.0)
var half_cos: float = cos(deg_to_rad(kick_angle * 0.5)) var half_cos: float = cos(deg_to_rad(kick_angle * 0.5))
var targets := get_tree().get_nodes_in_group("enemies") + get_tree().get_nodes_in_group("kickable") var candidates: Array[Node3D] = []
var kicked_any := false var candidate_dists: Array[float] = []
for e in targets: for e in get_tree().get_nodes_in_group("enemies") + get_tree().get_nodes_in_group("kickable"):
if not is_instance_valid(e): if not is_instance_valid(e):
continue continue
var en := e as Node3D var en := e as Node3D
@@ -150,7 +150,22 @@ func _do_kick() -> void:
if dist < 0.1 or dist > kick_range: if dist < 0.1 or dist > kick_range:
continue continue
if (diff / dist).dot(forward) >= half_cos: if (diff / dist).dot(forward) >= half_cos:
var obj_tier: int = en.get("tier") if en.get("tier") != null else 0 candidates.append(en)
candidate_dists.append(dist)
if candidates.is_empty():
return
var nearest_idx := 0
for i in range(1, candidates.size()):
if candidate_dists[i] < candidate_dists[nearest_idx]:
nearest_idx = i
var best := candidates[nearest_idx]
var best_diff := best.global_position - global_position
best_diff.y = 0.0
var best_dir := best_diff.normalized()
var obj_tier: int = best.get("tier") if best.get("tier") != null else 0
var diff_tier := tier - obj_tier var diff_tier := tier - obj_tier
var force: float var force: float
if diff_tier < 0: if diff_tier < 0:
@@ -161,9 +176,7 @@ func _do_kick() -> void:
force = 70.0 force = 70.0
else: else:
force = 80.0 force = 80.0
en.call("receive_kick", diff / dist, force) best.call("receive_kick", best_dir, force)
kicked_any = true
if kicked_any:
_squish_effect() _squish_effect()
func _try_interact() -> void: func _try_interact() -> void: