Reorganize file structure of project

This commit is contained in:
2026-03-17 14:44:13 -05:00
parent 86e3198645
commit 5a94483ffe
155 changed files with 365 additions and 162 deletions

View File

@@ -0,0 +1,10 @@
extends Node
@export var state_machine: PlayerStateMachine
# Public Methods
func OnMovementInput(_movement_vector: Vector2) -> void:
var current_state := state_machine.GetCurrentStateEnum()
if current_state == PlayerStateMachine.States.IDLE:
var idle_state := state_machine.current_state as PlayerIdleState
idle_state.QueueMovement()

View File

@@ -0,0 +1 @@
uid://ctoxjn2rvtjs6

View File

@@ -0,0 +1,33 @@
class_name BaseState
extends Node
@export var state_machine: PlayerStateMachine
func GetStateEnum() -> PlayerStateMachine.States:
push_error("Unimplemented Method: BaseState.GetName")
return PlayerStateMachine.States.IDLE
func GetAnimationBaseName() -> String:
var state: String = PlayerStateMachine.States.keys()[GetStateEnum()]
return state.to_lower()
func Enter(_extra_parameters: Dictionary) -> void:
pass
func Exit() -> void:
pass
func Update(_delta: float) -> void:
pass
func IsActive() -> bool:
return state_machine.GetCurrentStateEnum() == GetStateEnum()
func IsStateActionable() -> bool:
return true

View File

@@ -0,0 +1 @@
uid://cb57l5vpq5bee

View File

@@ -0,0 +1,29 @@
extends BaseState
class_name PlayerCutsceneState
@onready var interact_scanner: InteractScanner = $"../../../Marker2D/InteractScanner"
# Public Methods
func GetStateEnum() -> PlayerStateMachine.States:
return PlayerStateMachine.States.CUTSCENE
func GetAnimationBaseName() -> String:
return "idle"
func Enter(_extra_parameters: Dictionary) -> void:
print("Cutscene Started")
interact_scanner.disable_interactions = true
func Exit() -> void:
interact_scanner.disable_interactions = false
func OnCutsceneEnded() -> void:
state_machine.QueueStateChange(PlayerStateMachine.States.IDLE)
func IsStateActionable() -> bool:
return false

View File

@@ -0,0 +1 @@
uid://bnontuqj3cnom

View File

@@ -0,0 +1,37 @@
extends BaseState
signal PlayerBeganDrawingBow
@export var strafing_speed := 35
@export var movement_componenent: MovementComponent
@export var body: CharacterBody2D
var used_item_action: String
var animation_finished := false
func GetStateEnum() -> PlayerStateMachine.States:
return PlayerStateMachine.States.DRAWING_BOW
func Enter(extra_parameters: Dictionary) -> void:
animation_finished = false
used_item_action = extra_parameters.action_name
PlayerBeganDrawingBow.emit()
func Update(_delta: float) -> void:
if !animation_finished:
return
if !Input.is_action_pressed(used_item_action):
state_machine.QueueStateChange(PlayerStateMachine.States.FIRING_ARROW)
return
var movement_vector := movement_componenent.movement_vector
if movement_vector != Vector2.ZERO:
body.velocity = movement_vector * strafing_speed
body.move_and_slide()
func OnDrawingBowAnimationFinished() -> void:
animation_finished = true

View File

@@ -0,0 +1 @@
uid://bnp1vowmu15lg

View File

@@ -0,0 +1,31 @@
extends BaseState
class_name FiringArrowState
signal PlayerBeganFiringArrow
signal ArrowFired(spawn_position: Vector2, direction: Vector2)
@export var direction_component: FacingDirectionComponent
@export var arrow_spawn_marker: Marker2D
func GetStateEnum() -> PlayerStateMachine.States:
return PlayerStateMachine.States.FIRING_ARROW
func Enter(_extra_parameters: Dictionary) -> void:
PlayerBeganFiringArrow.emit()
var position := arrow_spawn_marker.global_position
var direction := Vector2.ZERO
if direction_component.current_direction == Enums.Directions.LEFT:
direction = Vector2.LEFT
elif direction_component.current_direction == Enums.Directions.RIGHT:
direction = Vector2.RIGHT
elif direction_component.current_direction == Enums.Directions.UP:
direction = Vector2.UP
elif direction_component.current_direction == Enums.Directions.DOWN:
direction = Vector2.DOWN
ArrowFired.emit(position, direction)
func OnFiringArrowAnimationFinished() -> void:
state_machine.QueueStateChange(PlayerStateMachine.States.IDLE)

View File

@@ -0,0 +1 @@
uid://cd2ewadcm8oi5

View File

@@ -0,0 +1,47 @@
extends BaseState
class_name PlayerIdleState
@export var movement_component: MovementComponent
signal PlayerBecameIdle
var _sit_queued := false
var _sit_queue_pos: Vector2
var _sit_queue_dir: Enums.Directions
func GetStateEnum() -> PlayerStateMachine.States:
return PlayerStateMachine.States.IDLE
func Enter(_extra_parameters: Dictionary) -> void:
PlayerBecameIdle.emit()
func Update(_delta: float) -> void:
var item_a := Input.is_action_just_pressed("use_item_a")
if item_a:
state_machine.QueueStateChange(PlayerStateMachine.States.USING_ITEM_A, {})
return
if _sit_queued:
state_machine.QueueStateChange(PlayerStateMachine.States.SITTING, {"pos": _sit_queue_pos, "dir": _sit_queue_dir})
_sit_queued = false
return
if movement_component.movement_vector != Vector2.ZERO:
state_machine.QueueStateChange(PlayerStateMachine.States.WALKING)
func OnSitOnFurnitureTriggered(sitting_position: Vector2, sitting_direction: Enums.Directions) -> void:
if state_machine.GetCurrentStateEnum() != GetStateEnum():
return
_sit_queued = true
_sit_queue_pos = sitting_position
_sit_queue_dir = sitting_direction
func OnCutsceneStarted() -> void:
state_machine.QueueStateChange(PlayerStateMachine.States.CUTSCENE)

View File

@@ -0,0 +1 @@
uid://dkmc1t43gomdb

View File

@@ -0,0 +1,30 @@
extends BaseState
class_name PlayerPlayAnimationState
signal PlayAnimation(animation_name: String)
signal AnimationFinished(animation_name: String)
var current_animation_name: String
# Public Methods
func GetAnimationBaseName() -> String:
return "idle"
func GetStateEnum() -> PlayerStateMachine.States:
return PlayerStateMachine.States.PLAY_ANIMATION
func Enter(_extra_parameters: Dictionary) -> void:
current_animation_name = _extra_parameters["animation_name"]
print("Playing Player Animation State: [%s]" % current_animation_name)
PlayAnimation.emit(current_animation_name)
func Exit() -> void:
current_animation_name = ''
func OnAnimationFinished(animation_name: String) -> void:
if animation_name != current_animation_name: return
AnimationFinished.emit(animation_name)

View File

@@ -0,0 +1 @@
uid://wfdtd3xlgrvm

View File

@@ -0,0 +1,25 @@
extends BaseState
@onready var player: PlayerCharacter = $"../../.."
@onready var facing_direction_component: FacingDirectionComponent = $"../../../Components/FacingDirectionComponent"
func GetAnimationBaseName() -> String:
return "idle"
func GetStateEnum() -> PlayerStateMachine.States:
return PlayerStateMachine.States.SITTING
func Enter(extra_parameters: Dictionary) -> void:
var pos := extra_parameters["pos"] as Vector2
var dir := extra_parameters["dir"] as Enums.Directions
player.position = pos
facing_direction_component.SetDirectionManually(dir)
func Update(_delta: float) -> void:
if Input.is_action_just_pressed("player_interact"):
player.position = Vector2(player.position.x, player.position.y + 16)
state_machine.QueueStateChange(PlayerStateMachine.States.IDLE)

View File

@@ -0,0 +1 @@
uid://bx1a35al4yiej

View File

@@ -0,0 +1,15 @@
extends BaseState
@export var body: CharacterBody2D
@export var direction_component: FacingDirectionComponent
func GetStateEnum() -> PlayerStateMachine.States:
return PlayerStateMachine.States.USING_ITEM_A
func GetAnimationBaseName() -> String:
return "idle"
func Update(_delta: float) -> void:
state_machine.QueueStateChange(PlayerStateMachine.States.DRAWING_BOW, { "action_name": "use_item_a" })

View File

@@ -0,0 +1 @@
uid://ckn7gmtc23b8l

View File

@@ -0,0 +1,27 @@
extends BaseState
signal StartedWalking
@export var walking_speed := 100
@export var movement_component: MovementComponent
@export var direction_component: FacingDirectionComponent
@export var body: CharacterBody2D
func GetStateEnum() -> PlayerStateMachine.States:
return PlayerStateMachine.States.WALKING
func Enter(_extra_parameters: Dictionary) -> void:
StartedWalking.emit()
func Update(_delta: float) -> void:
if movement_component.movement_vector == Vector2.ZERO:
state_machine.QueueStateChange(PlayerStateMachine.States.IDLE)
return
var movement_vector := movement_component.movement_vector
body.velocity = movement_vector * walking_speed
body.move_and_slide()
direction_component.ChangeDirectionUsingMovementVector(movement_vector)

View File

@@ -0,0 +1 @@
uid://bwmmah30t3m0u

View File

@@ -0,0 +1,28 @@
extends Area2D
class_name InteractScanner
signal InteractionActionTriggered()
@export var parent: Node2D
@export var direction_component: FacingDirectionComponent
@export var disable_interactions := false
# Public Methods
func OnDirectionChanged() -> void:
var direction := direction_component.GetCurrentDirection()
if direction == Enums.Directions.LEFT:
parent.rotation = deg_to_rad(90)
elif direction == Enums.Directions.RIGHT:
parent.rotation = deg_to_rad(-90)
elif direction == Enums.Directions.UP:
parent.rotation = deg_to_rad(180)
else:
parent.rotation = deg_to_rad(0)
func _process(_delta: float) -> void:
if disable_interactions:
return
if Input.is_action_just_pressed("player_interact"):
InputManager.IgnoreAction("player_interact")
InteractionActionTriggered.emit()

View File

@@ -0,0 +1 @@
uid://brlisuoocwehh

View File

@@ -0,0 +1,18 @@
extends Node
class_name MovementComponent
signal MovementInput(movement_vector: Vector2)
# Dynamic Exports
@export var body: CharacterBody2D
var movement_vector: Vector2
func _physics_process(_delta: float) -> void:
var direction_vector := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
if direction_vector:
movement_vector = direction_vector
MovementInput.emit(movement_vector)
else:
movement_vector = Vector2.ZERO

View File

@@ -0,0 +1 @@
uid://dwclkwbig1uii

View File

@@ -0,0 +1,18 @@
extends CharacterBody2D
class_name PlayerCharacter
# Signals
signal SitOnFurnitureTriggered(sitting_position: Vector2, sitting_direction: Enums.Directions)
# Exports
@export var player_sprite: PlayerSprite
@export var state_machine: PlayerStateMachine
@export var interact_scanner: InteractScanner
# Public Methods
func QueueCutsceneState() -> void:
state_machine.QueueStateChange(PlayerStateMachine.States.CUTSCENE)
func QueueEndCutsceneState() -> void:
state_machine.QueueStateChange(PlayerStateMachine.States.IDLE)

View File

@@ -0,0 +1 @@
uid://dacvayqstkvws

View File

@@ -0,0 +1,78 @@
extends Node2D
class_name PlayerSprite
# Signals
signal DrawingBowAnimationFinished
signal FiringArrowAnimationFinished
signal AnimationFinished(animation_name: String)
# Exports
@export var state_machine: PlayerStateMachine
@export var direction_component: FacingDirectionComponent
# OnReady Variables
@onready var full: AnimatedSprite2D = $Full
# Private Variables
var _all_parts: Array[AnimatedSprite2D]
var _current_animation := "idle-down"
var _is_flipped := false
# Public Methods
func UpdateSprite() -> void:
var current_state := state_machine.current_state
var current_direction := direction_component.GetCurrentDirection()
var animation := _build_animation_name(current_state, current_direction)
var should_flip := _should_flip_horizontal()
if animation == _current_animation and should_flip == _is_flipped:
return
_current_animation = animation
_is_flipped = should_flip
for part in _all_parts:
part.animation = animation
part.play()
part.flip_h = should_flip
func OnAnimationFinished() -> void:
if _current_animation.begins_with("drawing-bow-"):
DrawingBowAnimationFinished.emit()
elif _current_animation.begins_with("firing-arrow-"):
FiringArrowAnimationFinished.emit()
AnimationFinished.emit(_current_animation)
func PlaySpecifiedAnimation(animation_name: String) -> void:
_current_animation = animation_name
for part in _all_parts:
part.animation = animation_name
part.play()
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
_all_parts = [
full
]
UpdateSprite()
func _build_animation_name(state: BaseState, direction: Enums.Directions) -> String:
# e.g. "idle-down", "walking-up"
var state_str := state.GetAnimationBaseName().replace("_", "-")
var direction_str := _direction_to_animation_state(direction)
return "%s-%s" % [state_str, direction_str]
func _direction_to_animation_state(direction: Enums.Directions) -> String:
if direction == Enums.Directions.LEFT or direction == Enums.Directions.RIGHT:
return "side"
return Enums.Directions.keys()[direction].to_lower()
func _should_flip_horizontal() -> bool:
return direction_component.GetCurrentDirection() == Enums.Directions.LEFT

View File

@@ -0,0 +1 @@
uid://cuar23q48cbja

View File

@@ -0,0 +1,58 @@
extends Node
class_name PlayerStateMachine
signal StateChanged
enum States {
UNSET, IDLE, WALKING, USING_ITEM_A, DRAWING_BOW, FIRING_ARROW,
SITTING, CUTSCENE, PLAY_ANIMATION
}
@export var states_container: Node
@export var current_state: BaseState
var state_dict := {}
var queued_state: PlayerStateMachine.States = PlayerStateMachine.States.UNSET
var queued_parameters: Dictionary = {}
# Public Methods
func GetCurrentStateEnum() -> States:
return current_state.GetStateEnum()
func QueueStateChange(to_state_enum: PlayerStateMachine.States, extra_parameters: Dictionary = {}) -> void:
queued_state = to_state_enum
queued_parameters = extra_parameters
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
var children := states_container.get_children()
for child in children:
if child is not BaseState:
continue
var state := child as BaseState
state_dict[state.GetStateEnum()] = state
if current_state:
current_state.Enter({})
func _process(delta: float) -> void:
if current_state:
current_state.Update(delta)
if queued_state != PlayerStateMachine.States.UNSET:
_swap_state()
func _swap_state() -> void:
if current_state:
current_state.Exit()
current_state = state_dict[queued_state] as BaseState
current_state.Enter(queued_parameters)
queued_state = PlayerStateMachine.States.UNSET
queued_parameters = {}
StateChanged.emit()

View File

@@ -0,0 +1 @@
uid://c74mhfemxuuco