class_name BattleActor extends Node3D #un pokemon visible dans le monde pendant le combat (un par emplacement), avec ses petites animations. var slot_id : int = -1 var pokemon : PokemonInstance var model : Node3D var home : Vector3 = Vector3.ZERO var _marker : Label3D func setup(p_pokemon : PokemonInstance, p_slot_id : int) -> void: process_mode = Node.PROCESS_MODE_ALWAYS #le monde est en pause pendant le combat, pas les acteurs pokemon = p_pokemon slot_id = p_slot_id model = SentPokemon.create_model(p_pokemon) add_child(model) #marqueur "▼" au-dessus de la tete (pokemon qui agit / cible en cours de choix) _marker = Label3D.new() _marker.text = "▼" _marker.font_size = 96 _marker.pixel_size = 0.01 _marker.billboard = BaseMaterial3D.BILLBOARD_ENABLED _marker.no_depth_test = true _marker.modulate = Color(1.0, 0.85, 0.2) _marker.position = Vector3(0, 2.3, 0) _marker.visible = false add_child(_marker) func place(position_world : Vector3, look_at_pos : Vector3) -> void: global_position = position_world home = position_world var flat : Vector3 = Vector3(look_at_pos.x, position_world.y, look_at_pos.z) if flat.distance_to(position_world) > 0.01: look_at(flat, Vector3.UP) if SentPokemon.MODEL_FACES_PLUS_Z: rotate_y(PI) #look_at oriente -Z vers la cible func set_highlight(on : bool) -> void: if _marker: _marker.visible = on #---------- animations (awaitables) ---------- func play_enter() -> void: scale = Vector3.ONE * 0.01 var tween := create_tween() tween.tween_property(self, "scale", Vector3.ONE, 0.3).set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT) await tween.finished func play_leave() -> void: var tween := create_tween() tween.tween_property(self, "scale", Vector3.ONE * 0.01, 0.25).set_ease(Tween.EASE_IN) await tween.finished func play_attack(toward : Vector3) -> void: var dir : Vector3 = toward - home dir.y = 0.0 if dir.length() < 0.01: return var lunge : Vector3 = home + dir.normalized() * 1.2 var tween := create_tween() tween.tween_property(self, "global_position", lunge, 0.12).set_ease(Tween.EASE_OUT) tween.tween_property(self, "global_position", home, 0.2).set_ease(Tween.EASE_IN_OUT) await tween.finished func play_hit() -> void: var tween := create_tween() for i in 3: tween.tween_property(self, "global_position", home + Vector3(0.15, 0, 0), 0.04) tween.tween_property(self, "global_position", home + Vector3(-0.15, 0, 0), 0.04) tween.tween_property(self, "global_position", home, 0.04) await tween.finished func play_faint() -> void: var tween := create_tween() tween.set_parallel(true) tween.tween_property(self, "global_position", home + Vector3(0, -0.6, 0), 0.5) tween.tween_property(self, "scale", Vector3.ONE * 0.01, 0.5) await tween.finished visible = false