aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/gui/menus/main/about.gd1
-rw-r--r--client/map/tile_factory.gd1
-rw-r--r--client/map/tiles/rolling_board.gd57
-rw-r--r--client/map/tiles/rolling_board.gd.uid1
-rw-r--r--client/map/tiles/rolling_board.tscn14
-rw-r--r--client/map/tiles/rolling_pin.resbin0 -> 28783 bytes
-rw-r--r--client/map/tiles/rolling_pin.tscn10
-rw-r--r--client/map/tiles/sounds/roll.oggbin0 -> 11722 bytes
-rw-r--r--client/map/tiles/sounds/roll.ogg.import19
-rw-r--r--client/player/character/character.gd7
-rw-r--r--client/player/character/character.tscn220
11 files changed, 320 insertions, 10 deletions
diff --git a/client/gui/menus/main/about.gd b/client/gui/menus/main/about.gd
index 1b8f47d1..56887203 100644
--- a/client/gui/menus/main/about.gd
+++ b/client/gui/menus/main/about.gd
@@ -46,6 +46,7 @@ var credits := [
["Kay Lousberg", "Kitchen tiles", cc0],
["Poly by Google", "Strawberry", cc_by_3],
["Poly by Google", "Fish", cc_by_3],
+ ["Poly by Google", "Rolling pin", cc_by_3],
["jeremy", "Propeller hat", cc_by_3]
]],
[tr("c.credits.sounds"), [
diff --git a/client/map/tile_factory.gd b/client/map/tile_factory.gd
index 4049ea47..fb72fe77 100644
--- a/client/map/tile_factory.gd
+++ b/client/map/tile_factory.gd
@@ -54,6 +54,7 @@ func produce(tile_name: String, position: Vector2i, neighbors: Array) -> Tile:
"lamp": return Lamp.new(ctx)
"oven": return Oven.new(ctx)
"path": return Path.new(ctx)
+ "rolling-board": return RollingBoard.new(ctx)
"sink": return Sink.new(ctx)
"stove": return Stove.new(ctx)
"street": return Street.new(ctx)
diff --git a/client/map/tiles/rolling_board.gd b/client/map/tiles/rolling_board.gd
new file mode 100644
index 00000000..078897b1
--- /dev/null
+++ b/client/map/tiles/rolling_board.gd
@@ -0,0 +1,57 @@
+# Hurry Curry! - a game about cooking
+# Copyright (C) 2025 Hurry Curry! contributors
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, version 3 of the License only.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+class_name RollingBoard
+extends CounterBase
+
+var board = load("res://map/tiles/rolling_board.tscn").instantiate()
+var rolling: AudioStreamPlayer3D = AudioStreamPlayer3D.new()
+var acting_player
+
+func _init(ctx: TileFactory.TileCC):
+ super(ctx)
+ rolling.stream = preload("res://map/tiles/sounds/roll.ogg")
+ rolling.volume_db = -10
+ add_child(rolling)
+ base.add_child(board)
+
+func progress(position_: float, speed: float, warn: bool, acting_player_):
+ super(position_, speed, warn, acting_player)
+ var pin: Node3D = board.get_node("RollingPin")
+ acting_player = acting_player_
+
+ if not rolling.playing and speed != 0.:
+ rolling.play()
+ if acting_player != null:
+ pin.visible = false
+ var acting_character: Character = acting_player.character
+ acting_character.rolling = true
+ elif speed == 0:
+ rolling.stop()
+ pin.visible = true
+ if acting_player != null:
+ var acting_character: Character = acting_player.character
+ acting_character.rolling = false
+
+func finish():
+ super()
+ if is_instance_valid(acting_player):
+ var acting_character: Character = acting_player.character
+ acting_character.rolling = false
+ board.get_node("RollingPin").visible = true
+ rolling.stop()
+
+static func interact_target() -> Vector3:
+ return Vector3(0., 0.575, 0.)
diff --git a/client/map/tiles/rolling_board.gd.uid b/client/map/tiles/rolling_board.gd.uid
new file mode 100644
index 00000000..f394f40e
--- /dev/null
+++ b/client/map/tiles/rolling_board.gd.uid
@@ -0,0 +1 @@
+uid://dqo2vciij8w47
diff --git a/client/map/tiles/rolling_board.tscn b/client/map/tiles/rolling_board.tscn
new file mode 100644
index 00000000..ecf1c036
--- /dev/null
+++ b/client/map/tiles/rolling_board.tscn
@@ -0,0 +1,14 @@
+[gd_scene load_steps=3 format=3 uid="uid://c15xsbx0bduqt"]
+
+[ext_resource type="ArrayMesh" uid="uid://dd4g04lgvsly5" path="res://map/tiles/cutting_board.res" id="1_cuxby"]
+[ext_resource type="PackedScene" uid="uid://c8t04dfp45a86" path="res://map/tiles/rolling_pin.tscn" id="2_cuxby"]
+
+[node name="CuttingBoard" type="Node3D"]
+
+[node name="Mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(0.4, 0, 0, 0, 0.5, 0, 0, 0, 0.5, -0.075, 0.5, 0)
+mesh = ExtResource("1_cuxby")
+skeleton = NodePath("")
+
+[node name="RollingPin" parent="." instance=ExtResource("2_cuxby")]
+transform = Transform3D(0.0979824, 0, -0.9951882, 0, 1, 0, 0.9951882, 0, 0.0979824, 0.3562666, 0.575, 0)
diff --git a/client/map/tiles/rolling_pin.res b/client/map/tiles/rolling_pin.res
new file mode 100644
index 00000000..29a31bc7
--- /dev/null
+++ b/client/map/tiles/rolling_pin.res
Binary files differ
diff --git a/client/map/tiles/rolling_pin.tscn b/client/map/tiles/rolling_pin.tscn
new file mode 100644
index 00000000..b25419cd
--- /dev/null
+++ b/client/map/tiles/rolling_pin.tscn
@@ -0,0 +1,10 @@
+[gd_scene load_steps=2 format=3 uid="uid://c8t04dfp45a86"]
+
+[ext_resource type="ArrayMesh" uid="uid://bijk6tpibbek3" path="res://map/tiles/rolling_pin.res" id="1_s0lm5"]
+
+[node name="RollingPin" type="Node3D"]
+
+[node name="Mesh" type="MeshInstance3D" parent="."]
+transform = Transform3D(1.75, 0, 0, 0, 1.75, 0, 0, 0, 1.75, 0, 0, 0)
+mesh = ExtResource("1_s0lm5")
+skeleton = NodePath("")
diff --git a/client/map/tiles/sounds/roll.ogg b/client/map/tiles/sounds/roll.ogg
new file mode 100644
index 00000000..75eb8812
--- /dev/null
+++ b/client/map/tiles/sounds/roll.ogg
Binary files differ
diff --git a/client/map/tiles/sounds/roll.ogg.import b/client/map/tiles/sounds/roll.ogg.import
new file mode 100644
index 00000000..fb536ed1
--- /dev/null
+++ b/client/map/tiles/sounds/roll.ogg.import
@@ -0,0 +1,19 @@
+[remap]
+
+importer="oggvorbisstr"
+type="AudioStreamOggVorbis"
+uid="uid://drck03qv37u3w"
+path="res://.godot/imported/roll.ogg-777f87bf2da0dd0836179ee4fabb9c55.oggvorbisstr"
+
+[deps]
+
+source_file="res://map/tiles/sounds/roll.ogg"
+dest_files=["res://.godot/imported/roll.ogg-777f87bf2da0dd0836179ee4fabb9c55.oggvorbisstr"]
+
+[params]
+
+loop=true
+loop_offset=0
+bpm=0
+beat_count=0
+bar_beats=4
diff --git a/client/player/character/character.gd b/client/player/character/character.gd
index c6401965..a6af254a 100644
--- a/client/player/character/character.gd
+++ b/client/player/character/character.gd
@@ -35,6 +35,7 @@ var walking := false
var holding := false
var boosting := false
var cutting := false
+var rolling := false
var was_boosting := boosting
var current_animation := "idle"
@@ -57,7 +58,6 @@ var headwears: Array[PackedScene]= [
@onready var hand_animations = $HandAnimations
@onready var main = $Main
-@onready var tram = $Tram
@onready var default_height = main.position.y
@onready var main_height_target = default_height
@onready var walking_particles = $Walking
@@ -65,6 +65,7 @@ var headwears: Array[PackedScene]= [
@onready var username_tag = $Username
@onready var tie = $Main/Tie
@onready var knife = $Main/HandRight/Knife
+@onready var rolling_pin = $Main/RollingPin
@onready var head_default: MeshInstance3D = $Main/HeadDefault
@onready var head_robot: MeshInstance3D = $Main/HeadRobot
@@ -82,6 +83,7 @@ func _process(delta):
var next_animation: String
if holding: next_animation = "hold"
elif cutting: next_animation = "cut"
+ elif rolling: next_animation = "roll"
elif walking: next_animation = "walk"
else: next_animation = "idle"
@@ -106,8 +108,6 @@ func set_style(style: Dictionary, character_class: String):
tie.visible = character_class != "customer"
head_robot.visible = character_class == "bot"
head_default.visible = is_human
- main.visible = character_class != "tram"
- tram.visible = character_class == "tram"
# Hairstyle
hair_mesh.mesh = hairstyles[hairstyle_idx]
@@ -131,6 +131,7 @@ func play_animation(name_: String):
else: step_sounds.stop_autoplay()
knife.visible = name_ == "cut"
+ rolling_pin.visible = name_ == "roll"
func _on_hand_animations_animation_finished(_name):
hand_animations.play(current_animation)
diff --git a/client/player/character/character.tscn b/client/player/character/character.tscn
index ccf987b9..748cdaed 100644
--- a/client/player/character/character.tscn
+++ b/client/player/character/character.tscn
@@ -1,10 +1,11 @@
-[gd_scene load_steps=26 format=3 uid="uid://b3hhir2fvnunu"]
+[gd_scene load_steps=27 format=3 uid="uid://b3hhir2fvnunu"]
[ext_resource type="Script" uid="uid://dwk3vd4nv2k65" path="res://player/character/character.gd" id="1_12lbh"]
[ext_resource type="ArrayMesh" uid="uid://bnmm01yjwultj" path="res://player/character/default/main.res" id="2_uovyg"]
[ext_resource type="ArrayMesh" uid="uid://46sp3fu3n6ls" path="res://player/character/default/hand_right.res" id="3_k28vh"]
[ext_resource type="ArrayMesh" uid="uid://r52cylox4imf" path="res://player/character/default/hand_left.res" id="4_tcrm3"]
[ext_resource type="PackedScene" uid="uid://cufype1bex3r3" path="res://map/tiles/knife.tscn" id="4_tjq3a"]
+[ext_resource type="PackedScene" uid="uid://c8t04dfp45a86" path="res://map/tiles/rolling_pin.tscn" id="5_kl3lh"]
[ext_resource type="ArrayMesh" uid="uid://csryncouqhwp1" path="res://player/character/default/head.res" id="5_n1vl0"]
[ext_resource type="ArrayMesh" uid="uid://c2qnwt44x8ujl" path="res://player/character/default/tie.res" id="9_kgric"]
[ext_resource type="AudioStream" uid="uid://bxiorkb4xb8t1" path="res://player/sounds/step1.ogg" id="10_qpd6x"]
@@ -14,7 +15,6 @@
[ext_resource type="Script" uid="uid://n4jwod1jfuiv" path="res://audio/play_random.gd" id="14_3rb6x"]
[ext_resource type="AudioStream" uid="uid://1jsqpnk3igj3" path="res://player/sounds/woosh1.ogg" id="14_ikcec"]
[ext_resource type="AudioStream" uid="uid://cwme7eatip0jc" path="res://player/sounds/woosh2.ogg" id="15_iv4wu"]
-[ext_resource type="PackedScene" uid="uid://xq5claqewtb3" path="res://player/character/tram/tram.tscn" id="18_8h5ka"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_7ojaw"]
resource_local_to_scene = true
@@ -155,6 +155,39 @@ tracks/11/keys = {
"points": PackedFloat32Array(2.0944, -0.25, 0, 0.25, 0),
"times": PackedFloat32Array(0)
}
+tracks/12/type = "bezier"
+tracks/12/imported = false
+tracks/12/enabled = true
+tracks/12/path = NodePath("Main/RollingPin:position:x")
+tracks/12/interp = 1
+tracks/12/loop_wrap = true
+tracks/12/keys = {
+"handle_modes": PackedInt32Array(0),
+"points": PackedFloat32Array(0, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0)
+}
+tracks/13/type = "bezier"
+tracks/13/imported = false
+tracks/13/enabled = true
+tracks/13/path = NodePath("Main/RollingPin:position:y")
+tracks/13/interp = 1
+tracks/13/loop_wrap = true
+tracks/13/keys = {
+"handle_modes": PackedInt32Array(0),
+"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0)
+}
+tracks/14/type = "bezier"
+tracks/14/imported = false
+tracks/14/enabled = true
+tracks/14/path = NodePath("Main/RollingPin:position:z")
+tracks/14/interp = 1
+tracks/14/loop_wrap = true
+tracks/14/keys = {
+"handle_modes": PackedInt32Array(0),
+"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0)
+}
[sub_resource type="Animation" id="Animation_557hk"]
resource_name = "cut"
@@ -706,12 +739,183 @@ tracks/11/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4)
}
+[sub_resource type="Animation" id="Animation_01ngc"]
+resource_name = "roll"
+loop_mode = 1
+step = 0.01
+tracks/0/type = "bezier"
+tracks/0/imported = false
+tracks/0/enabled = true
+tracks/0/path = NodePath("Main/HandRight:position:x")
+tracks/0/interp = 1
+tracks/0/loop_wrap = true
+tracks/0/keys = {
+"handle_modes": PackedInt32Array(0, 0, 0),
+"points": PackedFloat32Array(-1, -0.125, 0, 0.125, 0, -1, -0.083333336, 0, 0, 0, -1, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0, 0.5, 1)
+}
+tracks/1/type = "bezier"
+tracks/1/imported = false
+tracks/1/enabled = true
+tracks/1/path = NodePath("Main/HandRight:position:y")
+tracks/1/interp = 1
+tracks/1/loop_wrap = true
+tracks/1/keys = {
+"handle_modes": PackedInt32Array(0, 0, 0),
+"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 1, -0.083333336, 0, 0, 0, 1, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0, 0.5, 1)
+}
+tracks/2/type = "bezier"
+tracks/2/imported = false
+tracks/2/enabled = true
+tracks/2/path = NodePath("Main/HandRight:position:z")
+tracks/2/interp = 1
+tracks/2/loop_wrap = true
+tracks/2/keys = {
+"handle_modes": PackedInt32Array(0, 0, 0),
+"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 2, -0.2, 0, 0.2, 0, 1, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0, 0.5, 1)
+}
+tracks/3/type = "bezier"
+tracks/3/imported = false
+tracks/3/enabled = true
+tracks/3/path = NodePath("Main/HandRight:rotation:x")
+tracks/3/interp = 1
+tracks/3/loop_wrap = true
+tracks/3/keys = {
+"handle_modes": PackedInt32Array(0),
+"points": PackedFloat32Array(0, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0)
+}
+tracks/4/type = "bezier"
+tracks/4/imported = false
+tracks/4/enabled = true
+tracks/4/path = NodePath("Main/HandRight:rotation:y")
+tracks/4/interp = 1
+tracks/4/loop_wrap = true
+tracks/4/keys = {
+"handle_modes": PackedInt32Array(0),
+"points": PackedFloat32Array(-2.0943952, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0)
+}
+tracks/5/type = "bezier"
+tracks/5/imported = false
+tracks/5/enabled = true
+tracks/5/path = NodePath("Main/HandRight:rotation:z")
+tracks/5/interp = 1
+tracks/5/loop_wrap = true
+tracks/5/keys = {
+"handle_modes": PackedInt32Array(0),
+"points": PackedFloat32Array(-3.1415927, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0)
+}
+tracks/6/type = "bezier"
+tracks/6/imported = false
+tracks/6/enabled = true
+tracks/6/path = NodePath("Main/HandLeft:position:x")
+tracks/6/interp = 1
+tracks/6/loop_wrap = true
+tracks/6/keys = {
+"handle_modes": PackedInt32Array(0, 2, 0),
+"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 1, -0.083333336, 0, 0, 0, 1, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0, 0.5, 1)
+}
+tracks/7/type = "bezier"
+tracks/7/imported = false
+tracks/7/enabled = true
+tracks/7/path = NodePath("Main/HandLeft:position:y")
+tracks/7/interp = 1
+tracks/7/loop_wrap = true
+tracks/7/keys = {
+"handle_modes": PackedInt32Array(0, 2, 0),
+"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 1, -0.083333336, 0, 0, 0, 1, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0, 0.5, 1)
+}
+tracks/8/type = "bezier"
+tracks/8/imported = false
+tracks/8/enabled = true
+tracks/8/path = NodePath("Main/HandLeft:position:z")
+tracks/8/interp = 1
+tracks/8/loop_wrap = true
+tracks/8/keys = {
+"handle_modes": PackedInt32Array(0, 2, 0),
+"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 2, -0.2, 0, 0.2, 0, 1, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0, 0.5, 1)
+}
+tracks/9/type = "bezier"
+tracks/9/imported = false
+tracks/9/enabled = true
+tracks/9/path = NodePath("Main/HandLeft:rotation:x")
+tracks/9/interp = 1
+tracks/9/loop_wrap = true
+tracks/9/keys = {
+"handle_modes": PackedInt32Array(0),
+"points": PackedFloat32Array(0, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0)
+}
+tracks/10/type = "bezier"
+tracks/10/imported = false
+tracks/10/enabled = true
+tracks/10/path = NodePath("Main/HandLeft:rotation:y")
+tracks/10/interp = 1
+tracks/10/loop_wrap = true
+tracks/10/keys = {
+"handle_modes": PackedInt32Array(0),
+"points": PackedFloat32Array(1.3962634, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0)
+}
+tracks/11/type = "bezier"
+tracks/11/imported = false
+tracks/11/enabled = true
+tracks/11/path = NodePath("Main/HandLeft:rotation:z")
+tracks/11/interp = 1
+tracks/11/loop_wrap = true
+tracks/11/keys = {
+"handle_modes": PackedInt32Array(0),
+"points": PackedFloat32Array(-3.1415927, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0)
+}
+tracks/12/type = "bezier"
+tracks/12/imported = false
+tracks/12/enabled = true
+tracks/12/path = NodePath("Main/RollingPin:position:x")
+tracks/12/interp = 1
+tracks/12/loop_wrap = true
+tracks/12/keys = {
+"handle_modes": PackedInt32Array(0, 2, 0),
+"points": PackedFloat32Array(0, -0.125, 0, 0.125, 0, 0, -0.083333336, 0, 0, 0, 0, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0, 0.5, 1)
+}
+tracks/13/type = "bezier"
+tracks/13/imported = false
+tracks/13/enabled = true
+tracks/13/path = NodePath("Main/RollingPin:position:y")
+tracks/13/interp = 1
+tracks/13/loop_wrap = true
+tracks/13/keys = {
+"handle_modes": PackedInt32Array(0, 2, 0),
+"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 1, -0.083333336, 0, 0, 0, 1, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0, 0.5, 1)
+}
+tracks/14/type = "bezier"
+tracks/14/imported = false
+tracks/14/enabled = true
+tracks/14/path = NodePath("Main/RollingPin:position:z")
+tracks/14/interp = 1
+tracks/14/loop_wrap = true
+tracks/14/keys = {
+"handle_modes": PackedInt32Array(0, 2, 0),
+"points": PackedFloat32Array(1, -0.125, 0, 0.125, 0, 2, -0.2, 0, 0.2, 0, 1, -0.125, 0, 0.125, 0),
+"times": PackedFloat32Array(0, 0.5, 1)
+}
+
[sub_resource type="AnimationLibrary" id="AnimationLibrary_xtrfe"]
_data = {
&"RESET": SubResource("Animation_tdhvg"),
&"cut": SubResource("Animation_557hk"),
&"hold": SubResource("Animation_cvcpd"),
&"idle": SubResource("Animation_r1hej"),
+&"roll": SubResource("Animation_01ngc"),
&"walk": SubResource("Animation_7kiho")
}
@@ -734,16 +938,21 @@ mesh = ExtResource("2_uovyg")
skeleton = NodePath("")
surface_material_override/0 = SubResource("StandardMaterial3D_7ojaw")
+[node name="RollingPin" parent="Main" instance=ExtResource("5_kl3lh")]
+transform = Transform3D(3.030303, -1.1268961e-05, -1.5955811e-05, 1.7894663e-05, 0.47404197, 2.992996, -8.746808e-06, -2.992996, 0.47404295, 0, 1, 1)
+visible = false
+
[node name="HandRight" type="MeshInstance3D" parent="Main"]
-transform = Transform3D(0.287144, 0.2864, -1.17785e-06, 0.402357, -0.133775, 0.337554, 0.292329, -0.0971941, -0.464603, -1.302, -0.17, 0)
+transform = Transform3D(0.28714395, 0.28639996, -1.177853e-06, 0.40235722, -0.13377503, 0.33755422, 0.29232922, -0.09719407, -0.46460304, -1.302, -0.17, 0)
mesh = ExtResource("3_k28vh")
skeleton = NodePath("")
[node name="Knife" parent="Main/HandRight" instance=ExtResource("4_tjq3a")]
transform = Transform3D(3.69699, 2.68602, 2.63837, -3.70658, -2.69301, 7.93544, 3.10156, -4.26893, -1.08623e-05, -0.157983, 0.472216, -0.19819)
+visible = false
[node name="HandLeft" type="MeshInstance3D" parent="Main"]
-transform = Transform3D(0.287143, -0.2864, 1.45591e-06, -0.497341, -0.165355, -2.37987e-16, 7.2796e-07, -7.26076e-07, -0.574281, 1.302, -0.17, 0)
+transform = Transform3D(0.2871431, -0.28640002, 1.4559066e-06, -0.49734095, -0.16535497, -2.3798664e-16, 7.2796e-07, -7.2607605e-07, -0.574281, 1.302, -0.17, 0)
mesh = ExtResource("4_tcrm3")
skeleton = NodePath("")
@@ -833,7 +1042,4 @@ billboard = 1
no_depth_test = true
text = "Username"
-[node name="Tram" parent="." instance=ExtResource("18_8h5ka")]
-visible = false
-
[connection signal="animation_finished" from="HandAnimations" to="." method="_on_hand_animations_animation_finished"]