diff --git a/levels/mechanic_test/mechanic_test.tscn b/levels/mechanic_test/mechanic_test.tscn index 2170ef2..337a6e1 100644 --- a/levels/mechanic_test/mechanic_test.tscn +++ b/levels/mechanic_test/mechanic_test.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=28 format=4 uid="uid://b8rv6dg4tgaeb"] +[gd_scene load_steps=42 format=4 uid="uid://b8rv6dg4tgaeb"] [ext_resource type="Script" uid="uid://bvua1l2hb3an6" path="res://levels/mechanic_test/mechanic_test.gd" id="1_bg05n"] [ext_resource type="PackedScene" uid="uid://bwe2jdmvinhqd" path="res://src/player/player.tscn" id="1_goufh"] @@ -8,6 +8,12 @@ [ext_resource type="Texture2D" uid="uid://8cm835h4gxwe" path="res://assets/debug_mask.png" id="5_x2vho"] [ext_resource type="FastNoiseLite" uid="uid://cnlvdtx68giv6" path="res://assets/materials/gunk_noise.tres" id="6_x2vho"] [ext_resource type="PackedScene" uid="uid://dvma1hufsl6mc" path="res://src/props/bulkhead/bulkhead.tscn" id="8_0j1ke"] +[ext_resource type="Texture2D" uid="uid://m2qxenym1otw" path="res://assets/level/wall/wall_2_C.png" id="9_cgmn0"] +[ext_resource type="Texture2D" uid="uid://begn6qloo0m1q" path="res://assets/level/wall/wall_2_M.png" id="10_aix42"] +[ext_resource type="PackedScene" uid="uid://bttust5ohud8e" path="res://src/world/mechanics/relay/gunk_relay.tscn" id="10_iyuyb"] +[ext_resource type="Texture2D" uid="uid://cpdrvdu3qt62t" path="res://assets/level/wall/wall_2_N.png" id="11_6frcc"] +[ext_resource type="PackedScene" uid="uid://dgeg3kkogm71m" path="res://src/world/mechanics/alarm/gunk_alarm.tscn" id="11_qjnj2"] +[ext_resource type="Texture2D" uid="uid://ba5vvrx730go8" path="res://assets/level/wall/wall_2_R.png" id="12_7cbja"] [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_goufh"] @@ -126,6 +132,92 @@ shadow_mesh = SubResource("ArrayMesh_0j1ke") [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_qjnj2"] 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) +[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_f342o"] +load_path = "res://.godot/imported/debug_mask.png-fd2bc783338ed9439fe81a4eef9d86da.s3tc.ctex" + +[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_iyuyb"] +width = 256 +height = 256 +depth = 32 +seamless = true +seamless_blend_skirt = 0.5 +noise = ExtResource("6_x2vho") + +[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_qjnj2"] +width = 256 +height = 256 +depth = 32 +seamless = true +seamless_blend_skirt = 0.5 +noise = ExtResource("6_x2vho") + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_awnx0"] +resource_local_to_scene = true +render_priority = 0 +shader = ExtResource("5_0j1ke") +shader_parameter/color_1 = Color(0, 0.03, 0.1, 1) +shader_parameter/color_2 = Color(0, 0.1, 0.3, 1) +shader_parameter/emission_color = Color(0.25, 0.88, 1, 1) +shader_parameter/pixellation = 128.0 +shader_parameter/time_pixellation = 30.0 +shader_parameter/roughness = 0.15 +shader_parameter/specular_contribution = 0.8 +shader_parameter/emission_strength = 0.02 +shader_parameter/uv_scale = Vector2(4, 4) +shader_parameter/time_scale = 0.2 +shader_parameter/edge_bleed = 0.25 +shader_parameter/gunk_mask = SubResource("CompressedTexture2D_f342o") +shader_parameter/gunk_noise = SubResource("NoiseTexture3D_iyuyb") +shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_qjnj2") +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_ujrcv"] +resource_local_to_scene = true +albedo_texture = ExtResource("9_cgmn0") +metallic = 1.0 +metallic_texture = ExtResource("10_aix42") +roughness_texture = ExtResource("12_7cbja") +normal_enabled = true +normal_texture = ExtResource("11_6frcc") +texture_filter = 4 + +[sub_resource type="ArrayMesh" id="ArrayMesh_ix0jw"] +_surfaces = [{ +"aabb": AABB(-1.5, 0, -1.5, 3, 1e-05, 3), +"format": 34896613377, +"index_count": 6, +"index_data": PackedByteArray("AAABAAIAAgABAAMA"), +"name": "Plane", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 4, +"vertex_data": PackedByteArray("//8AAP//AAAAAAAA//8AAP//AAAAAAAAAAAAAAAAAAA=") +}] +blend_shape_mode = 0 + +[sub_resource type="ArrayMesh" id="ArrayMesh_xrfi2"] +_surfaces = [{ +"aabb": AABB(-1.5, 0, -1.5, 3, 1e-05, 3), +"attribute_data": PackedByteArray("/////wAA/////wAAAAAAAA=="), +"format": 34896613399, +"index_count": 6, +"index_data": PackedByteArray("AAABAAIAAgABAAMA"), +"material": SubResource("StandardMaterial3D_ujrcv"), +"name": "Plane", +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 4, +"vertex_data": PackedByteArray("//8AAP///78AAAAA////v///AAAAAP+/AAAAAAAA/7////9/////f////3////9/") +}] +blend_shape_mode = 0 +shadow_mesh = SubResource("ArrayMesh_ix0jw") + +[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_x2vho"] +data = PackedVector3Array(1.5, 0, 1.5, -1.5, 0, 1.5, 1.5, 0, -1.5, 1.5, 0, -1.5, -1.5, 0, 1.5, -1.5, 0, -1.5) + [node name="MechanicTest" type="Node3D"] script = ExtResource("1_bg05n") @@ -276,6 +368,34 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.4, 0.35) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0.3) text = "Close" +[node name="SignalTest" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 0, -6) + +[node name="Wall" parent="SignalTest" instance=ExtResource("4_2uiim")] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 1.5, 0) +source_gunk_material = SubResource("ShaderMaterial_awnx0") + +[node name="MeshInstance3D" type="MeshInstance3D" parent="SignalTest/Wall"] +mesh = SubResource("ArrayMesh_xrfi2") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="SignalTest/Wall"] +shape = SubResource("ConcavePolygonShape3D_x2vho") + +[node name="WallSwitch" parent="SignalTest" instance=ExtResource("2_pka60")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.15, 1.45, 0.0999999) + +[node name="GunkRelay" parent="SignalTest" instance=ExtResource("10_iyuyb")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.45, 2.1, 0) + +[node name="GunkRelay2" parent="SignalTest" instance=ExtResource("10_iyuyb")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.15, 1.75, 0) + +[node name="GunkRelay3" parent="SignalTest" instance=ExtResource("10_iyuyb")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.2, 1.95, 0) + +[node name="GunkAlarm" parent="SignalTest" instance=ExtResource("11_qjnj2")] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0.9, 1.75, 0) + [connection signal="activated" from="ResetPodium/ResetSwitch" to="." method="reset"] [connection signal="activated" from="NoduleSpawner/WallSwitch" to="." method="spawn_nodule"] [connection signal="activated" from="AlarmSpawner/WallSwitch" to="." method="spawn_alarm"] @@ -286,3 +406,7 @@ text = "Close" [connection signal="activated" from="Bulkhead/Podium2/CloseSwitch" to="Bulkhead" method="close"] [connection signal="activated" from="Bulkhead/Podium2/CloseSwitch" to="Bulkhead/Podium/OpenSwitch" method="enable"] [connection signal="activated" from="Bulkhead/Podium2/CloseSwitch" to="Bulkhead/Podium2/CloseSwitch" method="disable"] +[connection signal="activated" from="SignalTest/WallSwitch" to="SignalTest/GunkRelay" method="trigger"] +[connection signal="triggered" from="SignalTest/GunkRelay" to="SignalTest/GunkRelay2" method="trigger"] +[connection signal="triggered" from="SignalTest/GunkRelay2" to="SignalTest/GunkRelay3" method="trigger"] +[connection signal="triggered" from="SignalTest/GunkRelay3" to="SignalTest/GunkAlarm" method="trigger"] diff --git a/src/world/mechanics/alarm/gunk_alarm.gd b/src/world/mechanics/alarm/gunk_alarm.gd index 1a0c822..db1214e 100644 --- a/src/world/mechanics/alarm/gunk_alarm.gd +++ b/src/world/mechanics/alarm/gunk_alarm.gd @@ -1,9 +1,6 @@ class_name GunkAlarm extends GunkNode ## Raises the grunk alert when triggered. -## Emitted when this alarm is triggered, just after the alert level is raised. -signal triggered - const ALERT_DELTA := 1 var _busy := false @@ -17,10 +14,9 @@ var _busy := false ## Will not trigger if this alarm is busy (e.g. on cooldown) func trigger() -> void: if not _busy: - Game.manager.raise_alert(ALERT_DELTA) _busy = true + Game.manager.raise_alert(ALERT_DELTA) animation_player.play("trigger") - triggered.emit() func _process(delta: float) -> void: diff --git a/src/world/mechanics/relay/gunk_relay.gd b/src/world/mechanics/relay/gunk_relay.gd new file mode 100644 index 0000000..abee019 --- /dev/null +++ b/src/world/mechanics/relay/gunk_relay.gd @@ -0,0 +1,20 @@ +extends GunkNode +## Gunk node that rebroadcasts triggers to the network after a delay. + +## Emitted when `trigger` is called, after a short delay. +signal triggered + +@onready var animation_player: AnimationPlayer = %AnimationPlayer +@onready var rebroadcast_delay: Timer = %RebroadcastDelay + + +## Trigger this relay. +## +## This will emit the `triggered` signal after a delay. +func trigger() -> void: + animation_player.play("trigger") + rebroadcast_delay.start() + + +func _on_rebroadcast_delay_timeout() -> void: + triggered.emit() diff --git a/src/world/mechanics/relay/gunk_relay.gd.uid b/src/world/mechanics/relay/gunk_relay.gd.uid new file mode 100644 index 0000000..c0d20e6 --- /dev/null +++ b/src/world/mechanics/relay/gunk_relay.gd.uid @@ -0,0 +1 @@ +uid://1oup50bp0pwd diff --git a/src/world/mechanics/relay/gunk_relay.tscn b/src/world/mechanics/relay/gunk_relay.tscn new file mode 100644 index 0000000..6a917d4 --- /dev/null +++ b/src/world/mechanics/relay/gunk_relay.tscn @@ -0,0 +1,80 @@ +[gd_scene load_steps=8 format=3 uid="uid://bttust5ohud8e"] + +[ext_resource type="Script" uid="uid://1oup50bp0pwd" path="res://src/world/mechanics/relay/gunk_relay.gd" id="1_rdv5j"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gk1l0"] +resource_local_to_scene = true +emission_enabled = true +emission = Color(1, 0, 0, 1) +emission_energy_multiplier = 0.0 + +[sub_resource type="SphereMesh" id="SphereMesh_hsruj"] +resource_local_to_scene = true +material = SubResource("StandardMaterial3D_gk1l0") +radius = 0.1 +height = 0.2 + +[sub_resource type="SphereShape3D" id="SphereShape3D_gk1l0"] +radius = 0.1 + +[sub_resource type="Animation" id="Animation_rdv5j"] +resource_name = "trigger" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("MeshInstance3D:mesh:material:emission_energy_multiplier") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.166667, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 2.0, 0.0] +} + +[sub_resource type="Animation" id="Animation_ipm58"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("MeshInstance3D:mesh:material:emission_energy_multiplier") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ipm58"] +_data = { +&"RESET": SubResource("Animation_ipm58"), +&"trigger": SubResource("Animation_rdv5j") +} + +[node name="GunkRelay" type="StaticBody3D"] +collision_layer = 5 +script = ExtResource("1_rdv5j") +durability = 0.8 +value = 800.0 +metadata/_custom_type_script = "uid://cs6y5mt7bx1yl" + +[node name="MeshInstance3D" type="MeshInstance3D" parent="."] +mesh = SubResource("SphereMesh_hsruj") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("SphereShape3D_gk1l0") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +unique_name_in_owner = true +libraries = { +&"": SubResource("AnimationLibrary_ipm58") +} + +[node name="RebroadcastDelay" type="Timer" parent="."] +unique_name_in_owner = true +wait_time = 0.2 +one_shot = true + +[connection signal="timeout" from="RebroadcastDelay" to="." method="_on_rebroadcast_delay_timeout"]