]> Untitled Git - frog-ninja.git/blobdiff - player/model.gd
Separated the Visual from the Model
[frog-ninja.git] / player / model.gd
index c2d8c7888aa9b3fc01a0ee8fc9c34f014813ed91..cd6100420ca891e1b18f2ec185061faf782302ff 100644 (file)
@@ -2,42 +2,53 @@ extends Node
 class_name PlayerModel
 
 
 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