diff --git a/asset_dev/level/airlock/floor_mask.xcf b/asset_dev/level/airlock/floor_mask.xcf new file mode 100644 index 0000000..d7fce22 Binary files /dev/null and b/asset_dev/level/airlock/floor_mask.xcf differ diff --git a/assets/black.png b/assets/black.png new file mode 100644 index 0000000..6bf4ab2 --- /dev/null +++ b/assets/black.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2038a28b1ccfa88a80de25e407e5725edecb108cf20cf9d6ad152c916be516b1 +size 546 diff --git a/assets/black.png.import b/assets/black.png.import new file mode 100644 index 0000000..b54184a --- /dev/null +++ b/assets/black.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cm1jrvx7ftx4c" +path.s3tc="res://.godot/imported/black.png-0c928088330c4cddf9e28b960b6ccae3.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/black.png" +dest_files=["res://.godot/imported/black.png-0c928088330c4cddf9e28b960b6ccae3.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/assets/materials/grunk_jittery.material b/assets/materials/grunk_jittery.material new file mode 100644 index 0000000..76b86db Binary files /dev/null and b/assets/materials/grunk_jittery.material differ diff --git a/assets/materials/gunk.material b/assets/materials/gunk.material index 12f838b..abd4b9f 100644 Binary files a/assets/materials/gunk.material and b/assets/materials/gunk.material differ diff --git a/assets/materials/gunk_lowrez.material b/assets/materials/gunk_lowrez.material index 6ab2e8a..21aa1d5 100644 Binary files a/assets/materials/gunk_lowrez.material and b/assets/materials/gunk_lowrez.material differ diff --git a/assets/particles/splatter_1.png b/assets/particles/splatter_1.png new file mode 100644 index 0000000..49ea1ac --- /dev/null +++ b/assets/particles/splatter_1.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:79bc45a2b1cf01e8232995d468116f157ad2fb635f94380fbd41c4dc74a54cfb +size 6588 diff --git a/assets/particles/splatter_1.png.import b/assets/particles/splatter_1.png.import new file mode 100644 index 0000000..279e966 --- /dev/null +++ b/assets/particles/splatter_1.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bhoai6xv53tqm" +path.s3tc="res://.godot/imported/splatter_1.png-9809720e1943a4aa83ecfb22feeb83c2.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/particles/splatter_1.png" +dest_files=["res://.godot/imported/splatter_1.png-9809720e1943a4aa83ecfb22feeb83c2.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/assets/particles/splatter_2.png b/assets/particles/splatter_2.png new file mode 100644 index 0000000..485c4ce --- /dev/null +++ b/assets/particles/splatter_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d46cce9a09a847ee4cfce74a70689801286605020cc6b3cdb1a98e6dc340122 +size 6422 diff --git a/assets/particles/splatter_2.png.import b/assets/particles/splatter_2.png.import new file mode 100644 index 0000000..73499e1 --- /dev/null +++ b/assets/particles/splatter_2.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cgwgmxwjgwbwr" +path="res://.godot/imported/splatter_2.png-9990293bc035c8e51b6c307a177f51f7.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/particles/splatter_2.png" +dest_files=["res://.godot/imported/splatter_2.png-9990293bc035c8e51b6c307a177f51f7.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/levels/ghost_ship/airlock/floor_mask.png b/levels/ghost_ship/airlock/floor_mask.png new file mode 100644 index 0000000..3e4468f --- /dev/null +++ b/levels/ghost_ship/airlock/floor_mask.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ded1d5b4c9daad523a0aad6ea6f1df9b01eccd36c599823494c9730d304215f +size 4104 diff --git a/levels/ghost_ship/airlock/floor_mask.png.import b/levels/ghost_ship/airlock/floor_mask.png.import new file mode 100644 index 0000000..4125958 --- /dev/null +++ b/levels/ghost_ship/airlock/floor_mask.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dthjo3ymo7say" +path.s3tc="res://.godot/imported/floor_mask.png-1a0b0eeca154b970656cd809641fb147.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://levels/ghost_ship/airlock/floor_mask.png" +dest_files=["res://.godot/imported/floor_mask.png-1a0b0eeca154b970656cd809641fb147.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/levels/ghost_ship/ghost_ship_level.tscn b/levels/ghost_ship/ghost_ship_level.tscn index 8c8a98a..94e1be7 100644 --- a/levels/ghost_ship/ghost_ship_level.tscn +++ b/levels/ghost_ship/ghost_ship_level.tscn @@ -1,8 +1,9 @@ -[gd_scene load_steps=110 format=4 uid="uid://crydi5cjgfwe5"] +[gd_scene load_steps=112 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"] [ext_resource type="Texture2D" uid="uid://c0a6flcoixsr2" path="res://assets/level/floor/floor_1_C.png" id="3_1chi6"] +[ext_resource type="Texture2D" uid="uid://dthjo3ymo7say" path="res://levels/ghost_ship/airlock/floor_mask.png" id="3_35kna"] [ext_resource type="Texture2D" uid="uid://dxuxhlycaamcy" path="res://assets/level/floor/floor_1_M.png" id="4_3ryvr"] [ext_resource type="Shader" uid="uid://ckxc0ngd37rtk" path="res://src/shaders/gunk.gdshader" id="5_1njh5"] [ext_resource type="FastNoiseLite" uid="uid://cnlvdtx68giv6" path="res://assets/materials/gunk_noise.tres" id="6_3kphg"] @@ -21,6 +22,7 @@ [ext_resource type="Texture2D" uid="uid://ckgmc6j7r0rh1" path="res://assets/level/t-junction/t-junction_2_C.png" id="18_qu6vm"] [ext_resource type="Texture2D" uid="uid://cjbem2fg50idh" path="res://assets/level/t-junction/t-junction_1_C.png" id="18_sqa4l"] [ext_resource type="Texture2D" uid="uid://cgsvlb8qc5yml" path="res://assets/level/t-junction/t-junction_1_M.png" id="19_17ivy"] +[ext_resource type="PackedScene" uid="uid://2yqi5u5eo025" path="res://src/world/gunk_node/grunk_nodule.tscn" id="19_ji5cn"] [ext_resource type="Texture2D" uid="uid://ckhslm3gb3xsk" path="res://assets/level/t-junction/t-junction_2_M.png" id="19_v8y1j"] [ext_resource type="Texture2D" uid="uid://c3nw2htq0gmit" path="res://assets/level/t-junction/t-junction_2_N.png" id="20_54or8"] [ext_resource type="Texture2D" uid="uid://dt4olb3vehawo" path="res://assets/level/t-junction/t-junction_1_N.png" id="20_ji5cn"] @@ -68,6 +70,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_rp2qp") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_if0c2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_2pd8h") +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="StandardMaterial3D" id="StandardMaterial3D_d1yty"] resource_local_to_scene = true @@ -132,6 +138,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_rp2qp") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_if0c2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_2pd8h") +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="StandardMaterial3D" id="StandardMaterial3D_qu6vm"] resource_local_to_scene = true @@ -231,6 +241,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_hrvvi") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc") +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="StandardMaterial3D" id="StandardMaterial3D_54or8"] resource_local_to_scene = true @@ -294,6 +308,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_hrvvi") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc") +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="StandardMaterial3D" id="StandardMaterial3D_ruwlj"] resource_local_to_scene = true @@ -340,6 +358,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_rp2qp") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_if0c2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_2pd8h") +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="CompressedTexture2D" id="CompressedTexture2D_rlaob"] load_path = "res://.godot/imported/hallway_1_C.png-9a126edbc39655070332e0af1a5ee780.ctex" @@ -414,6 +436,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_rp2qp") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_if0c2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_2pd8h") +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="StandardMaterial3D" id="StandardMaterial3D_okeuk"] albedo_texture = ExtResource("18_sqa4l") @@ -476,6 +502,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_rp2qp") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_if0c2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_2pd8h") +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="CompressedTexture2D" id="CompressedTexture2D_j0yby"] load_path = "res://.godot/imported/hallway_3_C.png-9b45a5b023d4947b4c559574fc3e621c.ctex" @@ -547,6 +577,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_rp2qp") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_if0c2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_2pd8h") +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="StandardMaterial3D" id="StandardMaterial3D_lfacn"] albedo_texture = SubResource("CompressedTexture2D_rlaob") @@ -606,6 +640,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_rp2qp") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_if0c2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_2pd8h") +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="StandardMaterial3D" id="StandardMaterial3D_54end"] transparency = 2 @@ -687,6 +725,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_ji5cn") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_35kna") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_4a0u4") +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="StandardMaterial3D" id="StandardMaterial3D_sqa4l"] resource_local_to_scene = true @@ -750,6 +792,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_rp2qp") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_if0c2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_2pd8h") +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="CompressedTexture2D" id="CompressedTexture2D_2h3rs"] load_path = "res://.godot/imported/hallway_2_C.png-368e035781dbfc292f80210e8377e1f9.ctex" @@ -812,6 +858,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -0.75) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -12) [node name="Floor" parent="Airlock" instance=ExtResource("2_2egij")] +initial_mask = ExtResource("3_35kna") source_gunk_material = SubResource("ShaderMaterial_sqa4l") [node name="MeshInstance3D" type="MeshInstance3D" parent="Airlock/Floor"] @@ -822,7 +869,8 @@ skeleton = NodePath("../..") shape = SubResource("ConcavePolygonShape3D_yvipw") [node name="Ceiling" parent="Airlock" instance=ExtResource("2_2egij")] -transform = Transform3D(1, 0, 0, 0, -1, 8.74228e-08, 0, -8.74228e-08, -1, 0, 3, 0) +transform = Transform3D(-1, -7.64274e-15, 8.74228e-08, 0, -1, -8.74228e-08, 8.74228e-08, -8.74228e-08, 1, 0, 3, 0) +initial_mask = ExtResource("3_35kna") source_gunk_material = SubResource("ShaderMaterial_17ivy") [node name="MeshInstance3D" type="MeshInstance3D" parent="Airlock/Ceiling"] @@ -923,6 +971,16 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 1.5, 0.1) [node name="Bulkhead" parent="Airlock/FarWall" instance=ExtResource("18_17ivy")] +[node name="GrunkNodule" parent="Airlock" instance=ExtResource("19_ji5cn")] +transform = Transform3D(1, 0, 0, 0, 0.866026, -0.5, 0, 0.5, 0.866026, -2.05, 0.15, -4.5) +value = 4000.0 + +[node name="GrunkNodule2" parent="Airlock" instance=ExtResource("19_ji5cn")] +transform = Transform3D(0.5, 0, 0, 0, 0.353553, 0.353554, 0, -0.353554, 0.353553, -1.1, 0.15, -4.3) + +[node name="GrunkNodule3" parent="Airlock" instance=ExtResource("19_ji5cn")] +transform = Transform3D(0.5, 0, 0, 0, 0.353553, 0.353554, 0, -0.353554, 0.353553, 1.4, 2.65, -4.3) + [node name="Corridor1" type="Node3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -22.5) diff --git a/levels/sandbox/sandbox.tscn b/levels/sandbox/sandbox.tscn index 4edd0d9..a448270 100644 --- a/levels/sandbox/sandbox.tscn +++ b/levels/sandbox/sandbox.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=44 format=4 uid="uid://16ds4fvv72xk"] +[gd_scene load_steps=45 format=4 uid="uid://16ds4fvv72xk"] [ext_resource type="PackedScene" uid="uid://c2omlx4ptrc01" path="res://src/world/gunk_body/gunk_body.tscn" id="1_a67lu"] [ext_resource type="PackedScene" uid="uid://bwe2jdmvinhqd" path="res://src/player/player.tscn" id="1_h436a"] @@ -9,6 +9,7 @@ [ext_resource type="ArrayMesh" uid="uid://5jt7xxr05lw3" path="res://assets/level/hallway/hallway_2.mesh" id="8_hrvvi"] [ext_resource type="ArrayMesh" uid="uid://o6k7ebet848p" path="res://assets/level/hallway/hallway_3.mesh" id="9_2roq2"] [ext_resource type="PackedScene" uid="uid://b6eg8t04rkh0c" path="res://src/props/wall_switch/wall_switch.tscn" id="9_p27ol"] +[ext_resource type="PackedScene" uid="uid://2yqi5u5eo025" path="res://src/world/gunk_node/grunk_nodule.tscn" id="10_2roq2"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_cj8bk"] @@ -70,6 +71,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_hrvvi") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc") +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="StandardMaterial3D" id="StandardMaterial3D_powch"] albedo_color = Color(1, 0.403922, 1, 1) @@ -126,6 +131,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_hrvvi") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc") +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="StandardMaterial3D" id="StandardMaterial3D_2h3rs"] albedo_color = Color(1, 0.403922, 1, 1) @@ -184,6 +193,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_hrvvi") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc") +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="StandardMaterial3D" id="StandardMaterial3D_0psug"] albedo_color = Color(1, 0.403922, 1, 1) @@ -240,6 +253,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_hrvvi") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc") +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="StandardMaterial3D" id="StandardMaterial3D_hrvvi"] albedo_color = Color(1, 0.403922, 1, 1) @@ -298,6 +315,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_hrvvi") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc") +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_p1wtp"] data = PackedVector3Array(-1.5, 0, -6, -1.5, 0, 6, -1.5, 3, -6, -1.5, 3, -6, -1.5, 0, 6, -1.5, 3, 6, 1.5, 0, 6, 1.5, 0, -6, 1.5, 3, 6, 1.5, 3, 6, 1.5, 0, -6, 1.5, 3, -6, -1.5, 0, 6, -1.5, 0, -6, 1.5, 0, 6, 1.5, 0, 6, -1.5, 0, -6, 1.5, 0, -6, 1.5, 3, 6, 1.5, 3, -6, -1.5, 3, 6, -1.5, 3, 6, 1.5, 3, -6, -1.5, 3, -6) @@ -320,6 +341,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_hrvvi") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc") +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_2l4r6"] data = PackedVector3Array(-1.5, 0, -6, -1.5, 0, 6, -1.5, 3, -6, -1.5, 3, -6, -1.5, 0, 6, -1.5, 3, 6, 1.5, 0, 6, 1.5, 0, -6, 1.5, 3, 6, 1.5, 3, 6, 1.5, 0, -6, 1.5, 3, -6, -1.5, 0, 6, -1.5, 0, -6, 1.5, 0, 6, 1.5, 0, 6, -1.5, 0, -6, 1.5, 0, -6, 1.5, 3, 6, 1.5, 3, -6, -1.5, 3, 6, -1.5, 3, 6, 1.5, 3, -6, -1.5, 3, -6) @@ -342,6 +367,10 @@ shader_parameter/edge_bleed = 0.25 shader_parameter/gunk_mask = SubResource("CompressedTexture2D_hrvvi") shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2") shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc") +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_tmxet"] data = PackedVector3Array(-1.5, 0, -6, -1.5, 0, 6, -1.5, 3, -6, -1.5, 3, -6, -1.5, 0, 6, -1.5, 3, 6, 1.5, 0, 6, 1.5, 0, -6, 1.5, 3, 6, 1.5, 3, 6, 1.5, 0, -6, 1.5, 3, -6, -1.5, 0, 6, -1.5, 0, -6, 1.5, 0, 6, 1.5, 0, 6, -1.5, 0, -6, 1.5, 0, -6, 1.5, 3, 6, 1.5, 3, -6, -1.5, 3, 6, -1.5, 3, 6, 1.5, 3, -6, -1.5, 3, -6) @@ -473,3 +502,9 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0834363, 3.98781, -0.965698 light_energy = 8.0 shadow_enabled = true omni_range = 20.0 + +[node name="GrunkNodule" parent="." instance=ExtResource("10_2roq2")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6, 1, -1) + +[node name="GrunkNodule2" parent="." instance=ExtResource("10_2roq2")] +transform = Transform3D(0.4, 0, 0, 0, 0.4, 0, 0, 0, 0.4, -6, 1, 1) diff --git a/src/effects/grunk_splatter.tscn b/src/effects/grunk_splatter.tscn new file mode 100644 index 0000000..962f9e0 --- /dev/null +++ b/src/effects/grunk_splatter.tscn @@ -0,0 +1,112 @@ +[gd_scene load_steps=17 format=3 uid="uid://xlt78xc1tmkl"] + +[ext_resource type="Texture2D" uid="uid://cgwgmxwjgwbwr" path="res://assets/particles/splatter_2.png" id="1_5xu2x"] +[ext_resource type="Texture2D" uid="uid://bhoai6xv53tqm" path="res://assets/particles/splatter_1.png" id="2_bt63p"] + +[sub_resource type="Gradient" id="Gradient_5xu2x"] +offsets = PackedFloat32Array(0, 0.291304, 0.526087, 1) +colors = PackedColorArray(2, 2, 2, 1, 0, 0.101961, 0.301961, 1, 0, 0.0313726, 0.101961, 1, 0, 0, 0, 0) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_bt63p"] +gradient = SubResource("Gradient_5xu2x") +use_hdr = true + +[sub_resource type="Curve" id="Curve_y6klh"] +_data = [Vector2(0.148438, 0.19687), 0.0, 0.0, 0, 0, Vector2(0.339844, 1), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_t00bd"] +curve = SubResource("Curve_y6klh") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_5xu2x"] +lifetime_randomness = 0.57 +angle_min = 1.07288e-05 +angle_max = 360.0 +direction = Vector3(0, 0, 0) +spread = 180.0 +initial_velocity_min = 8.0 +initial_velocity_max = 8.0 +scale_curve = SubResource("CurveTexture_t00bd") +color_ramp = SubResource("GradientTexture1D_bt63p") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_bt63p"] +transparency = 1 +vertex_color_use_as_albedo = true +albedo_texture = ExtResource("1_5xu2x") +texture_filter = 2 +billboard_mode = 3 +billboard_keep_scale = true +particles_anim_h_frames = 1 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[sub_resource type="QuadMesh" id="QuadMesh_y6klh"] +material = SubResource("StandardMaterial3D_bt63p") +size = Vector2(0.5, 0.5) + +[sub_resource type="Curve" id="Curve_bt63p"] +_limits = [0.0, 0.7, 0.0, 1.0] +_data = [Vector2(0, 0), 0.0, 0.0, 0, 0, Vector2(0.199219, 0.7), -0.414907, -0.414907, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_2iem1"] +curve = SubResource("Curve_bt63p") + +[sub_resource type="Curve" id="Curve_t00bd"] +_data = [Vector2(0, 0), 0.0, 1.334, 0, 0, Vector2(1, 1), -0.0498424, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_72g1e"] +curve = SubResource("Curve_t00bd") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_2iem1"] +lifetime_randomness = 0.55 +emission_shape = 1 +emission_sphere_radius = 0.9 +angle_min = 1.07288e-05 +angle_max = 360.0 +direction = Vector3(0, 1, 0) +spread = 0.0 +initial_velocity_max = 0.05 +gravity = Vector3(0, -0.3, 0) +scale_curve = SubResource("CurveTexture_72g1e") +color = Color(0.9, 0.983333, 1, 1) +alpha_curve = SubResource("CurveTexture_2iem1") + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ckw5w"] +transparency = 1 +vertex_color_use_as_albedo = true +albedo_texture = ExtResource("2_bt63p") +texture_filter = 2 +billboard_mode = 3 +billboard_keep_scale = true +particles_anim_h_frames = 1 +particles_anim_v_frames = 1 +particles_anim_loop = false + +[sub_resource type="QuadMesh" id="QuadMesh_6adkd"] +material = SubResource("StandardMaterial3D_ckw5w") +size = Vector2(2, 2) + +[node name="GrunkSplatter" type="GPUParticles3D"] +amount = 32 +lifetime = 0.3 +explosiveness = 1.0 +process_material = SubResource("ParticleProcessMaterial_5xu2x") +draw_pass_1 = SubResource("QuadMesh_y6klh") + +[node name="SubSplatter" type="GPUParticles3D" parent="."] +amount = 4 +lifetime = 0.3 +explosiveness = 0.82 +interpolate = false +fract_delta = false +process_material = SubResource("ParticleProcessMaterial_2iem1") +draw_pass_1 = SubResource("QuadMesh_6adkd") + +[node name="FreeTimer" type="Timer" parent="."] +wait_time = 0.3 +one_shot = true +autostart = true + +[connection signal="timeout" from="FreeTimer" to="." method="queue_free"] diff --git a/src/equipment/point_spray/point_spray.gd b/src/equipment/point_spray/point_spray.gd index 32c10df..015e462 100644 --- a/src/equipment/point_spray/point_spray.gd +++ b/src/equipment/point_spray/point_spray.gd @@ -19,6 +19,8 @@ func _fire() -> void: (collider as GunkBody).paint_continuous( point, laser.get_collision_normal(), point_scale ) + if collider is GunkNode: + (collider as GunkNode).hit() spray_effect.visible = true beam_particles_1.emitting = true diff --git a/src/equipment/wide_spray/wide_spray.gd b/src/equipment/wide_spray/wide_spray.gd index b8733a1..c571124 100644 --- a/src/equipment/wide_spray/wide_spray.gd +++ b/src/equipment/wide_spray/wide_spray.gd @@ -19,8 +19,9 @@ func _fire() -> void: for laser: LaserCast in spray_casts.get_children(): if laser.is_colliding(): - var target := laser.get_collider() as GunkBody - if target: + var collider := laser.get_collider() + if collider is GunkBody: + var target := collider as GunkBody var point := laser.get_collision_point() var normal := laser.get_collision_normal() @@ -34,6 +35,8 @@ func _fire() -> void: prev_target = target prev_point = point prev_normal = normal + elif collider is GunkNode: + (collider as GunkNode).hit() spray_effect.visible = true beam_particles_1.emitting = true diff --git a/src/shaders/gunk.gdshader b/src/shaders/gunk.gdshader index 980aa3f..0e18d0d 100644 --- a/src/shaders/gunk.gdshader +++ b/src/shaders/gunk.gdshader @@ -1,6 +1,7 @@ shader_type spatial; -render_mode blend_mix, depth_draw_opaque, cull_disabled, diffuse_burley, specular_schlick_ggx, sss_mode_skin; +render_mode diffuse_burley, specular_schlick_ggx, sss_mode_skin; +group_uniforms gunk_material; uniform vec3 color_1: source_color = vec3(0.0, 0.03, 0.1); uniform vec3 color_2: source_color = vec3(0.0, 0.1, 0.3); uniform vec3 emission_color: source_color = vec3(0.25, 0.88, 1.0); @@ -24,6 +25,24 @@ uniform sampler2D gunk_mask; uniform highp sampler3D gunk_noise; uniform highp sampler3D gunk_normal_map; +group_uniforms jitter; +uniform mediump float jitter_magnitude = 0.0; +uniform lowp float jitter_time_scale = 0.1; + +uniform highp sampler3D jitter_noise; + +group_uniforms inflation; +uniform highp float vertex_inflation = 0.0; +uniform highp float inflation_pixellation = 10.0; + +void vertex() { + float mixer = VERTEX.x + 0.553 * VERTEX.z + 1.618 * VERTEX.y; + float local_time = floor(TIME * jitter_time_scale * time_pixellation) / time_pixellation; + float sample = texture(jitter_noise, vec3(cos(mixer), sin(mixer), local_time)).r; + float inflation = floor(vertex_inflation * inflation_pixellation) / inflation_pixellation; + float jitter = jitter_magnitude * (sample - 0.5 + inflation); + VERTEX *= 1.0 + jitter; +} float hardstep(float value) { float x = clamp(value, 0.0, 1.0); diff --git a/src/shaders/nodule.gdshader b/src/shaders/nodule.gdshader new file mode 100644 index 0000000..36f5299 --- /dev/null +++ b/src/shaders/nodule.gdshader @@ -0,0 +1,17 @@ +/* The shuddererrrrrrrr +*/ +shader_type spatial; + +uniform mediump float jitter_magnitude = 0.1; +uniform mediump float time_scale = 0.1; +uniform lowp float time_pixellation = 100.0; + +uniform highp sampler3D jitter_noise; + +void vertex() { + float mixer = VERTEX.x + 0.553 * VERTEX.z + 1.618 * VERTEX.y; + float local_time = floor(TIME * time_scale * time_pixellation) / time_pixellation; + float sample = texture(jitter_noise, vec3(cos(mixer), sin(mixer), local_time)).r; + float jitter = jitter_magnitude * (sample - 0.5); + VERTEX *= 1.0 + jitter; +} \ No newline at end of file diff --git a/src/shaders/nodule.gdshader.uid b/src/shaders/nodule.gdshader.uid new file mode 100644 index 0000000..ee1ebe6 --- /dev/null +++ b/src/shaders/nodule.gdshader.uid @@ -0,0 +1 @@ +uid://by1atykyt6fkx diff --git a/src/world/gunk_node/grunk_nodule.gd b/src/world/gunk_node/grunk_nodule.gd new file mode 100644 index 0000000..e594d9f --- /dev/null +++ b/src/world/gunk_node/grunk_nodule.gd @@ -0,0 +1,22 @@ +extends GunkNode + +@export var jitter_scale_factor := 0.02 +@export var jitter_inflation_factor := 1.0 + +@export var splatter_scene: PackedScene + +@onready var mesh_instance: MeshInstance3D = %MeshInstance3D + + +func _process(_delta: float) -> void: + var shader: ShaderMaterial = mesh_instance.mesh.surface_get_material(0) + var value := _sustained_damage / durability + shader.set_shader_parameter("jitter_time_scale", value * jitter_scale_factor) + shader.set_shader_parameter("vertex_inflation", value * jitter_inflation_factor) + + +func _destroy() -> void: + var splatter: GPUParticles3D = splatter_scene.instantiate() + add_sibling(splatter) + splatter.global_position = global_position + splatter.emitting = true diff --git a/src/world/gunk_node/grunk_nodule.gd.uid b/src/world/gunk_node/grunk_nodule.gd.uid new file mode 100644 index 0000000..61e093b --- /dev/null +++ b/src/world/gunk_node/grunk_nodule.gd.uid @@ -0,0 +1 @@ +uid://07t7yhijru8f diff --git a/src/world/gunk_node/grunk_nodule.tscn b/src/world/gunk_node/grunk_nodule.tscn new file mode 100644 index 0000000..f1d9d94 --- /dev/null +++ b/src/world/gunk_node/grunk_nodule.tscn @@ -0,0 +1,55 @@ +[gd_scene load_steps=7 format=4 uid="uid://2yqi5u5eo025"] + +[ext_resource type="Script" uid="uid://07t7yhijru8f" path="res://src/world/gunk_node/grunk_nodule.gd" id="1_m8r0a"] +[ext_resource type="Material" uid="uid://bmab6i16v748m" path="res://assets/materials/grunk_jittery.material" id="2_530fq"] +[ext_resource type="PackedScene" uid="uid://xlt78xc1tmkl" path="res://src/effects/grunk_splatter.tscn" id="2_iyr82"] + +[sub_resource type="ArrayMesh" id="ArrayMesh_24j8i"] +_surfaces = [{ +"aabb": AABB(-0.894425, -1, -0.85064, 1.78885, 2, 1.70128), +"format": 34896613377, +"index_count": 60, +"index_data": PackedByteArray("AAABAAIAAgABAAMAAQAAAAQAAwABAAUABQABAAQABAAAAAYABQAEAAcABwAEAAYAAwAFAAgACAAFAAcAAgADAAkACQADAAgAAAACAAoACgACAAkABgAAAAoACAAHAAsABwAGAAsACQAIAAsABgAKAAsACgAJAAsA"), +"name": "Icosphere", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 12, +"vertex_data": PackedByteArray("jOfBRhrPAAD/fwAA/38AAHJYwUb//wAAAADBRv9/AACM58FG5DAAAHJYwUYAAAAA//89uf9/AACMpz25AAAAAHIYPbnkMAAAchg9uRrPAACMpz25//8AAP9/////fwAA") +}] +blend_shape_mode = 0 + +[sub_resource type="ArrayMesh" id="ArrayMesh_iyr82"] +resource_local_to_scene = true +_surfaces = [{ +"aabb": AABB(-0.894425, -1, -0.85064, 1.78885, 2, 1.70128), +"attribute_data": PackedByteArray("0UWv14su//9FF6/XFl3//9FFr9dcdK/X//+v17no//9z0a/Xc9Gv1y26///ooq/X6KKv16KL//9cdK/XXHSv19FFr9cWXWCv0UWv10UXr9eLLmCv//+v13PRr9e56GCvc9Gv1+iir9ctumCv6KKv11x0r9eii2CvFl1gr9FFr9eLLmCviy5gr0UXr9cAAGCvuehgr3PRr9ctumCvLbpgr+iir9eii2Cvootgr1x0r9cWXWCvFl1gr4suYK/RRRGHiy5grwAAYK9FFxGHuehgry26YK9z0RGHLbpgr6KLYK/oohGHootgrxZdYK9cdBGH"), +"format": 34896613399, +"index_count": 60, +"index_data": PackedByteArray("AAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsA"), +"material": ExtResource("2_530fq"), +"name": "Icosphere", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 60, +"vertex_data": PackedByteArray("jOfBRhrPZaf/fwAA/39lp3JYwUb//2Wn/38AAP9/DciM58FGGs8NyIznwUbkMA3IcljBRv//nLT/fwAA/3+ctAAAwUb/f5y0AADBRv9/2N3/fwAA/3/Y3XJYwUYAANjdcljBRgAAiPT/fwAA/3+I9IznwUbkMIj0jOfBRuQwW8CM58FGGs9bwP//Pbn/f1vAjOfBRhrP6Y5yWMFG///pjoynPbn//+mOcljBRv//GacAAMFG/38Zp3IYPbkazxmnAADBRv9/yNlyWMFGAADI2XIYPbnkMMjZcljBRgAAQfOM58FG5DBB84ynPbkAAEHz//89uf9/GaeM58FGGs8Zp4ynPbn//xmnjKc9uf//6Y5yWMFG///pjnIYPbkaz+mOchg9uRrPW8AAAMFG/39bwHIYPbnkMFvAchg9ueQwQfNyWMFGAABB84ynPbkAAEHzjKc9uQAAyNmM58FG5DDI2f//Pbn/f8jZ//89uf9/nLSMpz25//+ctP9/////f5y0jKc9uf//ZadyGD25Gs9lp/9/////f2Wnchg9uRrPDchyGD255DANyP9/////fw3Ichg9ueQwiPSMpz25AACI9P9/////f4j0jKc9uQAA2N3//z25/3/Y3f9/////f9jdbylFZG8pRWRvKUVkLWCkPy1gpD8tYKQ/7DOZzewzmc3sM5nNSkmH7UpJh+1KSYftn3mdLp95nS6feZ0uz3VfFM91XxTPdV8UzFJcNMxSXDTMUlw092Nt7fdjbe33Y23t/2+Y+v9vmPr/b5j6RH6lDER+pQxEfqUMB5yREgeckRIHnJESMq2iyzKtossyraLLL4qf6y+Kn+svip/ruoFZ87qBWfO6gVnz/49mBf+PZgX/j2YFEsxlMhLMZTISzGUyj9a5m4/WuZuP1rmb0Z9awNGfWsDRn1rAX4Zh0V+GYdFfhmHRtLZ3ErS2dxK0tncS") +}] +blend_shape_mode = 0 +shadow_mesh = SubResource("ArrayMesh_24j8i") + +[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_530fq"] +data = PackedVector3Array(0.7236, -0.4472, 0.5257, 0, -1, 0, -0.2764, -0.4472, 0.8506, 0, -1, 0, 0.7236, -0.4472, 0.5257, 0.7236, -0.4472, -0.5257, -0.2764, -0.4472, 0.8506, 0, -1, 0, -0.8944, -0.4472, 0, -0.8944, -0.4472, 0, 0, -1, 0, -0.2764, -0.4472, -0.8506, -0.2764, -0.4472, -0.8506, 0, -1, 0, 0.7236, -0.4472, -0.5257, 0.7236, -0.4472, -0.5257, 0.7236, -0.4472, 0.5257, 0.8944, 0.4472, 0, 0.7236, -0.4472, 0.5257, -0.2764, -0.4472, 0.8506, 0.2764, 0.4472, 0.8506, -0.2764, -0.4472, 0.8506, -0.8944, -0.4472, 0, -0.7236, 0.4472, 0.5257, -0.8944, -0.4472, 0, -0.2764, -0.4472, -0.8506, -0.7236, 0.4472, -0.5257, -0.2764, -0.4472, -0.8506, 0.7236, -0.4472, -0.5257, 0.2764, 0.4472, -0.8506, 0.8944, 0.4472, 0, 0.7236, -0.4472, 0.5257, 0.2764, 0.4472, 0.8506, 0.2764, 0.4472, 0.8506, -0.2764, -0.4472, 0.8506, -0.7236, 0.4472, 0.5257, -0.7236, 0.4472, 0.5257, -0.8944, -0.4472, 0, -0.7236, 0.4472, -0.5257, -0.7236, 0.4472, -0.5257, -0.2764, -0.4472, -0.8506, 0.2764, 0.4472, -0.8506, 0.2764, 0.4472, -0.8506, 0.7236, -0.4472, -0.5257, 0.8944, 0.4472, 0, 0.8944, 0.4472, 0, 0.2764, 0.4472, 0.8506, 0, 1, 0, 0.2764, 0.4472, 0.8506, -0.7236, 0.4472, 0.5257, 0, 1, 0, -0.7236, 0.4472, 0.5257, -0.7236, 0.4472, -0.5257, 0, 1, 0, -0.7236, 0.4472, -0.5257, 0.2764, 0.4472, -0.8506, 0, 1, 0, 0.2764, 0.4472, -0.8506, 0.8944, 0.4472, 0, 0, 1, 0) + +[node name="GrunkNodule" type="StaticBody3D"] +collision_layer = 5 +script = ExtResource("1_m8r0a") +splatter_scene = ExtResource("2_iyr82") +durability = 3.0 +metadata/_custom_type_script = "uid://bypgxi0gy56yk" + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +unique_name_in_owner = true +sorting_offset = 1.0 +mesh = SubResource("ArrayMesh_iyr82") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("ConcavePolygonShape3D_530fq") diff --git a/src/world/gunk_node/gunk_node.gd b/src/world/gunk_node/gunk_node.gd new file mode 100644 index 0000000..5aad6d9 --- /dev/null +++ b/src/world/gunk_node/gunk_node.gd @@ -0,0 +1,54 @@ +class_name GunkNode extends StaticBody3D +## A static body which can be destroyed and collected by the player. + +## Emitted immediately after this node has been destroyed by the player, +## but before it's removed from the scene tree +signal destroyed + +const JITTER_FADE_RATE := 0.6 + +## Time in seconds the player must hit this node with a sustained beam before it's destroyed. +@export var durability := 1.0 + +## Value added to the player's grunk total on destruction. +@export var value := 1000.0 + +var _sustained_damage := 0.0 +var _hit_this_frame := false + + +## Called each frame this node takes a hit. +## +## Derived types should override `_hit()` as a lifecycle method. +func hit() -> void: + _hit_this_frame = true + _hit() + + +func _hit() -> void: + pass # Implemented in derived type + + +func _physics_process(delta: float) -> void: + if _hit_this_frame: + _sustained_damage += delta + else: + _sustained_damage *= JITTER_FADE_RATE + _hit_this_frame = false + + if _sustained_damage >= durability: + destroy() + + +## Destroy this node. Called automatically when this node sustains damage beyond its durability. +## +## Derived types should override `_destroy` as a lifecycle method. +func destroy() -> void: + Game.manager.collect_grunk(value) + _destroy() + destroyed.emit() + queue_free() + + +func _destroy() -> void: + pass # Implemented in derived type diff --git a/src/world/gunk_node/gunk_node.gd.uid b/src/world/gunk_node/gunk_node.gd.uid new file mode 100644 index 0000000..8ff01ef --- /dev/null +++ b/src/world/gunk_node/gunk_node.gd.uid @@ -0,0 +1 @@ +uid://bypgxi0gy56yk