extends AnimationTree @export_group("Animation names") @export var _suffix_left := "_L" @export var _suffix_right := "_R" @export var _idle_name := "+idle" var _speed: float var _has_input: bool @onready var _player: Player = $"../" as Player @onready var _attack: PlayerAttack = $"../Attack" as PlayerAttack @onready var _locomotion_playback: AnimationNodeStateMachinePlayback = get( "parameters/locomotion/playback" ) func _ready() -> void: assert(_player, "_player missing!") Music.track_started.connect(_on_music_track_started) _attack.attacked.connect(_on_player_attacked) _set_bpm() _set_side() func _process(_delta: float) -> void: advance(Music.audio_delta as float) _speed = _player.velocity.length() / _player.movement.move_speed _has_input = _player.movement.move_input.length() > 0 var velocity_relative := _player.to_local( _player.global_position + _player.velocity ) var velocity_blend := ( Vector2(-velocity_relative.x, velocity_relative.z) / _player.movement.move_speed ) Debugger.text("velocity_blend", velocity_blend, 2) set(&"parameters/locomotion/run_R/blend_position", velocity_blend) func _is_left() -> bool: return _attack.side == PlayerAttack.Side.LEFT func _suffix(invert: bool = false) -> String: if not invert: return _suffix_left if _is_left() else _suffix_right return _suffix_left if not _is_left() else _suffix_right func _set_bpm() -> void: set(&"parameters/main_time_scale/scale", Music.bpm_factor) func _set_side() -> void: _locomotion_playback.travel(_idle_name + _suffix()) func _on_music_track_started() -> void: _set_bpm() func _on_player_attacked() -> void: _set_side()