diff --git a/Assets/Aseprite Files/Home_01_Overlay_01.aseprite b/Assets/Aseprite Files/Home_01_Overlay_01.aseprite new file mode 100644 index 0000000..03ecd70 Binary files /dev/null and b/Assets/Aseprite Files/Home_01_Overlay_01.aseprite differ diff --git a/Scenes/Characters/Player/player.tscn b/Scenes/Characters/Player/player.tscn index 09c9fef..2ebbd39 100644 --- a/Scenes/Characters/Player/player.tscn +++ b/Scenes/Characters/Player/player.tscn @@ -24,11 +24,12 @@ radius = 12.0 [sub_resource type="RectangleShape2D" id="RectangleShape2D_fu1fx"] size = Vector2(6, 5) -[node name="Player" type="CharacterBody2D" unique_id=1502234578 node_paths=PackedStringArray("player_sprite", "state_machine") groups=["Player Group"]] +[node name="Player" type="CharacterBody2D" unique_id=1502234578 node_paths=PackedStringArray("player_sprite", "state_machine", "interact_scanner") groups=["Player Group"]] y_sort_enabled = true script = ExtResource("1_qqvsf") player_sprite = NodePath("Player Sprite") state_machine = NodePath("State Machine") +interact_scanner = NodePath("Marker2D/InteractScanner") [node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=495465356] position = Vector2(0, 4.5) @@ -116,8 +117,6 @@ position = Vector2(0, 9.5) shape = SubResource("RectangleShape2D_fu1fx") debug_color = Color(0.79959095, 0.41617078, 0.18507844, 0.41960785) -[connection signal="CutsceneEnded" from="." to="State Machine/States/Cutscene State" method="OnCutsceneEnded"] -[connection signal="CutsceneStarted" from="." to="State Machine/States/Idle State" method="OnCutsceneStarted"] [connection signal="SitOnFurnitureTriggered" from="." to="State Machine/States/Idle State" method="OnSitOnFurnitureTriggered"] [connection signal="DirectionChanged" from="Components/FacingDirectionComponent" to="Player Sprite" method="UpdateSprite"] [connection signal="DirectionChanged" from="Components/FacingDirectionComponent" to="Marker2D/InteractScanner" method="OnDirectionChanged"] @@ -125,7 +124,6 @@ debug_color = Color(0.79959095, 0.41617078, 0.18507844, 0.41960785) [connection signal="StartedWalking" from="State Machine/States/Walking State" to="Player Sprite" method="UpdateSprite"] [connection signal="PlayerBeganDrawingBow" from="State Machine/States/Drawing Bow State" to="Player Sprite" method="UpdateSprite"] [connection signal="PlayerBeganFiringArrow" from="State Machine/States/Firing Arrow State" to="Player Sprite" method="UpdateSprite"] -[connection signal="PlayerFiredArrow" from="State Machine/States/Firing Arrow State" to="." method="_on_using_item_a_state_arrow_fired"] [connection signal="PlayAnimation" from="State Machine/States/Play Animation State" to="Player Sprite" method="PlaySpecifiedAnimation"] [connection signal="AnimationFinished" from="Player Sprite" to="State Machine/States/Play Animation State" method="OnAnimationFinished"] [connection signal="DrawingBowAnimationFinished" from="Player Sprite" to="State Machine/States/Drawing Bow State" method="OnDrawingBowAnimationFinished"] diff --git a/Scenes/Maps/Connectors/bench_interaction_connector.tscn b/Scenes/Maps/Connectors/bench_interaction_connector.tscn index c045818..a23ddb0 100644 --- a/Scenes/Maps/Connectors/bench_interaction_connector.tscn +++ b/Scenes/Maps/Connectors/bench_interaction_connector.tscn @@ -2,6 +2,5 @@ [ext_resource type="Script" uid="uid://c5yjcjk51l4bd" path="res://Scripts/Maps/Connectors/bench_interaction_connector.gd" id="1_34r4h"] -[node name="Bench Interaction Connector" type="Node" unique_id=541204437 node_paths=PackedStringArray("player")] +[node name="Bench Interaction Connector" type="Node" unique_id=541204437] script = ExtResource("1_34r4h") -player = NodePath("") diff --git a/Scenes/Maps/Forest Dungeon Entrance/Interiors/Home_01_Overlay_01.png b/Scenes/Maps/Forest Dungeon Entrance/Interiors/Home_01_Overlay_01.png new file mode 100644 index 0000000..74e60b6 Binary files /dev/null and b/Scenes/Maps/Forest Dungeon Entrance/Interiors/Home_01_Overlay_01.png differ diff --git a/Scenes/Maps/Forest Dungeon Entrance/Interiors/Home_01_Overlay_01.png.import b/Scenes/Maps/Forest Dungeon Entrance/Interiors/Home_01_Overlay_01.png.import new file mode 100644 index 0000000..2790034 --- /dev/null +++ b/Scenes/Maps/Forest Dungeon Entrance/Interiors/Home_01_Overlay_01.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqvnkdyhfa1yq" +path="res://.godot/imported/Home_01_Overlay_01.png-5522c04136136f6c0c2aaf9e86a5116f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Scenes/Maps/Forest Dungeon Entrance/Interiors/Home_01_Overlay_01.png" +dest_files=["res://.godot/imported/Home_01_Overlay_01.png-5522c04136136f6c0c2aaf9e86a5116f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Scenes/Maps/Forest Dungeon Entrance/Interiors/home_01.tscn b/Scenes/Maps/Forest Dungeon Entrance/Interiors/home_01.tscn index 3c48ed9..1315cab 100644 --- a/Scenes/Maps/Forest Dungeon Entrance/Interiors/home_01.tscn +++ b/Scenes/Maps/Forest Dungeon Entrance/Interiors/home_01.tscn @@ -10,6 +10,7 @@ [ext_resource type="PackedScene" uid="uid://b7u4hlvuqiefn" path="res://Scenes/Objects/Chests/Item Chests/item_chest_02 (Metal).tscn" id="4_a58cd"] [ext_resource type="PackedScene" uid="uid://b60nr4wfvijpf" path="res://Scenes/Objects/Dialogue/dialogue_trigger.tscn" id="5_msu6a"] [ext_resource type="Texture2D" uid="uid://bm5ewxv51potl" path="res://Assets/Spritesheets/NPCs/Miner_Mike.png" id="6_x3y8m"] +[ext_resource type="Texture2D" uid="uid://bqvnkdyhfa1yq" path="res://Scenes/Maps/Forest Dungeon Entrance/Interiors/Home_01_Overlay_01.png" id="11_6xfm6"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_7kg22"] size = Vector2(32, 8) @@ -73,15 +74,18 @@ size = Vector2(11, 14) [node name="Home 01" type="Node2D" unique_id=1401818514] y_sort_enabled = true -[node name="Collision Loading Zone Connector" type="Node" parent="." unique_id=483597596] +[node name="Connectors" type="Node" parent="." unique_id=517749045] + +[node name="Collision Loading Zone Connector" type="Node" parent="Connectors" unique_id=483597596] script = ExtResource("1_18bbf") -[node name="Spawn Marker Connector" type="Node" parent="." unique_id=296643918 node_paths=PackedStringArray("player", "markers")] +[node name="Spawn Marker Connector" type="Node" parent="Connectors" unique_id=296643918 node_paths=PackedStringArray("player", "markers")] script = ExtResource("2_16uj4") -player = NodePath("../Player") -markers = NodePath("../Spawn Markers") +player = NodePath("../../Player") +markers = NodePath("../../Spawn Markers") -[node name="Chest Interaction Connector" parent="." unique_id=625804018 instance=ExtResource("3_ec540")] +[node name="Chest Interaction Connector" parent="Connectors" unique_id=625804018 node_paths=PackedStringArray("player") instance=ExtResource("3_ec540")] +player = NodePath("../../Player") [node name="Tilemap" type="Node2D" parent="." unique_id=894627186] y_sort_enabled = true @@ -92,7 +96,7 @@ tile_set = ExtResource("1_rf04x") [node name="Decor" type="TileMapLayer" parent="Tilemap" unique_id=941487815] y_sort_enabled = true -tile_map_data = PackedByteArray("AAADAAQABAAAAAAAAAAEAAUABQAAAAAAAAACAAgAAgAAAAIAAAACAAkAAgAAAAMAAAADAAgAAgACAAIAAAADAAkAAgACAAMAAAAEAAgACQADAAAAAAAMAAUACwAAAAgAAAAIAAMACgAGAAAAAAA=") +tile_map_data = PackedByteArray("AAADAAQABAAAAAAAAAAEAAUABQAAAAAAAAACAAgAAgAAAAIAAAACAAkAAgAAAAMAAAADAAgAAgACAAIAAAADAAkAAgACAAMAAAAEAAgACQADAAAAAAAMAAUACwAAAAgAAAAIAAMACgAGAAAAAAAJAAQAAwAAAAAAAAAKAAQACQABAAAAAAA=") tile_set = ExtResource("1_rf04x") [node name="Decor 2" type="TileMapLayer" parent="Tilemap" unique_id=1988290805] @@ -155,3 +159,9 @@ zoom = Vector2(3, 3) [node name="Player" parent="." unique_id=1502234578 instance=ExtResource("2_lky26")] position = Vector2(108, 139) + +[node name="Overlay" type="Sprite2D" parent="." unique_id=455840170] +position = Vector2(124, 217) +scale = Vector2(0.25, 0.25) +texture = ExtResource("11_6xfm6") +offset = Vector2(16, -436) diff --git a/Scenes/Maps/Forest Dungeon Entrance/path_to_dungeon_01.tscn b/Scenes/Maps/Forest Dungeon Entrance/path_to_dungeon_01.tscn index e1f1cb2..02c515d 100644 --- a/Scenes/Maps/Forest Dungeon Entrance/path_to_dungeon_01.tscn +++ b/Scenes/Maps/Forest Dungeon Entrance/path_to_dungeon_01.tscn @@ -65,15 +65,18 @@ y_sort_enabled = true [node name="Connectors" type="Node" parent="." unique_id=1365901208] -[node name="Chest Interaction Connector" parent="Connectors" unique_id=625804018 instance=ExtResource("1_jtncl")] +[node name="Chest Interaction Connector" parent="Connectors" unique_id=625804018 node_paths=PackedStringArray("player") instance=ExtResource("1_jtncl")] +player = NodePath("../../Player") -[node name="Arrow Spawner" parent="Connectors" unique_id=627092886 node_paths=PackedStringArray("arrow_parent") instance=ExtResource("2_jtncl")] +[node name="Arrow Spawner" parent="Connectors" unique_id=627092886 node_paths=PackedStringArray("player", "arrow_parent") instance=ExtResource("2_jtncl")] +player = NodePath("../../Player") arrow_parent = NodePath("../../Objects/Projectiles") [node name="Bench Interaction Connector" parent="Connectors" unique_id=541204437 node_paths=PackedStringArray("player") instance=ExtResource("3_x6da4")] player = NodePath("../../Player") -[node name="Interactive Loading Zone Connector" parent="Connectors" unique_id=833475826 instance=ExtResource("4_4lnhp")] +[node name="Interactive Loading Zone Connector" parent="Connectors" unique_id=833475826 node_paths=PackedStringArray("player") instance=ExtResource("4_4lnhp")] +player = NodePath("../../Player") [node name="Spawn Marker Connector" parent="Connectors" unique_id=807187299 node_paths=PackedStringArray("player", "markers") instance=ExtResource("5_lphfo")] player = NodePath("../../Player") @@ -337,7 +340,7 @@ destination_marker_name = "Entrance" position = Vector2(278, 474) [node name="Player" parent="." unique_id=1502234578 instance=ExtResource("4_4igim")] -position = Vector2(656, 488) +position = Vector2(89, 450) [node name="Camera2D" type="Camera2D" parent="Player" unique_id=1115720225] position = Vector2(0, 1) diff --git a/Scenes/Maps/base_map.tscn b/Scenes/Maps/base_map.tscn new file mode 100644 index 0000000..7f00c5a --- /dev/null +++ b/Scenes/Maps/base_map.tscn @@ -0,0 +1,8 @@ +[gd_scene format=3 uid="uid://cb7es4u3xy5hw"] + +[ext_resource type="Script" uid="uid://da5dg36wink7x" path="res://Scripts/Maps/base_map.gd" id="1_71ugn"] + +[node name="BaseMap" type="Node2D" unique_id=94057185] +script = ExtResource("1_71ugn") + +[node name="Connectors" type="Node" parent="." unique_id=226687733] diff --git a/Scenes/main.tscn b/Scenes/main.tscn index 409f9e4..b8af70e 100644 --- a/Scenes/main.tscn +++ b/Scenes/main.tscn @@ -13,8 +13,9 @@ script = ExtResource("1_jjgbg") [node name="Map Transitioner" type="Node" parent="." unique_id=1528505665] script = ExtResource("3_kry3j") -[node name="Dialogue Trigger Connector" type="Node" parent="." unique_id=1187622540] +[node name="Dialogue Trigger Connector" type="Node" parent="." unique_id=1187622540 node_paths=PackedStringArray("dialogue_box")] script = ExtResource("4_6bp64") +dialogue_box = NodePath("../Gui/Dialogue Box") [node name="World" type="Node2D" parent="." unique_id=578440549] script = ExtResource("2_bo1nx") diff --git a/Scripts/Characters/Player/States/firing_arrow_state.gd b/Scripts/Characters/Player/States/firing_arrow_state.gd index e751944..2795b80 100644 --- a/Scripts/Characters/Player/States/firing_arrow_state.gd +++ b/Scripts/Characters/Player/States/firing_arrow_state.gd @@ -1,7 +1,8 @@ extends BaseState +class_name FiringArrowState signal PlayerBeganFiringArrow -signal PlayerFiredArrow(spawn_position: Vector2, direction: Vector2) +signal ArrowFired(spawn_position: Vector2, direction: Vector2) @export var direction_component: FacingDirectionComponent @export var arrow_spawn_marker: Marker2D @@ -23,7 +24,7 @@ func Enter(_extra_parameters: Dictionary) -> void: direction = Vector2.UP elif direction_component.current_direction == Enums.Directions.DOWN: direction = Vector2.DOWN - PlayerFiredArrow.emit(position, direction) + ArrowFired.emit(position, direction) func OnFiringArrowAnimationFinished() -> void: diff --git a/Scripts/Characters/Player/player.gd b/Scripts/Characters/Player/player.gd index 8b1effb..2b40e02 100644 --- a/Scripts/Characters/Player/player.gd +++ b/Scripts/Characters/Player/player.gd @@ -1,57 +1,18 @@ extends CharacterBody2D class_name PlayerCharacter -signal InteractScannerAreaEntered(area: Area2D) -signal InteractScannerAreaExited(area: Area2D) - -signal InteractScannerBodyEntered(body: Node2D) -signal InteractScannerBodyExited(body: Node2D) - -signal InteractionActionTriggered() - -signal ArrowFired(fire_position: Vector2, direction: Vector2) +# Signals signal SitOnFurnitureTriggered(sitting_position: Vector2, sitting_direction: Enums.Directions) -signal CutsceneStarted() -signal CutsceneEnded() - -@export var player_sprite: Node2D +# Exports +@export var player_sprite: PlayerSprite @export var state_machine: PlayerStateMachine +@export var interact_scanner: InteractScanner # Public Methods -func OnSitOnFurnitureTriggered(sitting_position: Vector2, sitting_direction: Enums.Directions): - SitOnFurnitureTriggered.emit(sitting_position, sitting_direction) +func QueueCutsceneState() -> void: + state_machine.QueueStateChange(PlayerStateMachine.States.CUTSCENE) -func OnCutsceneStarted() -> void: - CutsceneStarted.emit() - - -func OnCutsceneEnded() -> void: - CutsceneEnded.emit() - - -# Private Methods -func _on_interact_scanner_area_entered(area: Area2D) -> void: - InteractScannerAreaEntered.emit(area) - - -func _on_interact_scanner_area_exited(area: Area2D) -> void: - InteractScannerAreaExited.emit(area) - - -func _on_interact_scanner_body_entered(body: Node2D) -> void: - InteractScannerBodyEntered.emit(body) - - -func _on_interact_scanner_body_exited(body: Node2D) -> void: - InteractScannerBodyExited.emit(body) - - -func _on_interaction_action_triggered() -> void: - if state_machine.current_state.IsStateActionable(): - InteractionActionTriggered.emit() - - -func _on_using_item_a_state_arrow_fired(fire_position: Vector2, direction: Vector2) -> void: - ArrowFired.emit(fire_position, direction) +func QueueEndCutsceneState() -> void: + state_machine.QueueStateChange(PlayerStateMachine.States.IDLE) diff --git a/Scripts/Characters/Player/sprite.gd b/Scripts/Characters/Player/sprite.gd index df5e006..dc91347 100644 --- a/Scripts/Characters/Player/sprite.gd +++ b/Scripts/Characters/Player/sprite.gd @@ -1,22 +1,22 @@ 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 -@onready var base: AnimatedSprite2D = $Base -@onready var hair: AnimatedSprite2D = $Hair -@onready var pants: AnimatedSprite2D = $Pants -@onready var hands: AnimatedSprite2D = $Hands -@onready var shoes: AnimatedSprite2D = $Shoes -var all_parts: Array[AnimatedSprite2D] -var current_animation := "idle-down" -var is_flipped := false +# Private Variables +var _all_parts: Array[AnimatedSprite2D] +var _current_animation := "idle-down" +var _is_flipped := false # Public Methods func UpdateSprite() -> void: @@ -25,37 +25,37 @@ func UpdateSprite() -> void: var animation := _build_animation_name(current_state, current_direction) var should_flip := _should_flip_horizontal() - if animation == current_animation and should_flip == is_flipped: + if animation == _current_animation and should_flip == _is_flipped: return - current_animation = animation - is_flipped = should_flip + _current_animation = animation + _is_flipped = should_flip - for part in all_parts: + 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-"): + if _current_animation.begins_with("drawing-bow-"): DrawingBowAnimationFinished.emit() - elif current_animation.begins_with("firing-arrow-"): + elif _current_animation.begins_with("firing-arrow-"): FiringArrowAnimationFinished.emit() - AnimationFinished.emit(current_animation) + AnimationFinished.emit(_current_animation) func PlaySpecifiedAnimation(animation_name: String) -> void: - current_animation = animation_name - for part in all_parts: + _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, #base, hair, pants, hands, shoes + _all_parts = [ + full ] UpdateSprite() @@ -63,8 +63,8 @@ func _ready() -> void: 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) + var state_str := state.GetAnimationBaseName().replace("_", "-") + var direction_str := _direction_to_animation_state(direction) return "%s-%s" % [state_str, direction_str] diff --git a/Scripts/Entity Spawners/arrow_spawner.gd b/Scripts/Entity Spawners/arrow_spawner.gd index 2776b74..a3c4e9b 100644 --- a/Scripts/Entity Spawners/arrow_spawner.gd +++ b/Scripts/Entity Spawners/arrow_spawner.gd @@ -1,24 +1,22 @@ extends Node +# Exports +@export var player: PlayerCharacter @export var arrow_parent: Node2D +# Preloads const wooden_arrow_scene: PackedScene = preload("uid://b2wq5m01b68rx") -# Public Methods -func OnArrowFired(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) - - # Private Methods func _ready() -> void: - var players := get_tree().get_nodes_in_group("Player Group") - if players == null or players.is_empty() or players[0] is not PlayerCharacter: + 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 - - var player := players[0] as PlayerCharacter - player.ArrowFired.connect(OnArrowFired) + arrow_parent.add_child(wooden_arrow) diff --git a/Scripts/Maps/Connectors/bench_interaction_connector.gd b/Scripts/Maps/Connectors/bench_interaction_connector.gd index dd17d2c..55f3a37 100644 --- a/Scripts/Maps/Connectors/bench_interaction_connector.gd +++ b/Scripts/Maps/Connectors/bench_interaction_connector.gd @@ -1,31 +1,41 @@ extends Node +class_name BenchInteractionConnector +# Signals signal SitOnBenchTriggered(position: Vector2, sitting_direction: Enums.Directions) -@export var player: CharacterBody2D +# Exports +@export var player: PlayerCharacter -var benches_in_range: Array[WoodenBench] = [] +# Private Variables +var _benches_in_range: Array[WoodenBench] = [] -# Public Methods -func OnPlayerInteractScannerAreaEntered(area: Area2D) -> void: +# 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): + if parent == null or parent is not WoodenBench or _benches_in_range.has(parent): return - benches_in_range.append(parent) + _benches_in_range.append(parent) -func OnPlayerInteractScannerAreaExited(area: Area2D) -> void: - var parent = area.get_parent() - if parent == null or parent is not WoodenBench or !benches_in_range.has(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) + _benches_in_range.erase(parent) -func OnPlayerInteractionActionTriggered() -> void: - if benches_in_range.is_empty(): +func _on_interact_triggered() -> void: + if _benches_in_range.is_empty(): return - var bench := benches_in_range[0] + 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() @@ -41,18 +51,4 @@ func OnPlayerInteractionActionTriggered() -> void: if !closest_marker: return - SitOnBenchTriggered.emit(closest_marker.global_position, Enums.Directions.DOWN) - - -# 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(): - 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.SitOnFurnitureTriggered.emit(closest_marker.global_position, Enums.Directions.DOWN) diff --git a/Scripts/Maps/Connectors/chest_interaction_connector.gd b/Scripts/Maps/Connectors/chest_interaction_connector.gd index afdbea9..ee180ca 100644 --- a/Scripts/Maps/Connectors/chest_interaction_connector.gd +++ b/Scripts/Maps/Connectors/chest_interaction_connector.gd @@ -1,53 +1,20 @@ extends Node -# Drop-in that automatically connects signals from player to chest objects -signal ChestInteractedWith(chest: BaseChest) +# Signals signal OpeningOfOpenedChestAttempted +# Exports +@export var player: PlayerCharacter @export var auto_connect_all_chests := true -var chests_in_range: Array[BaseChest] = [] - -# Public Methods -func OnPlayerInteractScannerAreaEntered(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 OnPlayerInteractScannerAreaExited(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 OnPlayerInteractionActionTriggered() -> 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() - +# Private Variables +var _chests_in_range: Array[BaseChest] = [] # Private Methods func _ready() -> void: - var player := GroupUtils.GetPlayer() - if player == null: - return - - player.InteractScannerAreaEntered.connect(OnPlayerInteractScannerAreaEntered) - player.InteractScannerAreaExited.connect(OnPlayerInteractScannerAreaExited) - player.InteractionActionTriggered.connect(OnPlayerInteractionActionTriggered) + 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: @@ -58,7 +25,7 @@ func _on_chest_opening_animation_started() -> void: var player := GroupUtils.GetPlayer() var children := player.get_children() - player.OnCutsceneStarted() + player.QueueCutsceneState() var camera_idx := children.find_custom(func(x): return x is Camera2D) if camera_idx == -1: return @@ -77,4 +44,33 @@ func _on_chest_opening_animation_started() -> void: # 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() diff --git a/Scripts/Maps/Connectors/interactive_loading_zone_connector.gd b/Scripts/Maps/Connectors/interactive_loading_zone_connector.gd index 61ee1ec..8c901fe 100644 --- a/Scripts/Maps/Connectors/interactive_loading_zone_connector.gd +++ b/Scripts/Maps/Connectors/interactive_loading_zone_connector.gd @@ -1,39 +1,35 @@ extends Node +# Exports +@export var player: PlayerCharacter + +# Private Variables var _zones_in_range: Array[InteractiveLoadingZone] = [] -# Public Methods -func OnPlayerInteractScannerAreaEntered(area: Area2D) -> void: +# 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 OnPlayerInteractScannerAreaExited(area: Area2D) -> void: +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 OnPlayerInteractionActionTriggered() -> void: +func _on_interact_triggered() -> void: if _zones_in_range.is_empty(): return var zone := _zones_in_range[0] zone.Activate() - - -# 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(): - 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) diff --git a/Scripts/Maps/base_map.gd b/Scripts/Maps/base_map.gd new file mode 100644 index 0000000..ab001fd --- /dev/null +++ b/Scripts/Maps/base_map.gd @@ -0,0 +1,2 @@ +extends Node2D +class_name BaseMap diff --git a/Scripts/Maps/base_map.gd.uid b/Scripts/Maps/base_map.gd.uid new file mode 100644 index 0000000..6622dee --- /dev/null +++ b/Scripts/Maps/base_map.gd.uid @@ -0,0 +1 @@ +uid://da5dg36wink7x diff --git a/Scripts/UI/dialogue_box.gd b/Scripts/UI/dialogue_box.gd index 25f1ae5..21268ee 100644 --- a/Scripts/UI/dialogue_box.gd +++ b/Scripts/UI/dialogue_box.gd @@ -39,7 +39,7 @@ func _process(_delta: float) -> void: if !visible: return - if Input.is_action_just_pressed("player_interact") and !InputManager.ShouldIgnoreAction("player_interact"): + if Input.is_action_just_pressed("player_interact"): var finished := _proceed_dialogue() if finished: visible = false diff --git a/Scripts/dialogue_trigger_connector.gd b/Scripts/dialogue_trigger_connector.gd index aced2ee..b76d92c 100644 --- a/Scripts/dialogue_trigger_connector.gd +++ b/Scripts/dialogue_trigger_connector.gd @@ -1,30 +1,13 @@ extends Node +# Signals signal DialogueTriggered(dialogue_name: String) -@onready var dialogue_box: DialogueBox = $"../Gui/Dialogue Box" - -var dialogue_triggers_in_area: Array[DialogueTrigger] = [] - -# Public Methods -func OnPlayerInteractScannerAreaEntered(area: Area2D) -> void: - if area is not DialogueTrigger or dialogue_triggers_in_area.has(area): - return - dialogue_triggers_in_area.append(area) - - -func OnPlayerInteractScannerAreaExited(area: Area2D) -> void: - if area is not DialogueTrigger or !dialogue_triggers_in_area.has(area): return - dialogue_triggers_in_area.erase(area) - - -func OnPlayerInteractionActionTriggered() -> void: - if dialogue_triggers_in_area.is_empty(): - return - - var trigger := dialogue_triggers_in_area[0] - trigger.Trigger() +# Exports +@export var dialogue_box: DialogueBox +# Private Variables +var _dialogue_triggers_in_area: Array[DialogueTrigger] = [] # Private Methods func _on_map_changed(map_id: Enums.MapIds) -> void: @@ -32,19 +15,41 @@ func _on_map_changed(map_id: Enums.MapIds) -> void: if !player: return - player.InteractScannerAreaEntered.connect(OnPlayerInteractScannerAreaEntered) - player.InteractScannerAreaExited.connect(OnPlayerInteractScannerAreaExited) - player.InteractionActionTriggered.connect(OnPlayerInteractionActionTriggered) + 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) - dialogue_box.DialogueStarted.connect(player.OnCutsceneStarted) - dialogue_box.DialogueEnded.connect(player.OnCutsceneEnded) + dialogue_box.DialogueStarted.connect(player.QueueCutsceneState) + dialogue_box.DialogueEnded.connect(player.QueueEndCutsceneState) var dialogue_triggers := GroupUtils.GetAllDialogueTriggers() - print("Dialogue Triggers on map [%s]: [%d]" % [Enums.MapIds.keys()[map_id], len(dialogue_triggers)]) for trigger in dialogue_triggers: trigger.DialogueTriggered.connect(_on_dialogue_triggered) func _on_dialogue_triggered(dialogue_name: String) -> void: + # Wait one frame so we don't immediately close dialogue box + # TODO This is stupid + await get_tree().process_frame DialogueTriggered.emit(dialogue_name) + + +func _on_interact_scanned(area: Area2D) -> void: + if area is not DialogueTrigger or _dialogue_triggers_in_area.has(area): + return + _dialogue_triggers_in_area.append(area) + + +func _on_interact_unscanned(area: Area2D) -> void: + if area is not DialogueTrigger or !_dialogue_triggers_in_area.has(area): + return + _dialogue_triggers_in_area.erase(area) + + +func _on_interact_triggered() -> void: + if _dialogue_triggers_in_area.is_empty(): + return + + var trigger := _dialogue_triggers_in_area[0] + trigger.Trigger() diff --git a/Scripts/map_transitioner.gd b/Scripts/map_transitioner.gd index 71fa259..45c8829 100644 --- a/Scripts/map_transitioner.gd +++ b/Scripts/map_transitioner.gd @@ -34,10 +34,6 @@ func _on_map_transition_queued(map_id: Enums.MapIds, marker_name: String) -> voi MapChanged.emit(map_id) -func _connect_signals() -> void: - _connect_loading_zone_transporters() - - func _connect_loading_zone_transporters() -> void: var loading_zone_transporters := GroupUtils.GetAllLoadingZoneTransporters() print("Loading Zones: %d" % len(loading_zone_transporters)) diff --git a/project.godot b/project.godot index 906935b..9fcbd78 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="Archipelago Game" -config/version="beta-1.1" +config/version="beta-1.2" run/main_scene="uid://dqgxg3i307lvr" config/features=PackedStringArray("4.6", "Forward Plus") config/icon="res://icon.svg"