Compare commits

..

3 Commits

Author SHA1 Message Date
2462174a02 LevelStreamer improvements and WorldProxy changes
- LevelStreamer gizmo preview now updates when it's transform changes.
- Cleaned up main menu.
- Seperated entrance hall section into it's own scene (level).
2026-03-17 00:27:37 +01:00
ca427041e7 Improved Interaction System and hover hints 2026-03-17 00:22:01 +01:00
478c859d33 Added dialogs with subtitles 2026-03-17 00:18:19 +01:00
49 changed files with 927 additions and 421 deletions

View File

@ -0,0 +1,19 @@
[remap]
importer="mp3"
type="AudioStreamMP3"
uid="uid://bu3mcagsgxth"
path="res://.godot/imported/Deadbird_Alright_listen_here.mp3-3cc73b7ad94c9ac3c61368e7a863ddc9.mp3str"
[deps]
source_file="res://_development/ayuroo/voicelines/conductor/Deadbird_Alright_listen_here.mp3"
dest_files=["res://.godot/imported/Deadbird_Alright_listen_here.mp3-3cc73b7ad94c9ac3c61368e7a863ddc9.mp3str"]
[params]
loop=false
loop_offset=0.0
bpm=0.0
beat_count=0
bar_beats=4

View File

@ -0,0 +1,10 @@
[gd_resource type="Resource" script_class="DialogEntry" format=3 uid="uid://ju7es8xi1gpc"]
[ext_resource type="Script" uid="uid://crem3vn3eyf38" path="res://src/core/dialog/dialog_entry.gd" id="1_41r8w"]
[resource]
script = ExtResource("1_41r8w")
voiceline_path = "uid://bu3mcagsgxth"
subtitle_strings = PackedStringArray("Alright listen here, lass.", "Yer in big trouble.", "If yer helpin\' crooked", "[wave]D[/wave]", "[wave]DJ[/wave]", "[wave]DJ Gro[/wave]", "[wave]DJ Grooves[/wave]", "rig the awards-,", "And I can\'t take ya to jail,", "then yer got to help me even the score.")
subtitle_timings = PackedFloat32Array(0, 2.6, 4.2, 6, 6.5, 7, 7.35, 8, 9.6, 11)
metadata/_custom_type_script = "uid://crem3vn3eyf38"

View File

@ -0,0 +1,10 @@
[gd_resource type="Texture2D" script_class="ControllerIconTexture" format=3 uid="uid://c5nyul3r2u4wu"]
[ext_resource type="Script" uid="uid://ch00l1e1rteyw" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="1_2arla"]
[resource]
resource_local_to_scene = false
resource_name = ""
script = ExtResource("1_2arla")
path = "interact"
metadata/_custom_type_script = "uid://ch00l1e1rteyw"

View File

@ -1,9 +1,9 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://biu40ot7f55no"]
[ext_resource type="Texture2D" uid="uid://djftxgnhedhk2" path="res://assets/dev/dark/texture_05.png" id="1_l8w0p"]
[ext_resource type="Texture2D" uid="uid://wb1xv8sdexfr" path="res://assets/dev/dark/texture_04.png" id="1_ib6js"]
[resource]
albedo_texture = ExtResource("1_l8w0p")
albedo_texture = ExtResource("1_ib6js")
uv1_triplanar = true
uv1_world_triplanar = true
texture_filter = 5

View File

@ -1,9 +1,9 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://dto0mke6wp060"]
[ext_resource type="Texture2D" uid="uid://d4m1r5bjq4lbe" path="res://assets/dev/dark/texture_01.png" id="1_c2346"]
[ext_resource type="Texture2D" uid="uid://djftxgnhedhk2" path="res://assets/dev/dark/texture_05.png" id="1_p236r"]
[resource]
albedo_texture = ExtResource("1_c2346")
albedo_texture = ExtResource("1_p236r")
uv1_triplanar = true
uv1_world_triplanar = true
texture_filter = 5

View File

@ -3,19 +3,20 @@
importer="texture"
type="CompressedTexture2D"
uid="uid://wb1xv8sdexfr"
path="res://.godot/imported/texture_04.png-ab0c8f7791533824774bd7c2ee0b712c.ctex"
path.s3tc="res://.godot/imported/texture_04.png-ab0c8f7791533824774bd7c2ee0b712c.s3tc.ctex"
metadata={
"vram_texture": false
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/dev/dark/texture_04.png"
dest_files=["res://.godot/imported/texture_04.png-ab0c8f7791533824774bd7c2ee0b712c.ctex"]
dest_files=["res://.godot/imported/texture_04.png-ab0c8f7791533824774bd7c2ee0b712c.s3tc.ctex"]
[params]
compress/mode=0
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
@ -23,7 +24,7 @@ compress/rdo_quality_loss=0.0
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@ -37,4 +38,4 @@ 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
detect_3d/compress_to=0

View File

@ -44,6 +44,26 @@ _subresources={
"use_external/fallback_path": "res://assets/models/plush/godot_plush.tres",
"use_external/path": "uid://bp26kj1cs4p1s"
}
},
"meshes": {
"godot_plush_v2_Cube_001": {
"generate/lightmap_uv": 0,
"generate/lods": 0,
"generate/shadow_meshes": 0,
"lods/normal_merge_angle": 20.0,
"save_to_file/enabled": true,
"save_to_file/fallback_path": "res://assets/models/plush/godot_plush_v2_Cube_001.res",
"save_to_file/path": "uid://8s8l7hwib2ny"
},
"godot_plush_v2_Cube_002": {
"generate/lightmap_uv": 0,
"generate/lods": 0,
"generate/shadow_meshes": 0,
"lods/normal_merge_angle": 20.0,
"save_to_file/enabled": true,
"save_to_file/fallback_path": "res://assets/models/plush/godot_plush_v2_Cube_002.res",
"save_to_file/path": "uid://d3b8wym3dsqea"
}
}
}
gltf/naming_version=2

Binary file not shown.

Binary file not shown.

View File

@ -2,6 +2,7 @@ KEYS,en,de,es,ja
# UI
CONTINUE,Continue,Weiterspielen,Continue,Continue
LOAD,Load,Laden,Load,Load
NEW_GAME,New Game,Neues Spiel,New Game,New Game
SETTINGS,Settings,Einstellungen,Settings,Settings
QUIT,Quit,Beenden,Quit,Quit

Can't render this file because it has a wrong number of fields in line 3.

View File

@ -50,6 +50,10 @@ folder_colors={
"res://tools/": "gray"
}
[filesystem]
import/blender/enabled=false
[importer_defaults]
scene={

View File

@ -6,7 +6,7 @@ var using_controller: bool = false
func _input(event: InputEvent) -> void:
if not window_focused():
if not is_window_focused():
get_viewport().set_input_as_handled()
return
@ -21,7 +21,7 @@ func _input(event: InputEvent) -> void:
toggle_mouse()
func window_focused() -> bool:
func is_window_focused() -> bool:
return DisplayServer.window_is_focused()

View File

@ -0,0 +1,41 @@
@tool
class_name DialogEntry
extends Resource
@export_file("*.tres", "*.res", "*.ogg", "*.wav", "*.mp3")
var voiceline_path: String
@export var precache_vo_stream: bool = false
@export var subtitle_strings: PackedStringArray = []
@export var subtitle_timings: PackedFloat32Array = []
var _precached_stream: AudioStream
func _init() -> void:
if precache_vo_stream and not Engine.is_editor_hint():
_precached_stream = load(voiceline_path)
func get_voiceline_stream() -> AudioStream:
return _precached_stream if precache_vo_stream else load(voiceline_path)
func get_subtitle_string_from_elapsed_time(elapsed_time: float) -> String:
var subtitle_string: String = ""
for time_index: int in range(subtitle_timings.size()):
if subtitle_timings.get(time_index) >= elapsed_time:
break
subtitle_string = subtitle_strings.get(time_index)
return subtitle_string
# old (search from reverse)
#var timings: PackedFloat32Array = subtitle_timings.duplicate()
#timings.reverse()
#for time_index: int in range(timings.size()):
#var time: float = timings.get(time_index)
#if time <= elapsed_time:
#return subtitle_strings.get((timings.size() - time_index) - 1)

View File

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

View File

@ -0,0 +1,13 @@
class_name DialogEntryPlayback
var dialog_entry: DialogEntry
var playback_position: float = 0.0
func _init(entry: DialogEntry) -> void:
dialog_entry = entry
func get_dialog_subtitle() -> String:
return dialog_entry.get_subtitle_string_from_elapsed_time(playback_position)

View File

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

View File

@ -0,0 +1,91 @@
class_name DialogPlayer
extends Node
signal dialog_finished(dialog_key: StringName)
static var active_dialog_playbacks: Array[DialogEntryPlayback] = []
@export_node_path("AudioStreamPlayer", "AudioStreamPlayer2D", "AudioStreamPlayer3D")
var audio_player: NodePath: set = set_audio_player
@export var dialogs: Dictionary[StringName, DialogEntry] = {}
var _audio_player: Node
var _current_dialog_key: StringName
var _current_dialog_playback: DialogEntryPlayback
func _ready() -> void:
set_process(false)
set_audio_player(audio_player)
func _process(_delta: float) -> void:
if is_instance_valid(_audio_player) and is_instance_valid(_current_dialog_playback):
_current_dialog_playback.playback_position = _audio_player.get_playback_position()
func set_audio_player(audio_player_path: NodePath) -> void:
if is_instance_valid(_audio_player):
_audio_player.finished.disconnect(_on_dialog_finished)
audio_player = audio_player_path
_audio_player = get_node_or_null(audio_player)
if not is_instance_valid(_audio_player):
set_process(false)
return
if (
not _audio_player.has_method(&"play")
or not _audio_player.has_method(&"get_playback_position")
or not &"playing" in _audio_player
or not _audio_player.has_signal(&"finished")
):
_audio_player = null
push_error("audio_player is not a valid player.")
return
set_process(_audio_player.playing)
if not _audio_player.finished.is_connected(_on_dialog_finished):
_audio_player.finished.connect(_on_dialog_finished)
func play(entry_key: StringName, from_position: float = 0.0) -> void:
var dialog_entry: DialogEntry = dialogs.get(entry_key)
if is_instance_valid(dialog_entry):
stop_dialog()
_audio_player.stream = dialog_entry.get_voiceline_stream()
_current_dialog_key = entry_key
_current_dialog_playback = DialogEntryPlayback.new(dialog_entry)
active_dialog_playbacks.append(_current_dialog_playback)
_audio_player.play(from_position)
set_process(true)
func get_current_dialog_entry() -> DialogEntry:
return dialogs.get(_current_dialog_key)
func get_playback_position() -> float:
return _audio_player.get_playback_position() if is_instance_valid(_audio_player) else 0.0
func stop_dialog() -> void:
active_dialog_playbacks.erase(_current_dialog_playback)
_current_dialog_key = &""
_current_dialog_playback = null
_audio_player.stream = null
func _on_dialog_finished() -> void:
var entry: DialogEntry = dialogs.get(_current_dialog_key)
stop_dialog()
set_process(false)
dialog_finished.emit(entry)

View File

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

View File

@ -6,6 +6,7 @@ signal unfocused
signal hint_prompts_changed
@export var interaction_types: Array[InteractionType] = []: set = set_interaction_types
@export var focus_highlight_node: Node3D
var is_focused: bool = false
@ -13,38 +14,45 @@ var is_focused: bool = false
func _ready() -> void:
set_interaction_types(interaction_types)
if is_instance_valid(focus_highlight_node):
focus_highlight_node.hide()
func set_interaction_types(types: Array[InteractionType]) -> void:
for type: InteractionType in interaction_types:
if type.hint_prompt_changed.is_connected(hint_prompts_changed.emit):
type.hint_prompt_changed.disconnect(hint_prompts_changed.emit)
if type.enabled_changed.is_connected(_on_interaction_type_enabled_changed):
type.enabled_changed.disconnect(_on_interaction_type_enabled_changed)
interaction_types = types
for type: InteractionType in interaction_types:
if not type.hint_prompt_changed.is_connected(hint_prompts_changed.emit):
type.hint_prompt_changed.connect(hint_prompts_changed.emit)
if not type.enabled_changed.is_connected(_on_interaction_type_enabled_changed):
type.enabled_changed.connect(_on_interaction_type_enabled_changed)
func set_area_focused(value: bool) -> void:
is_focused = value
(focused if is_focused else unfocused).emit()
if is_instance_valid(focus_highlight_node):
focus_highlight_node.visible = value
for type: InteractionType in interaction_types:
type.set_focused(is_focused)
func get_interaction_strings() -> Array[Array]:
var strings: Array[Array] = []
func get_interaction_strings() -> PackedStringArray:
var strings: PackedStringArray = []
for interaction_type: InteractionType in interaction_types:
if interaction_type.enabled:
var pre: String = interaction_type.get_hint(0)
var prompt: Texture2D = interaction_type.button_prompt
var post: String = interaction_type.get_hint(1)
strings.append([pre, prompt, post])
var hint: String = interaction_type.get_correct_hover_hint()
strings.append(hint)
print("Interaction Strings: ", strings)
return strings
@ -54,3 +62,7 @@ func _interaction_started(_interaction_ray: InteractionRay) -> void:
func _interaction_ended(_interaction_ray: InteractionRay) -> void:
pass
func _on_interaction_type_enabled_changed() -> void:
set_area_focused(is_focused)

View File

@ -4,7 +4,6 @@ extends RayCast3D
signal focused_gained(interaction_area: InteractionArea)
signal focus_lost(interaction_area: InteractionArea)
var is_interacting: bool = false
var focused_area: InteractionArea
var had_focus: bool = false
@ -19,7 +18,6 @@ func _physics_process(_delta: float) -> void:
#focused_area = null
#focused_gained.emit(null)
if collider == focused_area:
if not is_instance_valid(focused_area) and had_focus:
had_focus = false
@ -28,21 +26,21 @@ func _physics_process(_delta: float) -> void:
return
if is_instance_valid(focused_area):
focused_area.set_area_focused(false)
had_focus = false
focus_lost.emit(focused_area)
lose_area_focus(focused_area)
focused_area = collider if collider is InteractionArea else null
focused_gained.emit(focused_area)
if is_instance_valid(focused_area):
had_focus = true
focused_area.set_area_focused(true)
gain_area_focus(focused_area)
func get_interaction() -> InteractionArea:
var collider: Object = get_collider()
if collider is InteractionArea:
return collider
func gain_area_focus(area: InteractionArea) -> void:
had_focus = true
area.set_area_focused(true)
return null
func lose_area_focus(area: InteractionArea) -> void:
area.set_area_focused(false)
had_focus = false
focus_lost.emit(area)

View File

@ -3,12 +3,15 @@ class_name InteractionType
extends Node
signal hint_prompt_changed
signal enabled_changed
@export var enabled: bool = true
@export var hover_hint: String = "Press {prompt} to interact": set = set_hover_hint
@export var button_prompt: Texture2D
#@export var additional_prompts: Dictionary[String, Texture2D] = {}
@export var enabled: bool = true: set = set_enabled
@export var hover_hint: String = "Press {interact} to interact": set = set_hover_hint
@export_custom(PROPERTY_HINT_INPUT_NAME, "") var action: StringName = &"interact"
@export var texture_size: float = 42.0
@export var interaction_textures: Dictionary[String, String] = {
"interact": "uid://c5nyul3r2u4wu",
}
var is_focused: bool = false
var is_interacting: bool = false
@ -26,25 +29,13 @@ func stop_interaction() -> void:
_interaction_ended()
func get_hint(slice_idx: int) -> String:
return hover_hint.get_slice("{prompt}", slice_idx)
#return hover_hint.format({"prompt": str("[img]", button_prompt, "[/img]]")})
func get_correct_hover_hint() -> String:
var hint: String = hover_hint
for key: String in interaction_textures.keys():
hint = hint.replace("{%s}" % key, "[img=%s]%s[/img]" % [texture_size, interaction_textures[key]])
# TODO: Convert from string to array.
# "Press {prompt} to {interact} interact{exclamation}"
# ["Press ", Texture, " to ", Texture, " interact", Texture]
func get_full_hint() -> Array:
var prompts: Dictionary[String, Texture2D] = {}#additional_prompts.duplicate()
prompts.set("{prompt}", button_prompt)
var entries: Array = []
var strings: Array[String] = []
for key: String in prompts.keys():
strings.append(hover_hint.split(key))
return entries
return hint
func set_focused(value: bool) -> void:
@ -61,6 +52,13 @@ func set_hover_hint(text: String) -> void:
hint_prompt_changed.emit()
func set_enabled(value: bool) -> void:
var was_different: bool = enabled != value
enabled = value
if was_different:
enabled_changed.emit()
@abstract func _interaction_started() -> void

View File

@ -4,6 +4,9 @@ extends Marker3D
signal loading_finished
## If [code]false[/code], prevents loading when inside the area,
## but will unload (even when inside the area).
@export var enabled: bool = true: set = set_enabled
@export var threaded_loading: bool = true
@export var prevent_unloading: bool = false
@export var unload_delay: float = 3.0
@ -38,14 +41,15 @@ var _unload_time_left: float = 0.0
var _precomputed_aabb: AABB # Big bounding box covering all [_precomputed_aabbs] for faster checking.
var _precomputed_aabbs: Array[AABB]
var _previous_camera: Camera3D
var _editor_previous_transform: Transform3D
static func get_node_aabb(node: Node3D = null, ignore_top_level: bool = true, bounds_transform := Transform3D()) -> AABB:
var aabb: AABB
var _transform: Transform3D
#We area going down the child chain,
#we want the aabb of each subsequent node to be on the same axis as the parent.
# We are going down the child chain,
# we want the aabb of each subsequent node to be on the same axis as the parent.
if bounds_transform.is_equal_approx(Transform3D()):
_transform = node.global_transform
else:
@ -97,11 +101,18 @@ func _get_configuration_warnings() -> PackedStringArray:
func _ready() -> void:
precompute_aabb()
_editor_previous_transform = global_transform
func _process(delta: float) -> void:
if Engine.is_editor_hint():
_editor_process_gizmo()
# Update aabb preview when transforming the node.
if not _editor_previous_transform.is_equal_approx(global_transform):
_editor_previous_transform = global_transform
precompute_aabb()
return
if get_tree().debug_collisions_hint:
@ -111,7 +122,7 @@ func _process(delta: float) -> void:
if not is_instance_valid(camera):
return
if is_position_in_bounds(camera.global_position):
if enabled and is_position_in_bounds(camera.global_position):
load_level()
elif not prevent_unloading and is_level_loaded():
_unload_time_left = maxf(_unload_time_left - delta, 0.0)
@ -171,6 +182,10 @@ func get_camera() -> Camera3D:
return camera
func set_enabled(value: bool) -> void:
enabled = value
func is_position_in_bounds(point: Vector3) -> bool:
if not _precomputed_aabb.has_point(point):
return false
@ -186,10 +201,10 @@ func is_position_in_bounds(point: Vector3) -> bool:
func _draw_debug() -> void:
for aabb: AABB in load_aabbs:
DebugDraw3D.draw_aabb(get_aabb_with_correct_position(aabb, self), Color.ORANGE)
for aabb: AABB in _precomputed_aabbs:
Game.debug_draw("aabb", [aabb, Color.LAWN_GREEN])
DebugDraw3D.draw_aabb(get_aabb_with_correct_position(_precomputed_aabb, self), Color.ORANGE_RED)
Game.debug_draw("aabb", [_precomputed_aabb, Color.ORANGE_RED])
func _editor_edit_level() -> void:

View File

@ -45,7 +45,11 @@ func initialize_level_streamers() -> void:
func initialize_world_proxies() -> void:
for world_proxy: WorldProxy in WorldProxy.world_proxies:
# Reverse order because children are added first, but need to be executed last.
var proxies: Array[WorldProxy] = WorldProxy.world_proxies.duplicate()
proxies.reverse()
for world_proxy: WorldProxy in proxies:
if is_ancestor_of(world_proxy):
world_proxy.set_world(self)

View File

@ -1,3 +1,4 @@
@tool
class_name Game
extends Node
@ -17,8 +18,8 @@ var current_save_data: SaveData = INITIAL_SAVE_DATA.duplicate()
var world: World
var main_menu: MainMenu
@onready var loading_screen: LoadingScreen = $LoadingScreen
@onready var world_container: Node = $WorldContainer
@onready var world_container: Node = %WorldContainer
@onready var loading_screen: LoadingScreen = %LoadingScreen
static func _static_init() -> void:
@ -31,7 +32,8 @@ static func debug_draw(draw_shape: String, args: Array) -> void:
func _ready() -> void:
load_main_menu()
if not Engine.is_editor_hint():
load_main_menu()
func load_game(save_data: SaveData, save_slot: int) -> void:
@ -54,15 +56,6 @@ func save_game() -> Error:
return ResourceSaver.save(current_save_data, SAVE_PATH % [save_slot, file_name])
#func _ready() -> void:
#await load_world("res://src/worlds/exposition/exposition.tscn")
#await get_tree().create_timer(5.0, false).timeout
#await unload_world()
#await loading_screen.fade_out()
#await get_tree().create_timer(3.0, false).timeout
#_ready()
func load_world(world_path: String, save_previous: bool = true, load_from_save: bool = true) -> Error:
if not ResourceLoader.exists(world_path, "PackedScene"):
return ERR_FILE_NOT_FOUND

View File

@ -8,5 +8,7 @@ script = ExtResource("1_7uq6d")
metadata/_custom_type_script = "uid://cl1u038dbrou2"
[node name="WorldContainer" type="Node" parent="." unique_id=1835125942]
unique_name_in_owner = true
[node name="LoadingScreen" parent="." unique_id=1509462056 instance=ExtResource("2_3msxb")]
unique_name_in_owner = true

View File

@ -82,7 +82,7 @@ func get_sensitivity() -> float:
func _process_input(delta: float) -> void:
if Input.mouse_mode != Input.MOUSE_MODE_CAPTURED or not InputManager.window_focused():
if Input.mouse_mode != Input.MOUSE_MODE_CAPTURED or not InputManager.is_window_focused():
return
if input_event is InputEventMouseMotion:

View File

@ -34,6 +34,9 @@ func _on_interaction_ray_focused(area: InteractionArea) -> void:
func _on_interaction_ray_focus_lost(area: InteractionArea) -> void:
interaction_prompt.clear()
_play_crosshair_anim(&"to_dot")
if is_instance_valid(area):
area.hint_prompts_changed.disconnect(_populate_focused_hints)
@ -46,20 +49,5 @@ func _play_crosshair_anim(anim_name: StringName) -> void:
func _populate_focused_hints(area: InteractionArea) -> void:
interaction_prompt.clear()
interaction_prompt.push_paragraph(HORIZONTAL_ALIGNMENT_CENTER)
#for hint: Array in area.get_interaction_strings():
#for entry: Variant in hint:
#if typeof(entry) == TYPE_STRING:
#interaction_prompt.append_text(entry)
#elif entry is Texture2D:
#interaction_prompt.add_image(entry, 42, 42)
#
#interaction_prompt.add_text("\n")
for string: Array in area.get_interaction_strings():
if not string[0].is_empty() or not string[2].is_empty():
interaction_prompt.append_text(string[0])
interaction_prompt.add_image(string[1], 42, 42)
interaction_prompt.append_text(string[2] + "\n")
interaction_prompt.append_text("\n".join(area.get_interaction_strings()))
interaction_prompt.pop_all()

View File

@ -32,14 +32,13 @@ var can_run: bool = true
var is_crouching: bool = false
var crouch_speed_affection: float = 0.0
@onready var head: PlayerHead = $Head
@onready var collision_shape: CollisionShape3D = $CylinderCollider
@onready var standup_checker: Area3D = $StandupChecker
@onready var head: PlayerHead = %Head
@onready var collision_shape: CollisionShape3D = %CylinderCollider
@onready var standup_checker: Area3D = %StandupChecker
@onready var interaction_ray: InteractionRay = %InteractionRay
@onready var flashlight: Flashlight = %Flashlight
#@onready var stair_stepper: StairStepper = $StairStepper
func _init() -> void:
player = self
@ -50,15 +49,7 @@ func _ready() -> void:
flashlight.manager = flashlight_manager
#func _ready() -> void:
#if not get_tree().current_scene.is_node_ready():
#await get_tree().current_scene.ready
#
#var spawn_point := PlayerSpawnPoint.get_spawnpoint_by_identifier(Game.instance.spawn_id)
#
#if is_instance_valid(spawn_point):
#global_position = spawn_point.global_position
#head.global_rotation = spawn_point.global_rotation
func _physics_process(delta: float) -> void:
#var lagspike: bool = randf() < 0.005
#if lagspike:
@ -137,7 +128,7 @@ func apply_gravity(delta: float) -> void:
func get_input_direction() -> Vector3:
if not InputManager.window_focused():
if not InputManager.is_window_focused():
return Vector3.ZERO
var input_dir := Input.get_vector(

View File

@ -13,7 +13,8 @@
[ext_resource type="Script" uid="uid://dd0i7xqjwgc6r" path="res://src/core/camera/effects/view_roll_effect.gd" id="7_3mv4n"]
[ext_resource type="Script" uid="uid://dyoa3tnirv7wh" path="res://src/core/camera/camera_effect_target.gd" id="7_ghuot"]
[ext_resource type="Script" uid="uid://gvuvxikepb2r" path="res://src/gameplay/characters/player/hud.gd" id="11_y2ktv"]
[ext_resource type="Texture2D" uid="uid://cwvfdx2v41k0h" path="res://src/ui/hud/crosshair.png" id="13_qx1cj"]
[ext_resource type="Texture2D" uid="uid://biljky5uh45hg" path="res://src/ui/hud/crosshair_outline.png" id="13_qx1cj"]
[ext_resource type="PackedScene" uid="uid://ct2u3f03lwsnr" path="res://src/ui/hud/hud_subtitle.tscn" id="15_hqe5n"]
[sub_resource type="Resource" id="Resource_vq0uu"]
script = ExtResource("2_1ixuj")
@ -165,19 +166,17 @@ shape = SubResource("CapsuleShape3D_bdj5f")
disabled = true
[node name="CylinderCollider" type="CollisionShape3D" parent="." unique_id=397310478]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0)
shape = SubResource("CylinderShape3D_bdj5f")
[node name="Head" type="Node3D" parent="." unique_id=647306642 node_paths=PackedStringArray("camera", "character")]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6, 0)
script = ExtResource("2_fjt7c")
camera = NodePath("EffectsRoot/ShakingCamera")
character = NodePath("..")
[node name="InteractionRay" parent="Head" unique_id=941602125 instance=ExtResource("4_de0uv")]
unique_name_in_owner = true
target_position = Vector3(0, 0, -1.75)
[node name="Flashlight" type="Node3D" parent="Head" unique_id=884032976 node_paths=PackedStringArray("light")]
unique_name_in_owner = true
script = ExtResource("5_vxew7")
@ -185,7 +184,7 @@ light = NodePath("FlashlightSpot")
metadata/_custom_type_script = "uid://1i0linakw8mg"
[node name="FlashlightSpot" type="SpotLight3D" parent="Head/Flashlight" unique_id=1000286492]
light_energy = 3.0
light_energy = 1.5
light_specular = 0.15
light_bake_mode = 0
shadow_enabled = true
@ -193,6 +192,10 @@ spot_range = 30.0
spot_attenuation = 2.0
spot_angle_attenuation = 0.5
[node name="InteractionRay" parent="Head" unique_id=941602125 instance=ExtResource("4_de0uv")]
unique_name_in_owner = true
target_position = Vector3(0, 0, -1.75)
[node name="EffectsRoot" type="Node3D" parent="Head" unique_id=274091696 node_paths=PackedStringArray("camera")]
script = ExtResource("7_ghuot")
camera = NodePath("ShakingCamera")
@ -242,6 +245,7 @@ target = NodePath("..")
metadata/_custom_type_script = "uid://ds461t4g8nlnh"
[node name="StandupChecker" type="Area3D" parent="." unique_id=1209822543]
unique_name_in_owner = true
collision_layer = 0
input_ray_pickable = false
@ -288,5 +292,5 @@ unique_name_in_owner = true
scale = Vector2(0.25, 0.25)
sprite_frames = SubResource("SpriteFrames_p81y6")
animation = &"to_hollow"
frame = 5
frame_progress = 1.0
[node name="HudSubtitle" parent="Hud" unique_id=123148710 instance=ExtResource("15_hqe5n")]

View File

@ -7,8 +7,9 @@ extends Node3D
var world: World
@onready var world_proxy: WorldProxy = $WorldProxy
@onready var pickup_interaction: PickupInteraction = $PickupInteraction
@onready var world_proxy: WorldProxy = %WorldProxy
@onready var pickup_interaction: PickupInteraction = %PickupInteraction
@onready var interaction_area: InteractionArea = %InteractionArea
func _ready() -> void:

View File

@ -3,7 +3,6 @@
[ext_resource type="Script" uid="uid://nsxr1qkvivsf" path="res://src/gameplay/systems/flashlight/flashlight_battery.gd" id="1_p5331"]
[ext_resource type="Script" uid="uid://ckdo7huqoleoi" path="res://src/core/interaction/interaction_types/pickup.gd" id="2_0r1sb"]
[ext_resource type="Script" uid="uid://qifiwdgyx6e" path="res://src/core/world/level/world_proxy.gd" id="2_3nps0"]
[ext_resource type="Script" uid="uid://ch00l1e1rteyw" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="3_3nps0"]
[ext_resource type="PackedScene" uid="uid://2dre1e56emw6" path="res://src/core/interaction/interaction_area.tscn" id="3_ouj7b"]
[sub_resource type="CylinderMesh" id="CylinderMesh_0r1sb"]
@ -11,12 +10,9 @@ top_radius = 0.05
bottom_radius = 0.05
height = 0.15
[sub_resource type="Texture2D" id="Texture2D_er8ho"]
resource_local_to_scene = false
resource_name = ""
script = ExtResource("3_3nps0")
path = "interact"
metadata/_custom_type_script = "uid://c2w177bb5r70x"
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ouj7b"]
cull_mode = 1
shading_mode = 0
[sub_resource type="CylinderShape3D" id="CylinderShape3D_3nps0"]
height = 0.2
@ -27,20 +23,28 @@ script = ExtResource("1_p5331")
metadata/_custom_type_script = "uid://nsxr1qkvivsf"
[node name="WorldProxy" type="Node" parent="." unique_id=930661856]
unique_name_in_owner = true
script = ExtResource("2_3nps0")
metadata/_custom_type_script = "uid://qifiwdgyx6e"
[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=1939916981]
mesh = SubResource("CylinderMesh_0r1sb")
[node name="FocusHightlight" type="MeshInstance3D" parent="MeshInstance3D" unique_id=2040210883]
transform = Transform3D(1.035, 0, 0, 0, 1.035, 0, 0, 0, 1.035, 0, 0, 0)
material_override = SubResource("StandardMaterial3D_ouj7b")
mesh = SubResource("CylinderMesh_0r1sb")
[node name="PickupInteraction" type="Node" parent="." unique_id=1627706216]
unique_name_in_owner = true
script = ExtResource("2_0r1sb")
hover_hint = "Press {prompt} to pickup"
button_prompt = SubResource("Texture2D_er8ho")
hover_hint = "Press {interact} to pickup"
metadata/_custom_type_script = "uid://ckdo7huqoleoi"
[node name="InteractionArea" parent="." unique_id=1987460629 node_paths=PackedStringArray("interaction_types") instance=ExtResource("3_ouj7b")]
[node name="InteractionArea" parent="." unique_id=1987460629 node_paths=PackedStringArray("interaction_types", "focus_highlight_node") instance=ExtResource("3_ouj7b")]
unique_name_in_owner = true
interaction_types = [NodePath("../PickupInteraction")]
focus_highlight_node = NodePath("../MeshInstance3D/FocusHightlight")
[node name="CollisionShape3D" type="CollisionShape3D" parent="InteractionArea" unique_id=1272180976]
shape = SubResource("CylinderShape3D_3nps0")

View File

@ -3,16 +3,8 @@
[ext_resource type="Script" uid="uid://dkao86mwhq1tm" path="res://src/gameplay/systems/power_box/fuse_pickup.gd" id="1_b733i"]
[ext_resource type="Script" uid="uid://ckdo7huqoleoi" path="res://src/core/interaction/interaction_types/pickup.gd" id="2_of2nm"]
[ext_resource type="Script" uid="uid://qifiwdgyx6e" path="res://src/core/world/level/world_proxy.gd" id="2_p036h"]
[ext_resource type="Script" uid="uid://ch00l1e1rteyw" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="3_hqmg0"]
[ext_resource type="PackedScene" uid="uid://2dre1e56emw6" path="res://src/core/interaction/interaction_area.tscn" id="4_3b6jw"]
[sub_resource type="Texture2D" id="Texture2D_3b6jw"]
resource_local_to_scene = false
resource_name = ""
script = ExtResource("3_hqmg0")
path = "interact"
metadata/_custom_type_script = "uid://c2w177bb5r70x"
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_3b6jw"]
albedo_color = Color(0.4862745, 0.6, 1, 1)
@ -35,8 +27,7 @@ metadata/_custom_type_script = "uid://qifiwdgyx6e"
[node name="PickupInteraction" type="Node" parent="." unique_id=285803844]
script = ExtResource("2_of2nm")
hover_hint = "Press {prompt} to pickup"
button_prompt = SubResource("Texture2D_3b6jw")
hover_hint = "Press {interact} to pickup"
metadata/_custom_type_script = "uid://ckdo7huqoleoi"
[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=476632181]

View File

@ -3,16 +3,8 @@
[ext_resource type="Script" uid="uid://bpvawt7ate0ug" path="res://src/gameplay/systems/power_box/power_box.gd" id="1_m14vv"]
[ext_resource type="Script" uid="uid://ckdo7huqoleoi" path="res://src/core/interaction/interaction_types/pickup.gd" id="2_35cpc"]
[ext_resource type="Script" uid="uid://qifiwdgyx6e" path="res://src/core/world/level/world_proxy.gd" id="2_v6qxf"]
[ext_resource type="Script" uid="uid://ch00l1e1rteyw" path="res://addons/controller_icons/objects/ControllerIconTexture.gd" id="3_35cpc"]
[ext_resource type="PackedScene" uid="uid://2dre1e56emw6" path="res://src/core/interaction/interaction_area.tscn" id="4_v6qxf"]
[sub_resource type="Texture2D" id="Texture2D_35cpc"]
resource_local_to_scene = false
resource_name = ""
script = ExtResource("3_35cpc")
path = "interact"
metadata/_custom_type_script = "uid://ch00l1e1rteyw"
[sub_resource type="BoxShape3D" id="BoxShape3D_v6qxf"]
size = Vector3(0.5, 0.8, 0.5)
@ -30,7 +22,6 @@ metadata/_custom_type_script = "uid://qifiwdgyx6e"
[node name="PickupInteraction" type="Node" parent="." unique_id=1698155134]
script = ExtResource("2_35cpc")
button_prompt = SubResource("Texture2D_35cpc")
metadata/_custom_type_script = "uid://ckdo7huqoleoi"
[node name="InteractionArea" parent="." unique_id=1987460629 node_paths=PackedStringArray("interaction_types") instance=ExtResource("4_v6qxf")]

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,40 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://biljky5uh45hg"
path="res://.godot/imported/crosshair_outline.png-dabc3110529c569dd574195e16b52c92.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://src/ui/hud/crosshair_outline.png"
dest_files=["res://.godot/imported/crosshair_outline.png-dabc3110529c569dd574195e16b52c92.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

View File

@ -0,0 +1,12 @@
class_name HudSubtitle
extends Control
@onready var rich_text_label: RichTextLabel = %RichTextLabel
func _process(_delta: float) -> void:
var parts: PackedStringArray = []
for playback: DialogEntryPlayback in DialogPlayer.active_dialog_playbacks:
parts.append(playback.get_dialog_subtitle())
rich_text_label.text = "\n".join(parts)

View File

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

View File

@ -0,0 +1,37 @@
[gd_scene format=3 uid="uid://ct2u3f03lwsnr"]
[ext_resource type="Script" uid="uid://ssyyrfvcmird" path="res://src/ui/hud/hud_subtitle.gd" id="1_07tug"]
[node name="HudSubtitle" type="Control" unique_id=123148710]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
script = ExtResource("1_07tug")
metadata/_custom_type_script = "uid://ssyyrfvcmird"
[node name="MarginContainer" type="MarginContainer" parent="." unique_id=441028605]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
mouse_filter = 2
theme_override_constants/margin_left = 12
theme_override_constants/margin_top = 12
theme_override_constants/margin_right = 12
theme_override_constants/margin_bottom = 12
[node name="RichTextLabel" type="RichTextLabel" parent="MarginContainer" unique_id=1994554868]
unique_name_in_owner = true
layout_mode = 2
mouse_filter = 2
theme_override_constants/outline_size = 4
bbcode_enabled = true
text = "Example subtitle"
horizontal_alignment = 1
vertical_alignment = 2

View File

@ -4,15 +4,50 @@ extends Control
signal load_game_request(save_data: SaveData, slot_index: int)
signal quit_request
const USER_SETTINGS_PATH: String = "user://settings.ini"
const SAVES_DIR: String = "user://saves/"
const SAVE_DATA_PATH: String = SAVES_DIR + "%s/save_data.tres"
@onready var continue_button: Button = %ContinueButton
@onready var load_button: Button = %LoadButton
@onready var new_game_button: Button = %NewGameButton
@onready var quit_button: Button = %QuitButton
@onready var saves_scroll_container: ScrollContainer = $SavesScrollContainer
@onready var saves_scroll_container: ScrollContainer = %SavesScrollContainer
@onready var saves_container: VBoxContainer = %SavesContainer
static func get_save_slots() -> PackedInt32Array:
if not DirAccess.dir_exists_absolute(SAVES_DIR):
return []
var dirs: PackedStringArray = DirAccess.get_directories_at(SAVES_DIR)
var index: int = 0
while index < dirs.size():
var dir_name: String = dirs[index]
if dir_name.is_valid_int() and not (dir_name.begins_with("+") or dir_name.begins_with("-")):
index += 1
else:
dirs.remove_at(index)
return type_convert(dirs, TYPE_PACKED_INT32_ARRAY)
static func get_unique_save_slot_index() -> int:
var index: int = 0
var taken_slots: PackedInt32Array = get_save_slots()
while taken_slots.has(index):
index += 1
return index
static func get_save_path(slot_index: int) -> String:
return SAVE_DATA_PATH % slot_index
func _ready() -> void:
continue_button.pressed.connect(_on_continue_pressed)
load_button.pressed.connect(_on_load_pressed)
@ -24,7 +59,7 @@ func _ready() -> void:
func has_save() -> bool:
var config := ConfigFile.new()
config.load("user://settings.ini")
config.load(USER_SETTINGS_PATH)
return config.has_section_key("game", "last_slot")
@ -33,36 +68,14 @@ func populate_save_entries() -> void:
child.queue_free()
for save_slot: int in get_save_slots():
var save_path: String = "user://%s/save_data.tres" % save_slot
var save_path: String = get_save_path(save_slot)
var button := SaveEntryButton.construct_save_entry_button(saves_container, save_path, save_slot)
button.pressed.connect(_on_save_entry_pressed.bind(save_slot))
func get_save_slots() -> PackedInt32Array:
if not DirAccess.dir_exists_absolute("user://saves/"):
return []
var dirs: PackedStringArray = DirAccess.get_directories_at("user://saves/")
return type_convert(dirs, TYPE_PACKED_INT32_ARRAY)
func get_unique_save_slot_index() -> int:
var index: int = 0
var taken_slots: PackedInt32Array = get_save_slots()
while taken_slots.has(index):
index += 1
return index
func get_save_path(slot_index: int) -> String:
return "user://saves/%s/save_data.tres" % slot_index
func _on_continue_pressed() -> void:
var config := ConfigFile.new()
config.load("user://settings.ini")
config.load(USER_SETTINGS_PATH)
var slot: int = config.get_value("game", "last_slot", 0)
var path: String = get_save_path(slot)
@ -74,7 +87,7 @@ func _on_continue_pressed() -> void:
return
config.set_value("game", "last_slot", slot)
config.save("user://settings.ini")
config.save(USER_SETTINGS_PATH)
var save_data: SaveData = load(path)
load_game_request.emit(save_data, slot)
@ -91,10 +104,9 @@ func _on_new_game_pressed() -> void:
load_game_request.emit(save_data, slot_index)
var config := ConfigFile.new()
var path: String = "user://settings.ini"
config.load(path)
config.load(USER_SETTINGS_PATH)
config.set_value("game", "last_slot", slot_index)
config.save(path)
config.save(USER_SETTINGS_PATH)
func _on_quit_pressed() -> void:
@ -103,9 +115,9 @@ func _on_quit_pressed() -> void:
func _on_save_entry_pressed(save_slot: int) -> void:
var config := ConfigFile.new()
config.load("user://settings.ini")
config.load(USER_SETTINGS_PATH)
config.set_value("game", "last_slot", save_slot)
config.save("user://settings.ini")
config.save(USER_SETTINGS_PATH)
var save_path: String = get_save_path(save_slot)

View File

@ -1,6 +1,22 @@
[gd_scene format=3 uid="uid://7v62dybcabgw"]
[ext_resource type="Script" uid="uid://ckaouf136x7rh" path="res://src/ui/main_menu/main_menu.gd" id="1_2hyyg"]
[ext_resource type="Material" uid="uid://c38215ysnknyk" path="res://assets/dev/dark/dark_01.tres" id="2_4ux21"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_4ux21"]
sky_horizon_color = Color(0.66224277, 0.6717428, 0.6867428, 1)
ground_horizon_color = Color(0.66224277, 0.6717428, 0.6867428, 1)
[sub_resource type="Sky" id="Sky_osdni"]
sky_material = SubResource("ProceduralSkyMaterial_4ux21")
[sub_resource type="Environment" id="Environment_3oi2e"]
background_mode = 2
sky = SubResource("Sky_osdni")
ambient_light_source = 2
ambient_light_color = Color(0.4390491, 0.43904912, 0.43904912, 1)
tonemap_mode = 2
glow_enabled = true
[node name="MainMenu" type="Control" unique_id=481021069]
layout_mode = 3
@ -57,6 +73,7 @@ layout_mode = 2
text = "QUIT"
[node name="SavesScrollContainer" type="ScrollContainer" parent="." unique_id=1084479536]
unique_name_in_owner = true
visible = false
layout_mode = 1
anchors_preset = -1
@ -93,3 +110,19 @@ text = "Save 1"
[node name="Button4" type="Button" parent="SavesScrollContainer/SavesContainer" unique_id=366833041]
layout_mode = 2
text = "Save 1"
[node name="Background" type="Node3D" parent="." unique_id=877986421]
[node name="WorldEnvironment" type="WorldEnvironment" parent="Background" unique_id=3797920]
environment = SubResource("Environment_3oi2e")
[node name="Camera3D" type="Camera3D" parent="Background" unique_id=1208848045]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, -0.90000004)
[node name="Geometry" type="CSGCombiner3D" parent="Background" unique_id=1192727861]
[node name="CSGBox3D" type="CSGBox3D" parent="Background/Geometry" unique_id=1467898282]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -3)
flip_faces = true
size = Vector3(9, 5, 6)
material = ExtResource("2_4ux21")

View File

@ -1,14 +1,12 @@
[gd_scene format=3 uid="uid://cnfgc6k86hp1q"]
[ext_resource type="PackedScene" uid="uid://8y3swwnmxwg2" path="res://src/worlds/world.tscn" id="1_3iyfg"]
[ext_resource type="Material" uid="uid://c38215ysnknyk" path="res://assets/dev/dark/dark_01.tres" id="2_f04cf"]
[ext_resource type="Script" uid="uid://s1vhbwkyewdg" path="res://src/gameplay/systems/flashlight/flashlight_manager.gd" id="2_whdyi"]
[ext_resource type="PackedScene" uid="uid://yuthv3c7rx8" path="res://src/ui/pause_menu/pause_menu.tscn" id="2_yht7d"]
[ext_resource type="Material" uid="uid://r527wj0qbkvs" path="res://assets/dev/orange/orange_02.tres" id="3_en67y"]
[ext_resource type="Material" uid="uid://d02jll28bgkap" path="res://assets/dev/orange/orange_05.tres" id="3_gdn1s"]
[ext_resource type="Material" uid="uid://bahys2ntbh2ap" path="res://assets/dev/orange/orange_01.tres" id="3_wtnit"]
[ext_resource type="Script" uid="uid://bgau5aa5a00w3" path="res://src/core/world/level/level_streamer.gd" id="3_maf5p"]
[ext_resource type="Material" uid="uid://biu40ot7f55no" path="res://assets/dev/dark/dark_04.tres" id="4_8xmty"]
[ext_resource type="PackedScene" uid="uid://cprtg457nr86q" path="res://assets/models/plush/godot_plush_v2.glb" id="8_qm8ha"]
[ext_resource type="PackedScene" uid="uid://bkq8nkmqu7drf" path="res://src/gameplay/systems/flashlight/flashlight_battery.tscn" id="9_n68sy"]
[ext_resource type="Script" uid="uid://qpwf8svieydl" path="res://src/worlds/exposition/levels/entrance_hall/entrance_hall_power_box.gd" id="10_btgc1"]
[ext_resource type="PackedScene" uid="uid://c2wxc6rij53vs" path="res://src/gameplay/systems/flashlight/flashlight_trigger.tscn" id="10_dy1qy"]
@ -16,8 +14,9 @@
[ext_resource type="Script" uid="uid://y1nxrfv31pke" path="res://tools/cutscene_animation_player.gd" id="11_map4s"]
[ext_resource type="PackedScene" uid="uid://bbqf7j8s2n81l" path="res://src/gameplay/systems/power_box/fuse_pickup.tscn" id="11_qm8ha"]
[ext_resource type="PackedScene" uid="uid://lyl5v6s6waw" path="res://_development/ayuroo/maestro/_mo_chase_test.tscn" id="14_264wa"]
[ext_resource type="Script" uid="uid://qifiwdgyx6e" path="res://src/core/world/level/world_proxy.gd" id="19_du0pf"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_gdn1s"]
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_glp4g"]
sky_top_color = Color(0.055987924, 0.081590004, 0.17344469, 1)
sky_horizon_color = Color(0.07963555, 0.093164064, 0.14665467, 1)
ground_horizon_color = Color(0.07963555, 0.093164064, 0.14665467, 1)
@ -25,7 +24,7 @@ sun_angle_max = 2.93
sun_curve = 2.2392747
[sub_resource type="Sky" id="Sky_dy1qy"]
sky_material = SubResource("ProceduralSkyMaterial_gdn1s")
sky_material = SubResource("ProceduralSkyMaterial_glp4g")
[sub_resource type="Environment" id="Environment_dy1qy"]
background_mode = 2
@ -33,6 +32,10 @@ sky = SubResource("Sky_dy1qy")
tonemap_mode = 2
glow_enabled = true
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_gdn1s"]
sun_angle_max = 2.93
sun_curve = 2.2392747
[sub_resource type="Sky" id="Sky_wb8ak"]
sky_material = SubResource("ProceduralSkyMaterial_gdn1s")
@ -97,16 +100,12 @@ tracks/1/keys = {
"values": [Vector3(0, 0, 0), Vector3(0, -1.8325957, 0)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_gdn1s"]
[sub_resource type="AnimationLibrary" id="AnimationLibrary_yht7d"]
_data = {
&"RESET": SubResource("Animation_gdn1s"),
&"open": SubResource("Animation_8xmty")
}
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_wtnit"]
transparency = 1
albedo_color = Color(1, 1, 1, 0.35686275)
[sub_resource type="Animation" id="Animation_map4s"]
length = 0.001
tracks/0/type = "value"
@ -285,26 +284,10 @@ _data = {
[sub_resource type="BoxShape3D" id="BoxShape3D_dy1qy"]
size = Vector3(14.6, 3, 1)
[node name="Exposition" unique_id=1613733883 instance=ExtResource("1_3iyfg")]
[node name="Exposition" unique_id=1613733883 node_paths=PackedStringArray("level_streamers") instance=ExtResource("1_3iyfg")]
level_streamers = [NodePath("LevelStreamers/EntranceHall")]
[node name="NightEnvironment" type="WorldEnvironment" parent="." index="0" unique_id=1572071534]
environment = SubResource("Environment_dy1qy")
[node name="DayEnvironment" type="WorldEnvironment" parent="." index="1" unique_id=168205352]
environment = SubResource("Environment_whdyi")
[node name="DaySun" type="DirectionalLight3D" parent="." index="2" unique_id=1667672001]
transform = Transform3D(-0.8660254, -0.43301278, 0.25, 0, 0.49999997, 0.86602545, -0.50000006, 0.75, -0.43301266, 0, 0, 0)
visible = false
shadow_enabled = true
[node name="NightSun" type="DirectionalLight3D" parent="." index="3" unique_id=372201677]
transform = Transform3D(-0.8660254, -0.43301278, 0.25, 0, 0.49999997, 0.86602545, -0.50000006, 0.75, -0.43301266, 0, 0, 0)
light_color = Color(0.31085983, 0.314331, 0.35950518, 1)
light_angular_distance = 0.75
shadow_enabled = true
[node name="PlayerCharacter" parent="." index="4" unique_id=1678220543 node_paths=PackedStringArray("flashlight_manager")]
[node name="PlayerCharacter" parent="." index="0" unique_id=1678220543 node_paths=PackedStringArray("flashlight_manager")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.0000005, 17)
flashlight_manager = NodePath("FlashlightManager")
@ -312,256 +295,95 @@ flashlight_manager = NodePath("FlashlightManager")
script = ExtResource("2_whdyi")
metadata/_custom_type_script = "uid://s1vhbwkyewdg"
[node name="EntranceHall" type="Node3D" parent="." index="5" unique_id=1518685491]
[node name="NightEnvironment" type="WorldEnvironment" parent="." index="1" unique_id=1572071534]
environment = SubResource("Environment_dy1qy")
[node name="Doors" type="CSGCombiner3D" parent="EntranceHall" index="0" unique_id=2012245375]
[node name="DayEnvironment" type="WorldEnvironment" parent="." index="2" unique_id=168205352]
environment = SubResource("Environment_whdyi")
[node name="NightSun" type="DirectionalLight3D" parent="." index="3" unique_id=372201677]
transform = Transform3D(-0.8660254, -0.43301278, 0.25, 0, 0.49999997, 0.86602545, -0.50000006, 0.75, -0.43301266, 0, 0, 0)
light_color = Color(0.31085983, 0.314331, 0.35950518, 1)
light_angular_distance = 0.75
shadow_enabled = true
[node name="DaySun" type="DirectionalLight3D" parent="." index="4" unique_id=1667672001]
transform = Transform3D(-0.8660254, -0.43301278, 0.25, 0, 0.49999997, 0.86602545, -0.50000006, 0.75, -0.43301266, 0, 0, 0)
visible = false
shadow_enabled = true
[node name="Doors" type="CSGCombiner3D" parent="." index="5" unique_id=623293063]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -19.6)
use_collision = true
[node name="AnimationPlayer" type="AnimationPlayer" parent="EntranceHall/Doors" index="0" unique_id=906939002]
libraries/ = SubResource("AnimationLibrary_gdn1s")
[node name="AnimationPlayer" type="AnimationPlayer" parent="Doors" index="0" unique_id=661035765]
libraries/ = SubResource("AnimationLibrary_yht7d")
[node name="DoorLeft" type="CSGCombiner3D" parent="EntranceHall/Doors" index="1" unique_id=1094260622]
[node name="DoorLeft" type="CSGCombiner3D" parent="Doors" index="1" unique_id=952971802]
transform = Transform3D(0.9999997, 0, 0, 0, 1, 0, 0, 0, 0.9999997, -5.2, 0, 0.10000038)
[node name="Box" type="CSGBox3D" parent="EntranceHall/Doors/DoorLeft" index="0" unique_id=1833029438]
[node name="Box" type="CSGBox3D" parent="Doors/DoorLeft" index="0" unique_id=1212613004]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.45, 7, 0)
visible = false
size = Vector3(5.5, 14, 1)
material = ExtResource("3_en67y")
[node name="Box3" type="CSGBox3D" parent="EntranceHall/Doors/DoorLeft" index="1" unique_id=1258502275]
[node name="Box3" type="CSGBox3D" parent="Doors/DoorLeft" index="1" unique_id=788913396]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.45, 5.625, 0)
size = Vector3(5.5, 11.25, 1)
material = ExtResource("3_en67y")
[node name="Box4" type="CSGBox3D" parent="EntranceHall/Doors/DoorLeft" index="2" unique_id=1346859939]
[node name="Box4" type="CSGBox3D" parent="Doors/DoorLeft" index="2" unique_id=1245695811]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.825, 7, 0)
size = Vector3(2.75, 14, 1)
material = ExtResource("3_en67y")
[node name="Box2" type="CSGCylinder3D" parent="EntranceHall/Doors/DoorLeft" index="3" unique_id=1015521100]
[node name="Box2" type="CSGCylinder3D" parent="Doors/DoorLeft" index="3" unique_id=946557532]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, -1, 0, 1, -4.371139e-08, 2.45, 11.25, 0)
radius = 2.75
height = 1.0
material = ExtResource("3_en67y")
[node name="DoorRight" type="CSGCombiner3D" parent="EntranceHall/Doors" index="2" unique_id=275591387]
[node name="DoorRight" type="CSGCombiner3D" parent="Doors" index="2" unique_id=215853960]
transform = Transform3D(0.9999997, 0, 0, 0, 1, 0, 0, 0, 0.9999997, 5.2, 0, 0.10000038)
[node name="Box" type="CSGBox3D" parent="EntranceHall/Doors/DoorRight" index="0" unique_id=404654783]
[node name="Box" type="CSGBox3D" parent="Doors/DoorRight" index="0" unique_id=944987501]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -2.4625, 7, 0)
visible = false
size = Vector3(5.5, 14, 1)
material = ExtResource("3_en67y")
[node name="Box3" type="CSGBox3D" parent="EntranceHall/Doors/DoorRight" index="1" unique_id=1124114693]
[node name="Box3" type="CSGBox3D" parent="Doors/DoorRight" index="1" unique_id=1942036079]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -2.4625, 5.625, 0)
size = Vector3(5.5, 11.25, 1)
material = ExtResource("3_en67y")
[node name="Box4" type="CSGBox3D" parent="EntranceHall/Doors/DoorRight" index="2" unique_id=461171599]
[node name="Box4" type="CSGBox3D" parent="Doors/DoorRight" index="2" unique_id=274266953]
transform = Transform3D(-1, 0, 8.742278e-08, 0, 1, 0, -8.742278e-08, 0, -1, -3.8374999, 7, 0)
size = Vector3(2.75, 14, 1)
material = ExtResource("3_en67y")
[node name="Box2" type="CSGCylinder3D" parent="EntranceHall/Doors/DoorRight" index="3" unique_id=1740694143]
[node name="Box2" type="CSGCylinder3D" parent="Doors/DoorRight" index="3" unique_id=589341751]
transform = Transform3D(-1, 8.742278e-08, -3.821371e-15, 0, -4.371139e-08, -1, -8.742278e-08, -1, 4.371139e-08, -2.4625, 11.25, 0)
radius = 2.75
height = 1.0
material = ExtResource("3_en67y")
[node name="Floor" type="CSGBox3D" parent="EntranceHall/Doors" index="3" unique_id=872627719]
[node name="Floor" type="CSGBox3D" parent="Doors" index="3" unique_id=359423735]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0.10000038)
size = Vector3(11, 1, 1)
material = ExtResource("3_en67y")
[node name="Blockout" type="CSGCombiner3D" parent="EntranceHall" index="1" unique_id=2092187673]
use_collision = true
[node name="LevelStreamers" type="Node3D" parent="." index="6" unique_id=460675243]
[node name="Floor" type="CSGBox3D" parent="EntranceHall/Blockout" index="0" unique_id=106297379]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
size = Vector3(40, 1, 38)
material = ExtResource("2_f04cf")
[node name="EntranceHall" type="Marker3D" parent="LevelStreamers" index="0" unique_id=1730849561]
script = ExtResource("3_maf5p")
level_id = &"entrance_hall"
scene_path = "uid://cksacjkic7wl6"
load_aabbs = Array[AABB]([AABB(-22, -2, -20, 41, 23, 40), AABB(-18, 0, -36, 41, 19, 16)])
metadata/_custom_type_script = "uid://bgau5aa5a00w3"
[node name="Ceiling" type="CSGBox3D" parent="EntranceHall/Blockout" index="1" unique_id=678154528]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 18.5, 0)
size = Vector3(40, 1, 38)
material = ExtResource("2_f04cf")
[node name="HollowSphere" type="CSGSphere3D" parent="EntranceHall/Blockout/Ceiling" index="0" unique_id=123150142]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
operation = 2
radius = 12.0
radial_segments = 24
material = ExtResource("2_f04cf")
[node name="CenterCashier" type="CSGCombiner3D" parent="EntranceHall/Blockout" index="2" unique_id=1862985509]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
[node name="Statue" type="CSGCombiner3D" parent="EntranceHall/Blockout/CenterCashier" index="0" unique_id=134083437]
[node name="Room" type="CSGCombiner3D" parent="EntranceHall/Blockout/CenterCashier" index="1" unique_id=120658381]
[node name="Cylinder" type="CSGCylinder3D" parent="EntranceHall/Blockout/CenterCashier/Room" index="0" unique_id=1559637996]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.25, 0)
radius = 6.0
height = 4.5
sides = 18
material = ExtResource("3_wtnit")
[node name="HollowCylinder" type="CSGCylinder3D" parent="EntranceHall/Blockout/CenterCashier/Room" index="1" unique_id=1402496092]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.7656252, 0)
operation = 2
radius = 5.8
height = 4.6312504
sides = 18
material = ExtResource("3_wtnit")
[node name="Window" type="CSGBox3D" parent="EntranceHall/Blockout/CenterCashier/Room" index="2" unique_id=556425626]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.95, 0)
operation = 2
size = Vector3(1.5, 2, 12)
material = ExtResource("2_f04cf")
[node name="Window2" type="CSGBox3D" parent="EntranceHall/Blockout/CenterCashier/Room" index="3" unique_id=1652618075]
transform = Transform3D(0.70710677, 0, -0.70710677, 0, 1, 0, 0.70710677, 0, 0.70710677, 0, 1.95, 0)
operation = 2
size = Vector3(1.5, 2, 12)
material = ExtResource("2_f04cf")
[node name="_TEMPDoor" type="CSGBox3D" parent="EntranceHall/Blockout/CenterCashier/Room" index="4" unique_id=136289796]
transform = Transform3D(0.70710677, 0, -0.70710677, 0, 1, 0, 0.70710677, 0, 0.70710677, -3.535534, 1.45, 3.535534)
operation = 2
size = Vector3(1.5, 3, 2)
material = ExtResource("2_f04cf")
[node name="Window3" type="CSGBox3D" parent="EntranceHall/Blockout/CenterCashier/Room" index="5" unique_id=1044909127]
transform = Transform3D(0, 0, -0.99999994, 0, 1, 0, 0.99999994, 0, 0, 0, 1.95, 0)
operation = 2
size = Vector3(1.5, 2, 12)
material = ExtResource("2_f04cf")
[node name="Window4" type="CSGBox3D" parent="EntranceHall/Blockout/CenterCashier/Room" index="6" unique_id=2033585943]
transform = Transform3D(-0.70710665, 0, -0.70710665, 0, 1, 0, 0.70710665, 0, -0.70710665, 0, 1.95, 0)
operation = 2
size = Vector3(1.5, 2, 12)
material = ExtResource("2_f04cf")
[node name="Dome" type="CSGCombiner3D" parent="EntranceHall/Blockout" index="3" unique_id=949578487]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 19, 0)
[node name="Sphere" type="CSGSphere3D" parent="EntranceHall/Blockout/Dome" index="0" unique_id=796313331]
radius = 13.0
radial_segments = 24
material = SubResource("StandardMaterial3D_wtnit")
[node name="DomeDetails" type="CSGCombiner3D" parent="EntranceHall/Blockout/Dome" index="1" unique_id=1959193638]
[node name="Torus" type="CSGTorus3D" parent="EntranceHall/Blockout/Dome/DomeDetails" index="0" unique_id=1458632213]
transform = Transform3D(1, 0, 0, 0, 2.9802322e-08, -1, 0, 1, 2.9802322e-08, 0, 0, 0)
inner_radius = 13.075
outer_radius = 14.0
sides = 24
material = ExtResource("3_en67y")
[node name="Torus2" type="CSGTorus3D" parent="EntranceHall/Blockout/Dome/DomeDetails" index="1" unique_id=778282688]
transform = Transform3D(0.70710677, -0.70710677, -2.1073424e-08, 0, 2.9802322e-08, -1, 0.70710677, 0.70710677, 2.1073424e-08, 0, 0, 0)
inner_radius = 13.075
outer_radius = 14.0
sides = 24
material = ExtResource("3_en67y")
[node name="Torus3" type="CSGTorus3D" parent="EntranceHall/Blockout/Dome/DomeDetails" index="2" unique_id=793102935]
transform = Transform3D(0, -0.99999994, -2.980232e-08, 0, 2.9802322e-08, -1, 0.99999994, 0, 0, 0, 0, 0)
inner_radius = 13.075
outer_radius = 14.0
sides = 24
material = ExtResource("3_en67y")
[node name="Torus4" type="CSGTorus3D" parent="EntranceHall/Blockout/Dome/DomeDetails" index="3" unique_id=357788534]
transform = Transform3D(-0.70710665, -0.70710665, -2.107342e-08, 0, 2.9802322e-08, -1, 0.70710665, -0.70710665, -2.107342e-08, 0, 0, 0)
inner_radius = 13.075
outer_radius = 14.0
sides = 24
material = ExtResource("3_en67y")
[node name="TopTorus" type="CSGTorus3D" parent="EntranceHall/Blockout/Dome/DomeDetails" index="4" unique_id=1057763023]
transform = Transform3D(0.9999998, 0, 0, 0, 0.9999998, 0, 0, 0, 1, 0, 12.263981, 0)
inner_radius = 5.0
outer_radius = 6.0
sides = 24
material = ExtResource("3_en67y")
[node name="TorusCutoff" type="CSGSphere3D" parent="EntranceHall/Blockout/Dome/DomeDetails" index="5" unique_id=1278980607]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 14.358425, 0)
operation = 2
radius = 5.6310983
radial_segments = 24
material = ExtResource("3_en67y")
[node name="LowerCutoff" type="CSGBox3D" parent="EntranceHall/Blockout/Dome" index="2" unique_id=2066422133]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -7.25, 0)
operation = 2
size = Vector3(29, 14.5, 28)
material = SubResource("StandardMaterial3D_wtnit")
[node name="FrontWall" type="CSGBox3D" parent="EntranceHall/Blockout" index="4" unique_id=767189909]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 19.5)
size = Vector3(40, 18, 1)
material = ExtResource("4_8xmty")
[node name="DoorCutLeft" type="CSGBox3D" parent="EntranceHall/Blockout/FrontWall" index="0" unique_id=787685923]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 2.5, -7.5, 0)
operation = 2
size = Vector3(2, 2, 3)
material = ExtResource("2_f04cf")
[node name="DoorCutLeft2" type="CSGBox3D" parent="EntranceHall/Blockout/FrontWall" index="1" unique_id=1636072458]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, -2.5, -7.5, 0)
operation = 2
size = Vector3(2, 2, 3)
material = ExtResource("2_f04cf")
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="EntranceHall/Blockout/FrontWall" index="2" unique_id=1660686906]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 0, -9, 0)
operation = 2
radius = 11.0
sides = 18
material = ExtResource("2_f04cf")
[node name="LowerCutoff" type="CSGBox3D" parent="EntranceHall/Blockout/FrontWall/CSGCylinder3D" index="0" unique_id=1970869844]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -5.25)
operation = 2
size = Vector3(25, 1, 12.5)
material = ExtResource("2_f04cf")
[node name="BackWall" type="CSGCombiner3D" parent="EntranceHall/Blockout" index="5" unique_id=1852128943]
[node name="Box" type="CSGBox3D" parent="EntranceHall/Blockout/BackWall" index="0" unique_id=651549013]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.75, 10, -19.5)
size = Vector3(14.5, 18, 1)
material = ExtResource("4_8xmty")
[node name="Box2" type="CSGBox3D" parent="EntranceHall/Blockout/BackWall" index="1" unique_id=762610247]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.75, 10, -19.5)
size = Vector3(14.5, 18, 1)
material = ExtResource("4_8xmty")
[node name="Box3" type="CSGBox3D" parent="EntranceHall/Blockout/BackWall" index="2" unique_id=1251599122]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 17, -19.5)
size = Vector3(11, 4, 1)
material = ExtResource("4_8xmty")
[node name="RightWall" type="CSGCombiner3D" parent="EntranceHall/Blockout" index="6" unique_id=427128707]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.5, 1, 0)
[node name="Box" type="CSGBox3D" parent="EntranceHall/Blockout/RightWall" index="0" unique_id=156076418]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 9, 0)
size = Vector3(1, 18, 40)
material = ExtResource("4_8xmty")
[node name="SecondEntranceHall" type="Node3D" parent="." index="6" unique_id=282414961]
[node name="SecondEntranceHall" type="Node3D" parent="." index="7" unique_id=282414961]
[node name="Blockout" type="CSGCombiner3D" parent="SecondEntranceHall" index="0" unique_id=1024650246]
use_collision = true
@ -595,18 +417,6 @@ operation = 2
size = Vector3(17, 11, 5)
material = ExtResource("4_8xmty")
[node name="godot_plush V2" parent="." index="7" unique_id=1756431274 instance=ExtResource("8_qm8ha")]
transform = Transform3D(-50, 0, 4.371139e-06, 0, 50, 0, -4.371139e-06, 0, -50, 0, 5.628097, 0)
[node name="godot_plush_01" parent="godot_plush V2" index="0" unique_id=983026135]
visible = false
[node name="godot_plush_sitted" parent="godot_plush V2" index="1" unique_id=1406071640]
visible = false
[node name="godot_plush_02" parent="godot_plush V2" index="2" unique_id=815057431]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0025618896, 0)
[node name="Objects" type="Node3D" parent="." index="8" unique_id=249052389]
[node name="FlashlightBattery" parent="Objects" index="0" unique_id=1021450063 node_paths=PackedStringArray("manager") instance=ExtResource("9_n68sy")]
@ -635,13 +445,16 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.50000006, 2.0499978, 5.8)
manager = NodePath("../../PlayerCharacter/FlashlightManager")
refill_amount = 0.5
[node name="LogicCluster" type="Node3D" parent="Objects" index="6" unique_id=556526856 node_paths=PackedStringArray("world", "doors_animation_player")]
[node name="LogicCluster" type="Node3D" parent="Objects" index="6" unique_id=556526856 node_paths=PackedStringArray("doors_animation_player")]
transform = Transform3D(1.0000001, 0, 0, 0, 1, 0, 0, 0, 1.0000001, 0, 0, 0)
script = ExtResource("10_btgc1")
world = NodePath("../..")
doors_animation_player = NodePath("../../EntranceHall/Doors/AnimationPlayer")
doors_animation_player = NodePath("../../Doors/AnimationPlayer")
[node name="Cutscene" type="Node3D" parent="Objects/LogicCluster" index="0" unique_id=970055626]
[node name="WorldProxy" type="Node" parent="Objects/LogicCluster" index="0" unique_id=227334375]
script = ExtResource("19_du0pf")
metadata/_custom_type_script = "uid://qifiwdgyx6e"
[node name="Cutscene" type="Node3D" parent="Objects/LogicCluster" index="1" unique_id=970055626]
[node name="EndAlignment" type="Marker3D" parent="Objects/LogicCluster/Cutscene" index="0" unique_id=399304482]
transform = Transform3D(1.0000001, 0, 0, 0, 1, 0, 0, 0, 1.0000001, 0, 1, -5)
@ -663,10 +476,10 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, -5)
top_level = true
fov = 65.0
[node name="PowerBoxFuse" parent="Objects/LogicCluster" index="1" unique_id=1951712625 instance=ExtResource("10_xp6ux")]
[node name="PowerBoxFuse" parent="Objects/LogicCluster" index="2" unique_id=1951712625 instance=ExtResource("10_xp6ux")]
transform = Transform3D(0.96592575, 0, 0.25881898, 0, 1, 0, -0.25881898, 0, 0.96592575, -1.2618543, 2.5, -5.657638)
[node name="FusePickup" parent="Objects/LogicCluster" index="2" unique_id=38269817 node_paths=PackedStringArray("power_box") instance=ExtResource("11_qm8ha")]
[node name="FusePickup" parent="Objects/LogicCluster" index="3" unique_id=38269817 node_paths=PackedStringArray("power_box") instance=ExtResource("11_qm8ha")]
transform = Transform3D(0.9999998, 0, 0, 0, 1, 0, 0, 0, 0.9999998, -4.2999997, 2.0499978, -3.9999995)
power_box = NodePath("../PowerBoxFuse")
@ -701,4 +514,3 @@ transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -20.
visible = false
world = NodePath("..")
[editable path="godot_plush V2"]

View File

@ -0,0 +1,282 @@
[gd_scene format=3 uid="uid://cksacjkic7wl6"]
[ext_resource type="Material" uid="uid://r527wj0qbkvs" path="res://assets/dev/orange/orange_02.tres" id="1_4sesj"]
[ext_resource type="Material" uid="uid://c38215ysnknyk" path="res://assets/dev/dark/dark_01.tres" id="2_ro4g0"]
[ext_resource type="Material" uid="uid://bahys2ntbh2ap" path="res://assets/dev/orange/orange_01.tres" id="3_4uqqm"]
[ext_resource type="Material" uid="uid://biu40ot7f55no" path="res://assets/dev/dark/dark_04.tres" id="4_3ohxo"]
[ext_resource type="PackedScene" uid="uid://qvgrds4w5qlk" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_PaperPile_03_2.glb" id="5_m5411"]
[ext_resource type="PackedScene" uid="uid://w5f6qhe2k7nt" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_PaperPile_03_1.glb" id="6_8s83o"]
[ext_resource type="PackedScene" uid="uid://dvypbwty4jpw4" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_PaperPile_03.glb" id="7_45xuj"]
[ext_resource type="PackedScene" uid="uid://brudyosqqlxho" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_CardboardFileBox_02_closed.glb" id="8_hci5i"]
[ext_resource type="PackedScene" uid="uid://c55o1tgvneib2" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_CardboardFileBox_02_open_01.glb" id="9_hx1l4"]
[ext_resource type="PackedScene" uid="uid://bp5tnpr2xeqcw" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_CardboardFileBox_01_closed.glb" id="10_mgf24"]
[ext_resource type="PackedScene" uid="uid://1m2vet7eedwm" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_Closet_b1.glb" id="11_t7ac6"]
[ext_resource type="PackedScene" uid="uid://di85vgulxf3qx" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_Chair_01.glb" id="12_ndl0p"]
[ext_resource type="PackedScene" uid="uid://cprtg457nr86q" path="res://assets/models/plush/godot_plush_v2.glb" id="13_ro4g0"]
[ext_resource type="PackedScene" uid="uid://dt1fqe1fhp1mi" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_PaperPile_01.glb" id="14_hx1l4"]
[ext_resource type="PackedScene" uid="uid://dv4o5ldywhctm" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_PaperFilePen_01.glb" id="15_mgf24"]
[ext_resource type="PackedScene" uid="uid://dnj6f7phs8lmy" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_PaperPile_02.glb" id="16_t7ac6"]
[ext_resource type="PackedScene" uid="uid://c2csp3q6ctuwm" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_RadioTelephone_01.glb" id="17_ndl0p"]
[ext_resource type="PackedScene" uid="uid://ctkwxcldpgnk5" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_ComicBooks_02.glb" id="18_id567"]
[ext_resource type="PackedScene" uid="uid://c8tu01ufnbr74" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_ComicBooks_01.glb" id="19_ngprr"]
[ext_resource type="PackedScene" uid="uid://d3ak24nb0j3h1" path="res://_development/ayuroo/_asset_packs/fc_research_tent/interior_props/SM_CerealBox_01.glb" id="20_dcj1l"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_wtnit"]
transparency = 1
albedo_color = Color(1, 1, 1, 0.35686275)
[node name="EntranceHall" type="Node3D" unique_id=1922543926]
[node name="Blockout" type="CSGCombiner3D" parent="." unique_id=1464342270]
use_collision = true
[node name="Floor" type="CSGBox3D" parent="Blockout" unique_id=981718431]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
size = Vector3(40, 1, 38)
material = ExtResource("2_ro4g0")
[node name="Ceiling" type="CSGBox3D" parent="Blockout" unique_id=1841940119]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 18.5, 0)
size = Vector3(40, 1, 38)
material = ExtResource("2_ro4g0")
[node name="HollowSphere" type="CSGSphere3D" parent="Blockout/Ceiling" unique_id=2138697938]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
operation = 2
radius = 12.0
radial_segments = 24
material = ExtResource("2_ro4g0")
[node name="CenterCashier" type="CSGCombiner3D" parent="Blockout" unique_id=1986799842]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0)
[node name="Statue" type="CSGCombiner3D" parent="Blockout/CenterCashier" unique_id=761625484]
[node name="Room" type="CSGCombiner3D" parent="Blockout/CenterCashier" unique_id=915954706]
[node name="Cylinder" type="CSGCylinder3D" parent="Blockout/CenterCashier/Room" unique_id=791128983]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.25, 0)
radius = 6.0
height = 4.5
sides = 18
material = ExtResource("3_4uqqm")
[node name="HollowCylinder" type="CSGCylinder3D" parent="Blockout/CenterCashier/Room" unique_id=517097479]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.7656252, 0)
operation = 2
radius = 5.8
height = 4.6312504
sides = 18
material = ExtResource("3_4uqqm")
[node name="Window" type="CSGBox3D" parent="Blockout/CenterCashier/Room" unique_id=1058717011]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.95, 0)
operation = 2
size = Vector3(1.5, 2, 12)
material = ExtResource("2_ro4g0")
[node name="Window2" type="CSGBox3D" parent="Blockout/CenterCashier/Room" unique_id=49546759]
transform = Transform3D(0.70710677, 0, -0.70710677, 0, 1, 0, 0.70710677, 0, 0.70710677, 0, 1.95, 0)
operation = 2
size = Vector3(1.5, 2, 12)
material = ExtResource("2_ro4g0")
[node name="_TEMPDoor" type="CSGBox3D" parent="Blockout/CenterCashier/Room" unique_id=2097227883]
transform = Transform3D(0.70710677, 0, -0.70710677, 0, 1, 0, 0.70710677, 0, 0.70710677, -3.535534, 1.45, 3.535534)
operation = 2
size = Vector3(1.5, 3, 2)
material = ExtResource("2_ro4g0")
[node name="Window3" type="CSGBox3D" parent="Blockout/CenterCashier/Room" unique_id=503374188]
transform = Transform3D(0, 0, -0.99999994, 0, 1, 0, 0.99999994, 0, 0, 0, 1.95, 0)
operation = 2
size = Vector3(1.5, 2, 12)
material = ExtResource("2_ro4g0")
[node name="Window4" type="CSGBox3D" parent="Blockout/CenterCashier/Room" unique_id=997856821]
transform = Transform3D(-0.70710665, 0, -0.70710665, 0, 1, 0, 0.70710665, 0, -0.70710665, 0, 1.95, 0)
operation = 2
size = Vector3(1.5, 2, 12)
material = ExtResource("2_ro4g0")
[node name="Dome" type="CSGCombiner3D" parent="Blockout" unique_id=1518873811]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 19, 0)
[node name="Sphere" type="CSGSphere3D" parent="Blockout/Dome" unique_id=1240820870]
radius = 13.0
radial_segments = 24
material = SubResource("StandardMaterial3D_wtnit")
[node name="DomeDetails" type="CSGCombiner3D" parent="Blockout/Dome" unique_id=1621148910]
[node name="Torus" type="CSGTorus3D" parent="Blockout/Dome/DomeDetails" unique_id=1726696752]
transform = Transform3D(1, 0, 0, 0, 2.9802322e-08, -1, 0, 1, 2.9802322e-08, 0, 0, 0)
inner_radius = 13.075
outer_radius = 14.0
sides = 24
material = ExtResource("1_4sesj")
[node name="Torus2" type="CSGTorus3D" parent="Blockout/Dome/DomeDetails" unique_id=1848013987]
transform = Transform3D(0.70710677, -0.70710677, -2.1073424e-08, 0, 2.9802322e-08, -1, 0.70710677, 0.70710677, 2.1073424e-08, 0, 0, 0)
inner_radius = 13.075
outer_radius = 14.0
sides = 24
material = ExtResource("1_4sesj")
[node name="Torus3" type="CSGTorus3D" parent="Blockout/Dome/DomeDetails" unique_id=526929359]
transform = Transform3D(0, -0.99999994, -2.980232e-08, 0, 2.9802322e-08, -1, 0.99999994, 0, 0, 0, 0, 0)
inner_radius = 13.075
outer_radius = 14.0
sides = 24
material = ExtResource("1_4sesj")
[node name="Torus4" type="CSGTorus3D" parent="Blockout/Dome/DomeDetails" unique_id=441749211]
transform = Transform3D(-0.70710665, -0.70710665, -2.107342e-08, 0, 2.9802322e-08, -1, 0.70710665, -0.70710665, -2.107342e-08, 0, 0, 0)
inner_radius = 13.075
outer_radius = 14.0
sides = 24
material = ExtResource("1_4sesj")
[node name="TopTorus" type="CSGTorus3D" parent="Blockout/Dome/DomeDetails" unique_id=338189784]
transform = Transform3D(0.9999998, 0, 0, 0, 0.9999998, 0, 0, 0, 1, 0, 12.263981, 0)
inner_radius = 5.0
outer_radius = 6.0
sides = 24
material = ExtResource("1_4sesj")
[node name="TorusCutoff" type="CSGSphere3D" parent="Blockout/Dome/DomeDetails" unique_id=1573441356]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 14.358425, 0)
operation = 2
radius = 5.6310983
radial_segments = 24
material = ExtResource("1_4sesj")
[node name="LowerCutoff" type="CSGBox3D" parent="Blockout/Dome" unique_id=182032145]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -7.25, 0)
operation = 2
size = Vector3(29, 14.5, 28)
material = SubResource("StandardMaterial3D_wtnit")
[node name="FrontWall" type="CSGBox3D" parent="Blockout" unique_id=1194334786]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 19.5)
size = Vector3(40, 18, 1)
material = ExtResource("4_3ohxo")
[node name="DoorCutLeft" type="CSGBox3D" parent="Blockout/FrontWall" unique_id=115120624]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 2.5, -7.5, 0)
operation = 2
size = Vector3(2, 2, 3)
material = ExtResource("2_ro4g0")
[node name="DoorCutLeft2" type="CSGBox3D" parent="Blockout/FrontWall" unique_id=1732807929]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, -2.5, -7.5, 0)
operation = 2
size = Vector3(2, 2, 3)
material = ExtResource("2_ro4g0")
[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Blockout/FrontWall" unique_id=1802029672]
transform = Transform3D(1, 0, 0, 0, -4.371139e-08, 1, 0, -1, -4.371139e-08, 0, -9, 0)
operation = 2
radius = 11.0
sides = 18
material = ExtResource("2_ro4g0")
[node name="LowerCutoff" type="CSGBox3D" parent="Blockout/FrontWall/CSGCylinder3D" unique_id=910198742]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -5.25)
operation = 2
size = Vector3(25, 1, 12.5)
material = ExtResource("2_ro4g0")
[node name="BackWall" type="CSGCombiner3D" parent="Blockout" unique_id=317398196]
[node name="Box" type="CSGBox3D" parent="Blockout/BackWall" unique_id=1748317091]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -12.75, 10, -19.5)
size = Vector3(14.5, 18, 1)
material = ExtResource("4_3ohxo")
[node name="Box2" type="CSGBox3D" parent="Blockout/BackWall" unique_id=1160242589]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.75, 10, -19.5)
size = Vector3(14.5, 18, 1)
material = ExtResource("4_3ohxo")
[node name="Box3" type="CSGBox3D" parent="Blockout/BackWall" unique_id=1687352900]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 17, -19.5)
size = Vector3(11, 4, 1)
material = ExtResource("4_3ohxo")
[node name="RightWall" type="CSGCombiner3D" parent="Blockout" unique_id=1186414279]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20.5, 1, 0)
[node name="Box" type="CSGBox3D" parent="Blockout/RightWall" unique_id=1541981230]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 9, 0)
size = Vector3(1, 18, 40)
material = ExtResource("4_3ohxo")
[node name="Props" type="Node3D" parent="." unique_id=1024337945]
[node name="godot_plush V2" parent="Props" unique_id=1730647663 instance=ExtResource("13_ro4g0")]
transform = Transform3D(-50, 0, 4.371139e-06, 0, 50, 0, -4.371139e-06, 0, -50, 0, 5.628097, 0)
[node name="godot_plush_01" parent="Props/godot_plush V2" index="0" unique_id=391290764]
visible = false
[node name="godot_plush_sitted" parent="Props/godot_plush V2" index="1" unique_id=703787110]
visible = false
[node name="godot_plush_02" parent="Props/godot_plush V2" index="2" unique_id=688355995]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.0025618896, 0)
[node name="SM_PaperPile_03_2" parent="Props" unique_id=1345844095 instance=ExtResource("5_m5411")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.718074, 1.0000002, 0.91673136)
[node name="SM_PaperPile_03_1" parent="Props" unique_id=1405386528 instance=ExtResource("6_8s83o")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.15694028, 1.0000007, 0.6348417)
[node name="SM_PaperPile_03" parent="Props" unique_id=1152191568 instance=ExtResource("7_45xuj")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.9146078, 1.0000002, 2.7609625)
[node name="SM_CardboardFileBox_02_closed" parent="Props" unique_id=1652579900 instance=ExtResource("8_hci5i")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.817931, 1.0000015, 1.2458999)
[node name="SM_CardboardFileBox_02_open_01" parent="Props" unique_id=893917537 instance=ExtResource("9_hx1l4")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.503678, 1.0000011, 2.1690526)
[node name="SM_CardboardFileBox_01_closed" parent="Props" unique_id=1230475848 instance=ExtResource("10_mgf24")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.4848406, 1.0000011, 1.309094)
[node name="SM_Closet_b1" parent="Props" unique_id=640104480 instance=ExtResource("11_t7ac6")]
transform = Transform3D(0.9396926, 0, -0.34202012, 0, 1, 0, 0.34202012, 0, 0.9396926, 1.4325718, 1.0000005, -5.5614686)
[node name="SM_Chair_01" parent="Props" unique_id=438450022 instance=ExtResource("12_ndl0p")]
transform = Transform3D(0.9396926, 0, -0.34202012, 0, 1, 0, 0.34202012, 0, 0.9396926, 2.9192212, 1.0028769, 3.78964)
[node name="SM_Chair_02" parent="Props" unique_id=1717374755 instance=ExtResource("12_ndl0p")]
transform = Transform3D(1, -1.4950173e-08, -6.7055225e-08, -7.450581e-09, -4.1075268e-08, 0.99999994, -1.4950176e-08, -1.0000001, -4.107527e-08, 3.919, 1.35, 1.79)
[node name="_TMP" type="Node3D" parent="Props" unique_id=1432658199]
[node name="SM_PaperPile_01" parent="Props/_TMP" unique_id=52655774 instance=ExtResource("14_hx1l4")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.050662, 1.0000005, 1.0565416)
[node name="SM_PaperFilePen_01" parent="Props/_TMP" unique_id=745932442 instance=ExtResource("15_mgf24")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.1075568, 1.0017344, 0.21156907)
[node name="SM_PaperPile_02" parent="Props/_TMP" unique_id=1667321464 instance=ExtResource("16_t7ac6")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.8432698, 1.0000005, 0.67616963)
[node name="SM_RadioTelephone_01" parent="Props/_TMP" unique_id=107255587 instance=ExtResource("17_ndl0p")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.0042534, 1.0000005, -1.0021183)
[node name="SM_RadioTelephone_02" parent="Props/_TMP" unique_id=1337907733 instance=ExtResource("17_ndl0p")]
transform = Transform3D(0.76604444, 0, 0.6427876, 0, 1, 0, -0.6427876, 0, 0.76604444, 1.596, 2.55, -5.102)
[node name="SM_ComicBooks_02" parent="Props/_TMP" unique_id=1014914008 instance=ExtResource("18_id567")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.3010767, 1.0000005, -1.1365142)
[node name="SM_ComicBooks_01" parent="Props/_TMP" unique_id=827009623 instance=ExtResource("19_ngprr")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.2338903, 1.0000005, -1.7645805)
[node name="SM_CerealBox_01" parent="Props/_TMP" unique_id=1966092815 instance=ExtResource("20_dcj1l")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.1755064, 1.0000006, -2.2027547)
[editable path="Props/godot_plush V2"]

View File

@ -1,15 +1,19 @@
extends Node3D
@export var world: World
@export var doors_animation_player: AnimationPlayer
var world: World
@onready var power_box_fuse: PowerBox = $PowerBoxFuse
@onready var fuse_pickup: FusePickup = $FusePickup
@onready var power_box_animation: CutsceneAnimationPlayer = $Cutscene/PowerBoxAnimation
@onready var world_proxy: WorldProxy = $WorldProxy
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
world = await world_proxy.wait_for_world()
power_box_fuse.power_restored.connect(_on_power_restored)
power_box_fuse.power_revoked.connect(_on_power_revoked)

View File

@ -0,0 +1,68 @@
[gd_scene format=3 uid="uid://bqx6t4agunl7h"]
[ext_resource type="PackedScene" uid="uid://ct2u3f03lwsnr" path="res://src/ui/hud/hud_subtitle.tscn" id="1_koq4j"]
[ext_resource type="Script" uid="uid://blxophwhpim0l" path="res://src/core/dialog/dialog_player.gd" id="2_4qqmy"]
[ext_resource type="Script" uid="uid://crem3vn3eyf38" path="res://src/core/dialog/dialog_entry.gd" id="3_j86jr"]
[ext_resource type="Resource" uid="uid://ju7es8xi1gpc" path="res://_development/ayuroo/voicelines/conductor/test_dialog.tres" id="4_pnxnv"]
[sub_resource type="GDScript" id="GDScript_j86jr"]
script/source = "extends Control
@export var dialog_key: StringName
@export_range(0.0, 1.0, 0.001, \"or_greater\", \"suffix:s\") var from_position: float = 0.0
@export_range(0.0, 1.0, 0.001, \"or_greater\", \"suffix:s\") var inital_delay: float = 0.5
@onready var dialog_player: DialogPlayer = $DialogPlayer
@onready var replay_button: Button = %ReplayButton
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
replay_button.pressed.connect(_on_replay_button_pressed)
await get_tree().create_timer(inital_delay).timeout
_on_replay_button_pressed()
func _on_replay_button_pressed() -> void:
dialog_player.play(dialog_key, from_position)
"
[node name="DialogTestScene" type="Control" unique_id=1728136061]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = SubResource("GDScript_j86jr")
dialog_key = &"listen_here"
[node name="HudSubtitle" parent="." unique_id=123148710 instance=ExtResource("1_koq4j")]
layout_mode = 1
[node name="ReplayButton" type="Button" parent="." unique_id=283603298]
unique_name_in_owner = true
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -30.0
offset_top = -15.5
offset_right = 30.0
offset_bottom = 15.5
grow_horizontal = 2
grow_vertical = 2
text = "Replay"
[node name="DialogPlayer" type="Node" parent="." unique_id=928993916]
script = ExtResource("2_4qqmy")
audio_player = NodePath("AudioStreamPlayer")
dialogs = Dictionary[StringName, ExtResource("3_j86jr")]({
&"listen_here": ExtResource("4_pnxnv")
})
metadata/_custom_type_script = "uid://blxophwhpim0l"
[node name="AudioStreamPlayer" type="AudioStreamPlayer" parent="DialogPlayer" unique_id=1284459]