Compare commits

..

No commits in common. "fb4b81d78cfb217e67c992426758ea708f0b1882" and "aa21c04c0fe8e4cbccf85dd97772471983c25f9b" have entirely different histories.

22 changed files with 208 additions and 19742 deletions

BIN
assets/grunk/listener/animations/RESET.res (Stored with Git LFS)

Binary file not shown.

BIN
assets/grunk/listener/animations/close.res (Stored with Git LFS)

Binary file not shown.

BIN
assets/grunk/listener/animations/idle.res (Stored with Git LFS)

Binary file not shown.

BIN
assets/grunk/listener/animations/open.res (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

BIN
assets/sfx/tools/pop.wav (Stored with Git LFS)

Binary file not shown.

View File

@ -1,24 +0,0 @@
[remap]
importer="wav"
type="AudioStreamWAV"
uid="uid://bmoel4uoncjgj"
path="res://.godot/imported/pop.wav-a125111ccb70bb530d8a9a1e740af87f.sample"
[deps]
source_file="res://assets/sfx/tools/pop.wav"
dest_files=["res://.godot/imported/pop.wav-a125111ccb70bb530d8a9a1e740af87f.sample"]
[params]
force/8_bit=false
force/mono=false
force/max_rate=false
force/max_rate_hz=44100
edit/trim=false
edit/normalize=false
edit/loop_mode=0
edit/loop_begin=0
edit/loop_end=-1
compress/mode=2

View File

@ -330,7 +330,6 @@ mesh_instance = NodePath("../..")
source_gunk_material = SubResource("ShaderMaterial_67o2j") source_gunk_material = SubResource("ShaderMaterial_67o2j")
[node name="Puzzle" type="Node3D" parent="ListenerWall"] [node name="Puzzle" type="Node3D" parent="ListenerWall"]
transform = Transform3D(0, 4.37114e-08, 1, -4.37114e-08, 1, -4.37114e-08, -1, -4.37114e-08, 1.91069e-15, 0, 0, 0)
[node name="Listener" parent="ListenerWall/Puzzle" instance=ExtResource("12_e8utx")] [node name="Listener" parent="ListenerWall/Puzzle" instance=ExtResource("12_e8utx")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.37114e-08, 1) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 4.37114e-08, 1)

View File

@ -1,11 +1,11 @@
[gd_scene load_steps=5 format=3 uid="uid://cbtmhu787diev"] [gd_scene load_steps=5 format=3 uid="uid://cbtmhu787diev"]
[ext_resource type="AudioStream" uid="uid://bmoel4uoncjgj" path="res://assets/sfx/tools/pop.wav" id="1_y7it3"] [ext_resource type="AudioStream" uid="uid://cj6rj8ujl60e3" path="res://assets/sfx/tools/collect2.wav" id="1_y7it3"]
[ext_resource type="Script" uid="uid://dwt66u7ua1to4" path="res://src/player/grunk_collection_sfx/grunk_collection_sfx.gd" id="5_ihwko"] [ext_resource type="Script" uid="uid://dwt66u7ua1to4" path="res://src/player/grunk_collection_sfx/grunk_collection_sfx.gd" id="5_ihwko"]
[sub_resource type="Curve" id="Curve_y7it3"] [sub_resource type="Curve" id="Curve_y7it3"]
_limits = [0.0, 2.4, 0.0, 1.0] _limits = [0.0, 2.4, 0.0, 1.0]
_data = [Vector2(0, 0.3), 0.0, 4.59122, 0, 0, Vector2(0.125, 0.5), 0.0, 0.0, 0, 0, Vector2(0.5, 0.5), 0.0, 0.0, 0, 0, Vector2(1, 1.23259), 5.30372, 0.0, 0, 0] _data = [Vector2(0, 1), 0.0, 8.88538, 0, 0, Vector2(0.125, 1.4), 0.0, 0.0, 0, 0, Vector2(0.5, 1.4), 0.0, 0.0, 0, 0, Vector2(1, 2.4), 6.54458, 0.0, 0, 0]
point_count = 4 point_count = 4
[sub_resource type="FastNoiseLite" id="FastNoiseLite_y7it3"] [sub_resource type="FastNoiseLite" id="FastNoiseLite_y7it3"]
@ -16,8 +16,6 @@ volume_db = -4.0
max_polyphony = 3 max_polyphony = 3
bus = &"SFX" bus = &"SFX"
script = ExtResource("5_ihwko") script = ExtResource("5_ihwko")
delay_mean = 0.4
delay_st_dev = 0.2
base_pitch_curve = SubResource("Curve_y7it3") base_pitch_curve = SubResource("Curve_y7it3")
noise = SubResource("FastNoiseLite_y7it3") noise = SubResource("FastNoiseLite_y7it3")

View File

@ -771,7 +771,6 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0518835, 0)
[node name="FootstepGameSoundEmitter" type="Area3D" parent="FootstepController"] [node name="FootstepGameSoundEmitter" type="Area3D" parent="FootstepController"]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
collision_layer = 0 collision_layer = 0
collision_mask = 16 collision_mask = 16
script = ExtResource("31_wcxbk") script = ExtResource("31_wcxbk")
@ -838,3 +837,4 @@ stream = ExtResource("39_gsylq")
pitch_scale = 1.8 pitch_scale = 1.8
[node name="GrunkCollectionSFX" parent="." instance=ExtResource("40_utg71")] [node name="GrunkCollectionSFX" parent="." instance=ExtResource("40_utg71")]
interval = 160

View File

@ -4,44 +4,27 @@ extends GunkNode
signal triggered signal triggered
const JITTER_SCALE_FACTOR := 0.15
const JITTER_INFLATION_FACTOR := 1.1
@export var quick_connect_to: SignalNode: @export var quick_connect_to: SignalNode:
set = _editor_connect set = _editor_connect
# NOTE
# trigger oscillation animation was generated using the formula
# f(x) = e^(-0.25x) * cos(x * pi / 2 - pi/2) + 1 for x in {0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 20}
@onready var trigger_animation_player: AnimationPlayer = %TriggerAnimationPlayer
@onready var cooldown_timer: Timer = %CooldownTimer @onready var cooldown_timer: Timer = %CooldownTimer
@onready var listener_model: ListenerModel = %ListenerModel
@onready var ping_animation: AnimationPlayer = %PingAnimation
@onready var listener_mesh: MeshInstance3D = $ListenerModel/Armature/Skeleton3D/Listener
func _on_sound_detected(source: Vector3) -> void:
listener_model.lock_target(source)
if cooldown_timer.is_stopped():
trigger()
cooldown_timer.start()
func trigger() -> void: func trigger() -> void:
if not cooldown_timer.is_stopped():
return
# TODO play sfx # TODO play sfx
ping_animation.play("ping")
trigger_animation_player.play("trigger")
triggered.emit() triggered.emit()
cooldown_timer.start()
func _editor_connect(node: SignalNode) -> void: func _editor_connect(node: SignalNode) -> void:
triggered.connect(node.trigger, CONNECT_PERSIST) triggered.connect(node.trigger, CONNECT_PERSIST)
self.notify_property_list_changed() self.notify_property_list_changed()
func _process(delta: float) -> void:
if Engine.is_editor_hint():
return
super._process(delta)
# TODO actual model & animation
var shader: ShaderMaterial = listener_mesh.get_surface_override_material(0)
var damage := pct_damage()
shader.set_shader_parameter("jitter_time_scale", pow(damage * JITTER_SCALE_FACTOR, 1.2))
shader.set_shader_parameter("vertex_inflation", pow(damage * JITTER_INFLATION_FACTOR, 3))
# TODO pulse animation

View File

@ -1,69 +1,74 @@
[gd_scene load_steps=25 format=3 uid="uid://kctp5erogwcb"] [gd_scene load_steps=19 format=3 uid="uid://kctp5erogwcb"]
[ext_resource type="Script" uid="uid://bde7cglaqobkd" path="res://src/world/mechanics/listener/listener.gd" id="1_htscg"] [ext_resource type="Script" uid="uid://bde7cglaqobkd" path="res://src/world/mechanics/listener/listener.gd" id="1_htscg"]
[ext_resource type="Script" uid="uid://cfsiyhhrcua6o" path="res://src/world/game_sound/game_sound_listener.gd" id="2_htscg"] [ext_resource type="Script" uid="uid://cfsiyhhrcua6o" path="res://src/world/game_sound/game_sound_listener.gd" id="2_htscg"]
[ext_resource type="Texture2D" uid="uid://c31gdstf55x5" path="res://assets/particles/ping.png" id="3_2ibh1"] [ext_resource type="Texture2D" uid="uid://c31gdstf55x5" path="res://assets/particles/ping.png" id="3_2ibh1"]
[ext_resource type="PackedScene" uid="uid://c2c0ooj1re3dk" path="res://src/world/mechanics/listener/listener_model.tscn" id="3_r42ft"]
[ext_resource type="Shader" uid="uid://ckxc0ngd37rtk" path="res://src/shaders/gunk.gdshader" id="4_pp7wn"] [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_2ibh1"]
[ext_resource type="Texture2D" uid="uid://cm1jrvx7ftx4c" path="res://assets/black.png" id="5_c5snp"] data = PackedVector3Array(0, 0.05, 0.25, 0.0957, 0.05, 0.231, 0, -0.05, 0.2, 0.0957, 0.05, 0.231, 0.0765, -0.05, 0.1848, 0, -0.05, 0.2, 0.0957, 0.05, 0.231, 0.1768, 0.05, 0.1768, 0.0765, -0.05, 0.1848, 0.1768, 0.05, 0.1768, 0.1414, -0.05, 0.1414, 0.0765, -0.05, 0.1848, 0.1768, 0.05, 0.1768, 0.231, 0.05, 0.0957, 0.1414, -0.05, 0.1414, 0.231, 0.05, 0.0957, 0.1848, -0.05, 0.0765, 0.1414, -0.05, 0.1414, 0.231, 0.05, 0.0957, 0.25, 0.05, 0, 0.1848, -0.05, 0.0765, 0.25, 0.05, 0, 0.2, -0.05, 0, 0.1848, -0.05, 0.0765, 0.25, 0.05, 0, 0.231, 0.05, -0.0957, 0.2, -0.05, 0, 0.231, 0.05, -0.0957, 0.1848, -0.05, -0.0765, 0.2, -0.05, 0, 0.231, 0.05, -0.0957, 0.1768, 0.05, -0.1768, 0.1848, -0.05, -0.0765, 0.1768, 0.05, -0.1768, 0.1414, -0.05, -0.1414, 0.1848, -0.05, -0.0765, 0.1768, 0.05, -0.1768, 0.0957, 0.05, -0.231, 0.1414, -0.05, -0.1414, 0.0957, 0.05, -0.231, 0.0765, -0.05, -0.1848, 0.1414, -0.05, -0.1414, 0.0957, 0.05, -0.231, 0, 0.05, -0.25, 0.0765, -0.05, -0.1848, 0, 0.05, -0.25, 0, -0.05, -0.2, 0.0765, -0.05, -0.1848, 0, 0.05, -0.25, -0.0957, 0.05, -0.231, 0, -0.05, -0.2, -0.0957, 0.05, -0.231, -0.0765, -0.05, -0.1848, 0, -0.05, -0.2, -0.0957, 0.05, -0.231, -0.1768, 0.05, -0.1768, -0.0765, -0.05, -0.1848, -0.1768, 0.05, -0.1768, -0.1414, -0.05, -0.1414, -0.0765, -0.05, -0.1848, -0.1768, 0.05, -0.1768, -0.231, 0.05, -0.0957, -0.1414, -0.05, -0.1414, -0.231, 0.05, -0.0957, -0.1848, -0.05, -0.0765, -0.1414, -0.05, -0.1414, -0.231, 0.05, -0.0957, -0.25, 0.05, 0, -0.1848, -0.05, -0.0765, -0.25, 0.05, 0, -0.2, -0.05, 0, -0.1848, -0.05, -0.0765, -0.25, 0.05, 0, -0.231, 0.05, 0.0957, -0.2, -0.05, 0, -0.231, 0.05, 0.0957, -0.1848, -0.05, 0.0765, -0.2, -0.05, 0, -0.231, 0.05, 0.0957, -0.1768, 0.05, 0.1768, -0.1848, -0.05, 0.0765, -0.1768, 0.05, 0.1768, -0.1414, -0.05, 0.1414, -0.1848, -0.05, 0.0765, -0.1768, 0.05, 0.1768, -0.0957, 0.05, 0.231, -0.1414, -0.05, 0.1414, -0.0957, 0.05, 0.231, -0.0765, -0.05, 0.1848, -0.1414, -0.05, 0.1414, -0.0957, 0.05, 0.231, 0, 0.05, 0.25, -0.0765, -0.05, 0.1848, 0, 0.05, 0.25, 0, -0.05, 0.2, -0.0765, -0.05, 0.1848, 0, 0.05, 0, 0.0957, 0.05, 0.231, 0, 0.05, 0.25, 0, 0.05, 0, 0.1768, 0.05, 0.1768, 0.0957, 0.05, 0.231, 0, 0.05, 0, 0.231, 0.05, 0.0957, 0.1768, 0.05, 0.1768, 0, 0.05, 0, 0.25, 0.05, 0, 0.231, 0.05, 0.0957, 0, 0.05, 0, 0.231, 0.05, -0.0957, 0.25, 0.05, 0, 0, 0.05, 0, 0.1768, 0.05, -0.1768, 0.231, 0.05, -0.0957, 0, 0.05, 0, 0.0957, 0.05, -0.231, 0.1768, 0.05, -0.1768, 0, 0.05, 0, 0, 0.05, -0.25, 0.0957, 0.05, -0.231, 0, 0.05, 0, -0.0957, 0.05, -0.231, 0, 0.05, -0.25, 0, 0.05, 0, -0.1768, 0.05, -0.1768, -0.0957, 0.05, -0.231, 0, 0.05, 0, -0.231, 0.05, -0.0957, -0.1768, 0.05, -0.1768, 0, 0.05, 0, -0.25, 0.05, 0, -0.231, 0.05, -0.0957, 0, 0.05, 0, -0.231, 0.05, 0.0957, -0.25, 0.05, 0, 0, 0.05, 0, -0.1768, 0.05, 0.1768, -0.231, 0.05, 0.0957, 0, 0.05, 0, -0.0957, 0.05, 0.231, -0.1768, 0.05, 0.1768, 0, 0.05, 0, 0, 0.05, 0.25, -0.0957, 0.05, 0.231, 0, -0.05, 0, 0, -0.05, 0.2, 0.0765, -0.05, 0.1848, 0, -0.05, 0, 0.0765, -0.05, 0.1848, 0.1414, -0.05, 0.1414, 0, -0.05, 0, 0.1414, -0.05, 0.1414, 0.1848, -0.05, 0.0765, 0, -0.05, 0, 0.1848, -0.05, 0.0765, 0.2, -0.05, 0, 0, -0.05, 0, 0.2, -0.05, 0, 0.1848, -0.05, -0.0765, 0, -0.05, 0, 0.1848, -0.05, -0.0765, 0.1414, -0.05, -0.1414, 0, -0.05, 0, 0.1414, -0.05, -0.1414, 0.0765, -0.05, -0.1848, 0, -0.05, 0, 0.0765, -0.05, -0.1848, 0, -0.05, -0.2, 0, -0.05, 0, 0, -0.05, -0.2, -0.0765, -0.05, -0.1848, 0, -0.05, 0, -0.0765, -0.05, -0.1848, -0.1414, -0.05, -0.1414, 0, -0.05, 0, -0.1414, -0.05, -0.1414, -0.1848, -0.05, -0.0765, 0, -0.05, 0, -0.1848, -0.05, -0.0765, -0.2, -0.05, 0, 0, -0.05, 0, -0.2, -0.05, 0, -0.1848, -0.05, 0.0765, 0, -0.05, 0, -0.1848, -0.05, 0.0765, -0.1414, -0.05, 0.1414, 0, -0.05, 0, -0.1414, -0.05, 0.1414, -0.0765, -0.05, 0.1848, 0, -0.05, 0, -0.0765, -0.05, 0.1848, 0, -0.05, 0.2)
[ext_resource type="FastNoiseLite" uid="uid://cnlvdtx68giv6" path="res://assets/materials/gunk_noise.tres" id="6_m4i7y"]
[sub_resource type="SphereShape3D" id="SphereShape3D_2ibh1"] [sub_resource type="SphereShape3D" id="SphereShape3D_2ibh1"]
radius = 1.0 radius = 1.0
[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_2roq2"] [sub_resource type="CylinderMesh" id="CylinderMesh_ud3xk"]
width = 256 top_radius = 0.25
height = 256 bottom_radius = 0.2
depth = 32 height = 0.1
seamless = true radial_segments = 16
seamless_blend_skirt = 0.5 rings = 0
noise = ExtResource("6_m4i7y")
[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_fk1xc"] [sub_resource type="Animation" id="Animation_2ibh1"]
width = 256 length = 0.001
height = 256 tracks/0/type = "value"
depth = 32 tracks/0/imported = false
seamless = true tracks/0/enabled = true
seamless_blend_skirt = 0.5 tracks/0/path = NodePath("CollisionShape3D:scale")
noise = ExtResource("6_m4i7y") tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(1, 1, 1)]
}
[sub_resource type="FastNoiseLite" id="FastNoiseLite_7fplw"] [sub_resource type="Animation" id="Animation_htscg"]
frequency = 0.0703 resource_name = "trigger"
length = 2.0
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("CollisionShape3D:scale")
tracks/0/interp = 2
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.9, 2),
"transitions": PackedFloat32Array(0.618, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 0,
"values": [Vector3(1, 1, 1), Vector3(1.779, 1.779, 1.779), Vector3(0.528, 0.528, 0.528), Vector3(1.287, 1.287, 1.287), Vector3(0.826, 0.826, 0.826), Vector3(1.105, 1.105, 1.105), Vector3(0.936, 0.936, 0.936), Vector3(1.039, 1.039, 1.039), Vector3(0.976, 0.976, 0.976), Vector3(1.014, 1.014, 1.014), Vector3(0.991, 0.991, 0.991), Vector3(1, 1, 1)]
}
tracks/1/type = "method"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("PingEffect/PingAnimation")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"values": [{
"args": [&"ping", -1, 1.0, false],
"method": &"play"
}]
}
[sub_resource type="NoiseTexture3D" id="NoiseTexture3D_omayi"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_2ibh1"]
width = 32 _data = {
height = 32 &"RESET": SubResource("Animation_2ibh1"),
depth = 128 &"trigger": SubResource("Animation_htscg")
noise = SubResource("FastNoiseLite_7fplw") }
[sub_resource type="ShaderMaterial" id="ShaderMaterial_yuift"]
resource_local_to_scene = true
render_priority = 0
shader = ExtResource("4_pp7wn")
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/normal_scale = 1.0
shader_parameter/uv_scale = Vector2(2, 2)
shader_parameter/time_scale = 0.2
shader_parameter/edge_bleed = 0.25
shader_parameter/gunk_mask = ExtResource("5_c5snp")
shader_parameter/gunk_noise = SubResource("NoiseTexture3D_2roq2")
shader_parameter/gunk_normal_map = SubResource("NoiseTexture3D_fk1xc")
shader_parameter/jitter_magnitude = 0.4
shader_parameter/jitter_time_scale = 0.1
shader_parameter/jitter_noise = SubResource("NoiseTexture3D_omayi")
shader_parameter/vertex_inflation = 0.0
shader_parameter/inflation_pixellation = 10.0
shader_parameter/overlay_emission_scale = 1.0
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2ibh1"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2ibh1"]
resource_local_to_scene = true
transparency = 3 transparency = 3
alpha_hash_scale = 1.0 alpha_hash_scale = 1.0
alpha_antialiasing_mode = 0 alpha_antialiasing_mode = 0
@ -76,11 +81,9 @@ billboard_mode = 1
billboard_keep_scale = true billboard_keep_scale = true
[sub_resource type="QuadMesh" id="QuadMesh_r42ft"] [sub_resource type="QuadMesh" id="QuadMesh_r42ft"]
resource_local_to_scene = true
material = SubResource("StandardMaterial3D_2ibh1") material = SubResource("StandardMaterial3D_2ibh1")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_dqq13"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_dqq13"]
resource_local_to_scene = true
transparency = 3 transparency = 3
alpha_hash_scale = 1.0 alpha_hash_scale = 1.0
alpha_antialiasing_mode = 0 alpha_antialiasing_mode = 0
@ -93,11 +96,9 @@ billboard_mode = 1
billboard_keep_scale = true billboard_keep_scale = true
[sub_resource type="QuadMesh" id="QuadMesh_gjouv"] [sub_resource type="QuadMesh" id="QuadMesh_gjouv"]
resource_local_to_scene = true
material = SubResource("StandardMaterial3D_dqq13") material = SubResource("StandardMaterial3D_dqq13")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_pp7wn"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_pp7wn"]
resource_local_to_scene = true
transparency = 3 transparency = 3
alpha_hash_scale = 1.0 alpha_hash_scale = 1.0
alpha_antialiasing_mode = 0 alpha_antialiasing_mode = 0
@ -110,120 +111,8 @@ billboard_mode = 1
billboard_keep_scale = true billboard_keep_scale = true
[sub_resource type="QuadMesh" id="QuadMesh_c5snp"] [sub_resource type="QuadMesh" id="QuadMesh_c5snp"]
resource_local_to_scene = true
material = SubResource("StandardMaterial3D_pp7wn") material = SubResource("StandardMaterial3D_pp7wn")
[sub_resource type="Animation" id="Animation_dqq13"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Ping1:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Ping1:scale")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.001, 0.001, 0.001)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Ping1:mesh:material:albedo_color")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.866667, 0.109804, 0.101961, 1)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Ping2:visible")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Ping2:scale")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.001, 0.001, 0.001)]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Ping2:mesh:material:albedo_color")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.866667, 0.109804, 0.101961, 1)]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Ping3:visible")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Ping3:scale")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.001, 0.001, 0.001)]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Ping3:mesh:material:albedo_color")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.866667, 0.109804, 0.101961, 1)]
}
[sub_resource type="Animation" id="Animation_r42ft"] [sub_resource type="Animation" id="Animation_r42ft"]
resource_name = "ping" resource_name = "ping"
length = 4.0 length = 4.0
@ -336,20 +225,123 @@ tracks/8/keys = {
"values": [Color(0.866667, 0.109804, 0.101961, 1), Color(0.866667, 0.109804, 0.101961, 1), Color(0.66, 0.08888, 0.0792, 0)] "values": [Color(0.866667, 0.109804, 0.101961, 1), Color(0.866667, 0.109804, 0.101961, 1), Color(0.66, 0.08888, 0.0792, 0)]
} }
[sub_resource type="Animation" id="Animation_dqq13"]
length = 0.001
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("Ping1:visible")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/1/type = "value"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("Ping1:scale")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.001, 0.001, 0.001)]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("Ping1:mesh:material:albedo_color")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.866667, 0.109804, 0.101961, 1)]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("Ping2:visible")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("Ping2:scale")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.001, 0.001, 0.001)]
}
tracks/5/type = "value"
tracks/5/imported = false
tracks/5/enabled = true
tracks/5/path = NodePath("Ping2:mesh:material:albedo_color")
tracks/5/interp = 1
tracks/5/loop_wrap = true
tracks/5/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.866667, 0.109804, 0.101961, 1)]
}
tracks/6/type = "value"
tracks/6/imported = false
tracks/6/enabled = true
tracks/6/path = NodePath("Ping3:visible")
tracks/6/interp = 1
tracks/6/loop_wrap = true
tracks/6/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/7/type = "value"
tracks/7/imported = false
tracks/7/enabled = true
tracks/7/path = NodePath("Ping3:scale")
tracks/7/interp = 1
tracks/7/loop_wrap = true
tracks/7/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Vector3(0.001, 0.001, 0.001)]
}
tracks/8/type = "value"
tracks/8/imported = false
tracks/8/enabled = true
tracks/8/path = NodePath("Ping3:mesh:material:albedo_color")
tracks/8/interp = 1
tracks/8/loop_wrap = true
tracks/8/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 0,
"values": [Color(0.866667, 0.109804, 0.101961, 1)]
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_dqq13"] [sub_resource type="AnimationLibrary" id="AnimationLibrary_dqq13"]
_data = { _data = {
&"RESET": SubResource("Animation_dqq13"), &"RESET": SubResource("Animation_dqq13"),
&"ping": SubResource("Animation_r42ft") &"ping": SubResource("Animation_r42ft")
} }
[sub_resource type="CylinderShape3D" id="CylinderShape3D_dqq13"]
height = 0.28
radius = 0.125
[sub_resource type="CylinderShape3D" id="CylinderShape3D_r42ft"]
height = 0.1
radius = 0.175
[node name="Listener" type="StaticBody3D" groups=["Persistent"]] [node name="Listener" type="StaticBody3D" groups=["Persistent"]]
collision_layer = 36 collision_layer = 36
collision_mask = 0 collision_mask = 0
@ -358,35 +350,41 @@ durability = 3.0
value = 4000.0 value = 4000.0
metadata/_custom_type_script = "uid://bypgxi0gy56yk" metadata/_custom_type_script = "uid://bypgxi0gy56yk"
[node name="GameSoundListener" type="StaticBody3D" parent="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0)
shape = SubResource("ConcavePolygonShape3D_2ibh1")
[node name="GameSoundListener" type="StaticBody3D" parent="CollisionShape3D"]
collision_layer = 16 collision_layer = 16
collision_mask = 0 collision_mask = 0
script = ExtResource("2_htscg") script = ExtResource("2_htscg")
metadata/_custom_type_script = "uid://cfsiyhhrcua6o" metadata/_custom_type_script = "uid://cfsiyhhrcua6o"
[node name="CollisionShape3D" type="CollisionShape3D" parent="GameSoundListener"] [node name="CollisionShape3D" type="CollisionShape3D" parent="CollisionShape3D/GameSoundListener"]
shape = SubResource("SphereShape3D_2ibh1") shape = SubResource("SphereShape3D_2ibh1")
[node name="ListenerModel" parent="." instance=ExtResource("3_r42ft")] [node name="MeshInstance3D" type="MeshInstance3D" parent="CollisionShape3D"]
gi_mode = 2
mesh = SubResource("CylinderMesh_ud3xk")
skeleton = NodePath("../..")
[node name="Label3D" type="Label3D" parent="CollisionShape3D/MeshInstance3D"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0.051, 0)
pixel_size = 0.001
text = "LISTENER"
font_size = 92
outline_size = 20
[node name="CooldownTimer" type="Timer" parent="."]
unique_name_in_owner = true unique_name_in_owner = true
transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, 0, 0, 0) wait_time = 4.0
one_shot = true
[node name="Listener" parent="ListenerModel/Armature/Skeleton3D" index="0"] [node name="TriggerAnimationPlayer" type="AnimationPlayer" parent="."]
surface_material_override/0 = SubResource("ShaderMaterial_yuift") unique_name_in_owner = true
libraries = {
[node name="PhysicalBoneSimulator3D" type="PhysicalBoneSimulator3D" parent="ListenerModel/Armature/Skeleton3D" index="6"] &"": SubResource("AnimationLibrary_2ibh1")
}
[node name="PhysicalBone3D" type="PhysicalBone3D" parent="ListenerModel/Armature/Skeleton3D/PhysicalBoneSimulator3D"]
transform = Transform3D(0.323526, 1.18154e-06, 1.20741, -1.06742e-08, 1.25, -1.22036e-06, -1.20741, 3.05545e-07, 0.323526, -4.82717e-06, 0.800007, -1.2209e-06)
joint_offset = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.43995e-08, -5.86509e-06, 3.98532e-06)
body_offset = Transform3D(1.25, 1.11823e-08, -2.86102e-06, -1.11851e-08, 1.25, -1.23028e-06, 2.86102e-06, 1.23028e-06, 1.25, -6.79879e-08, 7.33137e-06, -4.98164e-06)
bone_name = "Stem5"
[node name="RemoteTransform3D" type="RemoteTransform3D" parent="ListenerModel/Armature/Skeleton3D/PhysicalBoneSimulator3D/PhysicalBone3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.235, 0)
remote_path = NodePath("../../../../../../CollisionShape3D2")
update_scale = false
[node name="PingEffect" type="Node3D" parent="."] [node name="PingEffect" type="Node3D" parent="."]
@ -412,25 +410,8 @@ mesh = SubResource("QuadMesh_c5snp")
skeleton = NodePath("../..") skeleton = NodePath("../..")
[node name="PingAnimation" type="AnimationPlayer" parent="PingEffect"] [node name="PingAnimation" type="AnimationPlayer" parent="PingEffect"]
unique_name_in_owner = true
libraries = { libraries = {
&"": SubResource("AnimationLibrary_dqq13") &"": SubResource("AnimationLibrary_dqq13")
} }
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [connection signal="sound_detected" from="CollisionShape3D/GameSoundListener" to="." method="trigger" unbinds=1]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.14, 0)
shape = SubResource("CylinderShape3D_dqq13")
[node name="CollisionShape3D2" type="CollisionShape3D" parent="."]
transform = Transform3D(0.258816, 9.45216e-07, 0.96591, -8.53918e-09, 0.999981, -9.76275e-07, -0.965905, 2.44431e-07, 0.258817, -3.63961e-06, 0.875006, -9.19278e-07)
shape = SubResource("CylinderShape3D_r42ft")
[node name="CooldownTimer" type="Timer" parent="."]
unique_name_in_owner = true
wait_time = 4.0
one_shot = true
[connection signal="sound_detected" from="GameSoundListener" to="." method="_on_sound_detected"]
[connection signal="timeout" from="CooldownTimer" to="ListenerModel" method="release_target"]
[editable path="ListenerModel"]

View File

@ -1,71 +0,0 @@
class_name ListenerModel extends Node3D
## Model controller for the Grunk Listener
const TARGET_ACCELERATION := 8.0
var ik_influence := 0.0:
set = _set_ik_influence
var _open := false
var _ik_tween: Tween
@onready var target_target: Marker3D = %TargetTarget
@onready var ik_target: Marker3D = %IKTarget
@onready var leaf_animation: AnimationPlayer = %LeafAnimation
@onready var stem_ik_1: LookAtModifier3D = %StemIK1
@onready var stem_ik_2: LookAtModifier3D = %StemIK2
@onready var stem_ik_3: LookAtModifier3D = %StemIK3
@onready var stem_ik_4: LookAtModifier3D = %StemIK4
@onready var stem_ik_5: LookAtModifier3D = %StemIK5
func _get_ik_tween() -> Tween:
if _ik_tween and _ik_tween.is_valid():
_ik_tween.kill()
_ik_tween = create_tween()
return _ik_tween
func lock_target(target: Vector3) -> void:
target_target.global_position = target
if not _open:
_open = true
leaf_animation.play("open", 0.2)
(
_get_ik_tween()
. tween_property(self, "ik_influence", 1, leaf_animation.current_animation_length)
. set_ease(Tween.EASE_IN_OUT)
. set_trans(Tween.TRANS_CUBIC)
)
func release_target() -> void:
if _open:
leaf_animation.play("close", 0.2)
(
_get_ik_tween()
. tween_property(self, "ik_influence", 0, leaf_animation.current_animation_length)
. set_ease(Tween.EASE_IN_OUT)
. set_trans(Tween.TRANS_CUBIC)
)
_open = false
func _set_ik_influence(value: float) -> void:
ik_influence = value
stem_ik_1.influence = value
stem_ik_2.influence = value
stem_ik_3.influence = value
stem_ik_4.influence = value
stem_ik_5.influence = value
func _process(delta: float) -> void:
var target_weight := 1.0 - exp(-TARGET_ACCELERATION * delta)
ik_target.global_position = ik_target.global_position.lerp(
target_target.global_position, target_weight
)

View File

@ -1 +0,0 @@
uid://co4gkdwyhdbmc

View File

@ -1,179 +0,0 @@
[gd_scene load_steps=10 format=3 uid="uid://c2c0ooj1re3dk"]
[ext_resource type="PackedScene" uid="uid://coucghe370fff" path="res://assets/grunk/listener/listener.gltf" id="1_lgdkx"]
[ext_resource type="Script" uid="uid://co4gkdwyhdbmc" path="res://src/world/mechanics/listener/listener_model.gd" id="2_yh3g4"]
[ext_resource type="Material" uid="uid://bmab6i16v748m" path="res://assets/materials/grunk_jittery.material" id="3_xijsm"]
[ext_resource type="Animation" uid="uid://dihyn82xf67ou" path="res://assets/grunk/listener/animations/RESET.res" id="4_y4jww"]
[ext_resource type="Animation" uid="uid://c236lo5xytxaa" path="res://assets/grunk/listener/animations/idle.res" id="5_3vskp"]
[ext_resource type="Animation" uid="uid://bujor2i5icw8c" path="res://assets/grunk/listener/animations/close.res" id="6_ghw47"]
[ext_resource type="Animation" uid="uid://c4juq6vxnnxbe" path="res://assets/grunk/listener/animations/open.res" id="7_c25ju"]
[sub_resource type="AnimationLibrary" id="AnimationLibrary_ghw47"]
_data = {
&"RESET": ExtResource("4_y4jww"),
&"idle": ExtResource("5_3vskp")
}
[sub_resource type="AnimationLibrary" id="AnimationLibrary_5lsre"]
_data = {
&"RESET": ExtResource("4_y4jww"),
&"close": ExtResource("6_ghw47"),
&"open": ExtResource("7_c25ju")
}
[node name="ListenerModel" instance=ExtResource("1_lgdkx")]
script = ExtResource("2_yh3g4")
[node name="Skeleton3D" parent="Armature" index="0"]
bones/0/rotation = Quaternion(-1.51225e-09, 0.130526, 4.05207e-10, 0.991445)
bones/1/rotation = Quaternion(9.2869e-09, 0.130526, -8.10413e-10, 0.991445)
bones/2/rotation = Quaternion(-9.1802e-09, 0.130526, -8.10414e-10, 0.991445)
bones/3/rotation = Quaternion(6.20905e-09, 0.130526, -4.05206e-10, 0.991445)
bones/4/rotation = Quaternion(-8.49624e-09, 0.130526, -9.00455e-11, 0.991445)
bones/5/rotation = Quaternion(0.54585, 0.487268, 0.374478, -0.569548)
bones/6/rotation = Quaternion(0.308353, 2.1709e-08, 1.30586e-08, 0.951272)
bones/7/rotation = Quaternion(0.334237, -0.119529, -0.0427788, 0.9339)
bones/8/rotation = Quaternion(0.247978, -2.40337e-10, -3.8454e-09, 0.968766)
bones/9/rotation = Quaternion(0.148338, 2.82522e-09, -5.65045e-09, 0.988937)
bones/10/rotation = Quaternion(0.237284, 7.34911e-07, -1.96017e-07, 0.97144)
bones/11/rotation = Quaternion(0.285481, 0.70676, 0.597232, -0.249609)
bones/12/rotation = Quaternion(0.308353, 6.75348e-08, -4.55922e-08, 0.951272)
bones/13/rotation = Quaternion(0.334237, -0.119529, -0.0427787, 0.9339)
bones/14/rotation = Quaternion(0.247978, 6.91065e-10, -2.79256e-08, 0.968766)
bones/15/rotation = Quaternion(0.148338, 7.66861e-08, 9.51493e-08, 0.988937)
bones/16/rotation = Quaternion(0.237284, 1.57873e-06, -4.4533e-07, 0.97144)
bones/17/rotation = Quaternion(-0.0513825, 0.736877, 0.659958, 0.137212)
bones/18/rotation = Quaternion(0.308353, -1.71875e-07, -7.09416e-08, 0.951272)
bones/19/rotation = Quaternion(0.334237, -0.119529, -0.0427786, 0.9339)
bones/20/rotation = Quaternion(0.247978, -5.53974e-08, -1.69864e-07, 0.968766)
bones/21/rotation = Quaternion(0.148338, 4.98196e-08, 2.63702e-07, 0.988937)
bones/22/rotation = Quaternion(0.237284, 2.44019e-06, -9.05055e-07, 0.97144)
bones/23/rotation = Quaternion(-0.374478, 0.569548, 0.545849, 0.487268)
bones/24/rotation = Quaternion(0.308353, -3.56631e-08, -1.14694e-08, 0.951272)
bones/25/rotation = Quaternion(0.334237, -0.119529, -0.0427786, 0.9339)
bones/26/rotation = Quaternion(0.247978, -6.25756e-08, -2.50967e-07, 0.968766)
bones/27/rotation = Quaternion(0.148338, 2.83936e-08, 1.69831e-07, 0.988937)
bones/28/rotation = Quaternion(0.237284, 3.38177e-06, -1.02259e-06, 0.97144)
bones/29/rotation = Quaternion(-0.597232, 0.249609, 0.285481, 0.70676)
bones/30/rotation = Quaternion(0.308353, 2.31089e-09, 1.50606e-08, 0.951272)
bones/31/rotation = Quaternion(0.334237, -0.119529, -0.0427785, 0.9339)
bones/32/rotation = Quaternion(0.247978, -3.1123e-08, -2.32956e-07, 0.968766)
bones/33/rotation = Quaternion(0.148338, 5.29717e-08, 2.76084e-07, 0.988937)
bones/34/rotation = Quaternion(0.237284, 4.29037e-06, -1.26097e-06, 0.97144)
bones/35/rotation = Quaternion(-0.659958, -0.137212, -0.0513825, 0.736877)
bones/36/rotation = Quaternion(0.308353, 3.35578e-09, 4.35599e-09, 0.951272)
bones/37/rotation = Quaternion(0.334237, -0.119529, -0.0427785, 0.9339)
bones/38/rotation = Quaternion(0.247978, -1.26717e-07, -3.12779e-07, 0.968766)
bones/39/rotation = Quaternion(0.148338, 2.72959e-08, 3.46469e-07, 0.988937)
bones/40/rotation = Quaternion(0.237284, 5.07144e-06, -1.68211e-06, 0.97144)
[node name="Listener" parent="Armature/Skeleton3D" index="0"]
surface_material_override/0 = ExtResource("3_xijsm")
[node name="StemIK1" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="1"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem1"
bone = 0
forward_axis = 2
primary_rotation_axis = 0
duration = 0.2
transition_type = 1
ease_type = 1
use_angle_limitation = true
symmetry_limitation = true
primary_limit_angle = 0.174533
primary_damp_threshold = 0.0
secondary_limit_angle = 0.785398
secondary_damp_threshold = 0.0
[node name="StemIK2" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="2"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem2"
bone = 1
forward_axis = 2
primary_rotation_axis = 0
duration = 0.2
transition_type = 1
ease_type = 1
use_angle_limitation = true
symmetry_limitation = true
primary_limit_angle = 0.785398
primary_damp_threshold = 0.0
secondary_limit_angle = 0.174533
secondary_damp_threshold = 0.0
[node name="StemIK3" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="3"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem3"
bone = 2
forward_axis = 2
primary_rotation_axis = 0
duration = 0.2
transition_type = 1
ease_type = 1
use_angle_limitation = true
symmetry_limitation = true
primary_limit_angle = 1.5708
primary_damp_threshold = 0.0
secondary_limit_angle = 0.785398
secondary_damp_threshold = 0.0
[node name="StemIK4" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="4"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem4"
bone = 3
forward_axis = 2
primary_rotation_axis = 0
duration = 0.2
transition_type = 1
ease_type = 1
use_angle_limitation = true
symmetry_limitation = true
primary_limit_angle = 0.785398
primary_damp_threshold = 0.0
secondary_limit_angle = 1.5708
secondary_damp_threshold = 0.0
[node name="StemIK5" type="LookAtModifier3D" parent="Armature/Skeleton3D" index="5"]
unique_name_in_owner = true
influence = 0.0
target_node = NodePath("../../../IKTarget")
bone_name = "Stem5"
bone = 4
forward_axis = 2
primary_rotation_axis = 0
duration = 0.2
transition_type = 1
ease_type = 1
use_angle_limitation = true
symmetry_limitation = true
primary_limit_angle = 1.5708
primary_damp_threshold = 0.0
secondary_limit_angle = 1.5708
secondary_damp_threshold = 0.0
[node name="IKTarget" type="Marker3D" parent="." index="1"]
unique_name_in_owner = true
[node name="TargetTarget" type="Marker3D" parent="." index="2"]
unique_name_in_owner = true
[node name="IdleAnimation" type="AnimationPlayer" parent="." index="3"]
libraries = {
&"": SubResource("AnimationLibrary_ghw47")
}
autoplay = "idle"
[node name="LeafAnimation" type="AnimationPlayer" parent="." index="4"]
unique_name_in_owner = true
libraries = {
&"": SubResource("AnimationLibrary_5lsre")
}