81 lines
2.7 KiB
GDScript
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
|