From bc9e928c3b1ed20bd4380b85059e7c0959d1556f Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Tue, 22 Apr 2025 21:30:11 -0600 Subject: [PATCH] Sweet title screen! --- asset_dev/ui/title.xcf | Bin 0 -> 293763 bytes assets/ui/title.png | 3 + assets/ui/title.png.import | 34 + project.godot | 1 - src/game/game.gd | 2 + src/game/game.tscn | 2 +- src/ui/menus/title_screen/title_screen.gd | 40 + src/ui/menus/title_screen/title_screen.gd.uid | 1 + src/ui/menus/title_screen/title_screen.theme | Bin 0 -> 1004 bytes src/ui/menus/title_screen/title_screen.tscn | 756 ++++++++++++++++++ src/util/loading_tools.gd | 22 + src/util/loading_tools.gd.uid | 1 + src/world/world.gd | 44 +- 13 files changed, 882 insertions(+), 24 deletions(-) create mode 100644 asset_dev/ui/title.xcf create mode 100644 assets/ui/title.png create mode 100644 assets/ui/title.png.import create mode 100644 src/ui/menus/title_screen/title_screen.gd create mode 100644 src/ui/menus/title_screen/title_screen.gd.uid create mode 100644 src/ui/menus/title_screen/title_screen.theme create mode 100644 src/ui/menus/title_screen/title_screen.tscn create mode 100644 src/util/loading_tools.gd create mode 100644 src/util/loading_tools.gd.uid diff --git a/asset_dev/ui/title.xcf b/asset_dev/ui/title.xcf new file mode 100644 index 0000000000000000000000000000000000000000..0bc0286fc6a343ab8da5d630c1c65dae67ff760a GIT binary patch literal 293763 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 void: # Reset time scale in case it's been changed. Engine.time_scale = 1.0 + _unload_content() + content.add_child(scene_instance) scene_instance.reparent(content) diff --git a/src/game/game.tscn b/src/game/game.tscn index d17cb34..eaa4032 100644 --- a/src/game/game.tscn +++ b/src/game/game.tscn @@ -160,7 +160,7 @@ transitions = ["Start", "initial_display", SubResource("AnimationNodeStateMachin [node name="Game" type="Node"] script = ExtResource("1_qnjlk") -start_scene = "uid://884jqafhtrv0" +start_scene = "uid://bctwol681jdk0" [node name="Content" type="Node" parent="."] unique_name_in_owner = true diff --git a/src/ui/menus/title_screen/title_screen.gd b/src/ui/menus/title_screen/title_screen.gd new file mode 100644 index 0000000..3eacfc8 --- /dev/null +++ b/src/ui/menus/title_screen/title_screen.gd @@ -0,0 +1,40 @@ +extends Control +## Title screen! + +@export_category("Game Scenes") +# TODO is there a way to get the appropriate level scene path here without loading the world scene? +@export_file("*.tscn") var level_scene: String +@export_file("*.tscn") var world_scene: String + +@export var settings_scene: PackedScene + +@onready var continue_button: Button = %Continue +@onready var settings_container: Control = %SettingsContainer + + +func _ready() -> void: + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + var save_path := _get_save_path() + if FileAccess.file_exists(save_path): + continue_button.disabled = false + + +func _get_save_path() -> String: + return World.get_save_path(level_scene) + + +func continue_game() -> void: + LoadingTools.load_save(_get_save_path()) + + +func new_game() -> void: + LoadingTools.load_level(level_scene) + + +func show_settings() -> void: + var instance: Control = settings_scene.instantiate() + settings_container.add_child(instance) + + +func quit() -> void: + get_tree().root.propagate_notification(NOTIFICATION_WM_CLOSE_REQUEST) diff --git a/src/ui/menus/title_screen/title_screen.gd.uid b/src/ui/menus/title_screen/title_screen.gd.uid new file mode 100644 index 0000000..06107cc --- /dev/null +++ b/src/ui/menus/title_screen/title_screen.gd.uid @@ -0,0 +1 @@ +uid://dysldhadfr4oj diff --git a/src/ui/menus/title_screen/title_screen.theme b/src/ui/menus/title_screen/title_screen.theme new file mode 100644 index 0000000000000000000000000000000000000000..db6979cc5622892a610863e2a028146d0ff951a0 GIT binary patch literal 1004 zcmVVI^qd~ zab!gjS0y1ycj=P(1Ar@iM(q>1cO!c<%XT9~5^`JpoA}Jf(D7X_qlp4*>Zu0~^6`(l`Cyo?e0A>Jh0Gh2OXK~N{&vDC5IfJZdwg1;`oi&48>i@^P+Feru-YQPolY6yI z-WyLyC1+y?n{v~d{V$!nNJq|;vkPm(8M8VeXZEX??SGX2GoLJuJhXr&c>ZggJ62%; zu<-}6vz1!*sVa?UDqg8!m*-DkmHTCNTfr_yYxjrxPk`2qXUs0-8&k077dO^CX|oQF z${Xd3P&SQxx2x+kR)jYhAU}pH8439FQ}v}VDG0b zb2L`qd)az36m)iUWMW`OoPd%rOqb9Q_TthK;eX422>&-8IB38CMZy0AEC~?c7#W?w zK|)$_;yFrz!-4|DL_`$g1oR@wbP07h1^pr!7sly98%|IK(iQSQfT^g6M2TZVV}gV~ z;}YqY*|M?wQSLDLVVS)%Ar@}0mca*v!=;Va1%TA3k-ZU`nGs0}l1e&I0wIRTiW?GO z13{26gfe4@LPkVnB$Q~BQINLU(y4&QJ`ALwj;~y{a?&zjoj3s{v9#Pny)oAuUqveC zo}7~(5RHi{l4Ix|A!FAP2^&a&ZJj;BzwEuuxQ1h@DQyl)IR7G-{ZXS(L9)DQW0$Me zq%^!r2Yn)tDfDKMyC0GvPdoSTd#ytnh>&ARM&lyyD+ghLBEUtKXR@ma)*()y|Mzvt z{xRF)A@#WCvrptZW={id`uTFM7EkD(1Nsr(jw0EmAg6|R5vz^_%~sg@n~}4?)Hi~Q z;6%I-Nkpoz*q;1x(Rafn?*Vh*6+($j;Hv5SWsVVvDC>`2<6zmhl4*9h5hXVE8GVdvW=a z$3e)|QeecjcJoGbj>Wx~XsPY~3mrACBaEAh$=^kQ50ox_GgzXy0?C*iT1lxSJd)F} a$}Ld8JZ}5vPgN;}pzE?J=DAH$Q$s`VG2bEp literal 0 HcmV?d00001 diff --git a/src/ui/menus/title_screen/title_screen.tscn b/src/ui/menus/title_screen/title_screen.tscn new file mode 100644 index 0000000..db8ff73 --- /dev/null +++ b/src/ui/menus/title_screen/title_screen.tscn @@ -0,0 +1,756 @@ +[gd_scene load_steps=18 format=3 uid="uid://bctwol681jdk0"] + +[ext_resource type="Theme" uid="uid://dj2ij1b2yjicr" path="res://src/ui/menus/title_screen/title_screen.theme" id="1_3lcvc"] +[ext_resource type="PackedScene" uid="uid://b6dx0ovy15g5o" path="res://src/effects/grunk_2d/grunk_2d.tscn" id="2_7vchy"] +[ext_resource type="Script" uid="uid://dysldhadfr4oj" path="res://src/ui/menus/title_screen/title_screen.gd" id="2_rjwhj"] +[ext_resource type="Texture2D" uid="uid://buc0oy5col0et" path="res://assets/ui/title.png" id="2_uxv0r"] +[ext_resource type="PackedScene" uid="uid://d3eaqw2rdurct" path="res://src/ui/menus/settings_menu/settings_menu.tscn" id="3_wqn52"] +[ext_resource type="Shader" uid="uid://dnytoirugot2e" path="res://src/shaders/canvas_grunk.gdshader" id="3_yrys0"] +[ext_resource type="FastNoiseLite" uid="uid://cnlvdtx68giv6" path="res://assets/materials/gunk_noise.tres" id="4_cgiy0"] +[ext_resource type="Texture2D" uid="uid://dixpjnlaj86x2" path="res://assets/ui/corpo_logo/corpo_logo_128.png" id="5_yrys0"] +[ext_resource type="FontFile" uid="uid://bgy7odoob7xyl" path="res://assets/fonts/Silkscreen/Silkscreen-Bold.ttf" id="6_cgiy0"] + +[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_7v5ka"] +width = 256 +height = 256 +seamless = true +seamless_blend_skirt = 0.5 +noise = ExtResource("4_cgiy0") + +[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_d72jk"] +width = 256 +height = 256 +seamless = true +seamless_blend_skirt = 0.5 +noise = ExtResource("4_cgiy0") + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_qsvii"] +frequency = 0.0006 +fractal_type = 2 +fractal_octaves = 4 +fractal_gain = 0.667 +domain_warp_type = 2 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_pgbvb"] +width = 1024 +height = 1024 +noise = SubResource("FastNoiseLite_qsvii") + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_rjwhj"] +resource_local_to_scene = true +shader = ExtResource("3_yrys0") +shader_parameter/color_1 = Color(0, 0.03, 0.1, 1) +shader_parameter/color_2 = Color(0, 0.1, 0.3, 1) +shader_parameter/emission_color = Color(0.25, 0.88, 1, 1) +shader_parameter/pixellation = 30.0 +shader_parameter/time_pixellation = 30.0 +shader_parameter/emission_strength = 0.0 +shader_parameter/aspect_ratio = 0.5625 +shader_parameter/time_scale = 0.4 +shader_parameter/gunk_noise = SubResource("NoiseTexture3D_7v5ka") +shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_d72jk") +shader_parameter/mask_progress = 0.0 +shader_parameter/mask_noise = SubResource("NoiseTexture2D_pgbvb") + +[sub_resource type="Animation" id="Animation_uxv0r"] +resource_name = "display" +length = 10.0 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("VBoxContainer/Loader/Done:visible_ratio") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 1.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("VBoxContainer/TitleContainer:custom_minimum_size") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 6.15, 6.2, 6.25, 6.3, 6.35, 6.4, 6.45, 6.5, 6.55, 6.6, 6.65), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2(1024, 0), Vector2(1024, 48), Vector2(1024, 96), Vector2(1024, 144), Vector2(1024, 192), Vector2(1024, 240), Vector2(1024, 288), Vector2(1024, 336), Vector2(1024, 384), Vector2(1024, 432), Vector2(1024, 480), Vector2(1024, 528)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("VBoxContainer/WarningMessage/LogoContainer:custom_minimum_size") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 1, 1.1, 1.2, 1.3), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2(128, 0), Vector2(128, 32), Vector2(128, 64), Vector2(128, 96), Vector2(128, 128)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line1/Warning:visible_ratio") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 1.35, 1.45), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 1.0] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line1/Warning2:visible_ratio") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 2.35, 2.75), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 1.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line2/Warning3:visible_ratio") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 3.65, 4.15), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 1.0] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line1/Blinker:visible") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 1.45, 1.6, 1.75139, 1.9, 2.05139, 2.2, 2.35, 2.75, 2.90139, 3.05, 3.20139, 3.35, 3.5, 3.65), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [false, true, false, true, false, true, false, true, false, true, false, true, false, true, false] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line2/Blinker2:visible") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 4.15, 4.3, 4.45139, 4.6, 4.75139, 4.9, 5.05, 5.2, 5.35139, 5.5, 5.65, 5.79861, 5.95, 6.09861), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [false, true, false, true, false, true, false, true, false, true, false, true, false, true, false] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line1:visible") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 1.3), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line2:visible") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 3.65), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("VBoxContainer/BufferSpace:custom_minimum_size") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 7.75, 7.8, 7.85, 7.9, 7.95, 8, 8.05, 8.1, 8.15, 8.2, 8.25, 8.3, 8.35, 8.4, 8.45, 8.5, 8.55, 8.6, 8.65, 8.7, 8.75, 8.8, 8.85), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 1, +"values": [Vector2(1024, 0), Vector2(1024, 48), Vector2(1024, 96), Vector2(1024, 144), Vector2(1024, 192), Vector2(1024, 240), Vector2(1024, 288), Vector2(1024, 336), Vector2(1024, 384), Vector2(1024, 432), Vector2(1024, 480), Vector2(1024, 528), Vector2(1024, 576), Vector2(1024, 624), Vector2(1024, 672), Vector2(1024, 720), Vector2(1024, 768), Vector2(1024, 816), Vector2(1024, 864), Vector2(1024, 912), Vector2(1024, 960), Vector2(1024, 1008), Vector2(1024, 1056), Vector2(1024, 1104)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("../Grunk2D:material:shader_parameter/mask_progress") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 6.15, 10), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 1.0] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("VBoxContainer/MarginContainer/MenuButtons/Continue:visible") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 6.75), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("VBoxContainer/MarginContainer/MenuButtons/NewGame:visible") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 7), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("VBoxContainer/MarginContainer/MenuButtons/Settings:visible") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 7.25), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("VBoxContainer/MarginContainer/MenuButtons/Quit:visible") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 7.5), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("VBoxContainer/MarginContainer:visible") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 6.75), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("VBoxContainer/TitleContainer:visible") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 6.15), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("VBoxContainer/BufferSpace:visible") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0, 7.75), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("VBoxContainer/WarningMessage:visible") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} + +[sub_resource type="Animation" id="Animation_iv5x5"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("VBoxContainer/Loader/Done:visible_ratio") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("VBoxContainer/TitleContainer:custom_minimum_size") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(800, 0)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("VBoxContainer/WarningMessage/LogoContainer:custom_minimum_size") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(128, 0)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line1/Warning:visible_ratio") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line1/Warning2:visible_ratio") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line2/Warning3:visible_ratio") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line1/Blinker:visible") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line2/Blinker2:visible") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line1:visible") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("VBoxContainer/WarningMessage/VBoxContainer/Line2:visible") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("VBoxContainer/BufferSpace:custom_minimum_size") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1024, 0)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("../Grunk2D:material:shader_parameter/mask_progress") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("VBoxContainer/MarginContainer/MenuButtons/Continue:visible") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("VBoxContainer/MarginContainer/MenuButtons/NewGame:visible") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("VBoxContainer/MarginContainer/MenuButtons/Settings:visible") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("VBoxContainer/MarginContainer/MenuButtons/Quit:visible") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("VBoxContainer/MarginContainer:visible") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("VBoxContainer/TitleContainer:visible") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("VBoxContainer/BufferSpace:visible") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("VBoxContainer/WarningMessage:visible") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_3qdtd"] +_data = { +&"RESET": SubResource("Animation_iv5x5"), +&"display": SubResource("Animation_uxv0r") +} + +[node name="TitleScreen" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_3lcvc") +script = ExtResource("2_rjwhj") +level_scene = "uid://bov4ok76woyc" +world_scene = "uid://884jqafhtrv0" +settings_scene = ExtResource("3_wqn52") + +[node name="ColorRect" type="ColorRect" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0.0196078, 0.0431373, 0.0627451, 1) + +[node name="Grunk2D" parent="." instance=ExtResource("2_7vchy")] +material = SubResource("ShaderMaterial_rjwhj") +layout_mode = 1 + +[node name="MarginContainer" type="MarginContainer" parent="."] +layout_mode = 1 +anchors_preset = 2 +anchor_top = 1.0 +anchor_bottom = 1.0 +offset_top = -73.0 +offset_right = 440.0 +grow_vertical = 0 +theme_override_constants/margin_left = 32 +theme_override_constants/margin_bottom = 32 + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 32 + +[node name="Loader" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +layout_mode = 2 + +[node name="Prompt" type="Label" parent="MarginContainer/VBoxContainer/Loader"] +layout_mode = 2 +text = ">" + +[node name="Loading" type="Label" parent="MarginContainer/VBoxContainer/Loader"] +layout_mode = 2 +text = "UI_LOADING" +visible_characters_behavior = 1 + +[node name="Ellipsis" type="Label" parent="MarginContainer/VBoxContainer/Loader"] +layout_mode = 2 +text = "... " +visible_characters_behavior = 1 + +[node name="Done" type="Label" parent="MarginContainer/VBoxContainer/Loader"] +layout_mode = 2 +text = "Done!" +visible_characters = 0 +visible_characters_behavior = 1 +visible_ratio = 0.0 + +[node name="WarningMessage" type="HBoxContainer" parent="MarginContainer/VBoxContainer"] +visible = false +layout_mode = 2 +theme_override_constants/separation = 32 + +[node name="LogoContainer" type="Control" parent="MarginContainer/VBoxContainer/WarningMessage"] +clip_contents = true +custom_minimum_size = Vector2(128, 0) +layout_mode = 2 +size_flags_vertical = 0 + +[node name="Logo" type="TextureRect" parent="MarginContainer/VBoxContainer/WarningMessage/LogoContainer"] +modulate = Color(0.137255, 0.984314, 0.34902, 1) +layout_mode = 1 +offset_right = 128.0 +offset_bottom = 128.0 +texture = ExtResource("5_yrys0") + +[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/VBoxContainer/WarningMessage"] +layout_mode = 2 +theme_override_constants/separation = 16 +alignment = 2 + +[node name="Line1" type="HBoxContainer" parent="MarginContainer/VBoxContainer/WarningMessage/VBoxContainer"] +visible = false +layout_mode = 2 + +[node name="Warning" type="Label" parent="MarginContainer/VBoxContainer/WarningMessage/VBoxContainer/Line1"] +layout_mode = 2 +theme_override_fonts/font = ExtResource("6_cgiy0") +text = "!WARNING!" +visible_characters = 0 +visible_ratio = 0.0 + +[node name="Warning2" type="Label" parent="MarginContainer/VBoxContainer/WarningMessage/VBoxContainer/Line1"] +layout_mode = 2 +text = " This is a secure terminal system." +visible_characters = 0 +visible_ratio = 0.0 + +[node name="Blinker" type="Label" parent="MarginContainer/VBoxContainer/WarningMessage/VBoxContainer/Line1"] +visible = false +layout_mode = 2 +text = "_" + +[node name="Line2" type="HBoxContainer" parent="MarginContainer/VBoxContainer/WarningMessage/VBoxContainer"] +visible = false +layout_mode = 2 + +[node name="Warning3" type="Label" parent="MarginContainer/VBoxContainer/WarningMessage/VBoxContainer/Line2"] +layout_mode = 2 +text = "Unauthorized access is prohibited under penalty of" +visible_characters = 0 +visible_ratio = 0.0 + +[node name="Blinker2" type="Label" parent="MarginContainer/VBoxContainer/WarningMessage/VBoxContainer/Line2"] +visible = false +layout_mode = 2 +text = "_" + +[node name="BufferSpace" type="Control" parent="MarginContainer/VBoxContainer"] +visible = false +custom_minimum_size = Vector2(1024, 0) +layout_mode = 2 + +[node name="TitleContainer" type="Control" parent="MarginContainer/VBoxContainer"] +visible = false +clip_contents = true +custom_minimum_size = Vector2(800, 0) +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer/TitleContainer"] +layout_mode = 1 +offset_right = 968.0 +offset_bottom = 432.0 +theme_override_constants/margin_left = 64 + +[node name="Title" type="TextureRect" parent="MarginContainer/VBoxContainer/TitleContainer/MarginContainer"] +modulate = Color(0.137255, 0.984314, 0.34902, 1) +texture_filter = 3 +layout_mode = 2 +texture = ExtResource("2_uxv0r") +stretch_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="MarginContainer/VBoxContainer"] +visible = false +layout_mode = 2 +theme_override_constants/margin_left = 64 + +[node name="MenuButtons" type="VBoxContainer" parent="MarginContainer/VBoxContainer/MarginContainer"] +custom_minimum_size = Vector2(300, 0) +layout_mode = 2 +size_flags_horizontal = 0 +theme_override_constants/separation = 32 + +[node name="Continue" type="Button" parent="MarginContainer/VBoxContainer/MarginContainer/MenuButtons"] +unique_name_in_owner = true +visible = false +layout_mode = 2 +disabled = true +text = "Continue" + +[node name="NewGame" type="Button" parent="MarginContainer/VBoxContainer/MarginContainer/MenuButtons"] +visible = false +layout_mode = 2 +text = "New Game" + +[node name="Settings" type="Button" parent="MarginContainer/VBoxContainer/MarginContainer/MenuButtons"] +visible = false +layout_mode = 2 +text = "Settings" + +[node name="Quit" type="Button" parent="MarginContainer/VBoxContainer/MarginContainer/MenuButtons"] +visible = false +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "Quit" + +[node name="AnimationPlayer" type="AnimationPlayer" parent="MarginContainer"] +libraries = { +&"": SubResource("AnimationLibrary_3qdtd") +} +autoplay = "display" + +[node name="SettingsContainer" type="Control" parent="."] +unique_name_in_owner = true +custom_minimum_size = Vector2(1000, 600) +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -500.0 +offset_right = 500.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[connection signal="pressed" from="MarginContainer/VBoxContainer/MarginContainer/MenuButtons/Continue" to="." method="continue_game"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/MarginContainer/MenuButtons/NewGame" to="." method="new_game"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/MarginContainer/MenuButtons/Settings" to="." method="show_settings"] +[connection signal="pressed" from="MarginContainer/VBoxContainer/MarginContainer/MenuButtons/Quit" to="." method="quit"] diff --git a/src/util/loading_tools.gd b/src/util/loading_tools.gd new file mode 100644 index 0000000..91a4ebc --- /dev/null +++ b/src/util/loading_tools.gd @@ -0,0 +1,22 @@ +class_name LoadingTools +## Utilities for loading game states + +const WORLD_SCENE := "res://src/world/world.tscn" + + +static func _load_world(level: PackedScene, save: SaveState = null) -> void: + var finish_load := func(world: World) -> void: + world.save_state = save + world.initial_level = level + + Game.instance.queue_scene(WORLD_SCENE).then(finish_load) + + +static func load_level(level_path: String, save: SaveState = null) -> void: + var chain_load := func(level: PackedScene) -> void: LoadingTools._load_world(level, save) + Game.instance.queue_load(level_path).then(chain_load) + + +static func load_save(save_path: String) -> void: + var chain_load := func(save: SaveState) -> void: load_level(save.level_path, save) + Game.instance.queue_load(save_path).then(chain_load) diff --git a/src/util/loading_tools.gd.uid b/src/util/loading_tools.gd.uid new file mode 100644 index 0000000..7fb5b99 --- /dev/null +++ b/src/util/loading_tools.gd.uid @@ -0,0 +1 @@ +uid://b1hmb3efjqldu diff --git a/src/world/world.gd b/src/world/world.gd index 2d10452..e002db9 100644 --- a/src/world/world.gd +++ b/src/world/world.gd @@ -1,8 +1,11 @@ class_name World extends Node ## Access and flow control for the game world. +const SAVE_PATH_FMT := "user://{0}.state.res" + @export var pause_enabled := true -@export var save_path_fmt := "user://{0}.state.res" + +@export var save_state: SaveState @export var manager: WorldManager @export var spook_manager: SpookManager @@ -28,7 +31,8 @@ func _ready() -> void: manager.alert_raised.connect(spook_manager.on_alert_raised) manager.alert_cleared.connect(spook_manager.on_alert_cleared) manager.player_dead.connect(on_player_death) - load_level(initial_level) + if initial_level: + load_level(initial_level) func _unhandled_input(event: InputEvent) -> void: @@ -47,20 +51,7 @@ func unpause() -> void: get_tree().paused = false -func _get_level_id(level: PackedScene) -> String: - if level.resource_path: - var file := level.resource_path.get_file() - if file: - return file - return level.resource_path - return "level" - - -func _get_save_path(level: PackedScene) -> String: - return save_path_fmt.format([_get_level_id(level)]) - - -func load_level(level: PackedScene, save: SaveState = null) -> void: +func load_level(level: PackedScene) -> void: for c: Node in level_root.get_children(): c.queue_free() level_root.remove_child(c) @@ -68,8 +59,8 @@ func load_level(level: PackedScene, save: SaveState = null) -> void: print("Instantiating level from ", level.resource_path) var level_instance := level.instantiate() level_root.add_child(level_instance) - if save: - save.load_to_world(self) + if save_state: + save_state.load_to_world(self) print("Done!") spook_manager.after_level_init() @@ -81,13 +72,14 @@ func on_player_death() -> void: func _reload_saved(save: SaveState) -> void: - load_level(current_level, save) + save_state = save + load_level(current_level) func on_game_over() -> void: # reload the level from the last save - var save_path := _get_save_path(current_level) - if ResourceLoader.exists(save_path): + var save_path := World.get_level_save_path(current_level) + if FileAccess.file_exists(save_path): Game.instance.queue_load(save_path).finally(_reload_saved) else: load_level(current_level) @@ -97,8 +89,16 @@ func save_progress() -> void: print("Preparing save state...") save_icon.show() var save := SaveState.serialize(self) - var save_path := _get_save_path(current_level) + var save_path := World.get_level_save_path(current_level) print("Writing save to ", save_path) ResourceSaver.save(save, save_path) save_icon.hide() print("Done!") + + +static func get_save_path(level_path: String) -> String: + return SAVE_PATH_FMT.format([level_path.get_basename().get_file()]) + + +static func get_level_save_path(level: PackedScene) -> String: + return World.get_save_path(level.resource_path)