diff --git a/game/player/states/throw_state.gd b/game/player/states/throw_state.gd index b215c57..494ace9 100644 --- a/game/player/states/throw_state.gd +++ b/game/player/states/throw_state.gd @@ -30,6 +30,7 @@ var play_char : CharacterBody3D @export_group("Targeting") @export var throw_range : float = 20.0 @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 _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 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) #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) @@ -267,6 +272,19 @@ func _on_ball_landed(landing_pos : Vector3, pokemon : PokemonInstance, target : #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) +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 ---------- func _release_aim() -> void: