class_name TargetResolver extends RefCounted #convertit MoveData.target (valeurs PokeAPI) + le choix du joueur en liste d'emplacements. const SELECTABLE : Array[String] = ["selected-pokemon", "selected-pokemon-me-first", "specific-move", "ally", "user-or-ally"] static func get_target_type(move : MoveData) -> String: return move.target if move.target != "" else "selected-pokemon" static func get_selectable_targets(battle : Battle, actor : BattleSlot, move : MoveData) -> Array[BattleSlot]: #emplacements parmi lesquels le joueur peut choisir (ordre : par camp puis par position) var result : Array[BattleSlot] = [] match get_target_type(move): "ally": result = battle.get_allies(actor) "user-or-ally": result = battle.get_allies(actor) result.append(actor) _: for s in battle.get_active_slots(): if s != actor: result.append(s) return result static func needs_selection(battle : Battle, actor : BattleSlot, move : MoveData) -> bool: #une etape "choisir la cible" n'est utile que s'il y a vraiment un choix return SELECTABLE.has(get_target_type(move)) and get_selectable_targets(battle, actor, move).size() > 1 static func resolve(battle : Battle, actor : BattleSlot, move : MoveData, chosen : BattleSlot) -> Array[BattleSlot]: #liste finale des cibles au moment ou la capacite est utilisee (cible K.O. entre-temps : redirigee) var opponents : Array[BattleSlot] = battle.get_opponents(actor) var allies : Array[BattleSlot] = battle.get_allies(actor) var result : Array[BattleSlot] = [] match get_target_type(move): "user": result.append(actor) "all-opponents": result = opponents "random-opponent": if !opponents.is_empty(): result.append(opponents.pick_random()) "all-other-pokemon": result.append_array(opponents) result.append_array(allies) "all-pokemon", "entire-field": result.append_array(opponents) result.append_array(allies) result.append(actor) "all-allies", "user-and-allies": result = allies result.append(actor) "ally", "user-or-ally": if chosen != null and chosen.is_active() and (allies.has(chosen) or chosen == actor): result.append(chosen) elif !allies.is_empty(): result.append(allies.pick_random()) elif get_target_type(move) == "user-or-ally": result.append(actor) "users-field", "opponents-field", "fainting-pokemon": pass #effets de terrain : plus tard _: #cible choisie ; si elle est K.O. ou absente, redirection vers un adversaire au hasard if chosen != null and chosen != actor and chosen.is_active(): result.append(chosen) elif !opponents.is_empty(): result.append(opponents.pick_random()) return result