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

@@ -1,33 +0,0 @@
extends CharacterBody2D
enum States {
IDLE,
PECKING
}
@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D
var current_state := States.IDLE
var pecking_sched := randf_range(8.0, 25.0)
var pecking_timer := 0.0
func _ready() -> void:
_print_sched()
func _process(delta: float) -> void:
if current_state == States.IDLE:
pecking_timer += delta
if pecking_timer >= pecking_sched:
current_state = States.PECKING
animated_sprite_2d.play("pecking")
await animated_sprite_2d.animation_finished
animated_sprite_2d.play("idle")
pecking_sched = randf_range(8.0, 25.0)
pecking_timer = 0
current_state = States.IDLE
_print_sched()
func _print_sched() -> void:
print("%s Pecking Schedule: %f" % [name, pecking_sched])

View File

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

View File

@@ -1,10 +0,0 @@
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

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

View File

@@ -1,33 +0,0 @@
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

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

View File

@@ -1,29 +0,0 @@
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

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

View File

@@ -1,37 +0,0 @@
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

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

View File

@@ -1,31 +0,0 @@
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

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

View File

@@ -1,47 +0,0 @@
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

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

View File

@@ -1,30 +0,0 @@
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

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

View File

@@ -1,25 +0,0 @@
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

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

View File

@@ -1,15 +0,0 @@
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

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

View File

@@ -1,27 +0,0 @@
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

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

View File

@@ -1,28 +0,0 @@
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

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

View File

@@ -1,18 +0,0 @@
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

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

View File

@@ -1,18 +0,0 @@
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

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

View File

@@ -1,78 +0,0 @@
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

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

View File

@@ -1,58 +0,0 @@
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

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

View File

@@ -1,22 +0,0 @@
extends Node
# Exports
@export var player: PlayerCharacter
@export var arrow_parent: Node2D
# Preloads
const wooden_arrow_scene: PackedScene = preload("uid://b2wq5m01b68rx")
# Private Methods
func _ready() -> void:
var firing_arrow_state: FiringArrowState = player.get_node("State Machine/States/Firing Arrow State")
firing_arrow_state.ArrowFired.connect(_on_arrow_fired)
func _on_arrow_fired(fire_position: Vector2, direction: Vector2) -> void:
var wooden_arrow := wooden_arrow_scene.instantiate() as BaseProjectile
wooden_arrow.SetProjectileStartAndDirection(fire_position, direction)
if arrow_parent == null:
return
arrow_parent.add_child(wooden_arrow)

View File

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

View File

@@ -1,8 +0,0 @@
extends Node
var location_items: AbstractLocationItems
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
# TODO Will have an APLocationItems, select the correct one
location_items = LocationItems.new()

View File

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

View File

@@ -1,53 +0,0 @@
extends Node
func GetAllTreasureChests() -> Array[BaseChest]:
var nodes := get_tree().get_nodes_in_group("Treasure Chest Group")
var arr: Array[BaseChest] = []
for node in nodes:
if node is BaseChest:
arr.append(node as BaseChest)
return arr
func GetAllInteractiveLoadingZones() -> Array[InteractiveLoadingZone]:
var nodes := get_tree().get_nodes_in_group("Interactive Loading Zone Group")
var arr: Array[InteractiveLoadingZone] = []
for node in nodes:
if node is InteractiveLoadingZone:
arr.append(node)
return arr
func GetAllLoadingZoneTransporters() -> Array[LoadingZoneTransporter]:
var nodes := get_tree().get_nodes_in_group("Loading Zone Transporter Group")
var arr: Array[LoadingZoneTransporter] = []
for node in nodes:
if node is LoadingZoneTransporter:
arr.append(node)
return arr
func GetAllDialogueTriggers() -> Array[DialogueTrigger]:
var nodes := get_tree().get_nodes_in_group("Dialog Trigger Group")
var arr: Array[DialogueTrigger] = []
for node in nodes:
if node is DialogueTrigger:
arr.append(node)
return arr
func GetPlayer() -> PlayerCharacter:
var nodes := get_tree().get_nodes_in_group("Player Group")
if nodes.is_empty():
return null
return nodes[0] as PlayerCharacter

View File

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

View File

@@ -1,16 +0,0 @@
extends Node
var _actions_to_ignore: Array[StringName] = []
# Public Methods
func IgnoreAction(action_name: StringName) -> void:
_actions_to_ignore.append(action_name)
func ShouldIgnoreAction(action_name: StringName) -> bool:
return _actions_to_ignore.has(action_name)
# Private Methods
func _process(_delta: float) -> void:
_actions_to_ignore = []

View File

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

View File

@@ -1,25 +0,0 @@
extends Node
const HOME_01 = preload("uid://laxewy7irxno")
const PATH_TO_DUNGEON_01 = preload("uid://b07m0k40dh042")
const SHOP = preload("uid://bwt0ijoq4qmhn")
@onready var mapping := {
Enums.MapIds.SHOP_01: SHOP,
Enums.MapIds.PATH_TO_FOREST_DUNGEON_01: PATH_TO_DUNGEON_01,
Enums.MapIds.PATH_TO_FOREST_HOME_01: HOME_01
}
var _spawn_marker: String
# Public Methods
func GetMap(map_id: Enums.MapIds) -> PackedScene:
return mapping[map_id]
func SetSpawnMarker(marker_name: String) -> void:
_spawn_marker = marker_name
func GetSpawnMarker() -> String:
return _spawn_marker

View File

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

View File

@@ -1,54 +0,0 @@
extends Node
class_name BenchInteractionConnector
# Signals
signal SitOnBenchTriggered(position: Vector2, sitting_direction: Enums.Directions)
# Exports
@export var player: PlayerCharacter
# Private Variables
var _benches_in_range: Array[WoodenBench] = []
# Private Methods
func _ready() -> void:
player.interact_scanner.area_entered.connect(_on_interact_scanned)
player.interact_scanner.area_exited.connect(_on_interact_unscanned)
player.interact_scanner.InteractionActionTriggered.connect(_on_interact_triggered)
func _on_interact_scanned(area: Area2D) -> void:
var parent := area.get_parent()
if parent == null or parent is not WoodenBench or _benches_in_range.has(parent):
return
_benches_in_range.append(parent)
func _on_interact_unscanned(area: Area2D) -> void:
var parent: Node = area.get_parent()
if parent == null or parent is not WoodenBench or !_benches_in_range.has(parent):
return
_benches_in_range.erase(parent)
func _on_interact_triggered() -> void:
if _benches_in_range.is_empty():
return
var bench := _benches_in_range[0]
var sitting_spots_container := bench.get_node("Sitting Spots") as Node2D
var sitting_spot_markers := sitting_spots_container.get_children()
var closest_marker: Marker2D
var distance_to_player := 9999.0
for node in sitting_spot_markers:
var marker := node as Marker2D
var distance := marker.global_position.distance_to(player.global_position)
if distance < distance_to_player:
closest_marker = marker
distance_to_player = distance
if !closest_marker:
return
player.SitOnFurnitureTriggered.emit(closest_marker.global_position, Enums.Directions.DOWN)

View File

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

View File

@@ -1,26 +0,0 @@
extends Area2D
@export var camera_to_limit: Camera2D
@export var auto_limit := true
func _ready() -> void:
if camera_to_limit == null or !auto_limit or get_child_count() == 0:
return
var collision_shape: CollisionShape2D = get_children()[0]
if collision_shape.shape is not RectangleShape2D:
return
var limits := _get_normalized_limits(collision_shape)
camera_to_limit.limit_left = limits.position.x
camera_to_limit.limit_top = limits.position.y
camera_to_limit.limit_right = limits.end.x
camera_to_limit.limit_bottom = limits.end.y
func _get_normalized_limits(collision_shape: CollisionShape2D) -> Rect2i:
var rectangle_shape := collision_shape.shape as RectangleShape2D
var rect_position := collision_shape.position
var size := rectangle_shape.size
var begin := rect_position - size / 2
return Rect2(begin.x, begin.y, size.x, size.y)

View File

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

View File

@@ -1,76 +0,0 @@
extends Node
# Signals
signal OpeningOfOpenedChestAttempted
# Exports
@export var player: PlayerCharacter
@export var auto_connect_all_chests := true
# Private Variables
var _chests_in_range: Array[BaseChest] = []
# Private Methods
func _ready() -> void:
player.interact_scanner.area_entered.connect(_on_interact_scanned)
player.interact_scanner.area_exited.connect(_on_interact_unscanned)
player.interact_scanner.InteractionActionTriggered.connect(_on_interact_triggered)
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.QueueCutsceneState()
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
func _on_interact_scanned(area: Area2D) -> void:
var chest = area.get_parent()
if chest == null or chest is not BaseChest:
return
if _chests_in_range.has(chest):
return
_chests_in_range.append(chest)
func _on_interact_unscanned(area: Area2D) -> void:
var chest = area.get_parent()
if chest == null or chest is not BaseChest:
return
if !_chests_in_range.has(chest):
return
_chests_in_range.erase(chest)
func _on_interact_triggered() -> void:
if _chests_in_range.is_empty():
return
var chest := _chests_in_range[0]
if !chest.is_open:
chest.Open()
else:
chest.OpenAlreadyOpened()
OpeningOfOpenedChestAttempted.emit()

View File

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

View File

@@ -1,12 +0,0 @@
extends Node
@export var player: PlayerCharacter
# Public Methods
func OnPlayerAreaEntered(area: Area2D) -> void:
pass
# Private Methods
func _ready() -> void:
pass

View File

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

View File

@@ -1,35 +0,0 @@
extends Node
# Exports
@export var player: PlayerCharacter
# Private Variables
var _zones_in_range: Array[InteractiveLoadingZone] = []
# Private Methods
func _ready() -> void:
player.interact_scanner.area_entered.connect(_on_interact_scanned)
player.interact_scanner.area_exited.connect(_on_interact_unscanned)
player.interact_scanner.InteractionActionTriggered.connect(_on_interact_triggered)
func _on_interact_scanned(area: Area2D) -> void:
if area is not InteractiveLoadingZone or _zones_in_range.has(area):
return
_zones_in_range.append(area)
func _on_interact_unscanned(area: Area2D) -> void:
if area is not InteractiveLoadingZone or !_zones_in_range.has(area):
return
_zones_in_range.erase(area)
func _on_interact_triggered() -> void:
if _zones_in_range.is_empty():
return
var zone := _zones_in_range[0]
zone.Activate()

View File

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

View File

@@ -1,27 +0,0 @@
extends Node
@onready var item_notification: Label = $"../CanvasLayer/Item Notification"
var current_shop_item: ShopItem = null
# Public Methods
func OnPlayerInteractScannerAreaEntered(area: Area2D) -> void:
if area is not ShopItem:
return
var shop_item := area as ShopItem
if shop_item != current_shop_item:
current_shop_item = shop_item
var check_location := shop_item.check_location
var item := GameManager.location_items.CheckItemAtLocation(check_location)
var item_name: String = Enums.Items.keys()[item]
item_notification.text = item_name
func OnPlayerInteractScannerAreaExited(area: Area2D) -> void:
if area is not ShopItem:
return
if area == current_shop_item:
item_notification.text = ""
current_shop_item = null

View File

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

View File

@@ -1,16 +0,0 @@
extends Node
@export var player: CharacterBody2D
@export var markers: Node2D
# Public Methods
func _ready() -> void:
var marker_name := MapLoader.GetSpawnMarker()
if !marker_name:
return
for child in markers.get_children():
if child.name == marker_name:
var marker := child as Marker2D
var position := marker.global_position
player.position = position

View File

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

View File

@@ -1,2 +0,0 @@
extends Node2D
class_name BaseMap

View File

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

View File

@@ -1,11 +0,0 @@
extends Node2D
@onready var item_notification: Label = $"CanvasLayer/Item Notification"
func _on_player_shop_item_scanned(item_name: String) -> void:
item_notification.text = item_name
func _on_player_shop_item_unscanned() -> void:
item_notification.text = ""

View File

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

View File

@@ -1,14 +0,0 @@
extends StaticBody2D
class_name BaseChest
signal OpeningAnimationStarted
@export var is_open := false
# Public Methods
func Open() -> void:
is_open = true
func OpenAlreadyOpened() -> void:
pass

View File

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

View File

@@ -1,4 +0,0 @@
extends BaseChest
class_name BaseItemChest
@export var item_id: Enums.Items

View File

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

View File

@@ -1,33 +0,0 @@
extends BaseItemChest
@onready var chest_01_sprite: AnimatedSprite2D = $"Sprite"
@export var is_locked := false
@export var locked_message_dialogue_trigger: DialogueTrigger
@export var already_opened_message_dialogue_trigger: DialogueTrigger
# Public Methods
func Open() -> void:
if is_locked:
if locked_message_dialogue_trigger:
locked_message_dialogue_trigger.Trigger()
return
super.Open()
OpeningAnimationStarted.emit()
chest_01_sprite.play("opening")
var item_name: String = Enums.Items.keys()[item_id]
print(item_name)
func OpenAlreadyOpened() -> void:
if already_opened_message_dialogue_trigger:
already_opened_message_dialogue_trigger.Trigger()
# Private Methods
func _ready() -> void:
if is_open:
chest_01_sprite.play("opened")

View File

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

View File

@@ -1,2 +0,0 @@
extends StaticBody2D
class_name WoodenBench

View File

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

View File

@@ -1,10 +0,0 @@
extends Area2D
class_name DialogueTrigger
signal DialogueTriggered(dialogue_name: String)
@export var dialogue_name: String
# Public Methods
func Trigger() -> void:
DialogueTriggered.emit(dialogue_name)

View File

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

View File

@@ -1,17 +0,0 @@
extends StaticBody2D
@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D
@onready var collision_shape_2d: CollisionShape2D = $CollisionShape2D
var is_open := false
func OpenGate() -> void:
if is_open:
return
is_open = true
sprite.play("opening")
await sprite.animation_finished
collision_shape_2d.set_deferred("disabled", true)
sprite.play("open")

View File

@@ -1 +0,0 @@
uid://8erg53skow38

View File

@@ -1,11 +0,0 @@
extends Area2D
class_name CollisionLoadingZone
@export var loading_zone_transporter: LoadingZoneTransporter
# Private Methods
func _on_body_entered(body: Node2D) -> void:
if body is not PlayerCharacter:
return
loading_zone_transporter.Activate()

View File

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

View File

@@ -1,8 +0,0 @@
extends Area2D
class_name InteractiveLoadingZone
@export var loading_zone_transporter: LoadingZoneTransporter
# Public Methods
func Activate() -> void:
loading_zone_transporter.Activate()

View File

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

View File

@@ -1,18 +0,0 @@
extends Node
class_name LoadingZoneTransporter
signal MapTransitionQueued(map_id: Enums.MapIds, marker_name: String)
@export var destination_map_id: Enums.MapIds
@export var destination_marker_name: String
var _packed_scene: PackedScene
# Public Methods
func Activate() -> void:
MapTransitionQueued.emit(destination_map_id, destination_marker_name)
# Private Methods
func _ready() -> void:
_packed_scene = MapLoader.GetMap(destination_map_id)

View File

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

View File

@@ -1,15 +0,0 @@
extends Area2D
signal PressurePlateTripped
@onready var animated_sprite_2d: AnimatedSprite2D = $AnimatedSprite2D
var activated := false
func _on_body_entered(body: Node2D) -> void:
if activated:
return
activated = true
animated_sprite_2d.play("activated")
PressurePlateTripped.emit()

View File

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

View File

@@ -1,15 +0,0 @@
extends Area2D
@export var to_alpha := 0.38
@export var fade_out_duration := 0.2
@export var fade_in_duration := 0.2
@export var nodes_to_occlude: Array[Node2D]
func _on_area_entered(_area: Area2D) -> void:
for node in nodes_to_occlude:
get_tree().create_tween().tween_property(node, "self_modulate:a", to_alpha, fade_out_duration)
func _on_area_exited(_area: Area2D) -> void:
for node in nodes_to_occlude:
get_tree().create_tween().tween_property(node, "self_modulate:a", 1.0, fade_in_duration)

View File

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

View File

@@ -1,78 +0,0 @@
extends Node2D
@export var leaf_texture: Texture2D
@export var spawn_markers: Node2D
@export var destination_markers: Node2D
var _spawn_markers: Array[Marker2D] = []
var _destination_markers: Array[Marker2D] = []
var _spawn_schedule := 0.0
var _spawn_timer := 0.0
# Private Methods
func _ready() -> void:
for child in spawn_markers.get_children():
_spawn_markers.append(child)
for child in destination_markers.get_children():
_destination_markers.append(child)
_set_random_spawn_schedule()
# At spawn, we might want to spawn some leaves sooner...
_spawn_schedule -= randf_range(0.0, 15.0)
_spawn_schedule = max(0, _spawn_schedule)
print("%s - Leaf Spawn Schedule: %f" % [get_parent().name, _spawn_schedule])
# Debug
_spawn_schedule = randf_range(1.0, 3.0)
func _process(delta: float) -> void:
_spawn_timer += delta
if _spawn_timer >= _spawn_schedule:
_spawn_timer = 0.0
_set_random_spawn_schedule()
var spawn := _get_random_spawn_point()
var destination := _get_random_destination_point()
# TODO Refactor this into scene
var sprite := Sprite2D.new()
sprite.texture = leaf_texture
sprite.position = spawn
sprite.rotate(deg_to_rad(randf_range(0, 360)))
var tween := get_tree().create_tween().tween_property(sprite, "position", destination, randf_range(2.0, 3.0))
tween.finished.connect(
func():
var timer := get_tree().create_timer(randf_range(8.0, 15.0))
timer.timeout.connect(
func():
if !sprite: return
var tween2 := get_tree().create_tween().tween_property(sprite, "self_modulate:a", 0.0, randf_range(4.0, 6.0))
tween2.finished.connect(
func():
if !sprite: return
sprite.queue_free()
)
)
)
add_child(sprite)
func _set_random_spawn_schedule() -> void:
_spawn_schedule = randf_range(20.0, 60.0)
func _get_random_spawn_point() -> Vector2:
var idx := randi_range(0, len(_spawn_markers) - 1)
var marker := _spawn_markers[idx]
return marker.position
func _get_random_destination_point() -> Vector2:
var idx := randi_range(0, len(_destination_markers) - 1)
var marker := _destination_markers[idx]
var offset := Vector2(randf_range(-5.0, 5.0), randf_range(-5.0, 5.0))
return marker.position + offset

View File

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

View File

@@ -1,17 +0,0 @@
extends CharacterBody2D
class_name BaseProjectile
@export var direction: Vector2
@export var speed := 100
# Public Methods
func SetProjectileStartAndDirection(start_position: Vector2, projectile_direction: Vector2) -> void:
position = start_position
direction = projectile_direction
rotation = projectile_direction.angle()
# Private Methods
func _physics_process(delta: float) -> void:
velocity = direction * speed * delta
move_and_slide()

View File

@@ -1 +0,0 @@
uid://8q26ldhfyijx

View File

@@ -1,29 +0,0 @@
extends BaseProjectile
class_name WoodenArrow
@onready var animation_player: AnimationPlayer = $AnimationPlayer
var _despawn_queued := false
# Private Methods
func _ready() -> void:
speed = 8000
func _on_collision_detector_area_entered(_area: Area2D) -> void:
queue_despawn()
func _on_collision_detector_body_entered(body: Node2D) -> void:
if body == self: return
queue_despawn()
func queue_despawn() -> void:
if _despawn_queued: return
_despawn_queued = true
animation_player.play("shaking")
await animation_player.animation_finished
queue_free()

View File

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

View File

@@ -1,8 +0,0 @@
extends Area2D
signal TargetHit
func _on_body_entered(body: Node2D) -> void:
if body is not CharacterBody2D:
return
TargetHit.emit()

View File

@@ -1 +0,0 @@
uid://6jls1eokv2to

View File

@@ -1,13 +0,0 @@
extends Area2D
class_name ShopItem
@export var check_location: Enums.CheckLocations
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(_delta: float) -> void:
pass

View File

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

View File

@@ -1,46 +0,0 @@
extends Control
class_name DialogueBox
signal DialogueStarted
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:
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"):
var finished := _proceed_dialogue()
if finished:
visible = false
DialogueEnded.emit()

View File

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

View File

@@ -1 +0,0 @@
extends CanvasLayer

View File

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

View File

@@ -1,10 +0,0 @@
extends Node2D
#@export var initial_map: PackedScene
#
#@onready var world: Node2D = $World
#
## Called when the node enters the scene tree for the first time.
#func _ready() -> void:
#var map := initial_map.instantiate()
#world.add_child(map)

View File

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

View File

@@ -1,42 +0,0 @@
extends Node
signal MapChanged(map_id: Enums.MapIds)
@export var initial_map_id: Enums.MapIds
@onready var world: Node2D = $"../World"
# Private Methods
func _ready() -> void:
var map_scene := MapLoader.GetMap(initial_map_id)
var map := map_scene.instantiate()
world.add_child(map)
await map.ready
_connect_loading_zone_transporters()
MapChanged.emit(initial_map_id)
func _on_map_transition_queued(map_id: Enums.MapIds, marker_name: String) -> void:
print("Map Transition Queued: %s" % [Enums.MapIds.keys()[map_id]])
var map_scene := MapLoader.GetMap(map_id)
MapLoader.SetSpawnMarker(marker_name)
for child in world.get_children():
child.queue_free()
await child.tree_exited
var map := map_scene.instantiate()
world.call_deferred("add_child", map)
await map.ready
_connect_loading_zone_transporters()
MapChanged.emit(map_id)
func _connect_loading_zone_transporters() -> void:
var loading_zone_transporters := GroupUtils.GetAllLoadingZoneTransporters()
print("Loading Zones: %d" % len(loading_zone_transporters))
for transporter in loading_zone_transporters:
transporter.MapTransitionQueued.connect(_on_map_transition_queued)

View File

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

Some files were not shown because too many files have changed in this diff Show More