This commit is contained in:
2026-03-14 12:58:55 -05:00
parent 6738e8d217
commit 1c95315496
22 changed files with 313 additions and 45 deletions

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

@@ -1,7 +1,8 @@
extends BaseState
@export var walking_speed := 100
signal StartedWalking
@export var walking_speed := 100
@export var movement_component: MovementComponent
@export var direction_component: FacingDirectionComponent
@export var body: CharacterBody2D
@@ -10,6 +11,10 @@ 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)

View File

@@ -15,7 +15,8 @@ signal SitOnFurnitureTriggered(sitting_position: Vector2, sitting_direction: Enu
signal CutsceneStarted()
signal CutsceneEnded()
@onready var state_machine: PlayerStateMachine = $StateMachine
@export var player_sprite: Node2D
@export var state_machine: PlayerStateMachine
# Public Methods
func OnSitOnFurnitureTriggered(sitting_position: Vector2, sitting_direction: Enums.Directions):

View File

@@ -2,6 +2,7 @@ extends Node2D
signal DrawingBowAnimationFinished
signal FiringArrowAnimationFinished
signal AnimationFinished(animation_name: String)
@export var state_machine: PlayerStateMachine
@export var direction_component: FacingDirectionComponent
@@ -41,6 +42,14 @@ func OnAnimationFinished() -> void:
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.

View File

@@ -1,9 +1,11 @@
extends Node
class_name PlayerStateMachine
signal StateChanged
enum States {
UNSET, IDLE, WALKING, USING_ITEM_A, DRAWING_BOW, FIRING_ARROW,
SITTING, CUTSCENE
SITTING, CUTSCENE, PLAY_ANIMATION
}
@export var states_container: Node
@@ -36,7 +38,6 @@ func _ready() -> void:
current_state.Enter({})
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
if current_state:
current_state.Update(delta)
@@ -53,3 +54,5 @@ func _swap_state() -> void:
current_state.Enter(queued_parameters)
queued_state = PlayerStateMachine.States.UNSET
queued_parameters = {}
StateChanged.emit()

View File

@@ -41,13 +41,40 @@ func OnPlayerInteractionActionTriggered() -> void:
# Private Methods
func _ready() -> void:
var all_players := get_tree().get_nodes_in_group("Player Group")
if all_players == null or all_players.is_empty():
var player := GroupUtils.GetPlayer()
if player == null:
return
for player_node in all_players:
var player := player_node as PlayerCharacter
player.InteractScannerAreaEntered.connect(OnPlayerInteractScannerAreaEntered)
player.InteractScannerAreaExited.connect(OnPlayerInteractScannerAreaExited)
player.InteractionActionTriggered.connect(OnPlayerInteractionActionTriggered)
player.InteractScannerAreaEntered.connect(OnPlayerInteractScannerAreaEntered)
player.InteractScannerAreaExited.connect(OnPlayerInteractScannerAreaExited)
player.InteractionActionTriggered.connect(OnPlayerInteractionActionTriggered)
var chests := GroupUtils.GetAllTreasureChests()
for chest in chests:
chest.OpeningAnimationStarted.connect(_on_chest_opening_animation_started)
func _on_chest_opening_animation_started() -> void:
var player := GroupUtils.GetPlayer()
var children := player.get_children()
player.OnCutsceneStarted()
var camera_idx := children.find_custom(func(x): return x is Camera2D)
if camera_idx == -1: return
# Zoom In
var camera := children[camera_idx] as Camera2D
var current_zoom := camera.zoom
await get_tree().create_tween().tween_property(camera, "zoom", current_zoom + Vector2(2, 2), 0.5).finished
# Player the player's chest opening animation
player.state_machine.QueueStateChange(PlayerStateMachine.States.PLAY_ANIMATION, { "animation_name": "opening-chest-down" })
await player.state_machine.StateChanged
var play_animation_state := player.state_machine.current_state as PlayerPlayAnimationState
await play_animation_state.AnimationFinished
player.state_machine.QueueStateChange(PlayerStateMachine.States.IDLE)
# Zoom back out
await get_tree().create_tween().tween_property(camera, "zoom", current_zoom, 0.5).finished

View File

@@ -1,6 +1,8 @@
extends StaticBody2D
class_name BaseChest
signal OpeningAnimationStarted
@export var is_open := false
# Public Methods

View File

@@ -14,6 +14,8 @@ func Open() -> void:
return
super.Open()
OpeningAnimationStarted.emit()
chest_01_sprite.play("opening")
var item_name: String = Enums.Items.keys()[item_id]

View File

@@ -6,17 +6,41 @@ signal DialogueEnded
@onready var label: Label = $ColorRect/MarginContainer/Label
var _dialogue_arr: PackedStringArray
var _dialogue_idx := 0
var _dialogue_count := 0
# Public Methods
func OnDialogueTriggered(dialogue_name: String) -> void:
label.text = tr(dialogue_name)
var text_arr := tr(dialogue_name).split("<nm>")
_init_dialogue_box(text_arr)
visible = true
DialogueStarted.emit()
# Private Methods
func _init_dialogue_box(text_arr: PackedStringArray) -> void:
_dialogue_arr = text_arr
_dialogue_idx = 0
_dialogue_count = len(text_arr)
label.text = _dialogue_arr[_dialogue_idx]
func _proceed_dialogue() -> bool: # Returns true if no more dialogue
_dialogue_idx += 1
if _dialogue_idx == _dialogue_count:
return true
label.text = _dialogue_arr[_dialogue_idx]
return false
func _process(_delta: float) -> void:
if !visible:
return
if Input.is_action_just_pressed("player_interact") and !InputManager.ShouldIgnoreAction("player_interact"):
visible = false
DialogueEnded.emit()
var finished := _proceed_dialogue()
if finished:
visible = false
DialogueEnded.emit()