From ee00c12ca5c466b4945c4202ca7589f33f5d8030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Wed, 4 Feb 2026 15:38:12 -0300 Subject: [PATCH 01/16] Do not merge! Test scenes only --- project.godot | 2 +- .../guard_old/components/Storyvores.aseprite | 3 + .../guard_old/components/detection_area.gd | 15 + .../components/detection_area.gd.uid | 1 + .../guard_old/components/exclamation_mark.png | 3 + .../components/exclamation_mark.png.import | 40 ++ .../guard_old/components/field_of_view.png | 3 + .../components/field_of_view.png.import | 40 ++ .../enemies/guard_old/components/guard_old.gd | 482 ++++++++++++++++++ .../guard_old/components/guard_old.gd.uid | 1 + .../components/guard_old_movement.gd | 85 +++ .../components/guard_old_movement.gd.uid | 1 + .../components/guard_sprite_frames.tres | 133 +++++ .../enemies/guard_old/components/light.gd | 54 ++ .../enemies/guard_old/components/light.gd.uid | 1 + .../components/storyvore_attack_blue.png | 3 + .../storyvore_attack_blue.png.import | 40 ++ .../components/storyvore_attack_gray.png | 3 + .../storyvore_attack_gray.png.import | 40 ++ .../components/storyvore_attack_green.png | 3 + .../storyvore_attack_green.png.import | 40 ++ .../components/storyvore_attack_orange.png | 3 + .../storyvore_attack_orange.png.import | 40 ++ .../components/storyvore_attack_red.png | 3 + .../storyvore_attack_red.png.import | 40 ++ .../components/storyvore_frames_blue.tres | 184 +++++++ .../components/storyvore_frames_gray.tres | 184 +++++++ .../components/storyvore_frames_green.tres | 184 +++++++ .../components/storyvore_frames_orange.tres | 184 +++++++ .../components/storyvore_frames_red.tres | 184 +++++++ .../components/storyvore_idle_blue.png | 3 + .../components/storyvore_idle_blue.png.import | 40 ++ .../components/storyvore_idle_gray.png | 3 + .../components/storyvore_idle_gray.png.import | 40 ++ .../components/storyvore_idle_green.png | 3 + .../storyvore_idle_green.png.import | 40 ++ .../components/storyvore_idle_orange.png | 3 + .../storyvore_idle_orange.png.import | 40 ++ .../components/storyvore_idle_red.png | 3 + .../components/storyvore_idle_red.png.import | 40 ++ .../components/storyvore_move_blue.png | 3 + .../components/storyvore_move_blue.png.import | 40 ++ .../components/storyvore_move_gray.png | 3 + .../components/storyvore_move_gray.png.import | 40 ++ .../components/storyvore_move_green.png | 3 + .../storyvore_move_green.png.import | 40 ++ .../components/storyvore_move_orange.png | 3 + .../storyvore_move_orange.png.import | 40 ++ .../components/storyvore_move_red.png | 3 + .../components/storyvore_move_red.png.import | 40 ++ .../components/storyvoretorch_attack_blue.png | 3 + .../storyvoretorch_attack_blue.png.import | 40 ++ .../components/storyvoretorch_attack_gray.png | 3 + .../storyvoretorch_attack_gray.png.import | 40 ++ .../storyvoretorch_attack_green.png | 3 + .../storyvoretorch_attack_green.png.import | 40 ++ .../storyvoretorch_attack_orange.png | 3 + .../storyvoretorch_attack_orange.png.import | 40 ++ .../components/storyvoretorch_attack_red.png | 3 + .../storyvoretorch_attack_red.png.import | 40 ++ .../storyvoretorch_frames_blue.tres | 184 +++++++ .../storyvoretorch_frames_gray.tres | 184 +++++++ .../storyvoretorch_frames_green.tres | 184 +++++++ .../storyvoretorch_frames_orange.tres | 184 +++++++ .../components/storyvoretorch_frames_red.tres | 184 +++++++ .../components/storyvoretorch_idle_blue.png | 3 + .../storyvoretorch_idle_blue.png.import | 40 ++ .../components/storyvoretorch_idle_gray.png | 3 + .../storyvoretorch_idle_gray.png.import | 40 ++ .../components/storyvoretorch_idle_green.png | 3 + .../storyvoretorch_idle_green.png.import | 40 ++ .../components/storyvoretorch_idle_orange.png | 3 + .../storyvoretorch_idle_orange.png.import | 40 ++ .../components/storyvoretorch_idle_red.png | 3 + .../storyvoretorch_idle_red.png.import | 40 ++ .../components/storyvoretorch_move_blue.png | 3 + .../storyvoretorch_move_blue.png.import | 40 ++ .../components/storyvoretorch_move_gray.png | 3 + .../storyvoretorch_move_gray.png.import | 40 ++ .../components/storyvoretorch_move_green.png | 3 + .../storyvoretorch_move_green.png.import | 40 ++ .../components/storyvoretorch_move_orange.png | 3 + .../storyvoretorch_move_orange.png.import | 40 ++ .../components/storyvoretorch_move_red.png | 3 + .../storyvoretorch_move_red.png.import | 40 ++ .../enemies/guard_old/guard_old.tscn | 341 +++++++++++++ scenes/game_logic/stealth_game_logic.gd | 2 +- scenes/guard_test.tscn | 226 ++++++++ 88 files changed, 4561 insertions(+), 2 deletions(-) create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/Storyvores.aseprite create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/detection_area.gd create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/detection_area.gd.uid create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/exclamation_mark.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/exclamation_mark.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/field_of_view.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/field_of_view.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/guard_old.gd create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/guard_old.gd.uid create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/guard_old_movement.gd create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/guard_old_movement.gd.uid create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/guard_sprite_frames.tres create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/light.gd create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/light.gd.uid create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_blue.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_blue.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_gray.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_gray.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_green.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_green.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_orange.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_orange.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_red.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_red.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_blue.tres create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_gray.tres create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_green.tres create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_orange.tres create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_red.tres create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_blue.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_blue.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_gray.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_gray.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_green.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_green.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_orange.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_orange.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_red.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_red.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_blue.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_blue.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_gray.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_gray.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_green.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_green.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_orange.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_orange.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_red.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_red.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_blue.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_blue.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_gray.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_gray.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_green.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_green.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_orange.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_orange.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_red.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_red.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_blue.tres create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_gray.tres create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_green.tres create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_orange.tres create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_red.tres create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_blue.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_blue.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_gray.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_gray.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_green.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_green.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_orange.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_orange.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_red.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_red.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_blue.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_blue.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_gray.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_gray.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_green.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_green.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_orange.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_orange.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_red.png create mode 100644 scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_red.png.import create mode 100644 scenes/game_elements/characters/enemies/guard_old/guard_old.tscn create mode 100644 scenes/guard_test.tscn diff --git a/project.godot b/project.godot index 0ee44379c3..7aa14a5180 100644 --- a/project.godot +++ b/project.godot @@ -12,7 +12,7 @@ config_version=5 config/name="Threadbare" config/tags=PackedStringArray("2d", "endless", "game", "tilemap", "top_down") -run/main_scene="uid://huuo8mnwsphv" +run/main_scene="uid://ch44gyrcaqccd" config/project_settings_override="user://custom_overrides.cfg" config/features=PackedStringArray("4.6", "GL Compatibility") boot_splash/stretch_mode=0 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/Storyvores.aseprite b/scenes/game_elements/characters/enemies/guard_old/components/Storyvores.aseprite new file mode 100644 index 0000000000..34c6e0b989 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/Storyvores.aseprite @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29d89138bf292a75e775700afa964fe6041405f61bd0676db35f12acc2f5dd47 +size 104373 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/detection_area.gd b/scenes/game_elements/characters/enemies/guard_old/components/detection_area.gd new file mode 100644 index 0000000000..ff8075300c --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/detection_area.gd @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: The Threadbare Authors +# SPDX-License-Identifier: MPL-2.0 +extends Area2D + +const LOOK_AT_TURN_SPEED: float = 10.0 + +@onready var character: CharacterBody2D = owner + + +func _physics_process(delta: float) -> void: + if character.velocity.is_zero_approx(): + return + + var target_angle: float = character.velocity.angle() + rotation = rotate_toward(rotation, target_angle, delta * LOOK_AT_TURN_SPEED) diff --git a/scenes/game_elements/characters/enemies/guard_old/components/detection_area.gd.uid b/scenes/game_elements/characters/enemies/guard_old/components/detection_area.gd.uid new file mode 100644 index 0000000000..cd25f5cf1e --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/detection_area.gd.uid @@ -0,0 +1 @@ +uid://ddqfvux1l2ivu diff --git a/scenes/game_elements/characters/enemies/guard_old/components/exclamation_mark.png b/scenes/game_elements/characters/enemies/guard_old/components/exclamation_mark.png new file mode 100644 index 0000000000..8c4e0af1d5 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/exclamation_mark.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77f54f7bca028ea31c3f6bbacd4bcdfc843fb42aa19482e624d87ec46960cfa5 +size 1290 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/exclamation_mark.png.import b/scenes/game_elements/characters/enemies/guard_old/components/exclamation_mark.png.import new file mode 100644 index 0000000000..58d1d22767 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/exclamation_mark.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b038o41bnypch" +path="res://.godot/imported/exclamation_mark.png-cba541543fb356f1abd89f48bfb125ef.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/exclamation_mark.png" +dest_files=["res://.godot/imported/exclamation_mark.png-cba541543fb356f1abd89f48bfb125ef.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/game_elements/characters/enemies/guard_old/components/field_of_view.png b/scenes/game_elements/characters/enemies/guard_old/components/field_of_view.png new file mode 100644 index 0000000000..d225943313 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/field_of_view.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a01385ba74d362b4fdd27e1abb75c2fabca69595b6c2bf46ebcd7605051da8f0 +size 39619 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/field_of_view.png.import b/scenes/game_elements/characters/enemies/guard_old/components/field_of_view.png.import new file mode 100644 index 0000000000..c3354208fd --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/field_of_view.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cghhmc4v56gcy" +path="res://.godot/imported/field_of_view.png-0750fbdc5eb47b9f156be00619b68f7e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/field_of_view.png" +dest_files=["res://.godot/imported/field_of_view.png-0750fbdc5eb47b9f156be00619b68f7e.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/game_elements/characters/enemies/guard_old/components/guard_old.gd b/scenes/game_elements/characters/enemies/guard_old/components/guard_old.gd new file mode 100644 index 0000000000..73fa8d94fb --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/guard_old.gd @@ -0,0 +1,482 @@ +# SPDX-FileCopyrightText: The Threadbare Authors +# SPDX-License-Identifier: MPL-2.0 +@tool +class_name GuardOld extends CharacterBody2D +## Enemy type that patrols along a path and raises an alert if the player is detected. + +## Emitted when the player is detected. +## [br][br] +## As the name suggests, this is typically a [Player], but may be some +## other [PhysicsBody2D] (or even a [TileMapLayer]) that is in the +## collision layer(s) detected by the guard's detection areas' [member +## Area2D.collision_mask]. +signal player_detected(player: Node2D) + +enum State { + ## Going along the path. + PATROLLING, + ## Player is in sight, it takes some time until the player is detected. + DETECTING, + ## Player was detected. + ALERTED, + ## Player was in sight, going to the last point where the player was seen. + INVESTIGATING, + ## Lost track of player, walking back to the patrol path. + RETURNING, +} + +const DEFAULT_SPRITE_FRAMES = preload("uid://ovu5wqo15s5g") + +@export_category("Appearance") +@export var sprite_frames: SpriteFrames = DEFAULT_SPRITE_FRAMES: + set = _set_sprite_frames +@export_category("Sounds") +## Sound played when a guard's [enum State] enters DETECTING or ALERTED. +@export var alerted_sound_stream: AudioStream: + set = _set_alerted_sound_stream +## Sound played when a guard's moving from one point to the next. +@export var footsteps_sound_stream: AudioStream: + set = _set_footsteps_sound_stream +## Sound played continuously. +@export var idle_sound_stream: AudioStream: + set = _set_idle_sound_stream +## Sound played in bursts after the guard entered [enum State] ALERTED. +@export var alert_others_sound_stream: AudioStream: + set = _set_alert_other_sound_stream + +@export_category("Patrol") +@warning_ignore("unused_private_class_variable") +@export_tool_button("Add/Edit Patrol Path") var _edit_patrol_path: Callable = edit_patrol_path +## The path the guard follows while patrolling. +@export var patrol_path: Path2D: + set(new_value): + patrol_path = new_value + +## The wait time at each patrol point. +@export_range(0, 5, 0.1, "or_greater", "suffix:s") var wait_time: float = 1.0 +## The speed at which the guard moves. +@export_range(20, 300, 5, "or_greater", "or_less", "suffix:m/s") var move_speed: float = 100.0 + +@export_category("Player Detection") +## Whether the player is instantly detected upon being seen. +@export var player_instantly_detected_on_sight: bool = false +## Time required to detect the player. +@export_range(0.1, 5, 0.1, "or_greater", "suffix:s") var time_to_detect_player: float = 1.0 +## Scale factor for the detection area. +@export_range(0.1, 5, 0.1, "or_greater", "or_less") var detection_area_scale: float = 1.0: + set(new_value): + detection_area_scale = new_value + if detection_area: + detection_area.scale = Vector2.ONE * detection_area_scale + +@export_category("Debug") +## Enables movement in the editor for debugging. +@export var move_while_in_editor: bool = false +## Toggles visibility of debug info. +@export var show_debug_info: bool = false + +## Index of the previous patrol point, -1 means that there isn't a previous +## point yet. +var previous_patrol_point_idx: int = -1 +## Index of the current patrol point. +var current_patrol_point_idx: int = 0 +## Last position in which the player was seen. +var last_seen_position: Vector2 +## Breadcrumbs for tracking guards position while investigating, before +## returning to patrol, the guard walks through all these positions. +var breadcrumbs: Array[Vector2] = [] +## Current state of the guard. +var state: State = State.PATROLLING: + set = _set_state + +# The player that's being detected. +var _player: Node2D + +## Area that represents the sight of the guard. If a player is in this area +## and there are no walls in between detected by [member sight_ray_cast], it +## means the player is in sight. +@onready var detection_area: Area2D = %DetectionArea +## Progress bar that indicates how aware the guard is of the player, if it +## is completely filled, [signal player_detected] is triggered. +@onready var player_awareness: TextureProgressBar = %PlayerAwareness +## RayCast used to detect if the sight to a position is blocked. +@onready var sight_ray_cast: RayCast2D = %SightRayCast +## Control to hold debug info that can be toggled on or off. +@onready var debug_info: Label = %DebugInfo + +## Reference to the node controlling the AnimationPlayer for walking / being idle, +## so it can be disabled to play the alerted animation. +@onready +# gdlint:ignore = max-line-length +var character_animation_player_behavior: CharacterAnimationPlayerBehavior = %CharacterAnimationPlayerBehavior + +## Handles the velocity and movement of the guard. +@onready var guard_movement: GuardOldMovement = %GuardMovement +@onready var animated_sprite_2d: AnimatedSprite2D = %AnimatedSprite2D +@onready var animation_player: AnimationPlayer = $AnimationPlayer +@onready var _alert_sound: AudioStreamPlayer = %AlertSound +@onready var _foot_sound: AudioStreamPlayer2D = %FootSound +@onready var _fire_sound: AudioStreamPlayer2D = %FireSound +@onready var _torch_hit_sound: AudioStreamPlayer2D = %TorchHitSound + + +func _get_configuration_warnings() -> PackedStringArray: + var warnings: PackedStringArray + + if not sprite_frames: + warnings.push_back("sprite_frames must be set.") + + for required_animation: StringName in [&"alerted", &"idle", &"walk"]: + if sprite_frames and not sprite_frames.has_animation(required_animation): + warnings.push_back( + "sprite_frames is missing the following animation: %s" % required_animation + ) + + return warnings + + +func _ready() -> void: + if not Engine.is_editor_hint(): + # Player awareness is configured and started empty. + if player_awareness: + player_awareness.max_value = time_to_detect_player + player_awareness.value = 0.0 + + _set_sprite_frames(sprite_frames) + + if detection_area: + detection_area.scale = Vector2.ONE * detection_area_scale + + # When the level starts, the guard is placed at the beginning of the + # patrol path. + if patrol_path: + global_position = _patrol_point_position(0) + + guard_movement.destination_reached.connect(self._on_destination_reached) + guard_movement.still_time_finished.connect(self._on_still_time_finished) + guard_movement.path_blocked.connect(self._on_path_blocked) + + +func _process(delta: float) -> void: + _update_debug_info() + + if Engine.is_editor_hint() and not move_while_in_editor: + return + + _process_state() + guard_movement.move() + + if state != State.ALERTED: + _update_player_awareness(delta) + + _update_animation() + + +## Updates the guard's movement behavior based on its current state. +func _process_state() -> void: + match state: + State.PATROLLING: + if patrol_path: + var target_position: Vector2 = _patrol_point_position(current_patrol_point_idx) + guard_movement.set_destination(target_position) + else: + guard_movement.stop_moving() + State.INVESTIGATING: + guard_movement.set_destination(last_seen_position) + State.RETURNING: + if not breadcrumbs.is_empty(): + var target_position: Vector2 = breadcrumbs.back() + guard_movement.set_destination(target_position) + else: + state = State.PATROLLING + State.ALERTED: + guard_movement.stop_moving() + + +## Changes how PlayerAwareness looks to reflect how close is the player to +## being detected +func _update_player_awareness(delta: float) -> void: + var player_in_sight := _player and not _is_sight_to_point_blocked(_player.global_position) + + player_awareness.value = move_toward( + player_awareness.value, player_awareness.max_value if player_in_sight else 0.0, delta + ) + player_awareness.visible = player_awareness.ratio > 0.0 + player_awareness.modulate.a = clamp(player_awareness.ratio, 0.5, 1.0) + + if player_awareness.ratio >= 1.0: + state = State.ALERTED + player_detected.emit(_player) + + +func _update_animation() -> void: + if state == State.ALERTED: + return + + if velocity.is_zero_approx(): + animation_player.play(&"idle") + else: + animation_player.play(&"walk") + + +func _update_debug_info() -> void: + debug_info.visible = show_debug_info + if not debug_info.visible: + return + debug_info.text = "" + debug_property("position") + debug_value("state", State.keys()[state]) + debug_property("previous_patrol_point_idx") + debug_property("current_patrol_point_idx") + debug_value("time left", "%.2f" % guard_movement.still_time_left_in_seconds) + debug_value("target point", guard_movement.destination) + + +## What happens when the guard reached the point it was walking towards +func _on_destination_reached() -> void: + match state: + State.PATROLLING: + guard_movement.wait_seconds(wait_time) + _advance_target_patrol_point() + State.INVESTIGATING: + guard_movement.wait_seconds(wait_time) + State.RETURNING: + breadcrumbs.pop_back() + + +## What happens when the guard finished waiting on a point. +func _on_still_time_finished() -> void: + match state: + State.INVESTIGATING: + state = State.RETURNING + + +## What happens if the guard cannot reach their destination because it got +## stuck with a collider. +func _on_path_blocked() -> void: + match state: + State.PATROLLING: + guard_movement.wait_seconds(wait_time) + # This check makes sure that if the guard is blocked on start, + # they won't try to set an invalid patrol point as destination. + if previous_patrol_point_idx > -1: + var new_patrol_point: int = previous_patrol_point_idx + previous_patrol_point_idx = current_patrol_point_idx + current_patrol_point_idx = new_patrol_point + State.INVESTIGATING: + state = State.RETURNING + State.RETURNING: + if not breadcrumbs.is_empty(): + breadcrumbs.pop_back() + + +func _set_state(new_state: State) -> void: + if state == new_state: + return + + state = new_state + + match state: + State.DETECTING: + if not _alert_sound.playing: + _alert_sound.play() + State.ALERTED: + character_animation_player_behavior.process_mode = Node.PROCESS_MODE_DISABLED + if not _alert_sound.playing: + _alert_sound.play() + animation_player.play(&"alerted") + player_awareness.ratio = 1.0 + player_awareness.tint_progress = Color.RED + player_awareness.visible = true + State.INVESTIGATING: + guard_movement.start_moving_now() + breadcrumbs.push_back(global_position) + + +## Pass a property name as a parameter and it shows its name and its value +func debug_property(property_name: String) -> void: + debug_value(property_name, get(property_name)) + + +## Pass a value name and its value and it shows it on DebugInfo +func debug_value(value_name: String, value: Variant) -> void: + debug_info.text += "%s: %s\n" % [value_name, value] + + +## Calculate and set the next point in the patrol path. +## The guard would circle back if the path is open, and go in rounds if the +## path is closed. +func _advance_target_patrol_point() -> void: + if not patrol_path or not patrol_path.curve or _amount_of_patrol_points() < 2: + return + + var new_patrol_point_idx: int + + if _is_patrol_path_closed(): + # amount of points - 1 is used here because in a closed path, the + # last and first patrol points are the same. So, this lets us skip + # that repeated point and go for the first one that is different + new_patrol_point_idx = (current_patrol_point_idx + 1) % (_amount_of_patrol_points() - 1) + else: + var at_last_point: bool = current_patrol_point_idx == (_amount_of_patrol_points() - 1) + var at_first_point: bool = current_patrol_point_idx == 0 + var going_backwards_in_path: bool = previous_patrol_point_idx > current_patrol_point_idx + if at_last_point: + # When reaching the end of the path, it starts walking back + new_patrol_point_idx = current_patrol_point_idx - 1 + elif at_first_point: + # If it's at first point is either because it was walking back + # or because it's the first time it will move, in any case, it moves + # forward + new_patrol_point_idx = current_patrol_point_idx + 1 + elif going_backwards_in_path: + new_patrol_point_idx = current_patrol_point_idx - 1 + else: + new_patrol_point_idx = current_patrol_point_idx + 1 + + previous_patrol_point_idx = current_patrol_point_idx + current_patrol_point_idx = new_patrol_point_idx + + +## Checks if a straight line can be traced from the Guard to a certain point. +## It returns true if the path to the point is free of walls. +## Note: it only detects sight_occluders collisions, not wall collisions, this +## is so water doesn't block sight. +func _is_sight_to_point_blocked(point_position: Vector2) -> bool: + sight_ray_cast.target_position = sight_ray_cast.to_local(point_position) + sight_ray_cast.force_raycast_update() + return sight_ray_cast.is_colliding() + + +## Patrol point index to global position +func _patrol_point_position(point_idx: int) -> Vector2: + var local_point_position: Vector2 = patrol_path.curve.get_point_position(point_idx) + return patrol_path.to_global(local_point_position) + + +func _amount_of_patrol_points() -> int: + return patrol_path.curve.point_count + + +## Returns true if the end of the patrol path is the same point as the beginning +func _is_patrol_path_closed() -> bool: + if not patrol_path: + return false + + var curve: Curve2D = patrol_path.curve + if curve.point_count < 3: + return false + + var first_point_position: Vector2 = curve.get_point_position(0) + var last_point_position: Vector2 = curve.get_point_position(curve.point_count - 1) + + return first_point_position.is_equal_approx(last_point_position) + + +## Resets the guard to its initial values and placement on screen so it starts +## patrolling again as if the level just started. +func _reset() -> void: + previous_patrol_point_idx = -1 + current_patrol_point_idx = 0 + velocity = Vector2.ZERO + if patrol_path: + global_position = _patrol_point_position(0) + + +## When the scene is saved, resets the Guard's position to the beginning of +## the patrol path. +func _notification(what: int) -> void: + match what: + NOTIFICATION_EDITOR_PRE_SAVE: + _reset() + + +static func _editor_interface() -> Object: + # TODO: Workaround for https://github.com/godotengine/godot/issues/91713 + # Referencing [class EditorInterface] in scripts that don't run in the editor + # fails to load the script with a parse error. + return Engine.get_singleton("EditorInterface") + + +## Function used for a tool button that either selects the current patrol_path +## in the editor, or creates a new one +func edit_patrol_path() -> void: + if not Engine.is_editor_hint(): + return + + var editor_interface := _editor_interface() + + if patrol_path: + editor_interface.edit_node.call_deferred(patrol_path) + else: + var new_patrol_path: Path2D = Path2D.new() + patrol_path = new_patrol_path + get_parent().add_child(patrol_path) + patrol_path.owner = owner + patrol_path.global_position = global_position + var patrol_path_curve: Curve2D = Curve2D.new() + patrol_path.curve = patrol_path_curve + patrol_path.name = "%s-PatrolPath" % name + patrol_path_curve.add_point(Vector2.ZERO) + patrol_path_curve.add_point(Vector2.RIGHT * 150.0) + editor_interface.edit_node.call_deferred(patrol_path) + + +func _set_sprite_frames(new_sprite_frames: SpriteFrames) -> void: + sprite_frames = new_sprite_frames + if not is_node_ready(): + return + animated_sprite_2d.sprite_frames = sprite_frames + update_configuration_warnings() + + +func _set_alerted_sound_stream(new_value: AudioStream) -> void: + alerted_sound_stream = new_value + if not is_node_ready(): + await ready + _alert_sound.stream = new_value + + +func _set_footsteps_sound_stream(new_value: AudioStream) -> void: + footsteps_sound_stream = new_value + if not is_node_ready(): + await ready + _foot_sound.stream = new_value + + +func _set_idle_sound_stream(new_value: AudioStream) -> void: + idle_sound_stream = new_value + if not is_node_ready(): + await ready + _fire_sound.stream = new_value + + +func _set_alert_other_sound_stream(new_value: AudioStream) -> void: + alert_others_sound_stream = new_value + if not is_node_ready(): + await ready + _torch_hit_sound.stream = new_value + + +func _on_instant_detection_area_body_entered(body: Node2D) -> void: + state = State.ALERTED + player_detected.emit(body) + + +func _on_detection_area_body_entered(body: Node2D) -> void: + _player = body + if _is_sight_to_point_blocked(body.global_position): + return + if player_instantly_detected_on_sight: + state = State.ALERTED + player_detected.emit(_player) + else: + state = State.DETECTING + + +func _on_detection_area_body_exited(body: Node2D) -> void: + _player = null + last_seen_position = body.global_position + if state == State.DETECTING: + guard_movement.stop_moving() + state = State.INVESTIGATING diff --git a/scenes/game_elements/characters/enemies/guard_old/components/guard_old.gd.uid b/scenes/game_elements/characters/enemies/guard_old/components/guard_old.gd.uid new file mode 100644 index 0000000000..c0cc995f44 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/guard_old.gd.uid @@ -0,0 +1 @@ +uid://dox2uqh8s6vb5 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/guard_old_movement.gd b/scenes/game_elements/characters/enemies/guard_old/components/guard_old_movement.gd new file mode 100644 index 0000000000..b9661ee772 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/guard_old_movement.gd @@ -0,0 +1,85 @@ +# SPDX-FileCopyrightText: The Threadbare Authors +# SPDX-License-Identifier: MPL-2.0 +@tool +class_name GuardOldMovement +extends Node2D + +## Emitted when [member still_time_left] reaches 0 +signal still_time_finished +## Emitted when [member guard] reached [member destination] +signal destination_reached +## Emitted when [member guard] got stuck trying to reach [member destination] +signal path_blocked + +## While this time is greater than 0, the guard won't move +var still_time_left_in_seconds: float = 0.0 +var _destination_reached: bool = true + +## Target position into which the guard will move, in absolute coordinates +@onready var destination: Vector2 = Vector2.ZERO +@onready var guard: Node2D = owner + + +func _process(delta: float) -> void: + if still_time_left_in_seconds > 0.0: + still_time_left_in_seconds = move_toward(still_time_left_in_seconds, 0.0, delta) + if still_time_left_in_seconds <= 0.0: + still_time_finished.emit() + + if ( + not _destination_reached + and guard.global_position.distance_to(destination) <= guard.velocity.length() * delta + ): + _destination_reached = true + destination_reached.emit() + + +func move() -> void: + guard.velocity = calculate_velocity() + + guard.move_and_slide() + var collision: KinematicCollision2D = guard.get_last_slide_collision() + + # If the distance it was able to travel is a lot lower than the remainder, + # it's stuck and we can emit the path_blocked signal so the guard can + # handle that case + if collision and collision.get_travel().length() < collision.get_remainder().length() / 20.0: + path_blocked.emit() + + +## Returns the velocity the guard should have, receives the delta time since +## the last frame as a parameter +func calculate_velocity() -> Vector2: + if still_time_left_in_seconds > 0.0 or _destination_reached: + return Vector2.ZERO + return guard.global_position.direction_to(destination) * guard.move_speed + + +## Make the guard stop for the given time, in seconds +func wait_seconds(time: float) -> void: + still_time_left_in_seconds = time + + +## Sets the next point into which the guard will move. +## It won't make the guard move if [member still_time_left_in_seconds] if +## greater than 0. +func set_destination(new_destination: Vector2) -> void: + _destination_reached = false + destination = new_destination + + +func start_moving_now() -> void: + still_time_left_in_seconds = 0.0 + + +## Sets the next point into which the guard will move AND makes it start moving +## even if [member still_time_left_in_seconds] was positive. +func start_moving_towards(new_destination: Vector2) -> void: + set_destination(new_destination) + still_time_left_in_seconds = 0.0 + + +## Sets the destination to the same point the guard is at so it doesn't try to +## travel to any new point +func stop_moving() -> void: + destination = guard.global_position diff --git a/scenes/game_elements/characters/enemies/guard_old/components/guard_old_movement.gd.uid b/scenes/game_elements/characters/enemies/guard_old/components/guard_old_movement.gd.uid new file mode 100644 index 0000000000..584c11aa69 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/guard_old_movement.gd.uid @@ -0,0 +1 @@ +uid://d4b07dhpe64fx diff --git a/scenes/game_elements/characters/enemies/guard_old/components/guard_sprite_frames.tres b/scenes/game_elements/characters/enemies/guard_old/components/guard_sprite_frames.tres new file mode 100644 index 0000000000..a3ca26c812 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/guard_sprite_frames.tres @@ -0,0 +1,133 @@ +[gd_resource type="SpriteFrames" format=3 uid="uid://bon818620ltbi"] + +[ext_resource type="Texture2D" uid="uid://3ee7plbgf8tg" path="res://assets/third_party/tiny-swords/Factions/Goblins/Troops/Torch/Blue/Torch_Blue.png" id="1_g78v0"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_g173s"] +atlas = ExtResource("1_g78v0") +region = Rect2(384, 768, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pnkgp"] +atlas = ExtResource("1_g78v0") +region = Rect2(576, 768, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_iqgov"] +atlas = ExtResource("1_g78v0") +region = Rect2(768, 768, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vnsq3"] +atlas = ExtResource("1_g78v0") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_m6h06"] +atlas = ExtResource("1_g78v0") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x2hsm"] +atlas = ExtResource("1_g78v0") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_frfu0"] +atlas = ExtResource("1_g78v0") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_d2jm8"] +atlas = ExtResource("1_g78v0") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_46hcm"] +atlas = ExtResource("1_g78v0") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jgsr2"] +atlas = ExtResource("1_g78v0") +region = Rect2(1152, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_elbu8"] +atlas = ExtResource("1_g78v0") +region = Rect2(0, 192, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0hcfu"] +atlas = ExtResource("1_g78v0") +region = Rect2(192, 192, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0hsr3"] +atlas = ExtResource("1_g78v0") +region = Rect2(384, 192, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bibtp"] +atlas = ExtResource("1_g78v0") +region = Rect2(576, 192, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ut4jx"] +atlas = ExtResource("1_g78v0") +region = Rect2(768, 192, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5251y"] +atlas = ExtResource("1_g78v0") +region = Rect2(960, 192, 192, 192) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_g173s") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pnkgp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_iqgov") +}], +"loop": true, +"name": &"alerted", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_vnsq3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_m6h06") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x2hsm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_frfu0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_d2jm8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_46hcm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jgsr2") +}], +"loop": true, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_elbu8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0hcfu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0hsr3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bibtp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ut4jx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5251y") +}], +"loop": true, +"name": &"walk", +"speed": 10.0 +}] diff --git a/scenes/game_elements/characters/enemies/guard_old/components/light.gd b/scenes/game_elements/characters/enemies/guard_old/components/light.gd new file mode 100644 index 0000000000..93c9e7ef9b --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/light.gd @@ -0,0 +1,54 @@ +# SPDX-FileCopyrightText: The Threadbare Authors +# SPDX-License-Identifier: MPL-2.0 +@tool +extends PointLight2D + +@warning_ignore("unused_private_class_variable") +@export_tool_button("Generate sibling collision shape") +var _generate_collision_shape := generate_collision_shape +@export var debug_view: bool = false: + set = set_debug_view + +var debug_sprite_2d: Sprite2D + + +func _ready() -> void: + toggle_debug_sprite_2d(debug_view) + + +func set_debug_view(new_value: bool) -> void: + debug_view = new_value + if is_inside_tree(): + toggle_debug_sprite_2d(debug_view) + + +func toggle_debug_sprite_2d(should_show: bool) -> void: + if not Engine.is_editor_hint(): + return + if should_show: + if not debug_sprite_2d: + debug_sprite_2d = Sprite2D.new() + add_child(debug_sprite_2d) + else: + if debug_sprite_2d: + debug_sprite_2d.queue_free() + + +func generate_collision_shape() -> void: + var bitmap := BitMap.new() + bitmap.create_from_image_alpha(texture.get_image(), 0.6) + bitmap.resize(Vector2(bitmap.get_size()) * scale * texture_scale) + var polygons := bitmap.opaque_to_polygons(Rect2(Vector2(0, 0), bitmap.get_size())) + for polygon: PackedVector2Array in polygons: + var collider := CollisionPolygon2D.new() + collider.polygon = polygon + get_parent().add_child(collider, true) + collider.owner = owner + + +func _process(_delta: float) -> void: + if not Engine.is_editor_hint(): + return + if debug_sprite_2d: + debug_sprite_2d.texture = texture + debug_sprite_2d.offset = offset diff --git a/scenes/game_elements/characters/enemies/guard_old/components/light.gd.uid b/scenes/game_elements/characters/enemies/guard_old/components/light.gd.uid new file mode 100644 index 0000000000..925b97014b --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/light.gd.uid @@ -0,0 +1 @@ +uid://dw2jehlpe0ins diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_blue.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_blue.png new file mode 100644 index 0000000000..3caa975ad1 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_blue.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:83b2bcbf6aa0fcd16246792056b5b32f9aeb2d506118127d6cddf02c966273a4 +size 11920 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_blue.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_blue.png.import new file mode 100644 index 0000000000..f10a0e8cbe --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_blue.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dp3j0xesaqyqr" +path="res://.godot/imported/storyvore_attack_blue.png-ea61644ba83baaeb50fc3929e4844d98.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_blue.png" +dest_files=["res://.godot/imported/storyvore_attack_blue.png-ea61644ba83baaeb50fc3929e4844d98.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/game_elements/characters/enemies/guard_old/components/storyvore_attack_gray.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_gray.png new file mode 100644 index 0000000000..e0f969d408 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_gray.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a76670cd590a1c268cf668720bc5463febd95002f36069e4cafc6500739f40a2 +size 11896 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_gray.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_gray.png.import new file mode 100644 index 0000000000..5388afaab9 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_gray.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cp3uo78dmy08q" +path="res://.godot/imported/storyvore_attack_gray.png-fc978ef87bf5e061872b89525571b961.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_gray.png" +dest_files=["res://.godot/imported/storyvore_attack_gray.png-fc978ef87bf5e061872b89525571b961.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/game_elements/characters/enemies/guard_old/components/storyvore_attack_green.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_green.png new file mode 100644 index 0000000000..b7491af225 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_green.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07ff062424e816fa17aeab1af07d795955a91159a3e12548f0980ede47fbbf58 +size 11920 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_green.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_green.png.import new file mode 100644 index 0000000000..1c0e4e96c3 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_green.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://4u3xut4nqjwk" +path="res://.godot/imported/storyvore_attack_green.png-2315425787a2ec7c48de919d4e65fb7b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_green.png" +dest_files=["res://.godot/imported/storyvore_attack_green.png-2315425787a2ec7c48de919d4e65fb7b.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/game_elements/characters/enemies/guard_old/components/storyvore_attack_orange.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_orange.png new file mode 100644 index 0000000000..fcf0a91ef1 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_orange.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b26e1a90a6cc5814c539cb0a085985a4cb92f6e44ca4a465c4efbd7cdc63d03 +size 11913 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_orange.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_orange.png.import new file mode 100644 index 0000000000..d8ebf260fa --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_orange.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://df8r77df057rh" +path="res://.godot/imported/storyvore_attack_orange.png-d57eb95b32819ff970588346c50cf92c.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_orange.png" +dest_files=["res://.godot/imported/storyvore_attack_orange.png-d57eb95b32819ff970588346c50cf92c.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/game_elements/characters/enemies/guard_old/components/storyvore_attack_red.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_red.png new file mode 100644 index 0000000000..c96c9304fe --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_red.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59951f81c826226171dfc31d503bb1c9c859839bfc3cca6dfc3eb0ae00ab60e3 +size 11941 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_red.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_red.png.import new file mode 100644 index 0000000000..60a1b27fd7 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_red.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bj1lqcdjbnsqj" +path="res://.godot/imported/storyvore_attack_red.png-a368fdbcd483ba439f67eae3bb15d957.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_red.png" +dest_files=["res://.godot/imported/storyvore_attack_red.png-a368fdbcd483ba439f67eae3bb15d957.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/game_elements/characters/enemies/guard_old/components/storyvore_frames_blue.tres b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_blue.tres new file mode 100644 index 0000000000..6db4e7ca0f --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_blue.tres @@ -0,0 +1,184 @@ +[gd_resource type="SpriteFrames" format=3 uid="uid://bvu6nlavxayhv"] + +[ext_resource type="Texture2D" uid="uid://dp3j0xesaqyqr" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_blue.png" id="1_6le3u"] +[ext_resource type="Texture2D" uid="uid://bay8swpb3h5ud" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_blue.png" id="2_m2b2f"] +[ext_resource type="Texture2D" uid="uid://dduyb6d10pxru" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_blue.png" id="3_bjpkj"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_a3m8t"] +atlas = ExtResource("1_6le3u") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_hqesp"] +atlas = ExtResource("1_6le3u") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ibijm"] +atlas = ExtResource("1_6le3u") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_m8fc2"] +atlas = ExtResource("1_6le3u") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8xgaa"] +atlas = ExtResource("1_6le3u") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ljsnq"] +atlas = ExtResource("1_6le3u") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ywhk7"] +atlas = ExtResource("2_m2b2f") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7bju3"] +atlas = ExtResource("2_m2b2f") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_q8d2u"] +atlas = ExtResource("2_m2b2f") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3vx6g"] +atlas = ExtResource("2_m2b2f") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wcxyy"] +atlas = ExtResource("2_m2b2f") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8u6m5"] +atlas = ExtResource("2_m2b2f") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dkf3i"] +atlas = ExtResource("2_m2b2f") +region = Rect2(1152, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xn3vn"] +atlas = ExtResource("2_m2b2f") +region = Rect2(1344, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_si0oq"] +atlas = ExtResource("2_m2b2f") +region = Rect2(1536, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rs77g"] +atlas = ExtResource("2_m2b2f") +region = Rect2(1728, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_25idj"] +atlas = ExtResource("2_m2b2f") +region = Rect2(1920, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7ufcq"] +atlas = ExtResource("3_bjpkj") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_l0v8s"] +atlas = ExtResource("3_bjpkj") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bmri7"] +atlas = ExtResource("3_bjpkj") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wu533"] +atlas = ExtResource("3_bjpkj") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_s0jcg"] +atlas = ExtResource("3_bjpkj") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x777c"] +atlas = ExtResource("3_bjpkj") +region = Rect2(960, 0, 192, 192) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_a3m8t") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_hqesp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ibijm") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_m8fc2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8xgaa") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ljsnq") +}], +"loop": true, +"name": &"alerted", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_ywhk7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7bju3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_q8d2u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3vx6g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wcxyy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8u6m5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dkf3i") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xn3vn") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_si0oq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rs77g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_25idj") +}], +"loop": true, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_7ufcq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_l0v8s") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bmri7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wu533") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_s0jcg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x777c") +}], +"loop": true, +"name": &"walk", +"speed": 10.0 +}] diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_gray.tres b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_gray.tres new file mode 100644 index 0000000000..17e171e272 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_gray.tres @@ -0,0 +1,184 @@ +[gd_resource type="SpriteFrames" format=3 uid="uid://vde01jqujr4p"] + +[ext_resource type="Texture2D" uid="uid://cp3uo78dmy08q" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_gray.png" id="1_mdlq8"] +[ext_resource type="Texture2D" uid="uid://kchncmtpv2a5" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_gray.png" id="2_er64o"] +[ext_resource type="Texture2D" uid="uid://dkqmbryfey4w1" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_gray.png" id="3_vbvxu"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_pfijb"] +atlas = ExtResource("1_mdlq8") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tmamq"] +atlas = ExtResource("1_mdlq8") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_i82hb"] +atlas = ExtResource("1_mdlq8") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5w0s2"] +atlas = ExtResource("1_mdlq8") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_v451m"] +atlas = ExtResource("1_mdlq8") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jk4ky"] +atlas = ExtResource("1_mdlq8") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ns45a"] +atlas = ExtResource("2_er64o") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_esxs5"] +atlas = ExtResource("2_er64o") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tpkb2"] +atlas = ExtResource("2_er64o") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ihb8h"] +atlas = ExtResource("2_er64o") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qaa6o"] +atlas = ExtResource("2_er64o") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ryt21"] +atlas = ExtResource("2_er64o") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f76d7"] +atlas = ExtResource("2_er64o") +region = Rect2(1152, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_iey7k"] +atlas = ExtResource("2_er64o") +region = Rect2(1344, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4bvgd"] +atlas = ExtResource("2_er64o") +region = Rect2(1536, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ijw1g"] +atlas = ExtResource("2_er64o") +region = Rect2(1728, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8f32r"] +atlas = ExtResource("2_er64o") +region = Rect2(1920, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vwbvb"] +atlas = ExtResource("3_vbvxu") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_n2uqv"] +atlas = ExtResource("3_vbvxu") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wugj0"] +atlas = ExtResource("3_vbvxu") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0t42y"] +atlas = ExtResource("3_vbvxu") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xpaop"] +atlas = ExtResource("3_vbvxu") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_g3q3p"] +atlas = ExtResource("3_vbvxu") +region = Rect2(960, 0, 192, 192) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_pfijb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tmamq") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_i82hb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5w0s2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_v451m") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jk4ky") +}], +"loop": true, +"name": &"alerted", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_ns45a") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_esxs5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tpkb2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ihb8h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qaa6o") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ryt21") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f76d7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_iey7k") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4bvgd") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ijw1g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8f32r") +}], +"loop": true, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_vwbvb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_n2uqv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wugj0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0t42y") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xpaop") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_g3q3p") +}], +"loop": true, +"name": &"walk", +"speed": 10.0 +}] diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_green.tres b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_green.tres new file mode 100644 index 0000000000..fbe58b2f15 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_green.tres @@ -0,0 +1,184 @@ +[gd_resource type="SpriteFrames" format=3 uid="uid://ca6fhi1ukgnvc"] + +[ext_resource type="Texture2D" uid="uid://4u3xut4nqjwk" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_green.png" id="1_o0s35"] +[ext_resource type="Texture2D" uid="uid://bbhg173t4xatm" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_green.png" id="2_83dr3"] +[ext_resource type="Texture2D" uid="uid://b641qjrueh01g" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_green.png" id="3_c056f"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_86h0i"] +atlas = ExtResource("1_o0s35") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1vda6"] +atlas = ExtResource("1_o0s35") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4wh8j"] +atlas = ExtResource("1_o0s35") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_88rbp"] +atlas = ExtResource("1_o0s35") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_51exf"] +atlas = ExtResource("1_o0s35") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_imrt2"] +atlas = ExtResource("1_o0s35") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f8hmr"] +atlas = ExtResource("2_83dr3") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x8eow"] +atlas = ExtResource("2_83dr3") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_4ccay"] +atlas = ExtResource("2_83dr3") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x0xrw"] +atlas = ExtResource("2_83dr3") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2xa3g"] +atlas = ExtResource("2_83dr3") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_k6dor"] +atlas = ExtResource("2_83dr3") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_sxk83"] +atlas = ExtResource("2_83dr3") +region = Rect2(1152, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3mige"] +atlas = ExtResource("2_83dr3") +region = Rect2(1344, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jf131"] +atlas = ExtResource("2_83dr3") +region = Rect2(1536, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_th6vc"] +atlas = ExtResource("2_83dr3") +region = Rect2(1728, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_17qvl"] +atlas = ExtResource("2_83dr3") +region = Rect2(1920, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2qqfh"] +atlas = ExtResource("3_c056f") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_e36yw"] +atlas = ExtResource("3_c056f") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_058xe"] +atlas = ExtResource("3_c056f") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jtu0m"] +atlas = ExtResource("3_c056f") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_08q0v"] +atlas = ExtResource("3_c056f") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qcy2c"] +atlas = ExtResource("3_c056f") +region = Rect2(960, 0, 192, 192) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_86h0i") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1vda6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4wh8j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_88rbp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_51exf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_imrt2") +}], +"loop": true, +"name": &"alerted", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_f8hmr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x8eow") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_4ccay") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x0xrw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2xa3g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_k6dor") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_sxk83") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3mige") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jf131") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_th6vc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_17qvl") +}], +"loop": true, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_2qqfh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_e36yw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_058xe") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jtu0m") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_08q0v") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qcy2c") +}], +"loop": true, +"name": &"walk", +"speed": 10.0 +}] diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_orange.tres b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_orange.tres new file mode 100644 index 0000000000..b1ae7f6315 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_orange.tres @@ -0,0 +1,184 @@ +[gd_resource type="SpriteFrames" format=3 uid="uid://c60gf6ggpb3ns"] + +[ext_resource type="Texture2D" uid="uid://df8r77df057rh" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_orange.png" id="1_hr5x8"] +[ext_resource type="Texture2D" uid="uid://ckhesyclpgqb" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_orange.png" id="2_tu8fp"] +[ext_resource type="Texture2D" uid="uid://ej7m40q447et" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_orange.png" id="3_atvwo"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_abybu"] +atlas = ExtResource("1_hr5x8") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1hmdy"] +atlas = ExtResource("1_hr5x8") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_an5v4"] +atlas = ExtResource("1_hr5x8") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xg81j"] +atlas = ExtResource("1_hr5x8") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_oodis"] +atlas = ExtResource("1_hr5x8") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_g3p1j"] +atlas = ExtResource("1_hr5x8") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_q6fik"] +atlas = ExtResource("2_tu8fp") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x7ieb"] +atlas = ExtResource("2_tu8fp") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lwyt4"] +atlas = ExtResource("2_tu8fp") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_42ad3"] +atlas = ExtResource("2_tu8fp") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rjsih"] +atlas = ExtResource("2_tu8fp") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mjq7i"] +atlas = ExtResource("2_tu8fp") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ksq43"] +atlas = ExtResource("2_tu8fp") +region = Rect2(1152, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_mmcvy"] +atlas = ExtResource("2_tu8fp") +region = Rect2(1344, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kybr4"] +atlas = ExtResource("2_tu8fp") +region = Rect2(1536, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_toabe"] +atlas = ExtResource("2_tu8fp") +region = Rect2(1728, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_670j8"] +atlas = ExtResource("2_tu8fp") +region = Rect2(1920, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_syj48"] +atlas = ExtResource("3_atvwo") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7b5li"] +atlas = ExtResource("3_atvwo") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jsqt8"] +atlas = ExtResource("3_atvwo") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tta8m"] +atlas = ExtResource("3_atvwo") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vmexr"] +atlas = ExtResource("3_atvwo") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_c6rcf"] +atlas = ExtResource("3_atvwo") +region = Rect2(960, 0, 192, 192) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_abybu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1hmdy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_an5v4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xg81j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_oodis") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_g3p1j") +}], +"loop": true, +"name": &"alerted", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_q6fik") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x7ieb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lwyt4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_42ad3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rjsih") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mjq7i") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ksq43") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_mmcvy") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kybr4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_toabe") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_670j8") +}], +"loop": true, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_syj48") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7b5li") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jsqt8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tta8m") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vmexr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_c6rcf") +}], +"loop": true, +"name": &"walk", +"speed": 10.0 +}] diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_red.tres b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_red.tres new file mode 100644 index 0000000000..3fec4457d0 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_frames_red.tres @@ -0,0 +1,184 @@ +[gd_resource type="SpriteFrames" format=3 uid="uid://bgqyf00teddrx"] + +[ext_resource type="Texture2D" uid="uid://bj1lqcdjbnsqj" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_attack_red.png" id="1_lg20q"] +[ext_resource type="Texture2D" uid="uid://bjoyiblcwf8cb" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_red.png" id="2_qvy8v"] +[ext_resource type="Texture2D" uid="uid://dcmynl1mllx5m" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_red.png" id="3_45psf"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_hr8vt"] +atlas = ExtResource("1_lg20q") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kma2p"] +atlas = ExtResource("1_lg20q") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ehw4u"] +atlas = ExtResource("1_lg20q") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_n2gvh"] +atlas = ExtResource("1_lg20q") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jpumu"] +atlas = ExtResource("1_lg20q") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wblvh"] +atlas = ExtResource("1_lg20q") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vukql"] +atlas = ExtResource("2_qvy8v") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_32l4b"] +atlas = ExtResource("2_qvy8v") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7j5lb"] +atlas = ExtResource("2_qvy8v") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rucg6"] +atlas = ExtResource("2_qvy8v") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_trvh1"] +atlas = ExtResource("2_qvy8v") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_g8gej"] +atlas = ExtResource("2_qvy8v") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8bmjr"] +atlas = ExtResource("2_qvy8v") +region = Rect2(1152, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_85fpl"] +atlas = ExtResource("2_qvy8v") +region = Rect2(1344, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wmurr"] +atlas = ExtResource("2_qvy8v") +region = Rect2(1536, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qmqop"] +atlas = ExtResource("2_qvy8v") +region = Rect2(1728, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_nrbxm"] +atlas = ExtResource("2_qvy8v") +region = Rect2(1920, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ykvim"] +atlas = ExtResource("3_45psf") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_butek"] +atlas = ExtResource("3_45psf") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jnr2x"] +atlas = ExtResource("3_45psf") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bj6s0"] +atlas = ExtResource("3_45psf") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ktf7f"] +atlas = ExtResource("3_45psf") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5pnr4"] +atlas = ExtResource("3_45psf") +region = Rect2(960, 0, 192, 192) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_hr8vt") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kma2p") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ehw4u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_n2gvh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jpumu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wblvh") +}], +"loop": true, +"name": &"alerted", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_vukql") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_32l4b") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7j5lb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rucg6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_trvh1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_g8gej") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8bmjr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_85fpl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wmurr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qmqop") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nrbxm") +}], +"loop": true, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_ykvim") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_butek") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jnr2x") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bj6s0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ktf7f") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5pnr4") +}], +"loop": true, +"name": &"walk", +"speed": 10.0 +}] diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_blue.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_blue.png new file mode 100644 index 0000000000..0a81699c75 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_blue.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99d5b6d20259b7e0ffecdd792ead037e2f7b7f5e920e42f666e5df0cc54b3262 +size 10451 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_blue.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_blue.png.import new file mode 100644 index 0000000000..c5af4c5793 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_blue.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bay8swpb3h5ud" +path="res://.godot/imported/storyvore_idle_blue.png-112972e0402efa799fe5b11273c0353e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_blue.png" +dest_files=["res://.godot/imported/storyvore_idle_blue.png-112972e0402efa799fe5b11273c0353e.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/game_elements/characters/enemies/guard_old/components/storyvore_idle_gray.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_gray.png new file mode 100644 index 0000000000..1e66bba190 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_gray.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db1319b1ddeb857187af30d8b604fe0c074a0d28b580f1dd045eb5b2467a0e4c +size 10429 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_gray.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_gray.png.import new file mode 100644 index 0000000000..a0b7fce79f --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_gray.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://kchncmtpv2a5" +path="res://.godot/imported/storyvore_idle_gray.png-77faff6cbd98f96f6cf7d85ee6dbaeac.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_gray.png" +dest_files=["res://.godot/imported/storyvore_idle_gray.png-77faff6cbd98f96f6cf7d85ee6dbaeac.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/game_elements/characters/enemies/guard_old/components/storyvore_idle_green.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_green.png new file mode 100644 index 0000000000..78bfed06a8 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_green.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d7d02f7d125384085d40577445567f5d74e89ce6bfd04f40a9eb41ffb3e515f +size 10433 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_green.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_green.png.import new file mode 100644 index 0000000000..98f0b75896 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_green.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bbhg173t4xatm" +path="res://.godot/imported/storyvore_idle_green.png-3a9f9fb7dd2fc5a50ee84c52c6269ce0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_green.png" +dest_files=["res://.godot/imported/storyvore_idle_green.png-3a9f9fb7dd2fc5a50ee84c52c6269ce0.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/game_elements/characters/enemies/guard_old/components/storyvore_idle_orange.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_orange.png new file mode 100644 index 0000000000..7b0c460899 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_orange.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fee0064aca8c4bc3a5aec785ee95bfd93c38538b3d375e24a6dcefe980da4351 +size 10425 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_orange.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_orange.png.import new file mode 100644 index 0000000000..07968f7d2c --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_orange.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ckhesyclpgqb" +path="res://.godot/imported/storyvore_idle_orange.png-18792a18ccb98be0f1978d7e35fa54c3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_orange.png" +dest_files=["res://.godot/imported/storyvore_idle_orange.png-18792a18ccb98be0f1978d7e35fa54c3.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/game_elements/characters/enemies/guard_old/components/storyvore_idle_red.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_red.png new file mode 100644 index 0000000000..3eb684617f --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_red.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da84fd0736b85ddb285af311e3934ce1d7fdf62290039eacffebd5036fbf68cf +size 10479 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_red.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_red.png.import new file mode 100644 index 0000000000..add8afe7ee --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_red.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjoyiblcwf8cb" +path="res://.godot/imported/storyvore_idle_red.png-e3c3f503715bf73ab7163e379d790594.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_idle_red.png" +dest_files=["res://.godot/imported/storyvore_idle_red.png-e3c3f503715bf73ab7163e379d790594.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/game_elements/characters/enemies/guard_old/components/storyvore_move_blue.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_blue.png new file mode 100644 index 0000000000..2f57e43d55 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_blue.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f8ece430beb13b62d90e2003b31f0754a2801ade174a0b04595fedae28ed245 +size 8606 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_blue.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_blue.png.import new file mode 100644 index 0000000000..af7c17604b --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_blue.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dduyb6d10pxru" +path="res://.godot/imported/storyvore_move_blue.png-c03859cc71bf7b8984b2a3e44a7269b6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_blue.png" +dest_files=["res://.godot/imported/storyvore_move_blue.png-c03859cc71bf7b8984b2a3e44a7269b6.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/game_elements/characters/enemies/guard_old/components/storyvore_move_gray.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_gray.png new file mode 100644 index 0000000000..521031d6e1 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_gray.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1624dc2b239b1eedc5cc2eb243869af56a7c4230c86b7be6939f79288204729c +size 8526 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_gray.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_gray.png.import new file mode 100644 index 0000000000..bcece7a4fb --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_gray.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dkqmbryfey4w1" +path="res://.godot/imported/storyvore_move_gray.png-d1ef6d475efe29e5da478775a3a0e368.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_gray.png" +dest_files=["res://.godot/imported/storyvore_move_gray.png-d1ef6d475efe29e5da478775a3a0e368.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/game_elements/characters/enemies/guard_old/components/storyvore_move_green.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_green.png new file mode 100644 index 0000000000..7e0a6c1c0e --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_green.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3c76b625f17a7f89eb38bb881820633f3aa987572c08d4e1a11cf87fc72e984 +size 8583 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_green.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_green.png.import new file mode 100644 index 0000000000..0682a5cb3a --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_green.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b641qjrueh01g" +path="res://.godot/imported/storyvore_move_green.png-9f0a5e8c1d8404bf1543d53615eec200.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_green.png" +dest_files=["res://.godot/imported/storyvore_move_green.png-9f0a5e8c1d8404bf1543d53615eec200.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/game_elements/characters/enemies/guard_old/components/storyvore_move_orange.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_orange.png new file mode 100644 index 0000000000..52810452db --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_orange.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bb75fd44b2e0ba58201ccefd8c8bb395a71d9ff0edcbd620c36f0517b761d3ac +size 8586 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_orange.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_orange.png.import new file mode 100644 index 0000000000..7648763592 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_orange.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ej7m40q447et" +path="res://.godot/imported/storyvore_move_orange.png-d40f3ce70841c8cfabe40ecaefa7ac7f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_orange.png" +dest_files=["res://.godot/imported/storyvore_move_orange.png-d40f3ce70841c8cfabe40ecaefa7ac7f.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/game_elements/characters/enemies/guard_old/components/storyvore_move_red.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_red.png new file mode 100644 index 0000000000..cd1cac1a4d --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_red.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e4541ad0932c5592a915297deaee090b0c1c36df8b95804e9da2ab9fe6bf1a6 +size 8542 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_red.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_red.png.import new file mode 100644 index 0000000000..3e7d0a27a5 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_red.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dcmynl1mllx5m" +path="res://.godot/imported/storyvore_move_red.png-55458fbb92a10d4a0d9d4783cff474a7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvore_move_red.png" +dest_files=["res://.godot/imported/storyvore_move_red.png-55458fbb92a10d4a0d9d4783cff474a7.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_blue.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_blue.png new file mode 100644 index 0000000000..af7ea2aaa1 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_blue.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6f11d36f8a8f8add572058c7710cd28264c1991082352eda374d3dd7e1c501d +size 23061 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_blue.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_blue.png.import new file mode 100644 index 0000000000..4eef3c2714 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_blue.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d00j4opxt2buf" +path="res://.godot/imported/storyvoretorch_attack_blue.png-090f9cf11e93082a89bde6e7e19dfbef.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_blue.png" +dest_files=["res://.godot/imported/storyvoretorch_attack_blue.png-090f9cf11e93082a89bde6e7e19dfbef.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_gray.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_gray.png new file mode 100644 index 0000000000..49ab31afb7 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_gray.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54a27dc88d8086807ce41f02303202bde796a2884a04d15c98613bb18911f3d5 +size 23034 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_gray.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_gray.png.import new file mode 100644 index 0000000000..f94d637d83 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_gray.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bfjtfteb4t1gw" +path="res://.godot/imported/storyvoretorch_attack_gray.png-9ce5b91fb51c857ebe4c03b675da89b7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_gray.png" +dest_files=["res://.godot/imported/storyvoretorch_attack_gray.png-9ce5b91fb51c857ebe4c03b675da89b7.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_green.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_green.png new file mode 100644 index 0000000000..63b29486c3 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_green.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f383b9a92e02112b36b8f192496eafdad9016d8480047fcd0ceba8a0723865ba +size 23034 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_green.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_green.png.import new file mode 100644 index 0000000000..2a89444850 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_green.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://fub02gkny6es" +path="res://.godot/imported/storyvoretorch_attack_green.png-8ea745a054b513188c0544045543021e.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_green.png" +dest_files=["res://.godot/imported/storyvoretorch_attack_green.png-8ea745a054b513188c0544045543021e.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_orange.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_orange.png new file mode 100644 index 0000000000..fee910c551 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_orange.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f93dc389a11fa5749a826d4e2d1707115f2c673c83679f0ca4d04839a8d0b3eb +size 23046 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_orange.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_orange.png.import new file mode 100644 index 0000000000..7690af40dd --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_orange.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://didegkpofuks6" +path="res://.godot/imported/storyvoretorch_attack_orange.png-be9b022271f50123bd134187848097b2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_orange.png" +dest_files=["res://.godot/imported/storyvoretorch_attack_orange.png-be9b022271f50123bd134187848097b2.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_red.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_red.png new file mode 100644 index 0000000000..aca1722eb1 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_red.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac39ff76e1526010aa4ead0af8840071a7deecf6c8d065286d28abd689caa08e +size 23062 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_red.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_red.png.import new file mode 100644 index 0000000000..f4b59ab56a --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_red.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://j24tdrnxw1yi" +path="res://.godot/imported/storyvoretorch_attack_red.png-5a0b61ba7049b8c6d55e0381469c5510.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_red.png" +dest_files=["res://.godot/imported/storyvoretorch_attack_red.png-5a0b61ba7049b8c6d55e0381469c5510.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_blue.tres b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_blue.tres new file mode 100644 index 0000000000..dc5e23a120 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_blue.tres @@ -0,0 +1,184 @@ +[gd_resource type="SpriteFrames" format=3 uid="uid://b4eu8o8txkyjk"] + +[ext_resource type="Texture2D" uid="uid://d00j4opxt2buf" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_blue.png" id="1_fvu5h"] +[ext_resource type="Texture2D" uid="uid://cql7rrtnljeb1" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_blue.png" id="2_f3gvu"] +[ext_resource type="Texture2D" uid="uid://bbfqe6ei0shjo" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_blue.png" id="3_lcwnm"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_xgqcv"] +atlas = ExtResource("1_fvu5h") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_r6piu"] +atlas = ExtResource("1_fvu5h") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dwlrr"] +atlas = ExtResource("1_fvu5h") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_kcb5u"] +atlas = ExtResource("1_fvu5h") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3s2uu"] +atlas = ExtResource("1_fvu5h") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ulclx"] +atlas = ExtResource("1_fvu5h") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pswjb"] +atlas = ExtResource("2_f3gvu") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_f7t4u"] +atlas = ExtResource("2_f3gvu") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6oyju"] +atlas = ExtResource("2_f3gvu") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8pv5c"] +atlas = ExtResource("2_f3gvu") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x4ke5"] +atlas = ExtResource("2_f3gvu") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_g6j72"] +atlas = ExtResource("2_f3gvu") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_t45rp"] +atlas = ExtResource("2_f3gvu") +region = Rect2(1152, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wgyhu"] +atlas = ExtResource("2_f3gvu") +region = Rect2(1344, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lxu3n"] +atlas = ExtResource("2_f3gvu") +region = Rect2(1536, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_u4tss"] +atlas = ExtResource("2_f3gvu") +region = Rect2(1728, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_i8db7"] +atlas = ExtResource("2_f3gvu") +region = Rect2(1920, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5tdhv"] +atlas = ExtResource("3_lcwnm") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_y8bn7"] +atlas = ExtResource("3_lcwnm") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jrpil"] +atlas = ExtResource("3_lcwnm") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_38dpc"] +atlas = ExtResource("3_lcwnm") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8qi7e"] +atlas = ExtResource("3_lcwnm") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_q7o08"] +atlas = ExtResource("3_lcwnm") +region = Rect2(960, 0, 192, 192) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_xgqcv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_r6piu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dwlrr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_kcb5u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3s2uu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ulclx") +}], +"loop": true, +"name": &"alerted", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_pswjb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_f7t4u") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6oyju") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8pv5c") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x4ke5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_g6j72") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_t45rp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wgyhu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lxu3n") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_u4tss") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_i8db7") +}], +"loop": true, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_5tdhv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_y8bn7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jrpil") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_38dpc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8qi7e") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_q7o08") +}], +"loop": true, +"name": &"walk", +"speed": 10.0 +}] diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_gray.tres b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_gray.tres new file mode 100644 index 0000000000..e3f671546d --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_gray.tres @@ -0,0 +1,184 @@ +[gd_resource type="SpriteFrames" format=3 uid="uid://chnjuh2cqb4oc"] + +[ext_resource type="Texture2D" uid="uid://bfjtfteb4t1gw" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_gray.png" id="1_drvwd"] +[ext_resource type="Texture2D" uid="uid://bbaxfvjxbu548" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_gray.png" id="2_a64vs"] +[ext_resource type="Texture2D" uid="uid://cxsfyg3jcv0pg" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_gray.png" id="3_dfn04"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_46dfl"] +atlas = ExtResource("1_drvwd") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2w1vs"] +atlas = ExtResource("1_drvwd") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_h3wxu"] +atlas = ExtResource("1_drvwd") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_31bft"] +atlas = ExtResource("1_drvwd") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vl0je"] +atlas = ExtResource("1_drvwd") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6gl1q"] +atlas = ExtResource("1_drvwd") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_uxlgs"] +atlas = ExtResource("2_a64vs") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_37r4g"] +atlas = ExtResource("2_a64vs") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_a3atr"] +atlas = ExtResource("2_a64vs") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2lj24"] +atlas = ExtResource("2_a64vs") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vw6b8"] +atlas = ExtResource("2_a64vs") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_slphg"] +atlas = ExtResource("2_a64vs") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gv251"] +atlas = ExtResource("2_a64vs") +region = Rect2(1152, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_x7v25"] +atlas = ExtResource("2_a64vs") +region = Rect2(1344, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_doi1x"] +atlas = ExtResource("2_a64vs") +region = Rect2(1536, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_53xtt"] +atlas = ExtResource("2_a64vs") +region = Rect2(1728, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_3qm5e"] +atlas = ExtResource("2_a64vs") +region = Rect2(1920, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_p5bh8"] +atlas = ExtResource("3_dfn04") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vx8ux"] +atlas = ExtResource("3_dfn04") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ncgxx"] +atlas = ExtResource("3_dfn04") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ipvjb"] +atlas = ExtResource("3_dfn04") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_v5urs"] +atlas = ExtResource("3_dfn04") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pvtwy"] +atlas = ExtResource("3_dfn04") +region = Rect2(960, 0, 192, 192) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_46dfl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2w1vs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_h3wxu") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_31bft") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vl0je") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6gl1q") +}], +"loop": true, +"name": &"alerted", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_uxlgs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_37r4g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_a3atr") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2lj24") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vw6b8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_slphg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gv251") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_x7v25") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_doi1x") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_53xtt") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_3qm5e") +}], +"loop": true, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_p5bh8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vx8ux") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ncgxx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ipvjb") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_v5urs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pvtwy") +}], +"loop": true, +"name": &"walk", +"speed": 10.0 +}] diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_green.tres b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_green.tres new file mode 100644 index 0000000000..f276ca12b9 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_green.tres @@ -0,0 +1,184 @@ +[gd_resource type="SpriteFrames" format=3 uid="uid://cu6captpdl63g"] + +[ext_resource type="Texture2D" uid="uid://fub02gkny6es" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_green.png" id="1_0s2jq"] +[ext_resource type="Texture2D" uid="uid://dp718cciyymea" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_green.png" id="2_3m5ms"] +[ext_resource type="Texture2D" uid="uid://mjq3vl0662rc" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_green.png" id="3_ip7rv"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_58g01"] +atlas = ExtResource("1_0s2jq") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bp3gw"] +atlas = ExtResource("1_0s2jq") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_evuad"] +atlas = ExtResource("1_0s2jq") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_e1e12"] +atlas = ExtResource("1_0s2jq") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_a40u7"] +atlas = ExtResource("1_0s2jq") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lduj5"] +atlas = ExtResource("1_0s2jq") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qtixv"] +atlas = ExtResource("2_3m5ms") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_cb2t8"] +atlas = ExtResource("2_3m5ms") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_nsnu4"] +atlas = ExtResource("2_3m5ms") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qxai5"] +atlas = ExtResource("2_3m5ms") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_jjrt6"] +atlas = ExtResource("2_3m5ms") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fjnho"] +atlas = ExtResource("2_3m5ms") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0f8jl"] +atlas = ExtResource("2_3m5ms") +region = Rect2(1152, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_lrtqt"] +atlas = ExtResource("2_3m5ms") +region = Rect2(1344, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pasnj"] +atlas = ExtResource("2_3m5ms") +region = Rect2(1536, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_6b86h"] +atlas = ExtResource("2_3m5ms") +region = Rect2(1728, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xpxx1"] +atlas = ExtResource("2_3m5ms") +region = Rect2(1920, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0pvw5"] +atlas = ExtResource("3_ip7rv") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gi1i5"] +atlas = ExtResource("3_ip7rv") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_53mhp"] +atlas = ExtResource("3_ip7rv") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_xlfbo"] +atlas = ExtResource("3_ip7rv") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_yj568"] +atlas = ExtResource("3_ip7rv") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_ogcch"] +atlas = ExtResource("3_ip7rv") +region = Rect2(960, 0, 192, 192) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_58g01") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bp3gw") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_evuad") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_e1e12") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_a40u7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lduj5") +}], +"loop": true, +"name": &"alerted", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_qtixv") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_cb2t8") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nsnu4") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qxai5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_jjrt6") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fjnho") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0f8jl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_lrtqt") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pasnj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_6b86h") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xpxx1") +}], +"loop": true, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_0pvw5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gi1i5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_53mhp") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_xlfbo") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_yj568") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_ogcch") +}], +"loop": true, +"name": &"walk", +"speed": 10.0 +}] diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_orange.tres b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_orange.tres new file mode 100644 index 0000000000..d3f91464cb --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_orange.tres @@ -0,0 +1,184 @@ +[gd_resource type="SpriteFrames" format=3 uid="uid://b38k1swbnutb7"] + +[ext_resource type="Texture2D" uid="uid://didegkpofuks6" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_orange.png" id="1_5nbt1"] +[ext_resource type="Texture2D" uid="uid://b21pd6ave5gt4" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_orange.png" id="2_g1i7q"] +[ext_resource type="Texture2D" uid="uid://brfhqco5q6iku" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_orange.png" id="3_0thn5"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_6fmbh"] +atlas = ExtResource("1_5nbt1") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_63d1k"] +atlas = ExtResource("1_5nbt1") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_edjj7"] +atlas = ExtResource("1_5nbt1") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pm6gc"] +atlas = ExtResource("1_5nbt1") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qalko"] +atlas = ExtResource("1_5nbt1") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pbk5q"] +atlas = ExtResource("1_5nbt1") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dojs5"] +atlas = ExtResource("2_g1i7q") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_t4bdj"] +atlas = ExtResource("2_g1i7q") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bi7qf"] +atlas = ExtResource("2_g1i7q") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_wg62n"] +atlas = ExtResource("2_g1i7q") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1pntc"] +atlas = ExtResource("2_g1i7q") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_m75m2"] +atlas = ExtResource("2_g1i7q") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rujrh"] +atlas = ExtResource("2_g1i7q") +region = Rect2(1152, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_8de86"] +atlas = ExtResource("2_g1i7q") +region = Rect2(1344, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fjtx0"] +atlas = ExtResource("2_g1i7q") +region = Rect2(1536, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_7g52g"] +atlas = ExtResource("2_g1i7q") +region = Rect2(1728, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_he36m"] +atlas = ExtResource("2_g1i7q") +region = Rect2(1920, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_uvhux"] +atlas = ExtResource("3_0thn5") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_i62k3"] +atlas = ExtResource("3_0thn5") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_j1fpt"] +atlas = ExtResource("3_0thn5") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_0tr33"] +atlas = ExtResource("3_0thn5") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_bpysl"] +atlas = ExtResource("3_0thn5") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_5lvjl"] +atlas = ExtResource("3_0thn5") +region = Rect2(960, 0, 192, 192) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_6fmbh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_63d1k") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_edjj7") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pm6gc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qalko") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pbk5q") +}], +"loop": true, +"name": &"alerted", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_dojs5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_t4bdj") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bi7qf") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_wg62n") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1pntc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_m75m2") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rujrh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_8de86") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fjtx0") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_7g52g") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_he36m") +}], +"loop": true, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_uvhux") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_i62k3") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_j1fpt") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_0tr33") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_bpysl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_5lvjl") +}], +"loop": true, +"name": &"walk", +"speed": 10.0 +}] diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_red.tres b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_red.tres new file mode 100644 index 0000000000..80aefce953 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_frames_red.tres @@ -0,0 +1,184 @@ +[gd_resource type="SpriteFrames" format=3 uid="uid://drkpvcsf8tv42"] + +[ext_resource type="Texture2D" uid="uid://j24tdrnxw1yi" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_attack_red.png" id="1_s7mql"] +[ext_resource type="Texture2D" uid="uid://cvvhtg82cyiph" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_red.png" id="2_qv8x4"] +[ext_resource type="Texture2D" uid="uid://37lriijfo6cr" path="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_red.png" id="3_svell"] + +[sub_resource type="AtlasTexture" id="AtlasTexture_akvhs"] +atlas = ExtResource("1_s7mql") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_qx13j"] +atlas = ExtResource("1_s7mql") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_afdee"] +atlas = ExtResource("1_s7mql") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_fhyvx"] +atlas = ExtResource("1_s7mql") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_2xqb1"] +atlas = ExtResource("1_s7mql") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1jmai"] +atlas = ExtResource("1_s7mql") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_radai"] +atlas = ExtResource("2_qv8x4") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vs3nh"] +atlas = ExtResource("2_qv8x4") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_dl4rt"] +atlas = ExtResource("2_qv8x4") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_h3gn5"] +atlas = ExtResource("2_qv8x4") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_q8f4x"] +atlas = ExtResource("2_qv8x4") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_pdfki"] +atlas = ExtResource("2_qv8x4") +region = Rect2(960, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_saqlt"] +atlas = ExtResource("2_qv8x4") +region = Rect2(1152, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_po4eg"] +atlas = ExtResource("2_qv8x4") +region = Rect2(1344, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_1efbc"] +atlas = ExtResource("2_qv8x4") +region = Rect2(1536, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_gxg1d"] +atlas = ExtResource("2_qv8x4") +region = Rect2(1728, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_rlbot"] +atlas = ExtResource("2_qv8x4") +region = Rect2(1920, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_a1wrl"] +atlas = ExtResource("3_svell") +region = Rect2(0, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_vueno"] +atlas = ExtResource("3_svell") +region = Rect2(192, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_nca1e"] +atlas = ExtResource("3_svell") +region = Rect2(384, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_upkji"] +atlas = ExtResource("3_svell") +region = Rect2(576, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_tobr1"] +atlas = ExtResource("3_svell") +region = Rect2(768, 0, 192, 192) + +[sub_resource type="AtlasTexture" id="AtlasTexture_nm82a"] +atlas = ExtResource("3_svell") +region = Rect2(960, 0, 192, 192) + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_akvhs") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_qx13j") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_afdee") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_fhyvx") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_2xqb1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1jmai") +}], +"loop": true, +"name": &"alerted", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_radai") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vs3nh") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_dl4rt") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_h3gn5") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_q8f4x") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_pdfki") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_saqlt") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_po4eg") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_1efbc") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_gxg1d") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_rlbot") +}], +"loop": true, +"name": &"idle", +"speed": 10.0 +}, { +"frames": [{ +"duration": 1.0, +"texture": SubResource("AtlasTexture_a1wrl") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_vueno") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nca1e") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_upkji") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_tobr1") +}, { +"duration": 1.0, +"texture": SubResource("AtlasTexture_nm82a") +}], +"loop": true, +"name": &"walk", +"speed": 10.0 +}] diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_blue.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_blue.png new file mode 100644 index 0000000000..765d41acf5 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_blue.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a99ba0fbe0f0d253e54eab12a954c018f4d3cbd74606b26ca266f785273b6db +size 30617 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_blue.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_blue.png.import new file mode 100644 index 0000000000..51d0fb4dfa --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_blue.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cql7rrtnljeb1" +path="res://.godot/imported/storyvoretorch_idle_blue.png-b174de9981da6f9e177d1d4aa87aaedc.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_blue.png" +dest_files=["res://.godot/imported/storyvoretorch_idle_blue.png-b174de9981da6f9e177d1d4aa87aaedc.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_gray.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_gray.png new file mode 100644 index 0000000000..a4b383e865 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_gray.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5726f4aa6eb102c8f4e5183c39917253e2bfe0db3e0b75e6dfe2b1dd84ea96b +size 30481 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_gray.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_gray.png.import new file mode 100644 index 0000000000..b708e3b358 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_gray.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bbaxfvjxbu548" +path="res://.godot/imported/storyvoretorch_idle_gray.png-513b91e98cb91ab9149336ab1d6f85ee.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_gray.png" +dest_files=["res://.godot/imported/storyvoretorch_idle_gray.png-513b91e98cb91ab9149336ab1d6f85ee.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_green.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_green.png new file mode 100644 index 0000000000..d7cca7c3f8 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_green.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91a583c854feacb40865ac50fdc2d6aad807a47fa68b44c001ba4df9959367f1 +size 30466 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_green.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_green.png.import new file mode 100644 index 0000000000..5a7e21924d --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_green.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dp718cciyymea" +path="res://.godot/imported/storyvoretorch_idle_green.png-dfbbfecf988125d97bec8fa8bd34ec95.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_green.png" +dest_files=["res://.godot/imported/storyvoretorch_idle_green.png-dfbbfecf988125d97bec8fa8bd34ec95.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_orange.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_orange.png new file mode 100644 index 0000000000..97fc9d3621 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_orange.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68a5eb524c5a97f60c771c7ba66ba28f84b85c0fa1b89c4d7b474dd40a0556da +size 30476 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_orange.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_orange.png.import new file mode 100644 index 0000000000..81bcebb9f5 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_orange.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b21pd6ave5gt4" +path="res://.godot/imported/storyvoretorch_idle_orange.png-cf9801205458a589d6c1b4e129dcc468.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_orange.png" +dest_files=["res://.godot/imported/storyvoretorch_idle_orange.png-cf9801205458a589d6c1b4e129dcc468.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_red.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_red.png new file mode 100644 index 0000000000..8a89de981c --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_red.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eedfdd40d9e33c68cc0ad3cf4142cab92501b843eee490122d4207ad1eff5052 +size 30673 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_red.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_red.png.import new file mode 100644 index 0000000000..374f9a1951 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_red.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cvvhtg82cyiph" +path="res://.godot/imported/storyvoretorch_idle_red.png-ca04ca47028d5a40979b9b9dcca0ac37.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_idle_red.png" +dest_files=["res://.godot/imported/storyvoretorch_idle_red.png-ca04ca47028d5a40979b9b9dcca0ac37.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_blue.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_blue.png new file mode 100644 index 0000000000..adc2f12c17 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_blue.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1f819cde7fff1e8298da40205434a0072e08e5d63e3965735b4e9f7a41ec0af1 +size 22056 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_blue.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_blue.png.import new file mode 100644 index 0000000000..5635ded71b --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_blue.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bbfqe6ei0shjo" +path="res://.godot/imported/storyvoretorch_move_blue.png-c4c4ce120a41f85bd7071fab7c63cd88.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_blue.png" +dest_files=["res://.godot/imported/storyvoretorch_move_blue.png-c4c4ce120a41f85bd7071fab7c63cd88.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_gray.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_gray.png new file mode 100644 index 0000000000..d856df4232 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_gray.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3a418cb1be284205d45b644c057ae44c2c5bc7e2c9d1581443753321e383570 +size 22048 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_gray.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_gray.png.import new file mode 100644 index 0000000000..0053bb56ac --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_gray.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cxsfyg3jcv0pg" +path="res://.godot/imported/storyvoretorch_move_gray.png-eb9dcf61a017e26134316ab60a9e6e64.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_gray.png" +dest_files=["res://.godot/imported/storyvoretorch_move_gray.png-eb9dcf61a017e26134316ab60a9e6e64.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_green.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_green.png new file mode 100644 index 0000000000..213212f843 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_green.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:defbfeb9af0ea9e6aae5c7cdfee2257d251c5323423008bf02046d82a2420eff +size 22047 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_green.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_green.png.import new file mode 100644 index 0000000000..231d295633 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_green.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://mjq3vl0662rc" +path="res://.godot/imported/storyvoretorch_move_green.png-272c15033a86c5164719bc227cbf2807.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_green.png" +dest_files=["res://.godot/imported/storyvoretorch_move_green.png-272c15033a86c5164719bc227cbf2807.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_orange.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_orange.png new file mode 100644 index 0000000000..08855aa650 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_orange.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:748305d61f7a7174f5a93013f3359c0e98adcccacadd05999d074da23f71b187 +size 22050 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_orange.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_orange.png.import new file mode 100644 index 0000000000..94bf151e51 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_orange.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://brfhqco5q6iku" +path="res://.godot/imported/storyvoretorch_move_orange.png-052445bc2b57ac7011cfb35d7924f927.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_orange.png" +dest_files=["res://.godot/imported/storyvoretorch_move_orange.png-052445bc2b57ac7011cfb35d7924f927.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/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_red.png b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_red.png new file mode 100644 index 0000000000..175c581026 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_red.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae4a88603fed566d876202fa63d05eacb52e831896ed0a1f0bd9553862a5321b +size 22055 diff --git a/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_red.png.import b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_red.png.import new file mode 100644 index 0000000000..df266f1aa1 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_red.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://37lriijfo6cr" +path="res://.godot/imported/storyvoretorch_move_red.png-e164291c2a834f5d595b413adf3e3ce9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://scenes/game_elements/characters/enemies/guard_old/components/storyvoretorch_move_red.png" +dest_files=["res://.godot/imported/storyvoretorch_move_red.png-e164291c2a834f5d595b413adf3e3ce9.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/game_elements/characters/enemies/guard_old/guard_old.tscn b/scenes/game_elements/characters/enemies/guard_old/guard_old.tscn new file mode 100644 index 0000000000..2b266261d1 --- /dev/null +++ b/scenes/game_elements/characters/enemies/guard_old/guard_old.tscn @@ -0,0 +1,341 @@ +[gd_scene format=3 uid="uid://877o14cjju6m"] + +[ext_resource type="Script" uid="uid://dox2uqh8s6vb5" path="res://scenes/game_elements/characters/enemies/guard_old/components/guard_old.gd" id="1_7mvk1"] +[ext_resource type="Script" uid="uid://d4b07dhpe64fx" path="res://scenes/game_elements/characters/enemies/guard_old/components/guard_old_movement.gd" id="2_1l37j"] +[ext_resource type="Script" uid="uid://ddqfvux1l2ivu" path="res://scenes/game_elements/characters/enemies/guard_old/components/detection_area.gd" id="3_v4q7l"] +[ext_resource type="Texture2D" uid="uid://cghhmc4v56gcy" path="res://scenes/game_elements/characters/enemies/guard_old/components/field_of_view.png" id="4_le7de"] +[ext_resource type="Script" uid="uid://dw2jehlpe0ins" path="res://scenes/game_elements/characters/enemies/guard_old/components/light.gd" id="5_r2kh5"] +[ext_resource type="SpriteFrames" uid="uid://ovu5wqo15s5g" path="res://scenes/quests/template_quests/NO_EDIT/1_NO_EDIT_stealth/NO_EDIT_stealth_components/NO_EDIT_guard_enemy.tres" id="6_0pqqx"] +[ext_resource type="Script" uid="uid://dy68p7gf07pi3" path="res://scenes/game_logic/sprite_behaviors/character_sprite_behavior.gd" id="7_jd3vu"] +[ext_resource type="Texture2D" uid="uid://b038o41bnypch" path="res://scenes/game_elements/characters/enemies/guard_old/components/exclamation_mark.png" id="8_ypbyn"] +[ext_resource type="Script" uid="uid://b3hx1n2yl88qr" path="res://scenes/game_logic/character_animation_player_behavior.gd" id="9_13yxi"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_g173s"] +radius = 35.0 + +[sub_resource type="CircleShape2D" id="CircleShape2D_nv25s"] +radius = 15.0 + +[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_nv25s"] +light_mode = 1 + +[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_0hjcv"] +light_mode = 1 + +[sub_resource type="LabelSettings" id="LabelSettings_nv25s"] +outline_size = 3 +outline_color = Color(0, 0, 0, 1) +shadow_size = 2 +shadow_color = Color(0, 0, 0, 1) + +[sub_resource type="Animation" id="Animation_mswbt"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sounds/TorchHitSound:playing") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Sounds/FootSound:playing") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimatedSprite2D:animation") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [&"walk"] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("AnimatedSprite2D:frame") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + +[sub_resource type="Animation" id="Animation_innil"] +resource_name = "hit" +length = 0.6 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sounds/TorchHitSound:playing") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("AnimatedSprite2D:animation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [&"alerted"] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimatedSprite2D:frame") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 5] +} + +[sub_resource type="Animation" id="Animation_ls1y7"] +resource_name = "idle" +length = 1.1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("AnimatedSprite2D:animation") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [&"idle"] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("AnimatedSprite2D:frame") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10] +} + +[sub_resource type="Animation" id="Animation_8vt0k"] +resource_name = "walk" +length = 0.6 +loop_mode = 1 +step = 0.1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Sounds/FootSound:playing") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.3, 0.4, 0.7), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [true, false, true, false] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("AnimatedSprite2D:animation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [&"walk"] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("AnimatedSprite2D:frame") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 3, 4, 5, 5] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_innil"] +_data = { +&"RESET": SubResource("Animation_mswbt"), +&"alerted": SubResource("Animation_innil"), +&"idle": SubResource("Animation_ls1y7"), +&"walk": SubResource("Animation_8vt0k") +} + +[node name="GuardOld" type="CharacterBody2D" unique_id=689832587 groups=["guard_enemy"]] +collision_layer = 0 +collision_mask = 528 +motion_mode = 1 +script = ExtResource("1_7mvk1") + +[node name="GuardMovement" type="Node2D" parent="." unique_id=1116278916] +unique_name_in_owner = true +script = ExtResource("2_1l37j") + +[node name="SightRayCast" type="RayCast2D" parent="." unique_id=1964699795] +unique_name_in_owner = true +collision_mask = 8 +hit_from_inside = true +collide_with_areas = true + +[node name="InstantDetectionArea" type="Area2D" parent="." unique_id=1457569599] +unique_name_in_owner = true +collision_layer = 0 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="InstantDetectionArea" unique_id=1435997986] +shape = SubResource("CircleShape2D_g173s") + +[node name="DetectionArea" type="Area2D" parent="." unique_id=885694991] +unique_name_in_owner = true +position = Vector2(0, -19) +collision_layer = 0 +script = ExtResource("3_v4q7l") + +[node name="Light" type="PointLight2D" parent="DetectionArea" unique_id=366085581] +position = Vector2(37.3333, 1.33333) +scale = Vector2(0.340496, 0.340496) +color = Color(1, 1, 0.796078, 1) +blend_mode = 2 +shadow_enabled = true +shadow_filter = 1 +shadow_filter_smooth = 0.5 +texture = ExtResource("4_le7de") +offset = Vector2(377.88, 10.7686) +script = ExtResource("5_r2kh5") + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="DetectionArea" unique_id=1176393945] +position = Vector2(-29.3333, -132) +polygon = PackedVector2Array(302, 48, 283, 52, 279, 52, 101, 114, 98, 114, 79, 124, 77, 124, 72, 131, 71, 131, 71, 138, 78, 145, 78, 146, 95, 154, 95, 155, 275, 226, 275, 227, 292, 231, 292, 232, 312, 230, 316, 230, 330, 222, 332, 222, 340, 214, 341, 214, 346, 205, 347, 205, 351, 185, 351, 100, 347, 82, 347, 79, 338, 67, 338, 65, 325, 55, 325, 54, 302, 47) + +[node name="AnimatedSprite2D" type="AnimatedSprite2D" parent="." unique_id=616054452] +unique_name_in_owner = true +position = Vector2(0, -16) +sprite_frames = ExtResource("6_0pqqx") +animation = &"walk" +autoplay = "idle" + +[node name="CharacterSpriteBehavior" type="Node2D" parent="AnimatedSprite2D" unique_id=971917766 node_paths=PackedStringArray("character", "sprite")] +script = ExtResource("7_jd3vu") +character = NodePath("../..") +play_animations = false +sprite = NodePath("..") +metadata/_custom_type_script = "uid://dy68p7gf07pi3" + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=2124818446] +shape = SubResource("CircleShape2D_nv25s") + +[node name="PlayerAwareness" type="TextureProgressBar" parent="." unique_id=578256400] +unique_name_in_owner = true +visible = false +modulate = Color(1, 1, 1, 0) +z_index = 1 +material = SubResource("CanvasItemMaterial_nv25s") +offset_left = -62.0 +offset_top = -172.0 +offset_right = 62.0 +offset_bottom = -48.0 +pivot_offset = Vector2(62, 102) +step = 0.01 +fill_mode = 3 +nine_patch_stretch = true +texture_under = ExtResource("8_ypbyn") +texture_progress = ExtResource("8_ypbyn") +tint_under = Color(1, 1, 1, 0.392157) +tint_progress = Color(1, 1, 0, 1) + +[node name="DebugInfo" type="Label" parent="." unique_id=1627535706] +unique_name_in_owner = true +visible = false +z_index = 100 +material = SubResource("CanvasItemMaterial_0hjcv") +offset_left = -36.0 +offset_top = 20.0 +offset_right = 4.0 +offset_bottom = 43.0 +text = "position: (0.0, 0.0) +state: Patroling +previous_patrol_point_idx: -1 +current_patrol_point_idx: 0 +time left: 0.00 +target point: (0.0, 0.0) +" +label_settings = SubResource("LabelSettings_nv25s") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=1642930547] +libraries/ = SubResource("AnimationLibrary_innil") + +[node name="CharacterAnimationPlayerBehavior" type="Node2D" parent="AnimationPlayer" unique_id=1596266876 node_paths=PackedStringArray("character", "animation_player")] +unique_name_in_owner = true +script = ExtResource("9_13yxi") +character = NodePath("../..") +animation_player = NodePath("..") +metadata/_custom_type_script = "uid://b3hx1n2yl88qr" + +[node name="Sounds" type="Node2D" parent="." unique_id=787899072] + +[node name="AlertSound" type="AudioStreamPlayer" parent="Sounds" unique_id=1366827513] +unique_name_in_owner = true +volume_db = -5.0 +bus = &"SFX" + +[node name="FootSound" type="AudioStreamPlayer2D" parent="Sounds" unique_id=1825167375] +unique_name_in_owner = true +volume_db = -2.0 +max_distance = 350.0 +bus = &"SFX" + +[node name="FireSound" type="AudioStreamPlayer2D" parent="Sounds" unique_id=946121497] +unique_name_in_owner = true +volume_db = -2.0 +autoplay = true +max_distance = 500.0 +attenuation = 2.0 +bus = &"SFX" + +[node name="TorchHitSound" type="AudioStreamPlayer2D" parent="Sounds" unique_id=1573897868] +unique_name_in_owner = true +volume_db = -2.0 +max_distance = 500.0 +bus = &"SFX" + +[connection signal="body_entered" from="InstantDetectionArea" to="." method="_on_instant_detection_area_body_entered"] +[connection signal="body_entered" from="DetectionArea" to="." method="_on_detection_area_body_entered"] +[connection signal="body_exited" from="DetectionArea" to="." method="_on_detection_area_body_exited"] diff --git a/scenes/game_logic/stealth_game_logic.gd b/scenes/game_logic/stealth_game_logic.gd index 856de9b715..4e6b78fd62 100644 --- a/scenes/game_logic/stealth_game_logic.gd +++ b/scenes/game_logic/stealth_game_logic.gd @@ -8,7 +8,7 @@ extends Node func _ready() -> void: if Engine.is_editor_hint(): return - for guard: Guard in get_tree().get_nodes_in_group(&"guard_enemy"): + for guard: Node2D in get_tree().get_nodes_in_group(&"guard_enemy"): guard.player_detected.connect(self._on_player_detected) diff --git a/scenes/guard_test.tscn b/scenes/guard_test.tscn new file mode 100644 index 0000000000..3dcdca727b --- /dev/null +++ b/scenes/guard_test.tscn @@ -0,0 +1,226 @@ +[gd_scene format=4 uid="uid://ch44gyrcaqccd"] + +[ext_resource type="Script" uid="uid://dnp0tjloec2d7" path="res://scenes/game_logic/stealth_game_logic.gd" id="1_03fpm"] +[ext_resource type="PackedScene" uid="uid://2rbpl811wlv1" path="res://scenes/game_elements/props/background_music/background_music.tscn" id="2_o42vj"] +[ext_resource type="AudioStream" uid="uid://qnqpd21qyfnc" path="res://assets/first_party/music/Threadbare_Stealth.ogg" id="3_5lhyl"] +[ext_resource type="TileSet" uid="uid://oynx002hv8tl" path="res://tiles/water.tres" id="4_k5854"] +[ext_resource type="TileSet" uid="uid://bjx3gvah0ycl1" path="res://tiles/foam_2.tres" id="5_ps5t8"] +[ext_resource type="TileSet" uid="uid://dfp36ffpanjq2" path="res://tiles/elevation.tres" id="6_bpfsd"] +[ext_resource type="TileSet" uid="uid://b8qnr0owsbhhn" path="res://tiles/exterior_floors.tres" id="7_i7aen"] +[ext_resource type="Texture2D" uid="uid://baelulw1inl6s" path="res://assets/third_party/tiny-swords/Deco/09.png" id="13_cl42n"] +[ext_resource type="Texture2D" uid="uid://ctwx8gghts62p" path="res://assets/third_party/tiny-swords/Deco/06.png" id="17_rrjyy"] +[ext_resource type="Texture2D" uid="uid://b10hdfd5m5mj4" path="res://assets/third_party/tiny-swords/Deco/04.png" id="18_co7i0"] +[ext_resource type="Texture2D" uid="uid://cw330muutqql7" path="res://assets/third_party/tiny-swords/Deco/05.png" id="19_4l0dv"] +[ext_resource type="PackedScene" uid="uid://877o14cjju6m" path="res://scenes/game_elements/characters/enemies/guard_old/guard_old.tscn" id="21_do0b6"] +[ext_resource type="Texture2D" uid="uid://bfqjvai7ajhw3" path="res://assets/third_party/tiny-swords/Deco/01.png" id="24_ycfuw"] +[ext_resource type="PackedScene" uid="uid://iu2q66clupc6" path="res://scenes/game_elements/characters/player/player.tscn" id="25_i14f5"] +[ext_resource type="SpriteFrames" uid="uid://dtoylirwywk0j" path="res://scenes/game_elements/characters/components/sprite_frames/storyweaver_blue.tres" id="26_5x1yj"] +[ext_resource type="PackedScene" uid="uid://d37mebu7atru7" path="res://scenes/game_elements/characters/enemies/guard/guard.tscn" id="27_hyk7n"] +[ext_resource type="SpriteFrames" uid="uid://d1k25io0tiiij" path="res://scenes/game_elements/characters/enemies/guard/components/storyvoretorch_frames_blue.tres" id="28_sfcll"] +[ext_resource type="AudioStream" uid="uid://dgpeb1dtmfqud" path="res://assets/third_party/sounds/characters/enemies/guard/AlertSound.ogg" id="29_sl4jh"] +[ext_resource type="AudioStream" uid="uid://4ec6e2alns71" path="res://assets/third_party/sounds/characters/enemies/guard/GrassFoot.ogg" id="30_bya0j"] +[ext_resource type="AudioStream" uid="uid://c7om8kdork2rx" path="res://assets/third_party/sounds/characters/enemies/guard/Torch.ogg" id="31_aqeyv"] +[ext_resource type="AudioStream" uid="uid://bwif2oo6ymiu2" path="res://assets/third_party/sounds/characters/enemies/guard/TorchHit.ogg" id="32_4ibgn"] + +[sub_resource type="Curve2D" id="Curve2D_vnsq3"] +_data = { +"points": PackedVector2Array(0, 0, 0, 0, -24, -32, 0, 0, 0, 0, -24, 352) +} +point_count = 2 + +[sub_resource type="GDScript" id="GDScript_do0b6"] +script/source = "# SPDX-FileCopyrightText: The Threadbare Authors +# SPDX-License-Identifier: MPL-2.0 +extends Control +@onready var enemy_guards: Node2D = $\"../../EnemyGuards\" +@onready var guard: Guard = $\"../../EnemyGuards/Guard\" +@onready var guard_old: GuardOld = $\"../../EnemyGuards/GuardOld\" + +var origin: Vector2 + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + origin = enemy_guards.get_global_transform_with_canvas().origin + # Play the game in slow motion: + Engine.time_scale = 0.5 + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(_delta: float) -> void: + # Force redraw at every frame: + queue_redraw() + + +func _draw() -> void: + # draw_circle(origin + guard.position, 10.0, Color.LIGHT_CORAL) + for p in guard.breadcrumbs: + draw_circle(origin + p, 10.0, Color.BLUE_VIOLET) + for p in guard_old.breadcrumbs: + draw_circle(origin + p, 10.0, Color.BLUE_VIOLET) + #if guard._last_seen: + #var p := guard._last_seen.position + #draw_circle(origin + p, 10.0, Color.LIGHT_CORAL) + #if guard_old.guard_movement.destination: + #var p := guard_old.guard_movement.destination + #draw_circle(origin + p, 10.0, Color.LIGHT_CORAL) +" + +[node name="GuardTest" type="Node2D" unique_id=1653863263] +y_sort_enabled = true + +[node name="StealthGameLogic" type="Node" parent="." unique_id=884618699] +script = ExtResource("1_03fpm") + +[node name="BackgroundMusic" parent="." unique_id=66500309 instance=ExtResource("2_o42vj")] +stream = ExtResource("3_5lhyl") + +[node name="CanvasModulate" type="CanvasModulate" parent="." unique_id=1095059991] +color = Color(0.481789, 0.48179, 0.481789, 1) + +[node name="TileMapLayers" type="Node2D" parent="." unique_id=1033049986] +y_sort_enabled = true + +[node name="Water" type="TileMapLayer" parent="TileMapLayers" unique_id=584623038] +tile_map_data = PackedByteArray("AAAGAP7/AAAAAAAAAAAGAP//AAAAAAAAAAAGAAAAAAAAAAAAAAAHAP7/AAAAAAAAAAAHAP//AAAAAAAAAAAHAAAAAAAAAAAAAAAIAP7/AAAAAAAAAAAIAP//AAAAAAAAAAAIAAAAAAAAAAAAAAAJAP7/AAAAAAAAAAAJAP//AAAAAAAAAAAJAAAAAAAAAAAAAAAKAP7/AAAAAAAAAAAKAP//AAAAAAAAAAAKAAAAAAAAAAAAAAALAP7/AAAAAAAAAAALAP//AAAAAAAAAAALAAAAAAAAAAAAAAAMAP7/AAAAAAAAAAAMAP//AAAAAAAAAAAMAAAAAAAAAAAAAAANAP7/AAAAAAAAAAANAP//AAAAAAAAAAANAAAAAAAAAAAAAAAOAP7/AAAAAAAAAAAOAP//AAAAAAAAAAAOAAAAAAAAAAAAAAAPAP7/AAAAAAAAAAAPAP//AAAAAAAAAAAPAAAAAAAAAAAAAAAQAP7/AAAAAAAAAAAQAP//AAAAAAAAAAAQAAAAAAAAAAAAAAARAP7/AAAAAAAAAAARAP//AAAAAAAAAAARAAAAAAAAAAAAAAASAP7/AAAAAAAAAAASAP//AAAAAAAAAAASAAAAAAAAAAAAAAATAP7/AAAAAAAAAAATAP//AAAAAAAAAAATAAAAAAAAAAAAAAAUAP7/AAAAAAAAAAAUAP//AAAAAAAAAAAUAAAAAAAAAAAAAAAVAP7/AAAAAAAAAAAVAP//AAAAAAAAAAAVAAAAAAAAAAAAAAAWAP7/AAAAAAAAAAAWAP//AAAAAAAAAAAWAAAAAAAAAAAAAAAXAP7/AAAAAAAAAAAXAP//AAAAAAAAAAAXAAAAAAAAAAAAAAAGAAYAAAAAAAAAAAAGAAcAAAAAAAAAAAAGAAgAAAAAAAAAAAAGAAkAAAAAAAAAAAAGAAoAAAAAAAAAAAAHAAYAAAAAAAAAAAAHAAcAAAAAAAAAAAAHAAgAAAAAAAAAAAAHAAkAAAAAAAAAAAAHAAoAAAAAAAAAAAAIAAYAAAAAAAAAAAAIAAcAAAAAAAAAAAAIAAgAAAAAAAAAAAAIAAkAAAAAAAAAAAAIAAoAAAAAAAAAAAAJAAgAAAAAAAAAAAAJAAkAAAAAAAAAAAAJAAoAAAAAAAAAAAAGAAUAAAAAAAAAAAAHAAQAAAAAAAAAAAAHAAUAAAAAAAAAAAAIAAQAAAAAAAAAAAAIAAUAAAAAAAAAAAAGAAEAAAAAAAAAAAAGAAIAAAAAAAAAAAAHAAEAAAAAAAAAAAAHAAIAAAAAAAAAAAAIAAEAAAAAAAAAAAAIAAIAAAAAAAAAAAAJAAEAAAAAAAAAAAAJAAcAAAAAAAAAAAAKAAgAAAAAAAAAAAAKAAkAAAAAAAAAAAAKAAoAAAAAAAAAAAALAAgAAAAAAAAAAAALAAkAAAAAAAAAAAALAAoAAAAAAAAAAAAMAAgAAAAAAAAAAAAMAAkAAAAAAAAAAAAMAAoAAAAAAAAAAAANAAgAAAAAAAAAAAANAAkAAAAAAAAAAAANAAoAAAAAAAAAAAAOAAgAAAAAAAAAAAAOAAkAAAAAAAAAAAAOAAoAAAAAAAAAAAAPAAgAAAAAAAAAAAAPAAkAAAAAAAAAAAAPAAoAAAAAAAAAAAAQAAgAAAAAAAAAAAAQAAkAAAAAAAAAAAAQAAoAAAAAAAAAAAARAAgAAAAAAAAAAAARAAkAAAAAAAAAAAARAAoAAAAAAAAAAAASAAgAAAAAAAAAAAASAAkAAAAAAAAAAAASAAoAAAAAAAAAAAATAAgAAAAAAAAAAAATAAkAAAAAAAAAAAATAAoAAAAAAAAAAAAUAAgAAAAAAAAAAAAUAAkAAAAAAAAAAAAUAAoAAAAAAAAAAAAVAAgAAAAAAAAAAAAVAAkAAAAAAAAAAAAVAAoAAAAAAAAAAAAWAAgAAAAAAAAAAAAWAAkAAAAAAAAAAAAWAAoAAAAAAAAAAAAXAAgAAAAAAAAAAAAXAAkAAAAAAAAAAAAXAAoAAAAAAAAAAAATAAEAAAAAAAAAAAAUAAEAAAAAAAAAAAAJAAIAAAAAAAAAAQAKAAEAAAAAAAAAAQAGAAQAAAAAAAAAAAAGAAMAAAAAAAAAAAAHAAMAAAAAAAAAAAAIAAMAAAAAAAAAAAATAAIAAAAAAAAAAAATAAMAAAAAAAAAAAATAAQAAAAAAAAAAAATAAUAAAAAAAAAAAATAAYAAAAAAAAAAAATAAcAAAAAAAAAAAAUAAcAAAAAAAAAAAAeAP7/AAAAAAAAAAAeAP//AAAAAAAAAAAeAAAAAAAAAAAAAAAeAAEAAAAAAAAAAAAeAAIAAAAAAAAAAAAeAAMAAAAAAAAAAAAeAAQAAAAAAAAAAAAeAAUAAAAAAAAAAAAeAAYAAAAAAAAAAAAeAAcAAAAAAAAAAAAeAAgAAAAAAAAAAAAeAAkAAAAAAAAAAAAeAAoAAAAAAAAAAAAfAP7/AAAAAAAAAAAfAP//AAAAAAAAAAAfAAAAAAAAAAAAAAAfAAEAAAAAAAAAAAAfAAIAAAAAAAAAAAAfAAMAAAAAAAAAAAAfAAQAAAAAAAAAAAAfAAUAAAAAAAAAAAAfAAYAAAAAAAAAAAAfAAcAAAAAAAAAAAAfAAgAAAAAAAAAAAAfAAkAAAAAAAAAAAAfAAoAAAAAAAAAAAAgAP7/AAAAAAAAAAAgAP//AAAAAAAAAAAgAAAAAAAAAAAAAAAgAAEAAAAAAAAAAAAgAAIAAAAAAAAAAAAgAAMAAAAAAAAAAAAgAAQAAAAAAAAAAAAgAAUAAAAAAAAAAAAgAAYAAAAAAAAAAAAgAAcAAAAAAAAAAAAgAAgAAAAAAAAAAAAgAAkAAAAAAAAAAAAgAAoAAAAAAAAAAAAYAAgAAAAAAAAAAAAYAAkAAAAAAAAAAAAYAAoAAAAAAAAAAAAZAAgAAAAAAAAAAAAZAAkAAAAAAAAAAAAZAAoAAAAAAAAAAAAaAAgAAAAAAAAAAAAaAAkAAAAAAAAAAAAaAAoAAAAAAAAAAAAbAAgAAAAAAAAAAAAbAAkAAAAAAAAAAAAbAAoAAAAAAAAAAAAcAAgAAAAAAAAAAAAcAAkAAAAAAAAAAAAcAAoAAAAAAAAAAAAdAAgAAAAAAAAAAAAdAAkAAAAAAAAAAAAdAAoAAAAAAAAAAAAYAP7/AAAAAAAAAAAYAP//AAAAAAAAAAAYAAAAAAAAAAAAAAAZAP7/AAAAAAAAAAAZAP//AAAAAAAAAAAZAAAAAAAAAAAAAAAaAP7/AAAAAAAAAAAaAP//AAAAAAAAAAAaAAAAAAAAAAAAAAAbAP7/AAAAAAAAAAAbAP//AAAAAAAAAAAbAAAAAAAAAAAAAAAcAP7/AAAAAAAAAAAcAP//AAAAAAAAAAAcAAAAAAAAAAAAAAAdAP7/AAAAAAAAAAAdAP//AAAAAAAAAAAdAAAAAAAAAAAAAAADAPv/AAAAAAAAAAADAPz/AAAAAAAAAAADAP3/AAAAAAAAAAAEAPv/AAAAAAAAAAAEAPz/AAAAAAAAAAAEAP3/AAAAAAAAAAAFAPv/AAAAAAAAAAAFAPz/AAAAAAAAAAAFAP3/AAAAAAAAAAAGAPv/AAAAAAAAAAAGAPz/AAAAAAAAAAAGAP3/AAAAAAAAAAAHAPv/AAAAAAAAAAAHAPz/AAAAAAAAAAAHAP3/AAAAAAAAAAAIAPv/AAAAAAAAAAAIAPz/AAAAAAAAAAAIAP3/AAAAAAAAAAAJAPv/AAAAAAAAAAAJAPz/AAAAAAAAAAAJAP3/AAAAAAAAAAAKAPv/AAAAAAAAAAAKAPz/AAAAAAAAAAAKAP3/AAAAAAAAAAALAPv/AAAAAAAAAAALAPz/AAAAAAAAAAALAP3/AAAAAAAAAAAMAPv/AAAAAAAAAAAMAPz/AAAAAAAAAAAMAP3/AAAAAAAAAAANAPv/AAAAAAAAAAANAPz/AAAAAAAAAAANAP3/AAAAAAAAAAAOAPv/AAAAAAAAAAAOAPz/AAAAAAAAAAAOAP3/AAAAAAAAAAAPAPv/AAAAAAAAAAAPAPz/AAAAAAAAAAAPAP3/AAAAAAAAAAAQAPv/AAAAAAAAAAAQAPz/AAAAAAAAAAAQAP3/AAAAAAAAAAARAPv/AAAAAAAAAAARAPz/AAAAAAAAAAARAP3/AAAAAAAAAAASAPv/AAAAAAAAAAASAPz/AAAAAAAAAAASAP3/AAAAAAAAAAATAPv/AAAAAAAAAAATAPz/AAAAAAAAAAATAP3/AAAAAAAAAAAUAPv/AAAAAAAAAAAUAPz/AAAAAAAAAAAUAP3/AAAAAAAAAAAVAPv/AAAAAAAAAAAVAPz/AAAAAAAAAAAVAP3/AAAAAAAAAAAWAPv/AAAAAAAAAAAWAPz/AAAAAAAAAAAWAP3/AAAAAAAAAAAXAPv/AAAAAAAAAAAXAPz/AAAAAAAAAAAXAP3/AAAAAAAAAAAYAPv/AAAAAAAAAAAYAPz/AAAAAAAAAAAYAP3/AAAAAAAAAAAZAPv/AAAAAAAAAAAZAPz/AAAAAAAAAAAZAP3/AAAAAAAAAAAaAPv/AAAAAAAAAAAaAPz/AAAAAAAAAAAaAP3/AAAAAAAAAAAbAPv/AAAAAAAAAAAbAPz/AAAAAAAAAAAbAP3/AAAAAAAAAAAcAPv/AAAAAAAAAAAcAPz/AAAAAAAAAAAcAP3/AAAAAAAAAAAdAPv/AAAAAAAAAAAdAPz/AAAAAAAAAAAdAP3/AAAAAAAAAAAeAPv/AAAAAAAAAAAeAPz/AAAAAAAAAAAeAP3/AAAAAAAAAAAfAPv/AAAAAAAAAAAfAPz/AAAAAAAAAAAfAP3/AAAAAAAAAAAgAPv/AAAAAAAAAAAgAPz/AAAAAAAAAAAgAP3/AAAAAAAAAAAhAPv/AAAAAAAAAAAhAPz/AAAAAAAAAAAhAP3/AAAAAAAAAAAiAPv/AAAAAAAAAAAiAPz/AAAAAAAAAAAiAP3/AAAAAAAAAAAjAPv/AAAAAAAAAAAjAPz/AAAAAAAAAAAjAP3/AAAAAAAAAAADAAsAAAAAAAAAAAADAAwAAAAAAAAAAAADAA0AAAAAAAAAAAAEAAsAAAAAAAAAAAAEAAwAAAAAAAAAAAAEAA0AAAAAAAAAAAAFAAsAAAAAAAAAAAAFAAwAAAAAAAAAAAAFAA0AAAAAAAAAAAAGAAsAAAAAAAAAAAAGAAwAAAAAAAAAAAAGAA0AAAAAAAAAAAAHAAsAAAAAAAAAAAAHAAwAAAAAAAAAAAAHAA0AAAAAAAAAAAAIAAsAAAAAAAAAAAAIAAwAAAAAAAAAAAAIAA0AAAAAAAAAAAAJAAsAAAAAAAAAAAAJAAwAAAAAAAAAAAAJAA0AAAAAAAAAAAAKAAsAAAAAAAAAAAAKAAwAAAAAAAAAAAAKAA0AAAAAAAAAAAALAAsAAAAAAAAAAAALAAwAAAAAAAAAAAALAA0AAAAAAAAAAAAMAAsAAAAAAAAAAAAMAAwAAAAAAAAAAAAMAA0AAAAAAAAAAAANAAsAAAAAAAAAAAANAAwAAAAAAAAAAAANAA0AAAAAAAAAAAAOAAsAAAAAAAAAAAAOAAwAAAAAAAAAAAAOAA0AAAAAAAAAAAAPAAsAAAAAAAAAAAAPAAwAAAAAAAAAAAAPAA0AAAAAAAAAAAAQAAsAAAAAAAAAAAAQAAwAAAAAAAAAAAAQAA0AAAAAAAAAAAARAAsAAAAAAAAAAAARAAwAAAAAAAAAAAARAA0AAAAAAAAAAAASAAsAAAAAAAAAAAASAAwAAAAAAAAAAAASAA0AAAAAAAAAAAATAAsAAAAAAAAAAAATAAwAAAAAAAAAAAATAA0AAAAAAAAAAAAUAAsAAAAAAAAAAAAUAAwAAAAAAAAAAAAUAA0AAAAAAAAAAAAVAAsAAAAAAAAAAAAVAAwAAAAAAAAAAAAVAA0AAAAAAAAAAAAWAAsAAAAAAAAAAAAWAAwAAAAAAAAAAAAWAA0AAAAAAAAAAAAXAAsAAAAAAAAAAAAXAAwAAAAAAAAAAAAXAA0AAAAAAAAAAAAYAAsAAAAAAAAAAAAYAAwAAAAAAAAAAAAYAA0AAAAAAAAAAAAZAAsAAAAAAAAAAAAZAAwAAAAAAAAAAAAZAA0AAAAAAAAAAAAaAAsAAAAAAAAAAAAaAAwAAAAAAAAAAAAaAA0AAAAAAAAAAAAbAAsAAAAAAAAAAAAbAAwAAAAAAAAAAAAbAA0AAAAAAAAAAAAcAAsAAAAAAAAAAAAcAAwAAAAAAAAAAAAcAA0AAAAAAAAAAAAdAAsAAAAAAAAAAAAdAAwAAAAAAAAAAAAdAA0AAAAAAAAAAAAeAAsAAAAAAAAAAAAeAAwAAAAAAAAAAAAeAA0AAAAAAAAAAAAfAAsAAAAAAAAAAAAfAAwAAAAAAAAAAAAfAA0AAAAAAAAAAAAgAAsAAAAAAAAAAAAgAAwAAAAAAAAAAAAgAA0AAAAAAAAAAAAhAAsAAAAAAAAAAAAhAAwAAAAAAAAAAAAhAA0AAAAAAAAAAAAiAAsAAAAAAAAAAAAiAAwAAAAAAAAAAAAiAA0AAAAAAAAAAAAjAAsAAAAAAAAAAAAjAAwAAAAAAAAAAAAjAA0AAAAAAAAAAAAhAP7/AAAAAAAAAAAhAP//AAAAAAAAAAAhAAAAAAAAAAAAAAAhAAEAAAAAAAAAAAAhAAIAAAAAAAAAAAAhAAMAAAAAAAAAAAAhAAQAAAAAAAAAAAAhAAUAAAAAAAAAAAAhAAYAAAAAAAAAAAAhAAcAAAAAAAAAAAAhAAgAAAAAAAAAAAAhAAkAAAAAAAAAAAAhAAoAAAAAAAAAAAAiAP7/AAAAAAAAAAAiAP//AAAAAAAAAAAiAAAAAAAAAAAAAAAiAAEAAAAAAAAAAAAiAAIAAAAAAAAAAAAiAAMAAAAAAAAAAAAiAAQAAAAAAAAAAAAiAAUAAAAAAAAAAAAiAAYAAAAAAAAAAAAiAAcAAAAAAAAAAAAiAAgAAAAAAAAAAAAiAAkAAAAAAAAAAAAiAAoAAAAAAAAAAAAjAP7/AAAAAAAAAAAjAP//AAAAAAAAAAAjAAAAAAAAAAAAAAAjAAEAAAAAAAAAAAAjAAIAAAAAAAAAAAAjAAMAAAAAAAAAAAAjAAQAAAAAAAAAAAAjAAUAAAAAAAAAAAAjAAYAAAAAAAAAAAAjAAcAAAAAAAAAAAAjAAgAAAAAAAAAAAAjAAkAAAAAAAAAAAAjAAoAAAAAAAAAAAADAP7/AAAAAAAAAAADAP//AAAAAAAAAAADAAAAAAAAAAAAAAADAAEAAAAAAAAAAAADAAIAAAAAAAAAAAADAAMAAAAAAAAAAAADAAQAAAAAAAAAAAADAAUAAAAAAAAAAAADAAYAAAAAAAAAAAADAAcAAAAAAAAAAAADAAgAAAAAAAAAAAADAAkAAAAAAAAAAAADAAoAAAAAAAAAAAAEAP7/AAAAAAAAAAAEAP//AAAAAAAAAAAEAAAAAAAAAAAAAAAEAAEAAAAAAAAAAAAEAAIAAAAAAAAAAAAEAAMAAAAAAAAAAAAEAAQAAAAAAAAAAAAEAAUAAAAAAAAAAAAEAAYAAAAAAAAAAAAEAAcAAAAAAAAAAAAEAAgAAAAAAAAAAAAEAAkAAAAAAAAAAAAEAAoAAAAAAAAAAAAFAP7/AAAAAAAAAAAFAP//AAAAAAAAAAAFAAAAAAAAAAAAAAAFAAEAAAAAAAAAAAAFAAIAAAAAAAAAAAAFAAMAAAAAAAAAAAAFAAQAAAAAAAAAAAAFAAUAAAAAAAAAAAAFAAYAAAAAAAAAAAAFAAcAAAAAAAAAAAAFAAgAAAAAAAAAAAAFAAkAAAAAAAAAAAAFAAoAAAAAAAAAAAA=") +tile_set = ExtResource("4_k5854") + +[node name="Foam" type="TileMapLayer" parent="TileMapLayers" unique_id=357905616] +tile_map_data = PackedByteArray("AAAJAAMAAgAAAAAAAAAJAAQAAgAAAAAAAAAJAAUAAgAAAAAAAAAJAAYAAgAAAAAAAAAJAAcAAgAAAAAAAAAKAAcAAgAAAAAAAAAKAAgAAgAAAAAAAAALAAgAAgAAAAAAAAAMAAgAAgAAAAAAAAANAAgAAgAAAAAAAAAPAAgAAgAAAAAAAAAOAAgAAgAAAAAAAAAQAAgAAgAAAAAAAAARAAgAAgAAAAAAAAASAAgAAgAAAAAAAAASAAIAAgAAAAAAAAASAAMAAgAAAAAAAAASAAQAAgAAAAAAAAASAAUAAgAAAAAAAAASAAYAAgAAAAAAAAASAAcAAgAAAAAAAAAUAAMAAgAAAAAAAAAUAAQAAgAAAAAAAAAUAAUAAgAAAAAAAAAUAAYAAgAAAAAAAAAUAAcAAgAAAAAAAAAVAAcAAgAAAAAAAAAVAAgAAgAAAAAAAAAWAAgAAgAAAAAAAAAXAAgAAgAAAAAAAAAYAAgAAgAAAAAAAAAZAAgAAgAAAAAAAAAaAAgAAgAAAAAAAAAbAAgAAgAAAAAAAAAcAAgAAgAAAAAAAAAdAAIAAgAAAAAAAAAdAAMAAgAAAAAAAAAdAAQAAgAAAAAAAAAdAAUAAgAAAAAAAAAdAAYAAgAAAAAAAAAdAAcAAgAAAAAAAAAdAAgAAgAAAAAAAAA=") +tile_set = ExtResource("5_ps5t8") + +[node name="Stone Cover" type="TileMapLayer" parent="TileMapLayers" unique_id=1875275936] +tile_map_data = PackedByteArray("AAAJAAYABAABAAEAAAAJAAUABAABAAEAAAAJAAQABAABAAEAAAAJAAMABAABAAEAAAASAAcABAADAAEAAQARAAcABAADAAEAAQAQAAcABAADAAEAAQAPAAcABAADAAEAAQAOAAcABAADAAEAAQANAAcABAADAAEAAQAMAAcABAADAAEAAQALAAcABAADAAEAAQAKAAcABAADAAEAAQAUAAMABAABAAEAAAAUAAQABAABAAEAAAAUAAUABAABAAEAAAAUAAYABAABAAEAAAAVAAcABAADAAEAAQAWAAcABAADAAEAAQAXAAcABAADAAEAAQAYAAcABAADAAEAAQAZAAcABAADAAEAAQAaAAcABAADAAEAAQAbAAcABAADAAEAAQAcAAcABAADAAEAAQAdAAcABAADAAEAAQA=") +tile_set = ExtResource("6_bpfsd") + +[node name="Grass" type="TileMapLayer" parent="TileMapLayers" unique_id=130515080] +tile_map_data = PackedByteArray("AAAJAAIAAQAAAAAAAAAJAAMAAQAAAAEAAAAJAAQAAQAAAAEAAAAJAAUAAQAAAAEAAAAJAAYAAQAAAAIAAAAKAAEAAQAAAAAAAAAKAAIAAQABAAEAAAAKAAMAAQABAAEAAAAKAAQAAQABAAEAAAAKAAUAAQABAAEAAAAKAAYAAQABAAEAAAAKAAcAAQAAAAIAAAALAAEAAQABAAAAAAALAAIAAQABAAEAAAALAAMAAQABAAEAAAALAAQAAQABAAEAAAALAAUAAQABAAEAAAALAAYAAQABAAEAAAALAAcAAQABAAIAAAAMAAEAAQABAAAAAAAMAAIAAQABAAEAAAAMAAMAAQABAAEAAAAMAAQAAQABAAEAAAAMAAUAAQABAAEAAAAMAAYAAQABAAEAAAAMAAcAAQABAAIAAAANAAEAAQABAAAAAAANAAIAAQABAAEAAAANAAMAAQABAAEAAAANAAQAAQABAAEAAAANAAUAAQABAAEAAAANAAYAAQABAAEAAAANAAcAAQABAAIAAAAOAAEAAQABAAAAAAAOAAIAAQABAAEAAAAOAAMAAQABAAEAAAAOAAQAAQABAAEAAAAOAAUAAQABAAEAAAAOAAYAAQABAAEAAAAOAAcAAQABAAIAAAAPAAEAAQABAAAAAAAPAAIAAQABAAEAAAAPAAMAAQABAAEAAAAPAAQAAQABAAEAAAAPAAUAAQABAAEAAAAPAAYAAQABAAEAAAAPAAcAAQABAAIAAAAQAAEAAQABAAAAAAAQAAIAAQABAAEAAAAQAAMAAQABAAEAAAAQAAQAAQABAAEAAAAQAAUAAQABAAEAAAAQAAYAAQABAAEAAAAQAAcAAQABAAIAAAARAAEAAQABAAAAAAARAAIAAQABAAEAAAARAAMAAQABAAEAAAARAAQAAQABAAEAAAARAAUAAQABAAEAAAARAAYAAQABAAEAAAARAAcAAQABAAIAAAASAAEAAQACAAAAAAASAAIAAQACAAEAAAASAAMAAQACAAEAAAASAAQAAQACAAEAAAASAAUAAQACAAEAAAASAAYAAQACAAEAAAASAAcAAQACAAIAAAAUAAIAAQAAAAAAAAAUAAMAAQAAAAEAAAAUAAQAAQAAAAEAAAAUAAUAAQAAAAEAAAAUAAYAAQAAAAIAAAAVAAEAAQAAAAAAAAAVAAIAAQABAAEAAAAVAAMAAQABAAEAAAAVAAQAAQABAAEAAAAVAAUAAQABAAEAAAAVAAYAAQABAAEAAAAVAAcAAQAAAAIAAAAWAAEAAQABAAAAAAAWAAIAAQABAAEAAAAWAAMAAQABAAEAAAAWAAQAAQABAAEAAAAWAAUAAQABAAEAAAAWAAYAAQABAAEAAAAWAAcAAQABAAIAAAAXAAEAAQABAAAAAAAXAAIAAQABAAEAAAAXAAMAAQABAAEAAAAXAAQAAQABAAEAAAAXAAUAAQABAAEAAAAXAAYAAQABAAEAAAAXAAcAAQABAAIAAAAYAAEAAQABAAAAAAAYAAIAAQABAAEAAAAYAAMAAQABAAEAAAAYAAQAAQABAAEAAAAYAAUAAQABAAEAAAAYAAYAAQABAAEAAAAYAAcAAQABAAIAAAAZAAEAAQABAAAAAAAZAAIAAQABAAEAAAAZAAMAAQABAAEAAAAZAAQAAQABAAEAAAAZAAUAAQABAAEAAAAZAAYAAQABAAEAAAAZAAcAAQABAAIAAAAaAAEAAQABAAAAAAAaAAIAAQABAAEAAAAaAAMAAQABAAEAAAAaAAQAAQABAAEAAAAaAAUAAQABAAEAAAAaAAYAAQABAAEAAAAaAAcAAQABAAIAAAAbAAEAAQABAAAAAAAbAAIAAQABAAEAAAAbAAMAAQABAAEAAAAbAAQAAQABAAEAAAAbAAUAAQABAAEAAAAbAAYAAQABAAEAAAAbAAcAAQABAAIAAAAcAAEAAQABAAAAAAAcAAIAAQABAAEAAAAcAAMAAQABAAEAAAAcAAQAAQABAAEAAAAcAAUAAQABAAEAAAAcAAYAAQABAAEAAAAcAAcAAQABAAIAAAAdAAEAAQACAAAAAAAdAAIAAQACAAEAAAAdAAMAAQACAAEAAAAdAAQAAQACAAEAAAAdAAUAAQACAAEAAAAdAAYAAQACAAEAAAAdAAcAAQACAAIAAAA=") +tile_set = ExtResource("7_i7aen") + +[node name="Grass Worn" type="TileMapLayer" parent="TileMapLayers" unique_id=578971627] +tile_map_data = PackedByteArray("AAAOAAcABQADAAIAAAAOAAEABQADAAAAAAAOAAIABQADAAEAAAAOAAMABQADAAEAAAAOAAQABQADAAEAAAAOAAUABQADAAEAAAAOAAYABQADAAEAAAAZAAEABQADAAAAAAAZAAIABQADAAEAAAAZAAMABQADAAEAAAAZAAQABQADAAEAAAAZAAUABQADAAEAAAAZAAYABQADAAEAAAAZAAcABQADAAIAAAA=") +tile_set = ExtResource("7_i7aen") + +[node name="Stones" type="TileMapLayer" parent="TileMapLayers" unique_id=1628731558] +tile_map_data = PackedByteArray("AAAKAAgABAAAAAMAAAALAAgABAABAAMAAAAMAAgABAABAAMAAAANAAgABAABAAMAAAAQAAgABAABAAMAAAAPAAgABAABAAMAAAAOAAgABAABAAMAAAARAAgABAABAAMAAAASAAgABAACAAMAAAAJAAcABAAAAAMAAAAUAAcABAAAAAMAAAAVAAgABAAAAAMAAAAWAAgABAABAAMAAAAXAAgABAABAAMAAAAYAAgABAABAAMAAAAZAAgABAABAAMAAAAaAAgABAABAAMAAAAbAAgABAABAAMAAAAcAAgABAABAAMAAAAdAAgABAACAAMAAAA=") +tile_set = ExtResource("6_bpfsd") +collision_enabled = false + +[node name="Stones Level 3" type="TileMapLayer" parent="TileMapLayers" unique_id=426633963] +tile_map_data = PackedByteArray("AAAMAAIABAACAAAAAAALAAIABAAAAAAAAAAMAAYABAACAAMAAAALAAYABAAAAAMAAAAMAAMABAACAAEAAAALAAMABAAAAAEAAAAMAAUABAACAAIAAAALAAUABAAAAAIAAAAMAAQABAACAAEAAAALAAQABAAAAAEAAAARAAUABAACAAIAAAARAAQABAACAAAAAAAQAAUABAAAAAIAAAAQAAQABAAAAAAAAAARAAYABAACAAMAAAAQAAYABAAAAAMAAAAWAAIABAAAAAAAAAAWAAMABAAAAAEAAAAWAAQABAAAAAEAAAAWAAUABAAAAAIAAAAWAAYABAAAAAMAAAAXAAIABAACAAAAAAAXAAMABAACAAEAAAAXAAQABAACAAEAAAAXAAUABAACAAIAAAAXAAYABAACAAMAAAAbAAQABAAAAAAAAAAbAAUABAAAAAIAAAAbAAYABAAAAAMAAAAcAAQABAACAAAAAAAcAAUABAACAAIAAAAcAAYABAACAAMAAAA=") +tile_set = ExtResource("6_bpfsd") + +[node name="PropsLeft" type="Node2D" parent="." unique_id=1972057827] +y_sort_enabled = true + +[node name="Bush" type="Sprite2D" parent="PropsLeft" unique_id=1417676512] +position = Vector2(1038, 438) +texture = ExtResource("13_cl42n") + +[node name="Rock" type="Sprite2D" parent="PropsLeft" unique_id=1349178484] +position = Vector2(595, 262) +texture = ExtResource("17_rrjyy") + +[node name="Rock2" type="Sprite2D" parent="PropsLeft" unique_id=1156853998] +position = Vector2(623, 270) +texture = ExtResource("19_4l0dv") + +[node name="Rock3" type="Sprite2D" parent="PropsLeft" unique_id=217027698] +position = Vector2(606, 293) +texture = ExtResource("18_co7i0") + +[node name="Mushroom" type="Sprite2D" parent="PropsLeft" unique_id=556043882] +position = Vector2(1056, 448) +texture = ExtResource("24_ycfuw") + +[node name="PropsRight" type="Node2D" parent="." unique_id=1127692833] +y_sort_enabled = true +position = Vector2(704, 0) + +[node name="Bush" type="Sprite2D" parent="PropsRight" unique_id=1908788453] +position = Vector2(1038, 438) +texture = ExtResource("13_cl42n") + +[node name="Rock" type="Sprite2D" parent="PropsRight" unique_id=188590430] +position = Vector2(595, 262) +texture = ExtResource("17_rrjyy") + +[node name="Rock2" type="Sprite2D" parent="PropsRight" unique_id=550500399] +position = Vector2(623, 270) +texture = ExtResource("19_4l0dv") + +[node name="Rock3" type="Sprite2D" parent="PropsRight" unique_id=1176670763] +position = Vector2(606, 293) +texture = ExtResource("18_co7i0") + +[node name="Mushroom" type="Sprite2D" parent="PropsRight" unique_id=534577394] +position = Vector2(1056, 448) +texture = ExtResource("24_ycfuw") + +[node name="Player" parent="." unique_id=127705483 instance=ExtResource("25_i14f5")] +position = Vector2(640, 320) +player_name = "StoryWeaver" +sprite_frames = ExtResource("26_5x1yj") + +[node name="Player2" parent="." unique_id=296354958 instance=ExtResource("25_i14f5")] +position = Vector2(1344, 321) +player_name = "StoryWeaver" +sprite_frames = ExtResource("26_5x1yj") + +[node name="EnemyGuards" type="Node2D" parent="." unique_id=1913769214] +y_sort_enabled = true + +[node name="Guard" parent="EnemyGuards" unique_id=1439197628 node_paths=PackedStringArray("patrol_path") instance=ExtResource("27_hyk7n")] +position = Vector2(928, 96) +sprite_frames = ExtResource("28_sfcll") +alerted_sound_stream = ExtResource("29_sl4jh") +footsteps_sound_stream = ExtResource("30_bya0j") +idle_sound_stream = ExtResource("31_aqeyv") +alert_others_sound_stream = ExtResource("32_4ibgn") +patrol_path = NodePath("../Guard-PatrolPath") +move_speed = 200.0 +move_while_in_editor = true +show_debug_info = true + +[node name="Guard-PatrolPath" type="Path2D" parent="EnemyGuards" unique_id=499373590] +top_level = true +position = Vector2(952, 128) +curve = SubResource("Curve2D_vnsq3") + +[node name="GuardOld" parent="EnemyGuards" unique_id=689832587 node_paths=PackedStringArray("patrol_path") instance=ExtResource("21_do0b6")] +position = Vector2(1632, 96) +sprite_frames = ExtResource("28_sfcll") +alerted_sound_stream = ExtResource("29_sl4jh") +footsteps_sound_stream = ExtResource("30_bya0j") +idle_sound_stream = ExtResource("31_aqeyv") +alert_others_sound_stream = ExtResource("32_4ibgn") +patrol_path = NodePath("../Guard-PatrolPath2") +move_speed = 200.0 +move_while_in_editor = true +show_debug_info = true + +[node name="Guard-PatrolPath2" type="Path2D" parent="EnemyGuards" unique_id=1178531064] +top_level = true +position = Vector2(1656, 128) +curve = SubResource("Curve2D_vnsq3") + +[node name="ScreenOverlay" type="CanvasLayer" parent="." unique_id=603394532] + +[node name="Control" type="Control" parent="ScreenOverlay" unique_id=986673529] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = SubResource("GDScript_do0b6") + +[node name="Camera2D" type="Camera2D" parent="." unique_id=857685128] +unique_name_in_owner = true +process_mode = 3 +position = Vector2(1216, 320) +limit_left = 512 +limit_top = 0 +limit_right = 1984 +limit_bottom = 640 +position_smoothing_enabled = true +editor_draw_limits = true From 64bebcccd865100b4f5af780d637b7337043834d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Thu, 5 Feb 2026 09:39:59 -0300 Subject: [PATCH 02/16] Guard script: Check for empty array better --- .../characters/enemies/guard/components/guard.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index 72a9c1bcc3..d1ce84a4f3 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -184,7 +184,7 @@ func _process_state() -> void: State.INVESTIGATING: guard_movement.set_destination(last_seen_position) State.RETURNING: - if not breadcrumbs.is_empty(): + if breadcrumbs: var target_position: Vector2 = breadcrumbs.back() guard_movement.set_destination(target_position) else: @@ -266,7 +266,7 @@ func _on_path_blocked() -> void: State.INVESTIGATING: state = State.RETURNING State.RETURNING: - if not breadcrumbs.is_empty(): + if breadcrumbs: breadcrumbs.pop_back() From 4634d9d6d362f5218bf266e909e362dd41e4df44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Thu, 5 Feb 2026 10:13:59 -0300 Subject: [PATCH 03/16] Guard script: Simplify debug information --- .../enemies/guard/components/guard.gd | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index d1ce84a4f3..80940db4b9 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -224,12 +224,12 @@ func _update_debug_info() -> void: if not debug_info.visible: return debug_info.text = "" - debug_property("position") - debug_value("state", State.keys()[state]) - debug_property("previous_patrol_point_idx") - debug_property("current_patrol_point_idx") - debug_value("time left", "%.2f" % guard_movement.still_time_left_in_seconds) - debug_value("target point", guard_movement.destination) + debug_info.text += "%s: %s\n" % ["position", position] + debug_info.text += "%s: %s\n" % ["state", State.keys()[state]] + debug_info.text += "%s: %s\n" % ["previous_patrol_point_idx", previous_patrol_point_idx] + debug_info.text += "%s: %s\n" % ["current_patrol_point_idx", current_patrol_point_idx] + debug_info.text += "%s: %.2f\n" % ["time left", guard_movement.still_time_left_in_seconds] + debug_info.text += "%s: %s\n" % ["target point", guard_movement.destination] ## What happens when the guard reached the point it was walking towards @@ -293,16 +293,6 @@ func _set_state(new_state: State) -> void: breadcrumbs.push_back(global_position) -## Pass a property name as a parameter and it shows its name and its value -func debug_property(property_name: String) -> void: - debug_value(property_name, get(property_name)) - - -## Pass a value name and its value and it shows it on DebugInfo -func debug_value(value_name: String, value: Variant) -> void: - debug_info.text += "%s: %s\n" % [value_name, value] - - ## Calculate and set the next point in the patrol path. ## The guard would circle back if the path is open, and go in rounds if the ## path is closed. From b56a08483c23560dda7c117693ef1c2a4b0d619a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Thu, 5 Feb 2026 11:13:52 -0300 Subject: [PATCH 04/16] Guard script: Use timer for the waiting Add a timer node, and remove the custom time handling from the guard movement. --- .../enemies/guard/components/guard.gd | 44 +++++++++++++------ .../guard/components/guard_movement.gd | 29 +----------- .../characters/enemies/guard/guard.tscn | 20 +++++++++ 3 files changed, 51 insertions(+), 42 deletions(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index 80940db4b9..c2592c3901 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -15,6 +15,8 @@ signal player_detected(player: Node2D) enum State { ## Going along the path. PATROLLING, + ## Waiting idle at a path end, or after losing track of player, before returning. + WAITING, ## Player is in sight, it takes some time until the player is detected. DETECTING, ## Player was detected. @@ -53,7 +55,9 @@ const DEFAULT_SPRITE_FRAMES = preload("uid://ovu5wqo15s5g") patrol_path = new_value ## The wait time at each patrol point. -@export_range(0, 5, 0.1, "or_greater", "suffix:s") var wait_time: float = 1.0 +@export_range(0, 5, 0.1, "or_greater", "suffix:s") var wait_time: float = 1.0: + set = _set_wait_time + ## The speed at which the guard moves. @export_range(20, 300, 5, "or_greater", "or_less", "suffix:m/s") var move_speed: float = 100.0 @@ -89,6 +93,8 @@ var breadcrumbs: Array[Vector2] = [] var state: State = State.PATROLLING: set = _set_state +var _previous_state: State + # The player that's being detected. var _player: Node2D @@ -110,6 +116,9 @@ var _player: Node2D # gdlint:ignore = max-line-length var character_animation_player_behavior: CharacterAnimationPlayerBehavior = %CharacterAnimationPlayerBehavior +## Timer for the waiting state. +@onready var waiting_timer: Timer = %WaitingTimer + ## Handles the velocity and movement of the guard. @onready var guard_movement: GuardMovement = %GuardMovement @onready var animated_sprite_2d: AnimatedSprite2D = %AnimatedSprite2D @@ -153,7 +162,6 @@ func _ready() -> void: global_position = _patrol_point_position(0) guard_movement.destination_reached.connect(self._on_destination_reached) - guard_movement.still_time_finished.connect(self._on_still_time_finished) guard_movement.path_blocked.connect(self._on_path_blocked) @@ -228,7 +236,7 @@ func _update_debug_info() -> void: debug_info.text += "%s: %s\n" % ["state", State.keys()[state]] debug_info.text += "%s: %s\n" % ["previous_patrol_point_idx", previous_patrol_point_idx] debug_info.text += "%s: %s\n" % ["current_patrol_point_idx", current_patrol_point_idx] - debug_info.text += "%s: %.2f\n" % ["time left", guard_movement.still_time_left_in_seconds] + debug_info.text += "%s: %.2f\n" % ["time left", waiting_timer.time_left] debug_info.text += "%s: %s\n" % ["target point", guard_movement.destination] @@ -236,27 +244,20 @@ func _update_debug_info() -> void: func _on_destination_reached() -> void: match state: State.PATROLLING: - guard_movement.wait_seconds(wait_time) + state = State.WAITING _advance_target_patrol_point() State.INVESTIGATING: - guard_movement.wait_seconds(wait_time) + state = State.WAITING State.RETURNING: breadcrumbs.pop_back() -## What happens when the guard finished waiting on a point. -func _on_still_time_finished() -> void: - match state: - State.INVESTIGATING: - state = State.RETURNING - - ## What happens if the guard cannot reach their destination because it got ## stuck with a collider. func _on_path_blocked() -> void: match state: State.PATROLLING: - guard_movement.wait_seconds(wait_time) + state = State.WAITING # This check makes sure that if the guard is blocked on start, # they won't try to set an invalid patrol point as destination. if previous_patrol_point_idx > -1: @@ -274,6 +275,7 @@ func _set_state(new_state: State) -> void: if state == new_state: return + _previous_state = state state = new_state match state: @@ -289,8 +291,9 @@ func _set_state(new_state: State) -> void: player_awareness.tint_progress = Color.RED player_awareness.visible = true State.INVESTIGATING: - guard_movement.start_moving_now() breadcrumbs.push_back(global_position) + State.WAITING: + waiting_timer.start() ## Calculate and set the next point in the patrol path. @@ -448,6 +451,11 @@ func _set_alert_other_sound_stream(new_value: AudioStream) -> void: _torch_hit_sound.stream = new_value +func _set_wait_time(new_wait_time: float) -> void: + wait_time = new_wait_time + waiting_timer.wait_time = wait_time + + func _on_instant_detection_area_body_entered(body: Node2D) -> void: state = State.ALERTED player_detected.emit(body) @@ -470,3 +478,11 @@ func _on_detection_area_body_exited(body: Node2D) -> void: if state == State.DETECTING: guard_movement.stop_moving() state = State.INVESTIGATING + + +func _on_waiting_timer_timeout() -> void: + match _previous_state: + State.PATROLLING: + state = State.PATROLLING + State.INVESTIGATING: + state = State.RETURNING diff --git a/scenes/game_elements/characters/enemies/guard/components/guard_movement.gd b/scenes/game_elements/characters/enemies/guard/components/guard_movement.gd index 9cbe01b99a..7217567276 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard_movement.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard_movement.gd @@ -4,15 +4,11 @@ class_name GuardMovement extends Node2D -## Emitted when [member still_time_left] reaches 0 -signal still_time_finished ## Emitted when [member guard] reached [member destination] signal destination_reached ## Emitted when [member guard] got stuck trying to reach [member destination] signal path_blocked -## While this time is greater than 0, the guard won't move -var still_time_left_in_seconds: float = 0.0 var _destination_reached: bool = true ## Target position into which the guard will move, in absolute coordinates @@ -21,11 +17,6 @@ var _destination_reached: bool = true func _process(delta: float) -> void: - if still_time_left_in_seconds > 0.0: - still_time_left_in_seconds = move_toward(still_time_left_in_seconds, 0.0, delta) - if still_time_left_in_seconds <= 0.0: - still_time_finished.emit() - if ( not _destination_reached and guard.global_position.distance_to(destination) <= guard.velocity.length() * delta @@ -50,35 +41,17 @@ func move() -> void: ## Returns the velocity the guard should have, receives the delta time since ## the last frame as a parameter func calculate_velocity() -> Vector2: - if still_time_left_in_seconds > 0.0 or _destination_reached: + if _destination_reached: return Vector2.ZERO return guard.global_position.direction_to(destination) * guard.move_speed -## Make the guard stop for the given time, in seconds -func wait_seconds(time: float) -> void: - still_time_left_in_seconds = time - - ## Sets the next point into which the guard will move. -## It won't make the guard move if [member still_time_left_in_seconds] if -## greater than 0. func set_destination(new_destination: Vector2) -> void: _destination_reached = false destination = new_destination -func start_moving_now() -> void: - still_time_left_in_seconds = 0.0 - - -## Sets the next point into which the guard will move AND makes it start moving -## even if [member still_time_left_in_seconds] was positive. -func start_moving_towards(new_destination: Vector2) -> void: - set_destination(new_destination) - still_time_left_in_seconds = 0.0 - - ## Sets the destination to the same point the guard is at so it doesn't try to ## travel to any new point func stop_moving() -> void: diff --git a/scenes/game_elements/characters/enemies/guard/guard.tscn b/scenes/game_elements/characters/enemies/guard/guard.tscn index e8ef2b2b66..90a166903c 100644 --- a/scenes/game_elements/characters/enemies/guard/guard.tscn +++ b/scenes/game_elements/characters/enemies/guard/guard.tscn @@ -3,6 +3,7 @@ [ext_resource type="Script" uid="uid://dmf866kgfnp3c" path="res://scenes/game_elements/characters/enemies/guard/components/guard.gd" id="1_g173s"] [ext_resource type="Script" uid="uid://c477jgx4lwr86" path="res://scenes/game_elements/characters/enemies/guard/components/guard_movement.gd" id="2_0hjcv"] [ext_resource type="Texture2D" uid="uid://8t6ihmesvghq" path="res://scenes/game_elements/characters/enemies/guard/components/field_of_view.png" id="3_0hjcv"] +[ext_resource type="Script" uid="uid://cu7ujf83r7yh2" path="res://scenes/game_logic/walk_behaviors/points_walk_behavior.gd" id="3_mswbt"] [ext_resource type="Texture2D" uid="uid://c75ofhy3swhj3" path="res://scenes/game_elements/characters/enemies/guard/components/exclamation_mark.png" id="3_pnkgp"] [ext_resource type="Script" uid="uid://cxsi2xqcdyw7g" path="res://scenes/game_elements/characters/enemies/guard/components/light.gd" id="4_lptvm"] [ext_resource type="Script" uid="uid://bnbt0iw1a1w6" path="res://scenes/game_elements/characters/enemies/guard/components/detection_area.gd" id="4_mswbt"] @@ -210,6 +211,24 @@ script = ExtResource("1_g173s") unique_name_in_owner = true script = ExtResource("2_0hjcv") +[node name="WaitingTimer" type="Timer" parent="." unique_id=592808351] +unique_name_in_owner = true +one_shot = true + +[node name="PatrollingBehavior" type="Node2D" parent="." unique_id=803113417 node_paths=PackedStringArray("character")] +unique_name_in_owner = true +process_mode = 4 +script = ExtResource("3_mswbt") +character = NodePath("..") +metadata/_custom_type_script = "uid://cu7ujf83r7yh2" + +[node name="ReturningBehavior" type="Node2D" parent="." unique_id=641161332 node_paths=PackedStringArray("character")] +unique_name_in_owner = true +process_mode = 4 +script = ExtResource("3_mswbt") +character = NodePath("..") +metadata/_custom_type_script = "uid://cu7ujf83r7yh2" + [node name="SightRayCast" type="RayCast2D" parent="." unique_id=1964699795] unique_name_in_owner = true collision_mask = 8 @@ -336,6 +355,7 @@ volume_db = -2.0 max_distance = 500.0 bus = &"SFX" +[connection signal="timeout" from="WaitingTimer" to="." method="_on_waiting_timer_timeout"] [connection signal="body_entered" from="InstantDetectionArea" to="." method="_on_instant_detection_area_body_entered"] [connection signal="body_entered" from="DetectionArea" to="." method="_on_detection_area_body_entered"] [connection signal="body_exited" from="DetectionArea" to="." method="_on_detection_area_body_exited"] From 5e2323fbdd42a2cffecf003f72d314dce0ad206d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Thu, 5 Feb 2026 15:21:50 -0300 Subject: [PATCH 05/16] Guard script: Simplify debug information --- .../characters/enemies/guard/components/guard.gd | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index c2592c3901..826d1694fe 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -231,13 +231,15 @@ func _update_debug_info() -> void: debug_info.visible = show_debug_info if not debug_info.visible: return - debug_info.text = "" - debug_info.text += "%s: %s\n" % ["position", position] - debug_info.text += "%s: %s\n" % ["state", State.keys()[state]] - debug_info.text += "%s: %s\n" % ["previous_patrol_point_idx", previous_patrol_point_idx] - debug_info.text += "%s: %s\n" % ["current_patrol_point_idx", current_patrol_point_idx] - debug_info.text += "%s: %.2f\n" % ["time left", waiting_timer.time_left] - debug_info.text += "%s: %s\n" % ["target point", guard_movement.destination] + + debug_info.text = "%s: %s\n" % ["state", State.keys()[state]] + + match state: + State.WAITING: + debug_info.text += "%s: %.2f\n" % ["time left", waiting_timer.time_left] + _: + debug_info.text += "%s: %s\n" % ["previous_patrol_point_idx", previous_patrol_point_idx] + debug_info.text += "%s: %s\n" % ["current_patrol_point_idx", current_patrol_point_idx] ## What happens when the guard reached the point it was walking towards From 854682f02d203d3ff25052d9810dbc3b7894169c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Thu, 5 Feb 2026 15:24:47 -0300 Subject: [PATCH 06/16] Guard script: Remove process state function Unify it with _process --- .../enemies/guard/components/guard.gd | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index 826d1694fe..5038d7c2ca 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -171,17 +171,6 @@ func _process(delta: float) -> void: if Engine.is_editor_hint() and not move_while_in_editor: return - _process_state() - guard_movement.move() - - if state != State.ALERTED: - _update_player_awareness(delta) - - _update_animation() - - -## Updates the guard's movement behavior based on its current state. -func _process_state() -> void: match state: State.PATROLLING: if patrol_path: @@ -200,6 +189,13 @@ func _process_state() -> void: State.ALERTED: guard_movement.stop_moving() + guard_movement.move() + + if state != State.ALERTED: + _update_player_awareness(delta) + + _update_animation() + ## Changes how PlayerAwareness looks to reflect how close is the player to ## being detected From 282952208162f6b0a4c05d03dd797de48ccc8e13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Thu, 5 Feb 2026 15:31:25 -0300 Subject: [PATCH 07/16] Guard script: Do ALERTED state change only once Move the change (stopping the movement) from the process function to the state setter. --- .../characters/enemies/guard/components/guard.gd | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index 5038d7c2ca..a57f09b4e5 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -178,18 +178,21 @@ func _process(delta: float) -> void: guard_movement.set_destination(target_position) else: guard_movement.stop_moving() + guard_movement.move() + State.WAITING: + guard_movement.move() + State.DETECTING: + guard_movement.move() State.INVESTIGATING: guard_movement.set_destination(last_seen_position) + guard_movement.move() State.RETURNING: if breadcrumbs: var target_position: Vector2 = breadcrumbs.back() guard_movement.set_destination(target_position) else: state = State.PATROLLING - State.ALERTED: - guard_movement.stop_moving() - - guard_movement.move() + guard_movement.move() if state != State.ALERTED: _update_player_awareness(delta) @@ -288,6 +291,7 @@ func _set_state(new_state: State) -> void: player_awareness.ratio = 1.0 player_awareness.tint_progress = Color.RED player_awareness.visible = true + guard_movement.stop_moving() State.INVESTIGATING: breadcrumbs.push_back(global_position) State.WAITING: From ab6e136a7efed400d2ca59ad7dce28b8b54207ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Thu, 5 Feb 2026 15:44:43 -0300 Subject: [PATCH 08/16] Guard script: Do INVESTIGATING state change only once --- .../characters/enemies/guard/components/guard.gd | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index a57f09b4e5..3b89e84089 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -84,8 +84,6 @@ const DEFAULT_SPRITE_FRAMES = preload("uid://ovu5wqo15s5g") var previous_patrol_point_idx: int = -1 ## Index of the current patrol point. var current_patrol_point_idx: int = 0 -## Last position in which the player was seen. -var last_seen_position: Vector2 ## Breadcrumbs for tracking guards position while investigating, before ## returning to patrol, the guard walks through all these positions. var breadcrumbs: Array[Vector2] = [] @@ -179,12 +177,7 @@ func _process(delta: float) -> void: else: guard_movement.stop_moving() guard_movement.move() - State.WAITING: - guard_movement.move() - State.DETECTING: - guard_movement.move() - State.INVESTIGATING: - guard_movement.set_destination(last_seen_position) + State.WAITING, State.DETECTING, State.INVESTIGATING: guard_movement.move() State.RETURNING: if breadcrumbs: @@ -476,10 +469,12 @@ func _on_detection_area_body_entered(body: Node2D) -> void: func _on_detection_area_body_exited(body: Node2D) -> void: _player = null - last_seen_position = body.global_position if state == State.DETECTING: guard_movement.stop_moving() state = State.INVESTIGATING + guard_movement.set_destination(body.global_position) + elif state == State.INVESTIGATING: + guard_movement.set_destination(body.global_position) func _on_waiting_timer_timeout() -> void: From fce038d7bdd674381fa5ee2e903ae8e81dc8b3a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Thu, 5 Feb 2026 16:20:27 -0300 Subject: [PATCH 09/16] Guard script: Do RETURNING state change only once --- .../enemies/guard/components/guard.gd | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index 3b89e84089..4b83acf761 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -177,14 +177,7 @@ func _process(delta: float) -> void: else: guard_movement.stop_moving() guard_movement.move() - State.WAITING, State.DETECTING, State.INVESTIGATING: - guard_movement.move() - State.RETURNING: - if breadcrumbs: - var target_position: Vector2 = breadcrumbs.back() - guard_movement.set_destination(target_position) - else: - state = State.PATROLLING + State.WAITING, State.DETECTING, State.INVESTIGATING, State.RETURNING: guard_movement.move() if state != State.ALERTED: @@ -229,6 +222,8 @@ func _update_debug_info() -> void: match state: State.WAITING: debug_info.text += "%s: %.2f\n" % ["time left", waiting_timer.time_left] + State.DETECTING, State.INVESTIGATING, State.RETURNING: + debug_info.text += "%s: %s\n" % ["breadcrumbs", breadcrumbs.size()] _: debug_info.text += "%s: %s\n" % ["previous_patrol_point_idx", previous_patrol_point_idx] debug_info.text += "%s: %s\n" % ["current_patrol_point_idx", current_patrol_point_idx] @@ -244,6 +239,11 @@ func _on_destination_reached() -> void: state = State.WAITING State.RETURNING: breadcrumbs.pop_back() + if breadcrumbs: + var target_position: Vector2 = breadcrumbs.back() + guard_movement.set_destination(target_position) + else: + state = State.PATROLLING ## What happens if the guard cannot reach their destination because it got @@ -262,7 +262,10 @@ func _on_path_blocked() -> void: state = State.RETURNING State.RETURNING: if breadcrumbs: - breadcrumbs.pop_back() + var target_position: Vector2 = breadcrumbs.back() + guard_movement.set_destination(target_position) + else: + state = State.PATROLLING func _set_state(new_state: State) -> void: From d83d7f6d26f54837f8cb5001043e2240e7f1844e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 6 Feb 2026 09:27:43 -0300 Subject: [PATCH 10/16] Guard script: Do PATROLLING state change only once The destination point was being set on every process loop. --- .../enemies/guard/components/guard.gd | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index 4b83acf761..cb6a5c575c 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -88,7 +88,7 @@ var current_patrol_point_idx: int = 0 ## returning to patrol, the guard walks through all these positions. var breadcrumbs: Array[Vector2] = [] ## Current state of the guard. -var state: State = State.PATROLLING: +var state: State: set = _set_state var _previous_state: State @@ -162,6 +162,13 @@ func _ready() -> void: guard_movement.destination_reached.connect(self._on_destination_reached) guard_movement.path_blocked.connect(self._on_path_blocked) + # Wait 2 frames before starting to match backwards compatibility. + await get_tree().process_frame + await get_tree().process_frame + + _advance_target_patrol_point() + state = State.WAITING + func _process(delta: float) -> void: _update_debug_info() @@ -170,14 +177,7 @@ func _process(delta: float) -> void: return match state: - State.PATROLLING: - if patrol_path: - var target_position: Vector2 = _patrol_point_position(current_patrol_point_idx) - guard_movement.set_destination(target_position) - else: - guard_movement.stop_moving() - guard_movement.move() - State.WAITING, State.DETECTING, State.INVESTIGATING, State.RETURNING: + State.PATROLLING, State.WAITING, State.DETECTING, State.INVESTIGATING, State.RETURNING: guard_movement.move() if state != State.ALERTED: @@ -276,6 +276,9 @@ func _set_state(new_state: State) -> void: state = new_state match state: + State.PATROLLING: + var target_position: Vector2 = _patrol_point_position(current_patrol_point_idx) + guard_movement.set_destination(target_position) State.DETECTING: if not _alert_sound.playing: _alert_sound.play() From b08ac11888515f8e1b8053fc2eb009efa4ac8cf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 6 Feb 2026 11:12:13 -0300 Subject: [PATCH 11/16] Guard: Add and use PointsWalkBehavior This walk behavior is based on the original guard's patrolling implementation. --- .../enemies/guard/components/guard.gd | 60 ++++--- .../characters/enemies/guard/guard.tscn | 13 ++ .../walk_behaviors/points_walk_behavior.gd | 149 ++++++++++++++++++ .../points_walk_behavior.gd.uid | 1 + 4 files changed, 205 insertions(+), 18 deletions(-) create mode 100644 scenes/game_logic/walk_behaviors/points_walk_behavior.gd create mode 100644 scenes/game_logic/walk_behaviors/points_walk_behavior.gd.uid diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index cb6a5c575c..aacc23bece 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -51,8 +51,7 @@ const DEFAULT_SPRITE_FRAMES = preload("uid://ovu5wqo15s5g") @export_tool_button("Add/Edit Patrol Path") var _edit_patrol_path: Callable = edit_patrol_path ## The path the guard follows while patrolling. @export var patrol_path: Path2D: - set(new_value): - patrol_path = new_value + set = _set_patrol_path ## The wait time at each patrol point. @export_range(0, 5, 0.1, "or_greater", "suffix:s") var wait_time: float = 1.0: @@ -108,6 +107,9 @@ var _player: Node2D ## Control to hold debug info that can be toggled on or off. @onready var debug_info: Label = %DebugInfo +## Behavior to use when patrolling. +@onready var patrolling_behavior: PointsWalkBehavior = %PatrollingBehavior + ## Reference to the node controlling the AnimationPlayer for walking / being idle, ## so it can be disabled to play the alerted animation. @onready @@ -149,6 +151,8 @@ func _ready() -> void: player_awareness.max_value = time_to_detect_player player_awareness.value = 0.0 + patrolling_behavior.speeds.walk_speed = move_speed + _set_patrol_path(patrol_path) _set_sprite_frames(sprite_frames) if detection_area: @@ -163,8 +167,9 @@ func _ready() -> void: guard_movement.path_blocked.connect(self._on_path_blocked) # Wait 2 frames before starting to match backwards compatibility. - await get_tree().process_frame - await get_tree().process_frame + if not Engine.is_editor_hint(): + await get_tree().process_frame + await get_tree().process_frame _advance_target_patrol_point() state = State.WAITING @@ -177,8 +182,11 @@ func _process(delta: float) -> void: return match state: - State.PATROLLING, State.WAITING, State.DETECTING, State.INVESTIGATING, State.RETURNING: + State.WAITING, State.INVESTIGATING, State.RETURNING: guard_movement.move() + State.DETECTING: + if _previous_state != State.PATROLLING: + guard_movement.move() if state != State.ALERTED: _update_player_awareness(delta) @@ -224,6 +232,13 @@ func _update_debug_info() -> void: debug_info.text += "%s: %.2f\n" % ["time left", waiting_timer.time_left] State.DETECTING, State.INVESTIGATING, State.RETURNING: debug_info.text += "%s: %s\n" % ["breadcrumbs", breadcrumbs.size()] + State.PATROLLING: + debug_info.text += ( + "%s: %s\n" % ["previous_patrol_point_idx", patrolling_behavior.previous_point_index] + ) + debug_info.text += ( + "%s: %s\n" % ["current_patrol_point_idx", patrolling_behavior.current_point_index] + ) _: debug_info.text += "%s: %s\n" % ["previous_patrol_point_idx", previous_patrol_point_idx] debug_info.text += "%s: %s\n" % ["current_patrol_point_idx", current_patrol_point_idx] @@ -232,9 +247,6 @@ func _update_debug_info() -> void: ## What happens when the guard reached the point it was walking towards func _on_destination_reached() -> void: match state: - State.PATROLLING: - state = State.WAITING - _advance_target_patrol_point() State.INVESTIGATING: state = State.WAITING State.RETURNING: @@ -250,14 +262,6 @@ func _on_destination_reached() -> void: ## stuck with a collider. func _on_path_blocked() -> void: match state: - State.PATROLLING: - state = State.WAITING - # This check makes sure that if the guard is blocked on start, - # they won't try to set an invalid patrol point as destination. - if previous_patrol_point_idx > -1: - var new_patrol_point: int = previous_patrol_point_idx - previous_patrol_point_idx = current_patrol_point_idx - current_patrol_point_idx = new_patrol_point State.INVESTIGATING: state = State.RETURNING State.RETURNING: @@ -277,12 +281,14 @@ func _set_state(new_state: State) -> void: match state: State.PATROLLING: - var target_position: Vector2 = _patrol_point_position(current_patrol_point_idx) - guard_movement.set_destination(target_position) + patrolling_behavior.process_mode = Node.PROCESS_MODE_INHERIT State.DETECTING: + if _previous_state != State.PATROLLING: + patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED if not _alert_sound.playing: _alert_sound.play() State.ALERTED: + patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED character_animation_player_behavior.process_mode = Node.PROCESS_MODE_DISABLED if not _alert_sound.playing: _alert_sound.play() @@ -292,9 +298,13 @@ func _set_state(new_state: State) -> void: player_awareness.visible = true guard_movement.stop_moving() State.INVESTIGATING: + patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED breadcrumbs.push_back(global_position) State.WAITING: + patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED waiting_timer.start() + State.RETURNING: + patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED ## Calculate and set the next point in the patrol path. @@ -452,6 +462,12 @@ func _set_alert_other_sound_stream(new_value: AudioStream) -> void: _torch_hit_sound.stream = new_value +func _set_patrol_path(new_patrol_path: Path2D) -> void: + patrol_path = new_patrol_path + if patrolling_behavior: + patrolling_behavior.walking_path = patrol_path + + func _set_wait_time(new_wait_time: float) -> void: wait_time = new_wait_time waiting_timer.wait_time = wait_time @@ -489,3 +505,11 @@ func _on_waiting_timer_timeout() -> void: state = State.PATROLLING State.INVESTIGATING: state = State.RETURNING + + +func _on_patrolling_behavior_point_reached() -> void: + state = State.WAITING + + +func _on_patrolling_behavior_got_stuck() -> void: + state = State.WAITING diff --git a/scenes/game_elements/characters/enemies/guard/guard.tscn b/scenes/game_elements/characters/enemies/guard/guard.tscn index 90a166903c..7a91fd6b1a 100644 --- a/scenes/game_elements/characters/enemies/guard/guard.tscn +++ b/scenes/game_elements/characters/enemies/guard/guard.tscn @@ -5,12 +5,21 @@ [ext_resource type="Texture2D" uid="uid://8t6ihmesvghq" path="res://scenes/game_elements/characters/enemies/guard/components/field_of_view.png" id="3_0hjcv"] [ext_resource type="Script" uid="uid://cu7ujf83r7yh2" path="res://scenes/game_logic/walk_behaviors/points_walk_behavior.gd" id="3_mswbt"] [ext_resource type="Texture2D" uid="uid://c75ofhy3swhj3" path="res://scenes/game_elements/characters/enemies/guard/components/exclamation_mark.png" id="3_pnkgp"] +[ext_resource type="Script" uid="uid://csev4hv57utxv" path="res://scenes/game_logic/walk_behaviors/character_speeds.gd" id="4_innil"] [ext_resource type="Script" uid="uid://cxsi2xqcdyw7g" path="res://scenes/game_elements/characters/enemies/guard/components/light.gd" id="4_lptvm"] [ext_resource type="Script" uid="uid://bnbt0iw1a1w6" path="res://scenes/game_elements/characters/enemies/guard/components/detection_area.gd" id="4_mswbt"] [ext_resource type="SpriteFrames" uid="uid://ovu5wqo15s5g" path="res://scenes/quests/template_quests/NO_EDIT/1_NO_EDIT_stealth/NO_EDIT_stealth_components/NO_EDIT_guard_enemy.tres" id="5_mswbt"] [ext_resource type="Script" uid="uid://dy68p7gf07pi3" path="res://scenes/game_logic/sprite_behaviors/character_sprite_behavior.gd" id="7_klpct"] [ext_resource type="Script" uid="uid://b3hx1n2yl88qr" path="res://scenes/game_logic/character_animation_player_behavior.gd" id="9_8vt0k"] +[sub_resource type="Resource" id="Resource_2e3xr"] +script = ExtResource("4_innil") +walk_speed = 200.0 +metadata/_custom_type_script = "uid://csev4hv57utxv" + +[sub_resource type="Resource" id="Resource_innil"] +script = ExtResource("4_innil") + [sub_resource type="CircleShape2D" id="CircleShape2D_g173s"] radius = 35.0 @@ -219,6 +228,7 @@ one_shot = true unique_name_in_owner = true process_mode = 4 script = ExtResource("3_mswbt") +speeds = SubResource("Resource_2e3xr") character = NodePath("..") metadata/_custom_type_script = "uid://cu7ujf83r7yh2" @@ -226,6 +236,7 @@ metadata/_custom_type_script = "uid://cu7ujf83r7yh2" unique_name_in_owner = true process_mode = 4 script = ExtResource("3_mswbt") +speeds = SubResource("Resource_innil") character = NodePath("..") metadata/_custom_type_script = "uid://cu7ujf83r7yh2" @@ -356,6 +367,8 @@ max_distance = 500.0 bus = &"SFX" [connection signal="timeout" from="WaitingTimer" to="." method="_on_waiting_timer_timeout"] +[connection signal="got_stuck" from="PatrollingBehavior" to="." method="_on_patrolling_behavior_got_stuck"] +[connection signal="point_reached" from="PatrollingBehavior" to="." method="_on_patrolling_behavior_point_reached"] [connection signal="body_entered" from="InstantDetectionArea" to="." method="_on_instant_detection_area_body_entered"] [connection signal="body_entered" from="DetectionArea" to="." method="_on_detection_area_body_entered"] [connection signal="body_exited" from="DetectionArea" to="." method="_on_detection_area_body_exited"] diff --git a/scenes/game_logic/walk_behaviors/points_walk_behavior.gd b/scenes/game_logic/walk_behaviors/points_walk_behavior.gd new file mode 100644 index 0000000000..4596effa95 --- /dev/null +++ b/scenes/game_logic/walk_behaviors/points_walk_behavior.gd @@ -0,0 +1,149 @@ +# SPDX-FileCopyrightText: The Threadbare Authors +# SPDX-License-Identifier: MPL-2.0 +@tool +class_name PointsWalkBehavior +extends BaseCharacterBehavior +## @experimental +## +## Make the character walk through the points of a path. +## +## If the path is closed the character walks in circles. If not, they walk back and forth turning +## around in endings. +## [br][br] +## If the character gets stuck while walking the path, they turn around. + +## Emitted when a point of the path is reached. +## This could be used to wait standing for a bit in these points. +signal point_reached + +## Emitted when [member character] got stuck while walking the path. +signal got_stuck + +## Parameters controlling the speed at which this character walks. If unset, the default values of +## [CharacterSpeeds] are used. +@export var speeds: CharacterSpeeds + +## The walking path. +@export var walking_path: Path2D: + set = _set_walking_path + +## Index of the previous patrol point, -1 means that there isn't a previous +## point yet. +var previous_point_index: int = -1 + +## Index of the current patrol point. +var current_point_index: int = 0 + +## The walking target position. +var target_position: Vector2 + +## True if the [member walking_path] is closed, in which case the character will walk in +## circles. +var is_path_closed: bool + + +func _set_walking_path(new_walking_path: Path2D) -> void: + walking_path = new_walking_path + update_configuration_warnings() + if walking_path: + _advance_target_patrol_point() + var local_point_position: Vector2 = walking_path.curve.get_point_position( + current_point_index + ) + target_position = walking_path.to_global(local_point_position) + + +func _get_configuration_warnings() -> PackedStringArray: + var warnings := super._get_configuration_warnings() + if not walking_path: + warnings.append("Walking Path property must be set.") + return warnings + + +func _ready() -> void: + super._ready() + + if not speeds: + speeds = CharacterSpeeds.new() + + _set_walking_path(walking_path) + + +func _physics_process(delta: float) -> void: + character.velocity = character.global_position.direction_to(target_position) * speeds.walk_speed + character.move_and_slide() + + var collision: KinematicCollision2D = character.get_last_slide_collision() + + # If the distance it was able to travel is a lot lower than the remainder, + # it's stuck and we can emit the path_blocked signal so the guard can + # handle that case + if collision and collision.get_travel().length() < collision.get_remainder().length() / 20.0: + if previous_point_index > -1: + var new_patrol_point: int = previous_point_index + previous_point_index = current_point_index + current_point_index = new_patrol_point + got_stuck.emit() + + if ( + ( + character.global_position.distance_to(target_position) + <= character.velocity.length() * delta + ) + and walking_path + ): + _advance_target_patrol_point() + var local_point_position: Vector2 = walking_path.curve.get_point_position( + current_point_index + ) + target_position = walking_path.to_global(local_point_position) + point_reached.emit() + + +## Return true if the end of the path is the same point as the beginning. +func _is_path_closed() -> bool: + if walking_path.curve.point_count < 3: + return false + + var first_point_position: Vector2 = walking_path.curve.get_point_position(0) + var last_point_position: Vector2 = walking_path.curve.get_point_position( + walking_path.curve.point_count - 1 + ) + + return first_point_position.is_equal_approx(last_point_position) + + +## Calculate and set the next point in the patrol path. +## The guard would circle back if the path is open, and go in rounds if the +## path is closed. +func _advance_target_patrol_point() -> void: + # TODO: Assume as existing and add an editor warning instead. + if not walking_path or not walking_path.curve or walking_path.curve.point_count < 2: + return + + var new_patrol_point_idx: int + + if _is_path_closed(): + # amount of points - 1 is used here because in a closed path, the + # last and first patrol points are the same. So, this lets us skip + # that repeated point and go for the first one that is different + new_patrol_point_idx = (current_point_index + 1) % (walking_path.curve.point_count - 1) + else: + var at_last_point: bool = current_point_index == (walking_path.curve.point_count - 1) + var at_first_point: bool = current_point_index == 0 + var going_backwards_in_path: bool = previous_point_index > current_point_index + if at_last_point: + # When reaching the end of the path, it starts walking back + new_patrol_point_idx = current_point_index - 1 + elif at_first_point: + # If it's at first point is either because it was walking back + # or because it's the first time it will move, in any case, it moves + # forward + new_patrol_point_idx = current_point_index + 1 + elif going_backwards_in_path: + new_patrol_point_idx = current_point_index - 1 + else: + new_patrol_point_idx = current_point_index + 1 + + previous_point_index = current_point_index + current_point_index = new_patrol_point_idx diff --git a/scenes/game_logic/walk_behaviors/points_walk_behavior.gd.uid b/scenes/game_logic/walk_behaviors/points_walk_behavior.gd.uid new file mode 100644 index 0000000000..715e23cf05 --- /dev/null +++ b/scenes/game_logic/walk_behaviors/points_walk_behavior.gd.uid @@ -0,0 +1 @@ +uid://cu7ujf83r7yh2 From e46a87705b05a71b2bd61815b268e6e17ccc5714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 6 Feb 2026 16:45:27 -0300 Subject: [PATCH 12/16] BaseCharacterBehavior: Do not disable physics process in editor To see the guard walking in the editor canvas when the "move while in editor" debug option is enabled. --- scenes/game_logic/base_character_behavior.gd | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scenes/game_logic/base_character_behavior.gd b/scenes/game_logic/base_character_behavior.gd index 584ecf4504..1e89b7e281 100644 --- a/scenes/game_logic/base_character_behavior.gd +++ b/scenes/game_logic/base_character_behavior.gd @@ -21,9 +21,10 @@ func _enter_tree() -> void: func _ready() -> void: - if Engine.is_editor_hint(): - set_physics_process(false) - elif character.motion_mode != CharacterBody2D.MotionMode.MOTION_MODE_FLOATING: + if ( + not Engine.is_editor_hint() + and character.motion_mode != CharacterBody2D.MotionMode.MOTION_MODE_FLOATING + ): push_warning("Consider setting %s Motion Mode to Floating." % character.name) From c0a636b7ae9b0456dbe5c42ccf5eecfc8e6316f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Fri, 6 Feb 2026 17:03:49 -0300 Subject: [PATCH 13/16] Guard script: Cleanup after using a walk behavior for patrolling Remove the now uneeded methods or properties. --- .../enemies/guard/components/guard.gd | 83 +------------------ 1 file changed, 4 insertions(+), 79 deletions(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index aacc23bece..8a9937586b 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -78,11 +78,6 @@ const DEFAULT_SPRITE_FRAMES = preload("uid://ovu5wqo15s5g") ## Toggles visibility of debug info. @export var show_debug_info: bool = false -## Index of the previous patrol point, -1 means that there isn't a previous -## point yet. -var previous_patrol_point_idx: int = -1 -## Index of the current patrol point. -var current_patrol_point_idx: int = 0 ## Breadcrumbs for tracking guards position while investigating, before ## returning to patrol, the guard walks through all these positions. var breadcrumbs: Array[Vector2] = [] @@ -158,11 +153,6 @@ func _ready() -> void: if detection_area: detection_area.scale = Vector2.ONE * detection_area_scale - # When the level starts, the guard is placed at the beginning of the - # patrol path. - if patrol_path: - global_position = _patrol_point_position(0) - guard_movement.destination_reached.connect(self._on_destination_reached) guard_movement.path_blocked.connect(self._on_path_blocked) @@ -171,7 +161,6 @@ func _ready() -> void: await get_tree().process_frame await get_tree().process_frame - _advance_target_patrol_point() state = State.WAITING @@ -234,14 +223,11 @@ func _update_debug_info() -> void: debug_info.text += "%s: %s\n" % ["breadcrumbs", breadcrumbs.size()] State.PATROLLING: debug_info.text += ( - "%s: %s\n" % ["previous_patrol_point_idx", patrolling_behavior.previous_point_index] + "%s: %s\n" % ["previous_point_index", patrolling_behavior.previous_point_index] ) debug_info.text += ( - "%s: %s\n" % ["current_patrol_point_idx", patrolling_behavior.current_point_index] + "%s: %s\n" % ["current_point_index", patrolling_behavior.current_point_index] ) - _: - debug_info.text += "%s: %s\n" % ["previous_patrol_point_idx", previous_patrol_point_idx] - debug_info.text += "%s: %s\n" % ["current_patrol_point_idx", current_patrol_point_idx] ## What happens when the guard reached the point it was walking towards @@ -307,41 +293,6 @@ func _set_state(new_state: State) -> void: patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED -## Calculate and set the next point in the patrol path. -## The guard would circle back if the path is open, and go in rounds if the -## path is closed. -func _advance_target_patrol_point() -> void: - if not patrol_path or not patrol_path.curve or _amount_of_patrol_points() < 2: - return - - var new_patrol_point_idx: int - - if _is_patrol_path_closed(): - # amount of points - 1 is used here because in a closed path, the - # last and first patrol points are the same. So, this lets us skip - # that repeated point and go for the first one that is different - new_patrol_point_idx = (current_patrol_point_idx + 1) % (_amount_of_patrol_points() - 1) - else: - var at_last_point: bool = current_patrol_point_idx == (_amount_of_patrol_points() - 1) - var at_first_point: bool = current_patrol_point_idx == 0 - var going_backwards_in_path: bool = previous_patrol_point_idx > current_patrol_point_idx - if at_last_point: - # When reaching the end of the path, it starts walking back - new_patrol_point_idx = current_patrol_point_idx - 1 - elif at_first_point: - # If it's at first point is either because it was walking back - # or because it's the first time it will move, in any case, it moves - # forward - new_patrol_point_idx = current_patrol_point_idx + 1 - elif going_backwards_in_path: - new_patrol_point_idx = current_patrol_point_idx - 1 - else: - new_patrol_point_idx = current_patrol_point_idx + 1 - - previous_patrol_point_idx = current_patrol_point_idx - current_patrol_point_idx = new_patrol_point_idx - - ## Checks if a straight line can be traced from the Guard to a certain point. ## It returns true if the path to the point is free of walls. ## Note: it only detects sight_occluders collisions, not wall collisions, this @@ -352,39 +303,13 @@ func _is_sight_to_point_blocked(point_position: Vector2) -> bool: return sight_ray_cast.is_colliding() -## Patrol point index to global position -func _patrol_point_position(point_idx: int) -> Vector2: - var local_point_position: Vector2 = patrol_path.curve.get_point_position(point_idx) - return patrol_path.to_global(local_point_position) - - -func _amount_of_patrol_points() -> int: - return patrol_path.curve.point_count - - -## Returns true if the end of the patrol path is the same point as the beginning -func _is_patrol_path_closed() -> bool: - if not patrol_path: - return false - - var curve: Curve2D = patrol_path.curve - if curve.point_count < 3: - return false - - var first_point_position: Vector2 = curve.get_point_position(0) - var last_point_position: Vector2 = curve.get_point_position(curve.point_count - 1) - - return first_point_position.is_equal_approx(last_point_position) - - ## Resets the guard to its initial values and placement on screen so it starts ## patrolling again as if the level just started. func _reset() -> void: - previous_patrol_point_idx = -1 - current_patrol_point_idx = 0 velocity = Vector2.ZERO if patrol_path: - global_position = _patrol_point_position(0) + var local_point_position: Vector2 = patrol_path.curve.get_point_position(0) + global_position = patrol_path.to_global(local_point_position) ## When the scene is saved, resets the Guard's position to the beginning of From 9cc9f66ae3f796bc84afba38fd66aa6fd62d1218 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Mon, 9 Feb 2026 09:15:12 -0300 Subject: [PATCH 14/16] Guard script: Fix setting wait time The timer node might not be ready. This fixes the current stealth level. --- .../game_elements/characters/enemies/guard/components/guard.gd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index 8a9937586b..a54ba6ee97 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -395,7 +395,8 @@ func _set_patrol_path(new_patrol_path: Path2D) -> void: func _set_wait_time(new_wait_time: float) -> void: wait_time = new_wait_time - waiting_timer.wait_time = wait_time + if waiting_timer: + waiting_timer.wait_time = wait_time func _on_instant_detection_area_body_entered(body: Node2D) -> void: From 49732207dd2661f1b3e23ef077f401ce01e7e01f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Mon, 9 Feb 2026 13:47:45 -0300 Subject: [PATCH 15/16] Guard script: Add returning behavior Use a PointsWalkBehavior and dynamically create the path from the breadcrumbs. Go back to patrolling after walking through all the breadcrumbs. That is, when the path end is met. --- .../enemies/guard/components/guard.gd | 42 ++++++++++++------- .../characters/enemies/guard/guard.tscn | 1 + .../walk_behaviors/points_walk_behavior.gd | 8 ++++ 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index a54ba6ee97..af2f42125f 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -105,6 +105,9 @@ var _player: Node2D ## Behavior to use when patrolling. @onready var patrolling_behavior: PointsWalkBehavior = %PatrollingBehavior +## Behavior to use when returning. +@onready var returning_behavior: PointsWalkBehavior = %ReturningBehavior + ## Reference to the node controlling the AnimationPlayer for walking / being idle, ## so it can be disabled to play the alerted animation. @onready @@ -147,6 +150,8 @@ func _ready() -> void: player_awareness.value = 0.0 patrolling_behavior.speeds.walk_speed = move_speed + returning_behavior.speeds.walk_speed = move_speed + _set_patrol_path(patrol_path) _set_sprite_frames(sprite_frames) @@ -171,7 +176,7 @@ func _process(delta: float) -> void: return match state: - State.WAITING, State.INVESTIGATING, State.RETURNING: + State.WAITING, State.INVESTIGATING: guard_movement.move() State.DETECTING: if _previous_state != State.PATROLLING: @@ -219,7 +224,7 @@ func _update_debug_info() -> void: match state: State.WAITING: debug_info.text += "%s: %.2f\n" % ["time left", waiting_timer.time_left] - State.DETECTING, State.INVESTIGATING, State.RETURNING: + State.DETECTING, State.INVESTIGATING: debug_info.text += "%s: %s\n" % ["breadcrumbs", breadcrumbs.size()] State.PATROLLING: debug_info.text += ( @@ -235,13 +240,6 @@ func _on_destination_reached() -> void: match state: State.INVESTIGATING: state = State.WAITING - State.RETURNING: - breadcrumbs.pop_back() - if breadcrumbs: - var target_position: Vector2 = breadcrumbs.back() - guard_movement.set_destination(target_position) - else: - state = State.PATROLLING ## What happens if the guard cannot reach their destination because it got @@ -250,12 +248,6 @@ func _on_path_blocked() -> void: match state: State.INVESTIGATING: state = State.RETURNING - State.RETURNING: - if breadcrumbs: - var target_position: Vector2 = breadcrumbs.back() - guard_movement.set_destination(target_position) - else: - state = State.PATROLLING func _set_state(new_state: State) -> void: @@ -268,13 +260,16 @@ func _set_state(new_state: State) -> void: match state: State.PATROLLING: patrolling_behavior.process_mode = Node.PROCESS_MODE_INHERIT + returning_behavior.process_mode = Node.PROCESS_MODE_DISABLED State.DETECTING: if _previous_state != State.PATROLLING: patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED + returning_behavior.process_mode = Node.PROCESS_MODE_DISABLED if not _alert_sound.playing: _alert_sound.play() State.ALERTED: patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED + returning_behavior.process_mode = Node.PROCESS_MODE_DISABLED character_animation_player_behavior.process_mode = Node.PROCESS_MODE_DISABLED if not _alert_sound.playing: _alert_sound.play() @@ -285,12 +280,25 @@ func _set_state(new_state: State) -> void: guard_movement.stop_moving() State.INVESTIGATING: patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED + returning_behavior.process_mode = Node.PROCESS_MODE_DISABLED breadcrumbs.push_back(global_position) State.WAITING: patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED + returning_behavior.process_mode = Node.PROCESS_MODE_DISABLED waiting_timer.start() + guard_movement.stop_moving() State.RETURNING: patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED + var returning_path := Path2D.new() + returning_path.curve = Curve2D.new() + breadcrumbs.push_back(global_position) + breadcrumbs.reverse() + for point: Vector2 in breadcrumbs: + returning_path.curve.add_point(point) + returning_behavior.walking_path = returning_path + returning_behavior.process_mode = Node.PROCESS_MODE_INHERIT + breadcrumbs = [] + guard_movement.stop_moving() ## Checks if a straight line can be traced from the Guard to a certain point. @@ -439,3 +447,7 @@ func _on_patrolling_behavior_point_reached() -> void: func _on_patrolling_behavior_got_stuck() -> void: state = State.WAITING + + +func _on_returning_behavior_ending_reached() -> void: + state = State.PATROLLING diff --git a/scenes/game_elements/characters/enemies/guard/guard.tscn b/scenes/game_elements/characters/enemies/guard/guard.tscn index 7a91fd6b1a..8fe6896419 100644 --- a/scenes/game_elements/characters/enemies/guard/guard.tscn +++ b/scenes/game_elements/characters/enemies/guard/guard.tscn @@ -369,6 +369,7 @@ bus = &"SFX" [connection signal="timeout" from="WaitingTimer" to="." method="_on_waiting_timer_timeout"] [connection signal="got_stuck" from="PatrollingBehavior" to="." method="_on_patrolling_behavior_got_stuck"] [connection signal="point_reached" from="PatrollingBehavior" to="." method="_on_patrolling_behavior_point_reached"] +[connection signal="ending_reached" from="ReturningBehavior" to="." method="_on_returning_behavior_ending_reached"] [connection signal="body_entered" from="InstantDetectionArea" to="." method="_on_instant_detection_area_body_entered"] [connection signal="body_entered" from="DetectionArea" to="." method="_on_detection_area_body_entered"] [connection signal="body_exited" from="DetectionArea" to="." method="_on_detection_area_body_exited"] diff --git a/scenes/game_logic/walk_behaviors/points_walk_behavior.gd b/scenes/game_logic/walk_behaviors/points_walk_behavior.gd index 4596effa95..676550b257 100644 --- a/scenes/game_logic/walk_behaviors/points_walk_behavior.gd +++ b/scenes/game_logic/walk_behaviors/points_walk_behavior.gd @@ -12,6 +12,9 @@ extends BaseCharacterBehavior ## [br][br] ## If the character gets stuck while walking the path, they turn around. +## Emitted when [member character] reaches the ending of the path. +signal ending_reached + ## Emitted when a point of the path is reached. ## This could be used to wait standing for a bit in these points. signal point_reached @@ -92,6 +95,11 @@ func _physics_process(delta: float) -> void: ) and walking_path ): + if ( + (current_point_index == walking_path.curve.point_count - 1) + or (current_point_index == 0) + ): + ending_reached.emit() _advance_target_patrol_point() var local_point_position: Vector2 = walking_path.curve.get_point_position( current_point_index From 6f79687ee1d24593644594a6c157fad83264e9d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20Qui=C3=B1ones?= Date: Mon, 9 Feb 2026 14:59:21 -0300 Subject: [PATCH 16/16] Guard: Add investigating behavior Use a FollowWalkBehavior for it. --- .../enemies/guard/components/guard.gd | 64 +++++++++---------- .../characters/enemies/guard/guard.tscn | 11 ++++ 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/scenes/game_elements/characters/enemies/guard/components/guard.gd b/scenes/game_elements/characters/enemies/guard/components/guard.gd index af2f42125f..7a013c02bb 100644 --- a/scenes/game_elements/characters/enemies/guard/components/guard.gd +++ b/scenes/game_elements/characters/enemies/guard/components/guard.gd @@ -90,6 +90,9 @@ var _previous_state: State # The player that's being detected. var _player: Node2D +# A marker to the player's last seen position. +var _investigating_target: Node2D + ## Area that represents the sight of the guard. If a player is in this area ## and there are no walls in between detected by [member sight_ray_cast], it ## means the player is in sight. @@ -108,6 +111,9 @@ var _player: Node2D ## Behavior to use when returning. @onready var returning_behavior: PointsWalkBehavior = %ReturningBehavior +## Behavior to use when investigating. +@onready var investigating_behavior: FollowWalkBehavior = %InvestigatingBehavior + ## Reference to the node controlling the AnimationPlayer for walking / being idle, ## so it can be disabled to play the alerted animation. @onready @@ -117,8 +123,6 @@ var character_animation_player_behavior: CharacterAnimationPlayerBehavior = %Cha ## Timer for the waiting state. @onready var waiting_timer: Timer = %WaitingTimer -## Handles the velocity and movement of the guard. -@onready var guard_movement: GuardMovement = %GuardMovement @onready var animated_sprite_2d: AnimatedSprite2D = %AnimatedSprite2D @onready var animation_player: AnimationPlayer = $AnimationPlayer @onready var _alert_sound: AudioStreamPlayer = %AlertSound @@ -151,6 +155,9 @@ func _ready() -> void: patrolling_behavior.speeds.walk_speed = move_speed returning_behavior.speeds.walk_speed = move_speed + investigating_behavior.speeds.walk_speed = move_speed + + _investigating_target = Node2D.new() _set_patrol_path(patrol_path) _set_sprite_frames(sprite_frames) @@ -158,9 +165,6 @@ func _ready() -> void: if detection_area: detection_area.scale = Vector2.ONE * detection_area_scale - guard_movement.destination_reached.connect(self._on_destination_reached) - guard_movement.path_blocked.connect(self._on_path_blocked) - # Wait 2 frames before starting to match backwards compatibility. if not Engine.is_editor_hint(): await get_tree().process_frame @@ -175,13 +179,6 @@ func _process(delta: float) -> void: if Engine.is_editor_hint() and not move_while_in_editor: return - match state: - State.WAITING, State.INVESTIGATING: - guard_movement.move() - State.DETECTING: - if _previous_state != State.PATROLLING: - guard_movement.move() - if state != State.ALERTED: _update_player_awareness(delta) @@ -235,21 +232,6 @@ func _update_debug_info() -> void: ) -## What happens when the guard reached the point it was walking towards -func _on_destination_reached() -> void: - match state: - State.INVESTIGATING: - state = State.WAITING - - -## What happens if the guard cannot reach their destination because it got -## stuck with a collider. -func _on_path_blocked() -> void: - match state: - State.INVESTIGATING: - state = State.RETURNING - - func _set_state(new_state: State) -> void: if state == new_state: return @@ -261,15 +243,20 @@ func _set_state(new_state: State) -> void: State.PATROLLING: patrolling_behavior.process_mode = Node.PROCESS_MODE_INHERIT returning_behavior.process_mode = Node.PROCESS_MODE_DISABLED + investigating_behavior.process_mode = Node.PROCESS_MODE_DISABLED State.DETECTING: if _previous_state != State.PATROLLING: patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED + investigating_behavior.process_mode = Node.PROCESS_MODE_INHERIT + else: + investigating_behavior.process_mode = Node.PROCESS_MODE_DISABLED returning_behavior.process_mode = Node.PROCESS_MODE_DISABLED if not _alert_sound.playing: _alert_sound.play() State.ALERTED: patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED returning_behavior.process_mode = Node.PROCESS_MODE_DISABLED + investigating_behavior.process_mode = Node.PROCESS_MODE_DISABLED character_animation_player_behavior.process_mode = Node.PROCESS_MODE_DISABLED if not _alert_sound.playing: _alert_sound.play() @@ -277,16 +264,17 @@ func _set_state(new_state: State) -> void: player_awareness.ratio = 1.0 player_awareness.tint_progress = Color.RED player_awareness.visible = true - guard_movement.stop_moving() State.INVESTIGATING: patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED returning_behavior.process_mode = Node.PROCESS_MODE_DISABLED + investigating_behavior.process_mode = Node.PROCESS_MODE_INHERIT breadcrumbs.push_back(global_position) State.WAITING: patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED returning_behavior.process_mode = Node.PROCESS_MODE_DISABLED + investigating_behavior.process_mode = Node.PROCESS_MODE_DISABLED waiting_timer.start() - guard_movement.stop_moving() + velocity = Vector2.ZERO State.RETURNING: patrolling_behavior.process_mode = Node.PROCESS_MODE_DISABLED var returning_path := Path2D.new() @@ -297,8 +285,8 @@ func _set_state(new_state: State) -> void: returning_path.curve.add_point(point) returning_behavior.walking_path = returning_path returning_behavior.process_mode = Node.PROCESS_MODE_INHERIT + investigating_behavior.process_mode = Node.PROCESS_MODE_DISABLED breadcrumbs = [] - guard_movement.stop_moving() ## Checks if a straight line can be traced from the Guard to a certain point. @@ -426,11 +414,12 @@ func _on_detection_area_body_entered(body: Node2D) -> void: func _on_detection_area_body_exited(body: Node2D) -> void: _player = null if state == State.DETECTING: - guard_movement.stop_moving() + _investigating_target.global_position = body.global_position + investigating_behavior.target = _investigating_target state = State.INVESTIGATING - guard_movement.set_destination(body.global_position) elif state == State.INVESTIGATING: - guard_movement.set_destination(body.global_position) + _investigating_target.global_position = body.global_position + investigating_behavior.target = _investigating_target func _on_waiting_timer_timeout() -> void: @@ -451,3 +440,12 @@ func _on_patrolling_behavior_got_stuck() -> void: func _on_returning_behavior_ending_reached() -> void: state = State.PATROLLING + + +func _on_investigating_behavior_target_reached_changed(is_reached: bool) -> void: + if is_reached: + state = State.WAITING + + +func _on_investigating_behavior_got_stuck() -> void: + state = State.RETURNING diff --git a/scenes/game_elements/characters/enemies/guard/guard.tscn b/scenes/game_elements/characters/enemies/guard/guard.tscn index 8fe6896419..918aba531a 100644 --- a/scenes/game_elements/characters/enemies/guard/guard.tscn +++ b/scenes/game_elements/characters/enemies/guard/guard.tscn @@ -8,6 +8,7 @@ [ext_resource type="Script" uid="uid://csev4hv57utxv" path="res://scenes/game_logic/walk_behaviors/character_speeds.gd" id="4_innil"] [ext_resource type="Script" uid="uid://cxsi2xqcdyw7g" path="res://scenes/game_elements/characters/enemies/guard/components/light.gd" id="4_lptvm"] [ext_resource type="Script" uid="uid://bnbt0iw1a1w6" path="res://scenes/game_elements/characters/enemies/guard/components/detection_area.gd" id="4_mswbt"] +[ext_resource type="Script" uid="uid://cwoclmik3db2" path="res://scenes/game_logic/walk_behaviors/follow_walk_behavior.gd" id="5_2e3xr"] [ext_resource type="SpriteFrames" uid="uid://ovu5wqo15s5g" path="res://scenes/quests/template_quests/NO_EDIT/1_NO_EDIT_stealth/NO_EDIT_stealth_components/NO_EDIT_guard_enemy.tres" id="5_mswbt"] [ext_resource type="Script" uid="uid://dy68p7gf07pi3" path="res://scenes/game_logic/sprite_behaviors/character_sprite_behavior.gd" id="7_klpct"] [ext_resource type="Script" uid="uid://b3hx1n2yl88qr" path="res://scenes/game_logic/character_animation_player_behavior.gd" id="9_8vt0k"] @@ -240,6 +241,14 @@ speeds = SubResource("Resource_innil") character = NodePath("..") metadata/_custom_type_script = "uid://cu7ujf83r7yh2" +[node name="InvestigatingBehavior" type="Node2D" parent="." unique_id=1943355478 node_paths=PackedStringArray("character")] +unique_name_in_owner = true +process_mode = 4 +script = ExtResource("5_2e3xr") +target_reached_distance = 0.0 +character = NodePath("..") +metadata/_custom_type_script = "uid://cwoclmik3db2" + [node name="SightRayCast" type="RayCast2D" parent="." unique_id=1964699795] unique_name_in_owner = true collision_mask = 8 @@ -370,6 +379,8 @@ bus = &"SFX" [connection signal="got_stuck" from="PatrollingBehavior" to="." method="_on_patrolling_behavior_got_stuck"] [connection signal="point_reached" from="PatrollingBehavior" to="." method="_on_patrolling_behavior_point_reached"] [connection signal="ending_reached" from="ReturningBehavior" to="." method="_on_returning_behavior_ending_reached"] +[connection signal="got_stuck" from="InvestigatingBehavior" to="." method="_on_investigating_behavior_got_stuck"] +[connection signal="target_reached_changed" from="InvestigatingBehavior" to="." method="_on_investigating_behavior_target_reached_changed"] [connection signal="body_entered" from="InstantDetectionArea" to="." method="_on_instant_detection_area_body_entered"] [connection signal="body_entered" from="DetectionArea" to="." method="_on_detection_area_body_entered"] [connection signal="body_exited" from="DetectionArea" to="." method="_on_detection_area_body_exited"]