Allow entering battle from free aim throw

This commit is contained in:
TheThomaas 2026-10-12 10:09:40 +02:00
parent c4de43f990
commit c4c2bf5f7b

View file

@ -30,6 +30,7 @@ var play_char : CharacterBody3D
@export_group("Targeting") @export_group("Targeting")
@export var throw_range : float = 20.0 @export var throw_range : float = 20.0
@export_flags_3d_physics var ground_mask : int = 1 @export_flags_3d_physics var ground_mask : int = 1
@export var free_hit_radius : float = 2.0 #lancer sans cible verrouillee : rayon autour du point d'atterrissage pour trouver une cible de combat
var _elapsed : float = 0.0 var _elapsed : float = 0.0
var _released : bool = false #true des que RT est relachee (phase windup/recovery) var _released : bool = false #true des que RT est relachee (phase windup/recovery)
@ -256,6 +257,10 @@ func _on_ball_landed(landing_pos : Vector3, pokemon : PokemonInstance, target :
var scene : Node = get_tree().current_scene if is_inside_tree() else null var scene : Node = get_tree().current_scene if is_inside_tree() else null
if scene == null: return if scene == null: return
#lancer sans cible verrouillee : si la balle atterrit pres d'une cible de combat, c'est elle qui est visee
if !is_instance_valid(target):
target = _find_battle_target_near(landing_pos)
var target_valid : bool = is_instance_valid(target) var target_valid : bool = is_instance_valid(target)
#le pokemon regarde la cible, ou dans la direction du lancer s'il n'y en a pas #le pokemon regarde la cible, ou dans la direction du lancer s'il n'y en a pas
var look_pos : Vector3 = target.global_position if target_valid else landing_pos + (landing_pos - thrower_pos) var look_pos : Vector3 = target.global_position if target_valid else landing_pos + (landing_pos - thrower_pos)
@ -267,6 +272,19 @@ func _on_ball_landed(landing_pos : Vector3, pokemon : PokemonInstance, target :
#diagnostic : retire ce message quand tout fonctionne #diagnostic : retire ce message quand tout fonctionne
push_warning("ThrowState : la cible '%s' ne lance pas de combat (starts_battle faux : Encounter vide, ou aim_target.gd pas remplace)." % target.name) push_warning("ThrowState : la cible '%s' ne lance pas de combat (starts_battle faux : Encounter vide, ou aim_target.gd pas remplace)." % target.name)
func _find_battle_target_near(point : Vector3) -> AimTarget:
#cible de combat active la plus proche du point d'atterrissage, dans free_hit_radius
var best : AimTarget = null
var best_dist : float = free_hit_radius
for node in get_tree().get_nodes_in_group("aim_targets"):
var t := node as AimTarget
if t == null or !t.enabled or !_starts_battle(t): continue
var dist : float = point.distance_to(t.global_position)
if dist <= best_dist:
best_dist = dist
best = t
return best
#---------- nettoyage ---------- #---------- nettoyage ----------
func _release_aim() -> void: func _release_aim() -> void: