Tales-of-PKMN/game/battle/battle_actor.gd

81 lines
2.7 KiB
GDScript

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