@onready var player: Player = %Player
-@onready var model: PlayerModel = %Model
@onready var debug: CanvasLayer = %debug
@onready var version: String = ProjectSettings.get_setting("application/config/version")
func _ready() -> void:
debug.draw.add_vector(player, "velocity", 1, 1, Color(0,1,0,1))
- #_debug.draw.add_vector(model, "floor_normal", 1, 1, Color(0, 0, 1, 1))
- #_debug.draw.add_vector(model, "last_movement_direction", 1, 1, Color(1,0,0,1))
+ debug.draw.add_vector(player, "floor_normal", 1, 1, Color(0, 0, 1, 1))
+ debug.draw.add_vector(player, "last_movement_direction", 1, 1, Color(1,0,0,1))
debug.stats.add_property(self, "version", "")
+ debug.stats.add_property(player, "state", "")
debug.stats.add_property(player, "velocity", "length")
- #debug.stats.add_property(model, "idle_time", "round")
+ debug.stats.add_property(player, "idle_time", "round")
func _input(event: InputEvent) -> void:
###
# flags and variables here
-var player: CharacterBody3D
+var player: Player
var camera: Camera3D
# enums are prioritized by order of list
###
-func should_enter(input: InputPacket) -> String:
+func should_enter(_input: InputPacket) -> String:
print_debug("Function should_enter must be implemented in its child class!")
return ""
-func update(input: InputPacket, delta: float):
+func update(_input: InputPacket, _delta: float):
pass
return input.actions[0]
-func update(input: InputPacket, delta: float):
- player.move_and_slide()
+func update(input: InputPacket, _delta: float):
+ # 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.movement_direction.y + right * input.movement_direction.x
+ ).normalized()
+ move_direction.y = 0
+
+ # TODO: check if new_pos is valid!
+ var new_pos := player.last_movement_direction * player.dash_length
+ player.global_position += new_pos
-extends Move
+extends Walk
class_name Idle
-func should_enter(input) -> String:
- input.actions.sort_custom(moves_priority_sort)
- return input.actions[0]
+func update(input: InputPacket, delta: float):
+ player.idle_time += delta
+ super.update(input, delta)
+
+
+func on_enter_state():
+ player.idle_time = 0.0
+
+
+func on_exit_state():
+ player.idle_time = 0.0
###
func _ready() -> void:
+ # assign starting state
current_move = moves["idle"]
- # assign player object to each move
+ # assign objects to each move
for move in moves.values():
move.player = player
move.camera = camera
func update(input: InputPacket, delta: float):
- var relevent_move = current_move.should_enter(input)
- if not relevent_move.is_empty():
+ var relevent_move := current_move.should_enter(input)
+ if moves[relevent_move] != current_move:
switch_to(relevent_move)
current_move.update(input, delta)
func switch_to(state: String):
+ player.state = state
current_move.on_exit_state()
current_move = moves[state]
current_move.on_enter_state()
@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 acceleration := 20.0
@export var rotation_speed := 10.0
@export var idle_timeout := 5.0
-var idle_time := 0.0
+var idle_time := 0.00
+var last_movement_direction := Vector3.ZERO
+var state := ""
var floor_normal := Vector3.ZERO
var ground_slope_input := 0.0
func update(input: InputPacket, delta: float):
+ player.velocity = get_new_velocity_from_input(input, delta)
+ player.move_and_slide()
+
+
+func get_new_velocity_from_input(input: InputPacket, delta: float) -> Vector3:
# 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 := (
+ var movement_direction := (
forward * input.movement_direction.y + right * input.movement_direction.x
).normalized()
- move_direction.y = 0
+ movement_direction.y = 0
+
+ # save off last movement direction
+ if movement_direction.length() > 0.2:
+ player.last_movement_direction = movement_direction
# if we're not stuck, then it's okay to set the velocity
- var floor_normal = player.get_floor_normal()
- var ground_slope_input = (PI / 2) - player.velocity.angle_to(floor_normal)
- player.velocity = player.velocity.move_toward(
- move_direction * (player.walk_speed + ground_slope_input * player.walk_speed),
+ player.floor_normal = player.get_floor_normal()
+ player.ground_slope_input = (PI / 2) - player.velocity.angle_to(player.floor_normal)
+ var new_velocity = player.velocity.move_toward(
+ movement_direction * (player.walk_speed + player.ground_slope_input * player.walk_speed),
player.acceleration * delta
)
-
- player.move_and_slide()
+
+ return new_velocity