diff --git a/asset_dev/grunk_nodes/alarm/alarm_core.xcf b/asset_dev/grunk_nodes/alarm/alarm_core.xcf index eb250c4..7f7ad55 100644 Binary files a/asset_dev/grunk_nodes/alarm/alarm_core.xcf and b/asset_dev/grunk_nodes/alarm/alarm_core.xcf differ diff --git a/assets/grunk/alarm/alarm_core.material b/assets/grunk/alarm/alarm_core.material index 9f511ac..9215dcd 100644 Binary files a/assets/grunk/alarm/alarm_core.material and b/assets/grunk/alarm/alarm_core.material differ diff --git a/assets/grunk/alarm/alarm_core_E.png b/assets/grunk/alarm/alarm_core_E.png new file mode 100644 index 0000000..ec5d1cb --- /dev/null +++ b/assets/grunk/alarm/alarm_core_E.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c2585ac226ebdf9fa0297bd2372a837cec2db6b9b2c69586c37ad74ba3206a0 +size 14573 diff --git a/assets/grunk/alarm/alarm_core_E.png.import b/assets/grunk/alarm/alarm_core_E.png.import new file mode 100644 index 0000000..da6e83e --- /dev/null +++ b/assets/grunk/alarm/alarm_core_E.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vvcv5kyi4jvl" +path="res://.godot/imported/alarm_core_E.png-6e652d56d7fcc875e433f96b391d744d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/grunk/alarm/alarm_core_E.png" +dest_files=["res://.godot/imported/alarm_core_E.png-6e652d56d7fcc875e433f96b391d744d.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=false +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/src/world/mechanics/alarm/gunk_alarm.gd b/src/world/mechanics/alarm/gunk_alarm.gd index 09ce59c..60d4650 100644 --- a/src/world/mechanics/alarm/gunk_alarm.gd +++ b/src/world/mechanics/alarm/gunk_alarm.gd @@ -7,15 +7,14 @@ const ALERT_DELTA := 1 const JITTER_SCALE_FACTOR := 0.15 const JITTER_INFLATION_FACTOR := 1.5 -## Time to wait for a pulse signal before triggering. -@export var pulse_timeout := 6.0 - var _busy := false @onready var pulse_listener_timer: Timer = %PulseListenerTimer -@onready var animation_player: AnimationPlayer = $FrameSkipper/AlarmMesh/AnimationPlayer -@onready var effect_animation: AnimationPlayer = %EffectAnimation -@onready var bud: MeshInstance3D = $FrameSkipper/AlarmMesh/Armature/Skeleton3D/Bud +@onready var animation_player: AnimationPlayer = $FrameSkipper/Rumbler3D/AlarmMesh/AnimationPlayer +@onready var trigger_animation: AnimationPlayer = %TriggerAnimation +@onready var pulse_animation: AnimationPlayer = %PulseAnimation + +@onready var bud: MeshInstance3D = $FrameSkipper/Rumbler3D/AlarmMesh/Armature/Skeleton3D/Bud @onready var alarm_sfx: AudioStreamPlayer3D = %AlarmSFX @@ -27,7 +26,7 @@ func trigger() -> void: _busy = true Game.manager.raise_alert(ALERT_DELTA) animation_player.play("trigger") - effect_animation.play("trigger") + trigger_animation.play("trigger") alarm_sfx.play() @@ -36,7 +35,8 @@ func trigger() -> void: ## Note that alarms will not begin the pulse countdown until receiving the first pulse. ## On networks without a heart, the pulse timeout will be completely ignored. func pulse() -> void: - pulse_listener_timer.start(pulse_timeout) + pulse_animation.seek(0) + pulse_animation.play("pulse") func _process(delta: float) -> void: diff --git a/src/world/mechanics/alarm/gunk_alarm.tscn b/src/world/mechanics/alarm/gunk_alarm.tscn index 1d9fc9a..1da2c0d 100644 --- a/src/world/mechanics/alarm/gunk_alarm.tscn +++ b/src/world/mechanics/alarm/gunk_alarm.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=12 format=3 uid="uid://dgeg3kkogm71m"] +[gd_scene load_steps=16 format=3 uid="uid://dgeg3kkogm71m"] [ext_resource type="Script" uid="uid://djb5tabjcvwkt" path="res://src/world/mechanics/alarm/gunk_alarm.gd" id="1_piaxx"] [ext_resource type="PackedScene" uid="uid://60ks4l42qxia" path="res://assets/grunk/alarm/alarm.gltf" id="2_6vdvf"] [ext_resource type="Script" uid="uid://bukihqt1lybnx" path="res://src/util/frame_skipper.gd" id="2_gujky"] [ext_resource type="Material" uid="uid://bmab6i16v748m" path="res://assets/materials/grunk_jittery.material" id="3_g4yos"] +[ext_resource type="Script" uid="uid://b274q7uvn0cvp" path="res://src/ui/rumbler_3d.gd" id="3_vokcn"] [ext_resource type="Material" uid="uid://cdpvcruywnp4x" path="res://assets/grunk/alarm/alarm_core.material" id="5_6vdvf"] [ext_resource type="AudioStream" uid="uid://ypk1d4adrcs" path="res://assets/sfx/grunk/alarm_screech.wav" id="6_6vdvf"] @@ -12,7 +13,7 @@ length = 0.001 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("FrameSkipper/AlarmMesh/Armature/Skeleton3D/Bud:surface_material_override/0:shader_parameter/emission_color") +tracks/0/path = NodePath("FrameSkipper/Rumbler3D/AlarmMesh/Armature/Skeleton3D/Bud:surface_material_override/0:shader_parameter/emission_color") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -24,7 +25,7 @@ tracks/0/keys = { tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("FrameSkipper/AlarmMesh/Armature/Skeleton3D/Bud:surface_material_override/0:shader_parameter/emission_strength") +tracks/1/path = NodePath("FrameSkipper/Rumbler3D/AlarmMesh/Armature/Skeleton3D/Bud:surface_material_override/0:shader_parameter/emission_strength") tracks/1/interp = 1 tracks/1/loop_wrap = true tracks/1/keys = { @@ -40,7 +41,7 @@ length = 10.0 tracks/0/type = "value" tracks/0/imported = false tracks/0/enabled = true -tracks/0/path = NodePath("FrameSkipper/AlarmMesh/Armature/Skeleton3D/Bud:surface_material_override/0:shader_parameter/emission_color") +tracks/0/path = NodePath("FrameSkipper/Rumbler3D/AlarmMesh/Armature/Skeleton3D/Bud:surface_material_override/0:shader_parameter/emission_color") tracks/0/interp = 1 tracks/0/loop_wrap = true tracks/0/keys = { @@ -52,7 +53,7 @@ tracks/0/keys = { tracks/1/type = "value" tracks/1/imported = false tracks/1/enabled = true -tracks/1/path = NodePath("FrameSkipper/AlarmMesh/Armature/Skeleton3D/Bud:surface_material_override/0:shader_parameter/emission_strength") +tracks/1/path = NodePath("FrameSkipper/Rumbler3D/AlarmMesh/Armature/Skeleton3D/Bud:surface_material_override/0:shader_parameter/emission_strength") tracks/1/interp = 2 tracks/1/loop_wrap = true tracks/1/keys = { @@ -68,6 +69,171 @@ _data = { &"trigger": SubResource("Animation_6vdvf") } +[sub_resource type="Animation" id="Animation_vokcn"] +resource_name = "pulse" +length = 9.0 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Rumbler3D/AlarmMesh/Armature/Skeleton3D/Bud:surface_material_override/1:emission_energy_multiplier") +tracks/0/interp = 2 +tracks/0/loop_wrap = false +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.166667, 3.5, 6, 9), +"transitions": PackedFloat32Array(1.618, 0.618, 4, 0.554785, 1), +"update": 0, +"values": [0.02, 2.0, 0.0, 40.0, 0.02] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Rumbler3D/AlarmMesh/Armature/Skeleton3D/Bud:surface_material_override/1:emission") +tracks/1/interp = 1 +tracks/1/loop_wrap = false +tracks/1/keys = { +"times": PackedFloat32Array(0, 1.6, 1.63333, 8.5, 9), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Color(0.25098, 0.878431, 1, 1), Color(0.25098, 0.878431, 1, 1), Color(1, 0.25098, 0.262745, 1), Color(1, 0.25098, 0.262745, 1), Color(0.25098, 0.878431, 1, 1)] +} +tracks/2/type = "method" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("..") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(6), +"transitions": PackedFloat32Array(1), +"values": [{ +"args": [], +"method": &"trigger" +}] +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Rumbler3D/AlarmMesh:scale:x") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0), +"points": PackedFloat32Array(1, -0.25, 0, 0, -0.00028199, 1.05, -0.15, 0, 0.25, 0, 1, -0.4, -0.05, 0.25, 0.05, 1, -0.25, -0.025, 0.095, 0.01, 0.9, 0, 0.1, 0, 0.25, 1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.166667, 0.966667, 2.2, 6, 9) +} +tracks/4/type = "bezier" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Rumbler3D/AlarmMesh:scale:y") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0), +"points": PackedFloat32Array(1, -0.25, 0, 0, 0, 1.05, -0.15, 0, 0.25, 0, 1, -0.4, -0.05, 0.25, 0.05, 1, -0.25, -0.025, 0.095, 0.01, 0.9, 0, 0.1, 0, 0.25, 1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.4, 1.2, 2.2, 6, 9) +} +tracks/5/type = "bezier" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Rumbler3D/AlarmMesh:scale:z") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"handle_modes": PackedInt32Array(0, 0, 0, 0, 0, 0), +"points": PackedFloat32Array(1, -0.25, 0, 0, 0, 1.05, -0.15, 0, 0.25, 0, 1, -0.4, -0.05, 0.25, 0.05, 1, -0.25, -0.025, 0.095, 0.01, 0.9, 0, 0.1, 0, 0.25, 1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0, 0.633333, 1.43333, 2.2, 6, 9) +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Rumbler3D:intensity") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(3.5, 6, 9), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.002, 0.0] +} + +[sub_resource type="Animation" id="Animation_bknln"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Rumbler3D/AlarmMesh/Armature/Skeleton3D/Bud:surface_material_override/1: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.02] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Rumbler3D/AlarmMesh/Armature/Skeleton3D/Bud:surface_material_override/1:emission") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(0.25098, 0.878431, 1, 1)] +} +tracks/2/type = "bezier" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Rumbler3D/AlarmMesh:scale:x") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/3/type = "bezier" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Rumbler3D/AlarmMesh:scale:y") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/4/type = "bezier" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Rumbler3D/AlarmMesh:scale:z") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"handle_modes": PackedInt32Array(0), +"points": PackedFloat32Array(1, -0.25, 0, 0.25, 0), +"times": PackedFloat32Array(0) +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Rumbler3D:intensity") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_bknln"] +_data = { +&"RESET": SubResource("Animation_bknln"), +&"pulse": SubResource("Animation_vokcn") +} + [sub_resource type="SphereMesh" id="SphereMesh_b6er8"] radius = 0.285 height = 0.44 @@ -88,11 +254,15 @@ metadata/_custom_type_script = "uid://bypgxi0gy56yk" [node name="FrameSkipper" type="Node3D" parent="."] script = ExtResource("2_gujky") -[node name="AlarmMesh" parent="FrameSkipper" instance=ExtResource("2_6vdvf")] +[node name="Rumbler3D" type="Node3D" parent="FrameSkipper"] +script = ExtResource("3_vokcn") +metadata/_custom_type_script = "uid://b274q7uvn0cvp" + +[node name="AlarmMesh" parent="FrameSkipper/Rumbler3D" instance=ExtResource("2_6vdvf")] unique_name_in_owner = true transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 0.035, 0) -[node name="Skeleton3D" parent="FrameSkipper/AlarmMesh/Armature" index="0"] +[node name="Skeleton3D" parent="FrameSkipper/Rumbler3D/AlarmMesh/Armature" index="0"] bones/1/rotation = Quaternion(0.615412, 8.96411e-08, 6.99896e-08, 0.788205) bones/2/rotation = Quaternion(6.23537e-08, 0.911935, -0.410335, 6.88492e-08) bones/3/rotation = Quaternion(0.388328, -7.55108e-08, -2.12852e-09, 0.921521) @@ -121,15 +291,15 @@ bones/26/rotation = Quaternion(-8.38833e-08, 0.911935, -0.410335, -6.97367e-08) bones/27/rotation = Quaternion(0.388328, 2.1633e-07, -1.09183e-07, 0.921521) bones/28/rotation = Quaternion(0.362943, -7.93195e-08, 1.03952e-07, 0.931811) -[node name="Bud" parent="FrameSkipper/AlarmMesh/Armature/Skeleton3D" index="0"] +[node name="Bud" parent="FrameSkipper/Rumbler3D/AlarmMesh/Armature/Skeleton3D" index="0"] gi_mode = 2 surface_material_override/0 = ExtResource("3_g4yos") surface_material_override/1 = ExtResource("5_6vdvf") -[node name="AnimationPlayer" parent="FrameSkipper/AlarmMesh" index="1"] +[node name="AnimationPlayer" parent="FrameSkipper/Rumbler3D/AlarmMesh" index="1"] speed_scale = 7.4 -[node name="EffectAnimation" type="AnimationPlayer" parent="FrameSkipper"] +[node name="TriggerAnimation" type="AnimationPlayer" parent="FrameSkipper"] unique_name_in_owner = true root_node = NodePath("../..") libraries = { @@ -137,6 +307,13 @@ libraries = { } speed_scale = 7.4 +[node name="PulseAnimation" type="AnimationPlayer" parent="FrameSkipper"] +unique_name_in_owner = true +libraries = { +&"": SubResource("AnimationLibrary_bknln") +} +speed_scale = 2.0 + [node name="CollisionMesh" type="MeshInstance3D" parent="."] transform = Transform3D(0.906308, 0, -0.422618, 0, 1, 0, 0.422618, 0, 0.906308, 0, 0.2, 0) visible = false @@ -155,7 +332,7 @@ unique_name_in_owner = true stream = ExtResource("6_6vdvf") pitch_scale = 1.1 -[connection signal="animation_finished" from="FrameSkipper/AlarmMesh/AnimationPlayer" to="." method="_on_animation_finished"] +[connection signal="animation_finished" from="FrameSkipper/Rumbler3D/AlarmMesh/AnimationPlayer" to="." method="_on_animation_finished"] [connection signal="timeout" from="PulseListenerTimer" to="." method="trigger"] -[editable path="FrameSkipper/AlarmMesh"] +[editable path="FrameSkipper/Rumbler3D/AlarmMesh"]