X-Git-Url: http://git.purplebirdman.com/frog-ninja.git/blobdiff_plain/3aebb768a5eef14badd98369da99ee151d2a060b..refs/heads/state-machine:/player/model.gd?ds=sidebyside diff --git a/player/model.gd b/player/model.gd index c2d8c78..cd61004 100644 --- a/player/model.gd +++ b/player/model.gd @@ -2,42 +2,53 @@ extends Node class_name PlayerModel -@export_group("Movement") -@export var walk_speed := 8.0 -@export var dash_length := 10.0 -@export var air_speed := 3.0 -@export var acceleration := 30.0 -@export var rotation_speed := 10.0 -@export var idle_timeout := 5.0 +@onready var moves: Dictionary = { + "idle": $Idle, + "walk": $Walk, + "slash": $Slash, + "shoot": $Shoot, + "dash": $Dash, + "fall": $Fall, + "fallToRoll": $FallToRoll, + "fallToLanding": $FallToLanding +} -var idle_time := 0.0 -var floor_normal := Vector3.ZERO -var ground_slope_input := 0.0 +@onready var player: Player = $".." +@onready var skeleton: Skeleton3D = $Skeleton3D +@onready var animation_tree: ModelAnimationTree = $AnimationTree -@onready var _player: Player = $".." -@onready var _camera: Camera3D = %camera +var current_move: Move -func get_velocity_by_input(input_pkt: InputPacket, delta: float) -> Vector3: - var new_velocity: Vector3 = _player.velocity - - if _player.is_on_floor(): - # Get the XZ input direction based on player's input relative to the camera - var forward := _camera.global_basis.z - var right := _camera.global_basis.x - var move_direction := ( - forward * input_pkt.movement_direction.y + right * input_pkt.movement_direction.x - ).normalized() - move_direction.y = 0 +func _ready() -> void: + for state_name in moves.keys(): + var move: Move = moves[state_name] + move.player = player + move.state_name = state_name - # if we're not stuck, then it's okay to set the velocity - floor_normal = _player.get_floor_normal() - ground_slope_input = (PI / 2) - new_velocity.angle_to(floor_normal) - new_velocity = new_velocity.move_toward( - move_direction * (walk_speed + ground_slope_input * walk_speed), - acceleration * delta - ) - else: - new_velocity += _player.get_gravity() * air_speed * delta - - return new_velocity + assign_current_move("idle") + + +func update(input: InputPacket, delta: float): + var relevent_move := current_move.should_enter(input) + if moves[relevent_move] != current_move: + switch_to(relevent_move) + current_move.update(input, delta) + animation_tree.set_walking_speed(player.velocity.length()) + + +func switch_to(state: String): + animation_tree.animation_started.disconnect(current_move._on_animation_started) + animation_tree.animation_finished.disconnect(current_move._on_animation_finished) + current_move.on_exit_state() + assign_current_move(state) + + +func assign_current_move(state: String): + current_move = moves[state] + current_move.on_enter_state() + + animation_tree.animation_started.connect(current_move._on_animation_started) + animation_tree.animation_finished.connect(current_move._on_animation_finished) + animation_tree.transition(state) + player.state = state