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 663878c..f112c35 100644
Binary files a/levels/ghost_ship/guide_sign/airlock_sign.material and b/levels/ghost_ship/guide_sign/airlock_sign.material differ
diff --git a/levels/ghost_ship/guide_sign/cargo_bay_sign.material b/levels/ghost_ship/guide_sign/cargo_bay_sign.material
index 03d36e5..df6c2ce 100644
Binary files a/levels/ghost_ship/guide_sign/cargo_bay_sign.material and b/levels/ghost_ship/guide_sign/cargo_bay_sign.material differ
diff --git a/levels/ghost_ship/guide_sign/crew_quarters_sign.material b/levels/ghost_ship/guide_sign/crew_quarters_sign.material
index bfc29eb..8a0ddc8 100644
Binary files a/levels/ghost_ship/guide_sign/crew_quarters_sign.material and b/levels/ghost_ship/guide_sign/crew_quarters_sign.material differ
diff --git a/levels/ghost_ship/guide_sign/medbay_sign.material b/levels/ghost_ship/guide_sign/medbay_sign.material
index 839500d..c3e7a81 100644
Binary files a/levels/ghost_ship/guide_sign/medbay_sign.material and b/levels/ghost_ship/guide_sign/medbay_sign.material differ
diff --git a/levels/ghost_ship/guide_sign/mess_hall_sign.material b/levels/ghost_ship/guide_sign/mess_hall_sign.material
index 399118b..071b8bf 100644
Binary files a/levels/ghost_ship/guide_sign/mess_hall_sign.material and b/levels/ghost_ship/guide_sign/mess_hall_sign.material differ
diff --git a/levels/ghost_ship/guide_sign/ops_sign.material b/levels/ghost_ship/guide_sign/ops_sign.material
index 8f14228..49673ef 100644
Binary files a/levels/ghost_ship/guide_sign/ops_sign.material and b/levels/ghost_ship/guide_sign/ops_sign.material differ
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 0000000..6972fbd
Binary files /dev/null and b/src/ui/menus/menu.theme differ
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