From d94f68785a8f5478846d89ccf782fef006b6ee1e Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Sat, 22 Mar 2025 17:16:17 -0600 Subject: [PATCH] Added pause menu --- levels/ghost_ship/ghost_ship_level.tscn | 219 +++++++++++++++++- .../guide_sign/airlock_sign.material | Bin 1187 -> 1198 bytes .../guide_sign/cargo_bay_sign.material | Bin 1193 -> 1203 bytes .../guide_sign/crew_quarters_sign.material | Bin 1199 -> 1209 bytes .../guide_sign/medbay_sign.material | Bin 1194 -> 1204 bytes .../guide_sign/mess_hall_sign.material | Bin 1191 -> 1199 bytes .../ghost_ship/guide_sign/ops_sign.material | Bin 1187 -> 1196 bytes project.godot | 5 + src/game/game.gd | 7 +- src/player/camera_controller.gd | 3 - src/ui/hud/player_hud.gd | 1 - src/ui/menus/menu.theme | Bin 0 -> 885 bytes src/ui/menus/pause_menu/pause_menu.gd | 68 ++++++ src/ui/menus/pause_menu/pause_menu.gd.uid | 1 + src/ui/menus/pause_menu/pause_menu.tscn | 205 ++++++++++++++++ src/world/world.gd | 38 +++ src/world/world.gd.uid | 1 + src/world/world.tscn | 23 ++ vault/assets/color_palette.md | 7 +- 19 files changed, 562 insertions(+), 16 deletions(-) create mode 100644 src/ui/menus/menu.theme create mode 100644 src/ui/menus/pause_menu/pause_menu.gd create mode 100644 src/ui/menus/pause_menu/pause_menu.gd.uid create mode 100644 src/ui/menus/pause_menu/pause_menu.tscn create mode 100644 src/world/world.gd create mode 100644 src/world/world.gd.uid create mode 100644 src/world/world.tscn diff --git a/levels/ghost_ship/ghost_ship_level.tscn b/levels/ghost_ship/ghost_ship_level.tscn index 0d62a46..f18868d 100644 --- a/levels/ghost_ship/ghost_ship_level.tscn +++ b/levels/ghost_ship/ghost_ship_level.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=406 format=4 uid="uid://crydi5cjgfwe5"] +[gd_scene load_steps=415 format=4 uid="uid://crydi5cjgfwe5"] [ext_resource type="PackedScene" uid="uid://oowut88kr2ox" path="res://levels/ghost_ship/player_ship/player_ship.tscn" id="1_2pyr1"] [ext_resource type="PackedScene" uid="uid://c2omlx4ptrc01" path="res://src/world/gunk_body/gunk_body.tscn" id="2_2egij"] @@ -33,7 +33,6 @@ [ext_resource type="Texture2D" uid="uid://b1m1my5q2vlwi" path="res://assets/props/crate_long/crate_long_R.png" id="30_u2hqf"] [ext_resource type="ArrayMesh" uid="uid://5jt7xxr05lw3" path="res://assets/level/hallway/hallway_2.mesh" id="31_ji5cn"] [ext_resource type="ArrayMesh" uid="uid://d0sdsir1hqnbu" path="res://assets/level/wall/wall_4.mesh" id="33_4a0u4"] -[ext_resource type="Material" uid="uid://dutkfm4ek0ysh" path="res://assets/materials/gunk_bright.material" id="33_76qng"] [ext_resource type="ArrayMesh" uid="uid://c4klxlj1oop7t" path="res://assets/level/hallway/hallway_4.mesh" id="33_okeuk"] [ext_resource type="ArrayMesh" uid="uid://c2pruwilyqs07" path="res://assets/level/floor/floor_6x9.mesh" id="35_6giaa"] [ext_resource type="ArrayMesh" uid="uid://dkh2r61ydupb7" path="res://assets/level/floor/floor_2.mesh" id="35_d8p6j"] @@ -482,6 +481,45 @@ _surfaces = [{ blend_shape_mode = 0 shadow_mesh = SubResource("ArrayMesh_ojd88") +[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_76qng"] +width = 256 +height = 256 +depth = 32 +seamless = true +seamless_blend_skirt = 0.5 +noise = ExtResource("6_3kphg") + +[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_pifep"] +width = 256 +height = 256 +depth = 32 +seamless = true +seamless_blend_skirt = 0.5 +noise = ExtResource("6_3kphg") + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_mj4ca"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("5_1njh5") +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.66, 0.943333, 1, 1) +shader_parameter/pixellation = 128.0 +shader_parameter/time_pixellation = 30.0 +shader_parameter/roughness = 0.15 +shader_parameter/specular_contribution = 0.8 +shader_parameter/emission_strength = 0.04 +shader_parameter/uv_scale = Vector2(2, 2) +shader_parameter/time_scale = 0.2 +shader_parameter/edge_bleed = 0.25 +shader_parameter/gunk_mask = ExtResource("43_1h5r5") +shader_parameter/gunk_noise = SubResource("NoiseTexture3D_76qng") +shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_pifep") +shader_parameter/jitter_magnitude = 0.0 +shader_parameter/jitter_time_scale = 0.1 +shader_parameter/vertex_inflation = 0.0 +shader_parameter/inflation_pixellation = 10.0 + [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_ojd88"] data = PackedVector3Array(-1, 0, 0.2, -1, -0.4, 0, -1, 0, -0.2, -1, 0, -0.2, -1, -0.4, 0, 1, 0, -0.2, 1, 0, -0.2, -1, -0.4, 0, 1, -0.4, 0, 1, 0, -0.2, 1, -0.4, 0, 1, 0, 0.2, 1, 0, 0.2, 1, -0.4, 0, -1, 0, 0.2, -1, 0, 0.2, 1, -0.4, 0, -1, -0.4, 0, -1, 0, -0.2, 1, 0, -0.2, -1, 0, 0.2, -1, 0, 0.2, 1, 0, -0.2, 1, 0, 0.2) @@ -724,6 +762,29 @@ _surfaces = [{ blend_shape_mode = 0 shadow_mesh = SubResource("ArrayMesh_h1nog") +[sub_resource type="ShaderMaterial" id="ShaderMaterial_qbsys"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("5_1njh5") +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.66, 0.943333, 1, 1) +shader_parameter/pixellation = 128.0 +shader_parameter/time_pixellation = 30.0 +shader_parameter/roughness = 0.15 +shader_parameter/specular_contribution = 0.8 +shader_parameter/emission_strength = 0.04 +shader_parameter/uv_scale = Vector2(2, 2) +shader_parameter/time_scale = 0.2 +shader_parameter/edge_bleed = 0.25 +shader_parameter/gunk_mask = ExtResource("43_1h5r5") +shader_parameter/gunk_noise = SubResource("NoiseTexture3D_76qng") +shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_pifep") +shader_parameter/jitter_magnitude = 0.0 +shader_parameter/jitter_time_scale = 0.1 +shader_parameter/vertex_inflation = 0.0 +shader_parameter/inflation_pixellation = 10.0 + [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_mgo71"] data = PackedVector3Array(-0.7, 0, 0.14, -0.7, -0.28, 0, -0.7, 0, -0.14, -0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, -0.28, 0, 0.7, 0, 0.14, 0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, -0.28, 0, -0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, 0, -0.14, 0.7, 0, 0.14) @@ -1262,6 +1323,29 @@ _surfaces = [{ blend_shape_mode = 0 shadow_mesh = SubResource("ArrayMesh_h1nog") +[sub_resource type="ShaderMaterial" id="ShaderMaterial_2dhfq"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("5_1njh5") +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.66, 0.943333, 1, 1) +shader_parameter/pixellation = 128.0 +shader_parameter/time_pixellation = 30.0 +shader_parameter/roughness = 0.15 +shader_parameter/specular_contribution = 0.8 +shader_parameter/emission_strength = 0.04 +shader_parameter/uv_scale = Vector2(2, 2) +shader_parameter/time_scale = 0.2 +shader_parameter/edge_bleed = 0.25 +shader_parameter/gunk_mask = ExtResource("43_1h5r5") +shader_parameter/gunk_noise = SubResource("NoiseTexture3D_76qng") +shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_pifep") +shader_parameter/jitter_magnitude = 0.0 +shader_parameter/jitter_time_scale = 0.1 +shader_parameter/vertex_inflation = 0.0 +shader_parameter/inflation_pixellation = 10.0 + [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_2ft6k"] data = PackedVector3Array(-0.7, 0, 0.14, -0.7, -0.28, 0, -0.7, 0, -0.14, -0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, -0.28, 0, 0.7, 0, 0.14, 0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, -0.28, 0, -0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, 0, -0.14, 0.7, 0, 0.14) @@ -1319,6 +1403,29 @@ _surfaces = [{ blend_shape_mode = 0 shadow_mesh = SubResource("ArrayMesh_fkhf3") +[sub_resource type="ShaderMaterial" id="ShaderMaterial_2kcw6"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("5_1njh5") +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.66, 0.943333, 1, 1) +shader_parameter/pixellation = 128.0 +shader_parameter/time_pixellation = 30.0 +shader_parameter/roughness = 0.15 +shader_parameter/specular_contribution = 0.8 +shader_parameter/emission_strength = 0.04 +shader_parameter/uv_scale = Vector2(2, 2) +shader_parameter/time_scale = 0.2 +shader_parameter/edge_bleed = 0.25 +shader_parameter/gunk_mask = ExtResource("43_1h5r5") +shader_parameter/gunk_noise = SubResource("NoiseTexture3D_76qng") +shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_pifep") +shader_parameter/jitter_magnitude = 0.0 +shader_parameter/jitter_time_scale = 0.1 +shader_parameter/vertex_inflation = 0.0 +shader_parameter/inflation_pixellation = 10.0 + [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_7ctwk"] data = PackedVector3Array(-0.7, 0, 0.14, -0.7, -0.28, 0, -0.7, 0, -0.14, -0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, -0.28, 0, 0.7, 0, 0.14, 0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, -0.28, 0, -0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, 0, -0.14, 0.7, 0, 0.14) @@ -2798,6 +2905,29 @@ _surfaces = [{ blend_shape_mode = 0 shadow_mesh = SubResource("ArrayMesh_fkhf3") +[sub_resource type="ShaderMaterial" id="ShaderMaterial_y0tcr"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("5_1njh5") +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.66, 0.943333, 1, 1) +shader_parameter/pixellation = 128.0 +shader_parameter/time_pixellation = 30.0 +shader_parameter/roughness = 0.15 +shader_parameter/specular_contribution = 0.8 +shader_parameter/emission_strength = 0.04 +shader_parameter/uv_scale = Vector2(2, 2) +shader_parameter/time_scale = 0.2 +shader_parameter/edge_bleed = 0.25 +shader_parameter/gunk_mask = ExtResource("43_1h5r5") +shader_parameter/gunk_noise = SubResource("NoiseTexture3D_76qng") +shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_pifep") +shader_parameter/jitter_magnitude = 0.0 +shader_parameter/jitter_time_scale = 0.1 +shader_parameter/vertex_inflation = 0.0 +shader_parameter/inflation_pixellation = 10.0 + [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_dxmep"] data = PackedVector3Array(-0.7, 0, 0.14, -0.7, -0.28, 0, -0.7, 0, -0.14, -0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, -0.28, 0, 0.7, 0, 0.14, 0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, -0.28, 0, -0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, 0, -0.14, 0.7, 0, 0.14) @@ -2855,6 +2985,29 @@ _surfaces = [{ blend_shape_mode = 0 shadow_mesh = SubResource("ArrayMesh_4akax") +[sub_resource type="ShaderMaterial" id="ShaderMaterial_c4ji2"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("5_1njh5") +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.66, 0.943333, 1, 1) +shader_parameter/pixellation = 128.0 +shader_parameter/time_pixellation = 30.0 +shader_parameter/roughness = 0.15 +shader_parameter/specular_contribution = 0.8 +shader_parameter/emission_strength = 0.04 +shader_parameter/uv_scale = Vector2(2, 2) +shader_parameter/time_scale = 0.2 +shader_parameter/edge_bleed = 0.25 +shader_parameter/gunk_mask = ExtResource("43_1h5r5") +shader_parameter/gunk_noise = SubResource("NoiseTexture3D_76qng") +shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_pifep") +shader_parameter/jitter_magnitude = 0.0 +shader_parameter/jitter_time_scale = 0.1 +shader_parameter/vertex_inflation = 0.0 +shader_parameter/inflation_pixellation = 10.0 + [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_0ij5m"] data = PackedVector3Array(-0.7, 0, 0.14, -0.7, -0.28, 0, -0.7, 0, -0.14, -0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, -0.28, 0, 0.7, 0, 0.14, 0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, -0.28, 0, -0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, 0, -0.14, 0.7, 0, 0.14) @@ -3308,6 +3461,29 @@ _surfaces = [{ blend_shape_mode = 0 shadow_mesh = SubResource("ArrayMesh_eaq62") +[sub_resource type="ShaderMaterial" id="ShaderMaterial_bf7oo"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("5_1njh5") +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.66, 0.943333, 1, 1) +shader_parameter/pixellation = 128.0 +shader_parameter/time_pixellation = 30.0 +shader_parameter/roughness = 0.15 +shader_parameter/specular_contribution = 0.8 +shader_parameter/emission_strength = 0.04 +shader_parameter/uv_scale = Vector2(2, 2) +shader_parameter/time_scale = 0.2 +shader_parameter/edge_bleed = 0.25 +shader_parameter/gunk_mask = ExtResource("43_1h5r5") +shader_parameter/gunk_noise = SubResource("NoiseTexture3D_76qng") +shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_pifep") +shader_parameter/jitter_magnitude = 0.0 +shader_parameter/jitter_time_scale = 0.1 +shader_parameter/vertex_inflation = 0.0 +shader_parameter/inflation_pixellation = 10.0 + [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_wqqoq"] data = PackedVector3Array(-0.7, 0, 0.14, -0.7, -0.28, 0, -0.7, 0, -0.14, -0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, -0.28, 0, 0.7, 0, 0.14, 0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, -0.28, 0, -0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, 0, -0.14, 0.7, 0, 0.14) @@ -3618,6 +3794,29 @@ _surfaces = [{ blend_shape_mode = 0 shadow_mesh = SubResource("ArrayMesh_vt4uw") +[sub_resource type="ShaderMaterial" id="ShaderMaterial_i6b1e"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("5_1njh5") +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.66, 0.943333, 1, 1) +shader_parameter/pixellation = 128.0 +shader_parameter/time_pixellation = 30.0 +shader_parameter/roughness = 0.15 +shader_parameter/specular_contribution = 0.8 +shader_parameter/emission_strength = 0.04 +shader_parameter/uv_scale = Vector2(2, 2) +shader_parameter/time_scale = 0.2 +shader_parameter/edge_bleed = 0.25 +shader_parameter/gunk_mask = ExtResource("43_1h5r5") +shader_parameter/gunk_noise = SubResource("NoiseTexture3D_76qng") +shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_pifep") +shader_parameter/jitter_magnitude = 0.0 +shader_parameter/jitter_time_scale = 0.1 +shader_parameter/vertex_inflation = 0.0 +shader_parameter/inflation_pixellation = 10.0 + [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_np3w4"] data = PackedVector3Array(-0.7, 0, 0.14, -0.7, -0.28, 0, -0.7, 0, -0.14, -0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, -0.28, 0, 0.7, -0.28, 0, 0.7, 0, -0.14, 0.7, -0.28, 0, 0.7, 0, 0.14, 0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, -0.28, 0, -0.7, -0.28, 0, -0.7, 0, -0.14, 0.7, 0, -0.14, -0.7, 0, 0.14, -0.7, 0, 0.14, 0.7, 0, -0.14, 0.7, 0, 0.14) @@ -6026,7 +6225,7 @@ mesh = SubResource("ArrayMesh_anoak") [node name="GunkBody" parent="Corridor1/Hallway1/AirlockSign" instance=ExtResource("2_2egij")] mask_dim = 32 -source_gunk_material = ExtResource("33_76qng") +source_gunk_material = SubResource("ShaderMaterial_mj4ca") [node name="CollisionShape3D" type="CollisionShape3D" parent="Corridor1/Hallway1/AirlockSign/GunkBody"] shape = SubResource("ConcavePolygonShape3D_ojd88") @@ -6160,7 +6359,7 @@ mesh = SubResource("ArrayMesh_sux6n") [node name="GunkBody" parent="Corridor1/Hallway4/MessHallSign" instance=ExtResource("2_2egij")] mask_dim = 32 -source_gunk_material = ExtResource("33_76qng") +source_gunk_material = SubResource("ShaderMaterial_qbsys") [node name="CollisionShape3D" type="CollisionShape3D" parent="Corridor1/Hallway4/MessHallSign/GunkBody"] shape = SubResource("ConcavePolygonShape3D_mgo71") @@ -6523,7 +6722,7 @@ mesh = SubResource("ArrayMesh_w13dd") [node name="GunkBody" parent="Corridor2/Hallway1/MessHallSign" instance=ExtResource("2_2egij")] mask_dim = 32 -source_gunk_material = ExtResource("33_76qng") +source_gunk_material = SubResource("ShaderMaterial_2dhfq") [node name="CollisionShape3D" type="CollisionShape3D" parent="Corridor2/Hallway1/MessHallSign/GunkBody"] shape = SubResource("ConcavePolygonShape3D_2ft6k") @@ -6556,7 +6755,7 @@ mesh = SubResource("ArrayMesh_f0psm") [node name="GunkBody" parent="Corridor2/Hallway2/CrewQuartersSign" instance=ExtResource("2_2egij")] mask_dim = 32 -source_gunk_material = ExtResource("33_76qng") +source_gunk_material = SubResource("ShaderMaterial_2kcw6") [node name="CollisionShape3D" type="CollisionShape3D" parent="Corridor2/Hallway2/CrewQuartersSign/GunkBody"] shape = SubResource("ConcavePolygonShape3D_7ctwk") @@ -7349,7 +7548,7 @@ mesh = SubResource("ArrayMesh_v4tkv") [node name="GunkBody" parent="Corridor3/Hallway/CrewQuartersSign" instance=ExtResource("2_2egij")] mask_dim = 32 -source_gunk_material = ExtResource("33_76qng") +source_gunk_material = SubResource("ShaderMaterial_y0tcr") [node name="CollisionShape3D" type="CollisionShape3D" parent="Corridor3/Hallway/CrewQuartersSign/GunkBody"] shape = SubResource("ConcavePolygonShape3D_dxmep") @@ -7382,7 +7581,7 @@ mesh = SubResource("ArrayMesh_v0ki8") [node name="GunkBody" parent="Corridor3/Hallway2/OpsSign" instance=ExtResource("2_2egij")] mask_dim = 32 -source_gunk_material = ExtResource("33_76qng") +source_gunk_material = SubResource("ShaderMaterial_c4ji2") [node name="CollisionShape3D" type="CollisionShape3D" parent="Corridor3/Hallway2/OpsSign/GunkBody"] shape = SubResource("ConcavePolygonShape3D_0ij5m") @@ -7621,7 +7820,7 @@ mesh = SubResource("ArrayMesh_dspic") [node name="GunkBody" parent="Corridor3/ShortHallway3/MedbaySign" instance=ExtResource("2_2egij")] mask_dim = 32 -source_gunk_material = ExtResource("33_76qng") +source_gunk_material = SubResource("ShaderMaterial_bf7oo") [node name="CollisionShape3D" type="CollisionShape3D" parent="Corridor3/ShortHallway3/MedbaySign/GunkBody"] shape = SubResource("ConcavePolygonShape3D_wqqoq") @@ -7783,7 +7982,7 @@ mesh = SubResource("ArrayMesh_rigxx") [node name="GunkBody" parent="Corridor3/ShortHallway6/CargoBaySign" instance=ExtResource("2_2egij")] mask_dim = 32 -source_gunk_material = ExtResource("33_76qng") +source_gunk_material = SubResource("ShaderMaterial_i6b1e") [node name="CollisionShape3D" type="CollisionShape3D" parent="Corridor3/ShortHallway6/CargoBaySign/GunkBody"] shape = SubResource("ConcavePolygonShape3D_np3w4") diff --git a/levels/ghost_ship/guide_sign/airlock_sign.material b/levels/ghost_ship/guide_sign/airlock_sign.material index 663878c09a7a85110562b679fadb4798ee60e45f..f112c3584552d67623030485ca144f5735c89ee4 100644 GIT binary patch literal 1198 zcmV;f1X24^Q$s@n000005C8yE3;+O@1ONaiwJ-f(QwwDz0M;^?I3QQj0jM|-LMjLd z@Zb!%2S7V*BZTZ!8Zya^yhQd+Ql9dVIC9P}`wzv*zIkx8EBkf!`r9Y*q<{c`0D=Gv zA;8Z>+tfSVM@psbNq^AUrlrr-CkR>=xn-I0cYVcIm5c5OtAfcz@f6M|y{ zA__ng9$Iee=L*)zT>cA0L_x#?0}un6LBs|qoWB%;Qt=7DlsMcVla|N*?CY}RlUJv< z<@Tj*X}jg}1TCdzhuKWZHGj4~Zr%3w+a#%$sMV=rPL<}ak@8~bUCu&!|4v?8XEtRKgZoE`SzjcF%D;NcC`Du-H z#k8}Kn^;Q4;f@fIz*E&Y=;WuheO5l^Fo&6LR+o0_)7EbbVK5jBri8U-&g;y$>U7!O z_P;s=afi*++LBFerW1{)wE4~*l|^_d1tnNsus9hPEL0!?LC^%m04fhg+(1k*@qrSD%iD~r zcg{o?2Z4wHY#`xbqlXGg3KleiVA6;P6hlsYP%#6+kro+r>|mkr17m=QjTk2@{BggF z3m_+Q6w#1GgOPh2N+`|Z)|<**#CD1I)^tBpkp=2 zlFlKeXhvp9QCZ2d29L7C^n=JoyAA>?dz+G)8~+Rg5DHYYc^K+ppz$iwW^yH!E)-3n z3;wuntS#i$Q&a=>r8VRZybGNbsblD@LmS9VX@WIVlQN?Kli{tDrK8&=O#$Whs+SPx ziJr|#?~Ul=BnTAX?nn;pG%nj=AND_xi0NIn(nekoV}z# zbF4O09Nj}keE_^r2HYVqop22Q&^?$GUVCVoQ`~_kR|q<8gtekiZ-qh@02G~e Mf58h_CQ?&FLw0^PBme*a literal 1187 zcmV;U1YG-4Q$s@n000005C8x>3;+O&1ONaiwJ-f(I|~gY0G9HWI3QQj0jM|-LMjLd z@Q{*RgY+>iA%yHy8Zya^yhQd+Ql9dVIC9P}`-X;P-#j?lmHj$C;kqs^-Q^ar9d?h^T@Q2TyCPE2f-< z+{99<4R?fy1fFW3 zh&^bg)=oC1nM^XC(&j5uY49r>(k{uYeBPO#47yzYucX0k2J?~AesBGUdh%!Tecoy0 z^3~f0ML)JXau>W5fLbcoB*L>MuHO)mAi=T6j_>Tv|0SsJuQ|Ht{~9F1;)SaWq^}zRn%?!i8XTBswrom z@?|U`)%lf{!~MLiwzc1h@@_eS0H|THQHF*{L{g9>X$?RELYOL|dJ=$RHOPX_DW!-; zW;rPuJ+p>@}-j5v`Ex@cbcuaC_{e)R{RaKj%mr-~2cIU3^M%Qg8}Dfy9YhUMNSA z5sMl)pPnh89u<2u$wo4fs3m?<;s(DxycYB_?|t31jN0Yd7*IpZvt|LF2D^V?kQNP- zr&oEqbF73|F&7GpxJhhq{9jfj0*0DK%OFQ67!DDSJ;IN6+!h1{n9*kM3;vq<&Fu{7 z#^q=rp~A${>M;sOmNL%|^E7A}!VVa$mA&WWdc50ceyRQUv1Ir&z#3C0L>BIQqI2M_ zXaqbVJUNN+*ULG)_P44+i@8c*4xz~2;0raB6i-AVd}hfY9`(swTxmNOfa7$8CLqqyD BI|Bd! diff --git a/levels/ghost_ship/guide_sign/cargo_bay_sign.material b/levels/ghost_ship/guide_sign/cargo_bay_sign.material index 03d36e5adc0da9c91b8ac83d7fd6f0d5293d22c1..df6c2ced091e24b13645da9ad86ccd468ee8e2d0 100644 GIT binary patch literal 1203 zcmV;k1WfxKqi0y zpr279H$b!jnh-*Enu<(v*_X)PNy<~f?)jiyey&KQ`XwFl(D3k)Ak@D33is# z&gU-s5itR}=Tpy7hlnHC`EA~Qs+GACR4JVTRHw@oziPR-DP29WYa?O=L}a}9kYIyI zhZG%%C;&-#Xt}MQDOe|S`79981Q81iKn#f3z=ZRcLQpC$;g`~e8${B1+|Rx)M?QIV zYFln!+LpFkE>F->YIYdSq+Ii7>*LmKZ@*2F>O`$h6?3W_ulq`x;;t?eP25eL%gjtS&eOf9{)!cX~j()2K5mhi^2tmtF zWvnZvoQ2%PQmPGigop&5YKwzTep=gS<>L)+n5kxUX{SDI{k9MWgTY`%SZm(A&Wx*0 zm+fu;t3wcX&`hnJY)Uhgw0KIJuS|u(uWU$rq-Evv&irK1hGBL|Af2^BojBgh6ACWMq&K@kH1kQEwi++d-w17qOF3>PIS z{BggF+fn4g2L&~TVB{W$5vr4q;;3^ecM;nux-`{jyZEbnUM?%HD@X#<;@|c%z)80% z>bCvF8o6xMl(SFyGM13){7TE=e%@Bw+V4Dh7l8w)k+DIBW=JF{C`dAl0f7XBa8f#l zHxj^OHHebVA*Eo}3?T#1s$S<;C! zg$471k0Zc*=Pw(@`waVR#IM{f<1x_fHm(b-A9aA z%ENV!LH~%ED zs~y4?7zPb%gZFR#1o?)Hj8Ehx8BmnFmVmi?d|Vl)RsA2|1Z}bB5Qgw3@mAjoB4Db@ zRl&q+nTTn85o64hP-3LP&jKIkudwvfMioA%@G@sp@sPZd4JQZ>1HLo&)LeOW3Fq;2 zr9I;8B?X#eg`wW)?q%u&*o9`meFE!*#K>Px@#^j%MZ*b9I1Pr#B+eHUMv5&0vLdZWhsCFe*l62 zpNW{|x8+CDT=wXL;L0Yo?(Lf(h*#8jY3BXg&u$y_m6>TWRDkcP%jaxEL<@GFz1dy*u110@X4As>u*3(Z?E9)>xvr+~0uf6PvA_Vt=%A$a)k2VFleAN5(+on;aqZuan_6C5xh_+U zUt*WonX0FNspQ=-nkk$2tFLQcW{#gtQg$NWwz=A7YkrTVMR{*qCYsvWwx$`CCk-$i zpkl`KS3<-C2(2fjNkfT(>(g`g8Q>H7%f}C}*FH@1X?n9($=UbSAYuwe4JE)!gI})Y zFw~}&G&k)LA`)=BD-T@zVT>Q8t~b5uwHjWvuItwK8ABKh27|FI=Dl&QnU}6jnPdOo z2SM#YGx>IurDh^oc`C8~u9OC^)S-3Diqhv__oHD|(|?vWG+xPk)Ykv`{zE>!XL|g6 z+o`uBr2Y3cbDel z2!;>~ZWO_&xeg?fUm6YGkuo!ltg|3sRuifV7_htHDtyP#763!Fj_+*9GIxx?MO0blvN=1Z*cVHh*;R zg+(JpKnHgQu;sP31?&z*URF!AIAGXa)8W!{N+gkw zwDZkvkV$a&C6W;9nWn$oYr0>NSs~Zq`9pl<_Si|Ovvf{=&XG30dH4Cd`9N~Q;1q;H z#EH8+DEA^F78W>%o>D-aDtI*2Mr0xhOT?ta4PtwEEoo%l%ereBwac?OpoW-d%>q0P zcK^^IEgFuV66N8}w-VxFE@~EWli1++f38Xd3^k3GL5@%`955bxgeL8{EeHxQqs`tI z_$%<6*BRDTmz#i8yD|rm;aKlCt)7xTf@Z!IAjK`bED=y01)%(?xvLZtgE2s-8Nmp< zYNxb;Mm|e$9Gt@I?=x!m@d^i&nx3EY^l13P4j7!(yl3Tla<^@MSDW{-WcV|{8q*@g z74C5&bKt6|2zV^qIf>$@mwR~4Z=ph%Ih24MqR9T>3o+CepGBg5=E@)&HO*ff(iVj= zrAWbTcRWLMmV!NJ*mR3AYgVecCMrMUzRR|*a=<;!^yEOz#-`R8nU7J$X+K4NuM6A~ HQd2`iq@hRq diff --git a/levels/ghost_ship/guide_sign/crew_quarters_sign.material b/levels/ghost_ship/guide_sign/crew_quarters_sign.material index bfc29eb37c3f016751da2dc88f7b9d0f9f75b2df..8a0ddc8544a28d5730266236aa8abe35bfe3c921 100644 GIT binary patch literal 1209 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 S+o-}SI&J)(7qCoHQ$s^JVLFHa literal 1194 zcmV;b1XcS|Q$s@n000005C8x<3;+O<1ONaiwJ-f(ISWN30LC(zJU~^_0mE=W_5o5F z$8h3)M2IYGI86v4J4s3=xe=B2mPyJJ9EjEn;9(eJoltD^#L_paT3fBk)>eqorhou{ z0D%Az#7_NNek4`v9*quM-Lw|QjZj8UO_&c4hX$2scu{&Kcfm6x*VKkF^-mku}ec3^NH%Y1k`My=`t$NKdva}Im+!sMpyW96PS}KJ> zDwAC7oc>Cgc_15$l0xaGBINq?oc#s)Kps`(2H9*Mrz)!QcD)p5-&d2FDhYK%kRMU8 z<#2mbOR6^QP-YTA{W!(u&lLIj zx6sp9kX?I_9Cc1zp@O>%0#s?E%rprhSXx+~3kww}fM~5r$PAF;;Dd}zlo`3wqD)hl zONY#?keL8t46zXdN6HBa6ef0<)L@|-ij3e;;st^rDKOBe!7?ES#(<9)D@sm8*bXl( zZV*{%@z8@Lp$9XBP#t~PN-92x@dRDmYSvxiZ;X1mbco9#MPO7sWM2k2`dDQjyPtZY zr>@*`7^=vOX;YnNi8<{sI$pQQTv&MBsdMrJuFtEDxM_zC;-f04@L*YeynX2%|Vkdd`|AGtktQtB+7lb>^>jc?w4{%$^yoG>^A zp%8K6E)UARh=_#+&Y`CiP^StWO|=o3NWu~^DRG0?9$rftnfJ2pT1M^iEDoq4=2^1< zPlMe*G)Rkvqo+i9xbv-qxR{H|B5o2J9RJU&G+;<-gb#9rg5iMi*dsJ)$8AASfEjJ} zzQA9B-@MMSuDaX=q}r7^fDFfaziIW9^bs`ktpF)*;bn<{>L>u^Pt9GWm>7%!I?V`1 z*i}2F4K(sug5%&6UVooayN_2mpw#sIoTo>_7k0qltmZu{*OR+#^Sj!-k0ryO0oIrn zA+B(b6PW{7MMc14;m%1EKfT<;YkmtA!pxxr><~rv2VaPxzW6K>?K4*f*{Es$;*ho| zj44G5ZoA_dqO%n2Im4z~j9If%%{5W^8TVbbb(I6|X{IL!YBn~t&d7X>Do*<;@_Sw2 ImQqtgLj%o2m;e9( diff --git a/levels/ghost_ship/guide_sign/mess_hall_sign.material b/levels/ghost_ship/guide_sign/mess_hall_sign.material index 399118b60b267efa08b8ab78146a0b8ef49595cd..071b8bfa3770aa4a666c0a4f6618105486b87bc3 100644 GIT binary patch literal 1199 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 KLo5?gQ$s@(<|c*! literal 1187 zcmV;U1YG-4Q$s@n000005C8x(3;+O&1ONaiwJ-f(GYbtQ09LY=I3RV>0RUwp5CFp- zz~%~A1OVov5khvFicE6Zm&le$N>U>=yTpgNxrmj{3_yIiE%*v)-nGj|DS!Ze0D%Ar z@HNl2^iDSeWzv>OhtSy~rO(wP#&$h!S8DuSKe6LvucY~>tF=h!Vkj-AErTt}Y3Fm7 z{fMXl-SegIs6#{%Z24{8eyMf25mYGM0#v8U6Mt%{xFuB`v1=ou1Vm&+pkW6O9YIz) zAff;y;i2WWex_KR%jK^iA_*cE7=Re)fQ0jvGM0%)_$9>Q#t^hT?q^?@BA=`}wJEm` zZA05Fl`CioH9O2EO0M~{^>ORAx8EWtwLGm(({h>|ulquJ;;v5fMBGiCON~k<4KO)C zwXNkVgop=_Er(JGvvh*m(RcJ2VCHF0z7LR>W?ClC)ZAF5j(+O~5mE4A7VBwgXPJu_ z%EaM*5Rt%BWqHuanbtO=@-c@wymYgwv{Rq9ep`mYU@#bw)tWi4Q{$=AWqaHI>Wp!R zP1M?wEp4I^7EfsNb)htPmCdw8SX5@-nKKwvx%^)!gIgBOKTi9-^`CX*naDTuP9K+_ z-ZmBiJK0)xzVuX=gqM(N5CbDrR#cpe3l=JfV2n*b3}6Bw#0ho5YYl6 z0*Eo>MhqM#BqvmuSdsGMq=yd{B~nnlNFZcI1{yU~DCEEx01~6cND6=4??M2?1{u)= z8!Gs?$6-YB$I0EZHhL~iH`*@#>YkU&2iFuNfno7)TN&u2TNHKMK4N`bc52$$mweYs zmRf$H?QlPDt4-~9mb_bj3L}94s9~{DhK5K)QjjDW4nP7zm@1-r5`beh$b!x(rHDpm zIVmTZ){pp^`}1=V$K%&BZsO*{-hHsqg>jjA?w37oO_w@F=N8pz(lZZT;oEXVYF$%W z!se~y>rtTCz}Ukvs>3xXP#75?<+;H}H-h13-7bUzy6<&c0=5%@&F?y%!lIEPpo2RD z@?pDi;l;4SOC)JXy%Kd;=g<5<-}2gR0dt1}m&GMn92k1n>~N`^61m7A?bPOW$|Sh^ z5XlkiY13cqHLG6{t&r>R{2_jDd+emtnK>sv=SUmh{5Snwd`fasa0)I+WJYu+Nel z2c$6jTaB7}jKYzn%=5!M4H|~90|skl?>V_1?>3rWYX5yK8U75g#?%Rsh5Mf99C#}l z0Z#}|PGbD^at^Qkt*X#st`e9-D6%*BLJcLw6Ojm?Su%)6eKHqU+LALS8!5m2j%kRp zQn2R?m~J&@&WbbFM5SlkciGk@2fL@3t{kw54c`h~D^2DHqyn^`vcJ~_ZV6ITLqjzk BDo6kT diff --git a/project.godot b/project.godot index 43bd784..6bf80d9 100644 --- a/project.godot +++ b/project.godot @@ -143,6 +143,11 @@ select_prev_tool={ "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null) ] } +pause={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} [layer_names] diff --git a/src/game/game.gd b/src/game/game.gd index d5d9630..1ad8cea 100644 --- a/src/game/game.gd +++ b/src/game/game.gd @@ -6,4 +6,9 @@ static var manager: GameManagerType: get(): return GameManager -static var hud: PlayerHUD +## Global static access to Game singleton +static var instance: Game + + +func _ready() -> void: + Game.instance = self diff --git a/src/player/camera_controller.gd b/src/player/camera_controller.gd index 8981e46..7a438e9 100644 --- a/src/player/camera_controller.gd +++ b/src/player/camera_controller.gd @@ -15,9 +15,6 @@ func _unhandled_input(event: InputEvent) -> void: camera_motion((event as InputEventMouseMotion).relative) elif event is InputEventMouseButton: Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) - elif event is InputEventKey: - if (event as InputEventKey).keycode == KEY_ESCAPE: - Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) func camera_motion(motion: Vector2) -> void: diff --git a/src/ui/hud/player_hud.gd b/src/ui/hud/player_hud.gd index 3e6448e..0c0b94c 100644 --- a/src/ui/hud/player_hud.gd +++ b/src/ui/hud/player_hud.gd @@ -7,7 +7,6 @@ class_name PlayerHUD extends Control func _ready() -> void: Game.manager.alert_raised.connect(_on_raise_alert) - Game.hud = self func select_interactive(prop: Interactive) -> void: diff --git a/src/ui/menus/menu.theme b/src/ui/menus/menu.theme new file mode 100644 index 0000000000000000000000000000000000000000..6972fbd4e1c8ad6d4baf3008a43100935654abbb GIT binary patch literal 885 zcmV-*1B(1oQ$s@n000005C8yg3IG6I0{{RhwJ-f(ZwZ|m0EXdnMIf&v9Y8SZRGU5Jy+T5dcycjuu-Za{H6LSv{K&A~(6sVdy6uWc*0F%nW-GDua}MfZ+xrWbtLlEGHFB3)dqQEJRg;rh1+Y& zP3!faI&YA6oGD-T)qWFRbw0jqS1;TDB>yQqW~Sr>t7J<2zc_EKbqIj*2Xb~-Uv(>5 zyE~Tu3uwi7!s|Z1aP)e15aY;6due1;UMMGgvMJ@R?5fM&s!F+RSKJ1Gwy2>!8X_7cNkO610f2%L zn=#e_62Rj~O)^X?BLUTjNRpD0l$By(3~@;CVZldH#gY>Bp7deN1fww=xJCv9W~1A0PB|a?&fas1sLXDH02y+U-ujo2}wrEOYoy2nZxt~NLZ;n zYzV3L?m8KXkfLFzOyrbNS_l((5@fpEE?DjeOwZ1_0r>YwR)qqK4qnMA{@E#kMFl7qyHy`8Az?J|WAnx-4;+!Nl^34B>_8GdnJ4N@|tulZsnFt_w z5>VsZ7Y8(Hd09IA=JYw7;sOE;kck2$H+UXr1e^M~?2Jp4|98i%lIaX2O!}g*!V5c0 zH?Am{NvcmaM%5;uCml!%k9b+F>P^d#xCemRwh;ioMBe@-B literal 0 HcmV?d00001 diff --git a/src/ui/menus/pause_menu/pause_menu.gd b/src/ui/menus/pause_menu/pause_menu.gd new file mode 100644 index 0000000..3363daf --- /dev/null +++ b/src/ui/menus/pause_menu/pause_menu.gd @@ -0,0 +1,68 @@ +extends Control +## Menu shown in-game when the user presses pause. + +@export var settings_scene: PackedScene + +var _freeze_input := false + +@onready var menu_list: VBoxContainer = %MenuList +@onready var quit_confirm: CenterContainer = %QuitConfirm +@onready var end_game_confirm: CenterContainer = %EndGameConfirm +@onready var settings_container: MarginContainer = %SettingsContainer + + +func _ready() -> void: + print_debug("PAUSING") + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + Engine.time_scale = 1.0 + + +func _unhandled_key_input(event: InputEvent) -> void: + if not _freeze_input and event.is_action_pressed("pause"): + get_viewport().set_input_as_handled() + resume() + + +func _unhide() -> void: + menu_list.show() + + +func _hide() -> void: + menu_list.hide() + + +func resume() -> void: + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + queue_free() + + +func settings() -> void: + var instance: Control = settings_scene.instantiate() + settings_container.add_child(instance) + instance.tree_exited.connect(_unhide) + _hide() + + +func quit() -> void: + quit_confirm.show() + + +func cancel_quit() -> void: + quit_confirm.hide() + + +func confirm_quit() -> void: + get_tree().root.propagate_notification(NOTIFICATION_WM_CLOSE_REQUEST) + + +func end_game() -> void: + end_game_confirm.show() + + +func cancel_end_game() -> void: + end_game_confirm.hide() + + +func confirm_end_game() -> void: + print_debug("TODO") + #world.fade_to_title() diff --git a/src/ui/menus/pause_menu/pause_menu.gd.uid b/src/ui/menus/pause_menu/pause_menu.gd.uid new file mode 100644 index 0000000..549b4d5 --- /dev/null +++ b/src/ui/menus/pause_menu/pause_menu.gd.uid @@ -0,0 +1 @@ +uid://cllx5glqld8wn diff --git a/src/ui/menus/pause_menu/pause_menu.tscn b/src/ui/menus/pause_menu/pause_menu.tscn new file mode 100644 index 0000000..e66b83f --- /dev/null +++ b/src/ui/menus/pause_menu/pause_menu.tscn @@ -0,0 +1,205 @@ +[gd_scene load_steps=4 format=3 uid="uid://byvjsvavbg5xe"] + +[ext_resource type="Theme" uid="uid://doq7ay6f7dgfo" path="res://src/ui/menus/menu.theme" id="1_b4t8b"] +[ext_resource type="Script" uid="uid://cllx5glqld8wn" path="res://src/ui/menus/pause_menu/pause_menu.gd" id="1_rd0j2"] + +[sub_resource type="Resource" id="Resource_6sp1a"] +metadata/__load_path__ = "res://src/ui/menus/settings_menu/settings_menu.tscn" + +[node name="PauseMenu" type="Control"] +process_mode = 3 +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("1_b4t8b") +script = ExtResource("1_rd0j2") +settings_scene = SubResource("Resource_6sp1a") + +[node name="Shade" 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, 0, 0, 0.627451) + +[node name="MenuList" type="VBoxContainer" parent="."] +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 = -127.0 +offset_top = -147.0 +offset_right = 127.0 +offset_bottom = 147.0 +grow_horizontal = 2 +grow_vertical = 2 +alignment = 1 + +[node name="TitleLabel" type="Label" parent="MenuList"] +layout_mode = 2 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 8 +theme_override_font_sizes/font_size = 72 +text = "GRUNK" +horizontal_alignment = 1 + +[node name="PauseLabel" type="Label" parent="MenuList"] +layout_mode = 2 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_colors/font_outline_color = Color(0, 0, 0, 1) +theme_override_constants/outline_size = 8 +text = "paused" +horizontal_alignment = 1 + +[node name="HSeparator" type="HSeparator" parent="MenuList"] +layout_mode = 2 +theme_override_constants/separation = 24 + +[node name="VBoxContainer" type="VBoxContainer" parent="MenuList"] +layout_mode = 2 +size_flags_horizontal = 4 +alignment = 1 + +[node name="ResumeButton" type="Button" parent="MenuList/VBoxContainer"] +layout_mode = 2 +text = "Resume" + +[node name="SettingsButton" type="Button" parent="MenuList/VBoxContainer"] +layout_mode = 2 +text = "Settings" + +[node name="EndGameButton" type="Button" parent="MenuList/VBoxContainer"] +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "Quit to Title" + +[node name="QuitButton" type="Button" parent="MenuList/VBoxContainer"] +layout_mode = 2 +theme_type_variation = &"DangerButton" +text = "Quit to Desktop" + +[node name="SettingsContainer" type="MarginContainer" parent="."] +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 = -640.0 +offset_top = -360.0 +offset_right = 640.0 +offset_bottom = 360.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 + +[node name="QuitConfirm" type="CenterContainer" parent="."] +unique_name_in_owner = true +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="PanelContainer" type="PanelContainer" parent="QuitConfirm"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="QuitConfirm/PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 16 +theme_override_constants/margin_top = 16 +theme_override_constants/margin_right = 16 +theme_override_constants/margin_bottom = 16 + +[node name="VBoxContainer" type="VBoxContainer" parent="QuitConfirm/PanelContainer/MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Label" type="Label" parent="QuitConfirm/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_font_sizes/font_size = 24 +text = "End the game and return to the title screen? +Unsaved progress will be lost." +horizontal_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="QuitConfirm/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="CancelButton" type="Button" parent="QuitConfirm/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Cancel" + +[node name="ConfirmQuitButton" type="Button" parent="QuitConfirm/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"DangerButton" +text = "Quit" + +[node name="EndGameConfirm" type="CenterContainer" parent="."] +unique_name_in_owner = true +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="PanelContainer" type="PanelContainer" parent="EndGameConfirm"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="EndGameConfirm/PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 16 +theme_override_constants/margin_top = 16 +theme_override_constants/margin_right = 16 +theme_override_constants/margin_bottom = 16 + +[node name="VBoxContainer" type="VBoxContainer" parent="EndGameConfirm/PanelContainer/MarginContainer"] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="Label" type="Label" parent="EndGameConfirm/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_font_sizes/font_size = 24 +text = "End the game and return to the desktop? +Unsaved progress will be lost." +horizontal_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="EndGameConfirm/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +theme_override_constants/separation = 16 + +[node name="CancelButton" type="Button" parent="EndGameConfirm/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Cancel" + +[node name="ConfirmEndGameButton" type="Button" parent="EndGameConfirm/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +theme_type_variation = &"DangerButton" +text = "Quit" + +[connection signal="pressed" from="MenuList/VBoxContainer/ResumeButton" to="." method="resume"] +[connection signal="pressed" from="MenuList/VBoxContainer/SettingsButton" to="." method="settings"] +[connection signal="pressed" from="MenuList/VBoxContainer/EndGameButton" to="." method="end_game"] +[connection signal="pressed" from="MenuList/VBoxContainer/QuitButton" to="." method="quit"] +[connection signal="pressed" from="QuitConfirm/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/CancelButton" to="." method="cancel_quit"] +[connection signal="pressed" from="QuitConfirm/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/ConfirmQuitButton" to="." method="confirm_quit"] +[connection signal="pressed" from="EndGameConfirm/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/CancelButton" to="." method="cancel_end_game"] +[connection signal="pressed" from="EndGameConfirm/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/ConfirmEndGameButton" to="." method="confirm_end_game"] diff --git a/src/world/world.gd b/src/world/world.gd new file mode 100644 index 0000000..3c88e03 --- /dev/null +++ b/src/world/world.gd @@ -0,0 +1,38 @@ +class_name World extends Node +## Access and flow control for the game world. + +@export var initial_level: PackedScene + +@export var pause_scene: PackedScene + +@onready var level_root: Node3D = %LevelRoot +@onready var ui_root: Control = %UIRoot + +static var instance: World + + +func _ready() -> void: + World.instance = self + load_level(initial_level) + + +func _unhandled_input(event: InputEvent) -> void: + if event.is_action_pressed("pause"): + pause() + + +func pause() -> void: + get_tree().paused = true + var pause_menu: Control = pause_scene.instantiate() + ui_root.add_child(pause_menu) + pause_menu.tree_exited.connect(unpause) + + +func unpause() -> void: + get_tree().paused = false + + +func load_level(level: PackedScene) -> void: + for c: Node in level_root.get_children(): + c.queue_free() + level_root.add_child(level.instantiate()) diff --git a/src/world/world.gd.uid b/src/world/world.gd.uid new file mode 100644 index 0000000..baa4ecf --- /dev/null +++ b/src/world/world.gd.uid @@ -0,0 +1 @@ +uid://cgqmhtemibxc5 diff --git a/src/world/world.tscn b/src/world/world.tscn new file mode 100644 index 0000000..c60c747 --- /dev/null +++ b/src/world/world.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=4 format=3 uid="uid://884jqafhtrv0"] + +[ext_resource type="Script" uid="uid://cgqmhtemibxc5" path="res://src/world/world.gd" id="1_1k4gi"] +[ext_resource type="PackedScene" uid="uid://byvjsvavbg5xe" path="res://src/ui/menus/pause_menu/pause_menu.tscn" id="2_6fy3g"] +[ext_resource type="PackedScene" uid="uid://bov4ok76woyc" path="res://levels/ghost_ship/ghost_ship.tscn" id="2_jte2u"] + +[node name="World" type="Node"] +script = ExtResource("1_1k4gi") +initial_level = ExtResource("2_jte2u") +pause_scene = ExtResource("2_6fy3g") + +[node name="LevelRoot" type="Node3D" parent="."] +unique_name_in_owner = true + +[node name="UIRoot" type="Control" parent="."] +unique_name_in_owner = true +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 diff --git a/vault/assets/color_palette.md b/vault/assets/color_palette.md index 6de08c0..457b9e5 100644 --- a/vault/assets/color_palette.md +++ b/vault/assets/color_palette.md @@ -37,4 +37,9 @@ - `#ff4a1c` Emissive Blood Orange SAMPLE - `#dd1c1a` DANGER Red SAMPLE - `#23fb59` SUCCESS Green SAMPLE -- `#39a0ed` HI-TECH Blue SAMPLE \ No newline at end of file +- `#39a0ed` HI-TECH Blue SAMPLE + +## UI +- `#dd1c1a` DANGER Red SAMPLE +- `#23fb59` SUCCESS Green SAMPLE +- `#39a0ed` NOTICE Blue SAMPLE \ No newline at end of file