diff --git a/demo/LICENSE_ASSETS.md b/demo/LICENSE_ASSETS.md new file mode 100644 index 0000000..f2760dc --- /dev/null +++ b/demo/LICENSE_ASSETS.md @@ -0,0 +1,5 @@ +LimboAI Demo project graphical assets (PNG & SVG files in the "assets/" folder) +Copyright (c) 2024 Aleksandra Snitsaruk + +This work is licensed under the Creative Commons Attribution 4.0 International +license (CC BY 4.0 International): https://creativecommons.org/licenses/by/4.0/ diff --git a/demo/agents/01_agent_melee_simple.tscn b/demo/agents/01_agent_melee_simple.tscn new file mode 100644 index 0000000..b0db1ed --- /dev/null +++ b/demo/agents/01_agent_melee_simple.tscn @@ -0,0 +1,44 @@ +[gd_scene format=3 uid="uid://1dnm7tuik8xo"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_l180o"] +[ext_resource type="Texture2D" uid="uid://cw8s50856x8ct" path="res://demo/assets/agent_melee_simple.png" id="2_bvbes"] +[ext_resource type="BehaviorTree" uid="uid://bpdm5jnegi38" path="res://demo/ai/trees/01_agent_melee_simple.tres" id="3_tb7cx"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_s08ac"] +var/var4/name = &"var4" +var/var4/type = 3 +var/var4/value = -0.985 +var/var4/hint = 0 +var/var4/hint_string = "" +var/var5/name = &"var5" +var/var5/type = 3 +var/var5/value = 1.251 +var/var5/hint = 0 +var/var5/hint_string = "" + +[node name="AgentMeleeSimple" unique_id=505170388 instance=ExtResource("1_l180o")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_bvbes") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_bvbes") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_bvbes") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_bvbes") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_bvbes") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_bvbes") + +[node name="Health" parent="." index="3" unique_id=531975927] +max_health = 3.0 + +[node name="BTPlayer" type="BTPlayer" parent="." index="5" unique_id=1399725832] +behavior_tree = ExtResource("3_tb7cx") +blackboard_plan = SubResource("BlackboardPlan_s08ac") diff --git a/demo/agents/02_agent_charger.tscn b/demo/agents/02_agent_charger.tscn new file mode 100644 index 0000000..af3f0a4 --- /dev/null +++ b/demo/agents/02_agent_charger.tscn @@ -0,0 +1,37 @@ +[gd_scene format=3 uid="uid://g1pnvanyxcpa"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_n83hi"] +[ext_resource type="Texture2D" uid="uid://ce16nc0wy2s8" path="res://demo/assets/agent_charger.png" id="2_y7pic"] +[ext_resource type="BehaviorTree" uid="uid://ylife72ym5et" path="res://demo/ai/trees/02_agent_charger.tres" id="3_nacc3"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_pmyhf"] + +[node name="AgentCharger" unique_id=2045336463 instance=ExtResource("1_n83hi")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_y7pic") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_y7pic") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_y7pic") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_y7pic") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_y7pic") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_y7pic") + +[node name="Hitbox" parent="Root" parent_id_path=PackedInt32Array(961776610) index="1" unique_id=2090984012] +damage = 2.0 + +[node name="Health" parent="." index="3" unique_id=531975927] +max_health = 8.0 + +[node name="BTPlayer" type="BTPlayer" parent="." index="4" unique_id=1733921525] +behavior_tree = ExtResource("3_nacc3") +blackboard_plan = SubResource("BlackboardPlan_pmyhf") diff --git a/demo/agents/03_agent_imp.tscn b/demo/agents/03_agent_imp.tscn new file mode 100644 index 0000000..2c3d003 --- /dev/null +++ b/demo/agents/03_agent_imp.tscn @@ -0,0 +1,34 @@ +[gd_scene format=3 uid="uid://730bthc0ywhd"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_13xup"] +[ext_resource type="Texture2D" uid="uid://h70okn6hmxum" path="res://demo/assets/agent_imp.png" id="2_xd5s8"] +[ext_resource type="BehaviorTree" uid="uid://c2bxoo68ywb27" path="res://demo/ai/trees/03_agent_imp.tres" id="3_furh3"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_aog23"] + +[node name="AgentImp" unique_id=543735530 instance=ExtResource("1_13xup")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_xd5s8") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_xd5s8") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_xd5s8") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_xd5s8") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_xd5s8") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_xd5s8") + +[node name="Health" parent="." index="3" unique_id=531975927] +max_health = 4.0 + +[node name="BTPlayer" type="BTPlayer" parent="." index="5" unique_id=137535558] +behavior_tree = ExtResource("3_furh3") +blackboard_plan = SubResource("BlackboardPlan_aog23") diff --git a/demo/agents/04_agent_skirmisher.tscn b/demo/agents/04_agent_skirmisher.tscn new file mode 100644 index 0000000..2a8952c --- /dev/null +++ b/demo/agents/04_agent_skirmisher.tscn @@ -0,0 +1,34 @@ +[gd_scene format=3 uid="uid://co6yeafaljbq0"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_2ir76"] +[ext_resource type="Texture2D" uid="uid://l042ovqqsy3l" path="res://demo/assets/agent_skirmisher.png" id="2_w8tqw"] +[ext_resource type="BehaviorTree" uid="uid://qqmjvbeibatn" path="res://demo/ai/trees/04_agent_skirmisher.tres" id="3_bhfkv"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_vjbry"] + +[node name="AgentSkirmisher" unique_id=1648538552 instance=ExtResource("1_2ir76")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_w8tqw") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_w8tqw") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_w8tqw") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_w8tqw") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_w8tqw") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_w8tqw") + +[node name="Health" parent="." index="3" unique_id=531975927] +max_health = 7.0 + +[node name="BTPlayer" type="BTPlayer" parent="." index="4" unique_id=1268324578] +behavior_tree = ExtResource("3_bhfkv") +blackboard_plan = SubResource("BlackboardPlan_vjbry") diff --git a/demo/agents/05_agent_ranged.tscn b/demo/agents/05_agent_ranged.tscn new file mode 100644 index 0000000..ea912e7 --- /dev/null +++ b/demo/agents/05_agent_ranged.tscn @@ -0,0 +1,34 @@ +[gd_scene format=3 uid="uid://ci3x5esepbu5v"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_oa4xm"] +[ext_resource type="Texture2D" uid="uid://cjts4ennjtepg" path="res://demo/assets/agent_ranged.png" id="2_37lvn"] +[ext_resource type="BehaviorTree" uid="uid://cqluon1y1hnn5" path="res://demo/ai/trees/05_agent_ranged.tres" id="3_f7r5w"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_2kwy7"] + +[node name="AgentRanged" unique_id=2028208475 instance=ExtResource("1_oa4xm")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_37lvn") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_37lvn") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_37lvn") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_37lvn") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_37lvn") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_37lvn") + +[node name="Health" parent="." index="3" unique_id=531975927] +max_health = 6.0 + +[node name="BTPlayer" type="BTPlayer" parent="." index="4" unique_id=1201627788] +behavior_tree = ExtResource("3_f7r5w") +blackboard_plan = SubResource("BlackboardPlan_2kwy7") diff --git a/demo/agents/06_agent_melee_combo.tscn b/demo/agents/06_agent_melee_combo.tscn new file mode 100644 index 0000000..c3bbd21 --- /dev/null +++ b/demo/agents/06_agent_melee_combo.tscn @@ -0,0 +1,34 @@ +[gd_scene format=3 uid="uid://blxmw2w1h2s0s"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_dny3b"] +[ext_resource type="Texture2D" uid="uid://bo0ibp7tvjbba" path="res://demo/assets/agent_combo.png" id="2_4rqld"] +[ext_resource type="BehaviorTree" uid="uid://cpncl1db8j12f" path="res://demo/ai/trees/06_agent_melee_combo.tres" id="3_l805q"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_67ric"] + +[node name="AgentMeleeCombo" unique_id=1686489418 instance=ExtResource("1_dny3b")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_4rqld") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_4rqld") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_4rqld") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_4rqld") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_4rqld") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_4rqld") + +[node name="Health" parent="." index="3" unique_id=531975927] +max_health = 6.0 + +[node name="BTPlayer" type="BTPlayer" parent="." index="4" unique_id=1594372294] +behavior_tree = ExtResource("3_l805q") +blackboard_plan = SubResource("BlackboardPlan_67ric") diff --git a/demo/agents/07_agent_melee_nuanced.tscn b/demo/agents/07_agent_melee_nuanced.tscn new file mode 100644 index 0000000..e08c2a8 --- /dev/null +++ b/demo/agents/07_agent_melee_nuanced.tscn @@ -0,0 +1,34 @@ +[gd_scene format=3 uid="uid://2e4ohaqjaawb"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_afx5l"] +[ext_resource type="Texture2D" uid="uid://usu3j55d6dgc" path="res://demo/assets/agent_melee_nuanced.png" id="2_e51r0"] +[ext_resource type="BehaviorTree" uid="uid://c2u6sljqkim0n" path="res://demo/ai/trees/07_agent_melee_nuanced.tres" id="3_b8kcf"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_tnf02"] + +[node name="AgentMeleeNuanced" unique_id=552443241 instance=ExtResource("1_afx5l")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_e51r0") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_e51r0") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_e51r0") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_e51r0") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_e51r0") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_e51r0") + +[node name="Health" parent="." index="3" unique_id=531975927] +max_health = 6.0 + +[node name="BTPlayer" type="BTPlayer" parent="." index="4" unique_id=1879939663] +behavior_tree = ExtResource("3_b8kcf") +blackboard_plan = SubResource("BlackboardPlan_tnf02") diff --git a/demo/agents/08_agent_demon.tscn b/demo/agents/08_agent_demon.tscn new file mode 100644 index 0000000..035bf14 --- /dev/null +++ b/demo/agents/08_agent_demon.tscn @@ -0,0 +1,34 @@ +[gd_scene format=3 uid="uid://dbmcufef0cc4b"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_115kp"] +[ext_resource type="Texture2D" uid="uid://d1tx7u8ho0r4v" path="res://demo/assets/agent_demon.png" id="2_cb5f2"] +[ext_resource type="BehaviorTree" uid="uid://cpcnbi81jqge4" path="res://demo/ai/trees/08_agent_demon.tres" id="3_ebd57"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_5sr4g"] + +[node name="AgentDemon" unique_id=1526091536 instance=ExtResource("1_115kp")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_cb5f2") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_cb5f2") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_cb5f2") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_cb5f2") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_cb5f2") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_cb5f2") + +[node name="Health" parent="." index="3" unique_id=531975927] +max_health = 8.0 + +[node name="BTPlayer" type="BTPlayer" parent="." index="5" unique_id=394684464] +behavior_tree = ExtResource("3_ebd57") +blackboard_plan = SubResource("BlackboardPlan_5sr4g") diff --git a/demo/agents/09_agent_summoner.tscn b/demo/agents/09_agent_summoner.tscn new file mode 100644 index 0000000..5725669 --- /dev/null +++ b/demo/agents/09_agent_summoner.tscn @@ -0,0 +1,34 @@ +[gd_scene format=3 uid="uid://bycvi2fb0f7ue"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_neifu"] +[ext_resource type="Texture2D" uid="uid://ombnpn2edldt" path="res://demo/assets/agent_summoner.png" id="2_fcti4"] +[ext_resource type="BehaviorTree" uid="uid://cpxk7jnqpwwlc" path="res://demo/ai/trees/09_agent_summoner.tres" id="3_bunpq"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_bqv3d"] + +[node name="AgentSummoner" unique_id=2069305663 instance=ExtResource("1_neifu")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_fcti4") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_fcti4") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_fcti4") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_fcti4") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_fcti4") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_fcti4") + +[node name="Health" parent="." index="3" unique_id=531975927] +max_health = 8.0 + +[node name="BTPlayer" type="BTPlayer" parent="." index="5" unique_id=1626195106] +behavior_tree = ExtResource("3_bunpq") +blackboard_plan = SubResource("BlackboardPlan_bqv3d") diff --git a/demo/agents/agent_base.tscn b/demo/agents/agent_base.tscn new file mode 100644 index 0000000..3b7783a --- /dev/null +++ b/demo/agents/agent_base.tscn @@ -0,0 +1,4527 @@ +[gd_scene format=3 uid="uid://ooigbfhfy4wa"] + +[ext_resource type="Texture2D" uid="uid://dlo1ine6p5di4" path="res://demo/assets/agent_bobby.png" id="1_1u51b"] +[ext_resource type="Script" uid="uid://68wbhtvlbkqm" path="res://demo/agents/scripts/agent_base.gd" id="1_n8vy2"] +[ext_resource type="Texture2D" uid="uid://dj4oayt5ttvh8" path="res://demo/assets/fx.png" id="2_lv102"] +[ext_resource type="Texture2D" uid="uid://dwhhxj5557qrb" path="res://demo/assets/shadow.png" id="2_vr0jo"] +[ext_resource type="Texture2D" uid="uid://2uyxh7sy8qny" path="res://demo/assets/weapon_ninja_star.png" id="4_1c5xq"] +[ext_resource type="Texture2D" uid="uid://bdusy0qqtw0th" path="res://demo/assets/smoke.png" id="4_mnb6v"] +[ext_resource type="Script" uid="uid://5byn62y1oa76" path="res://demo/agents/scripts/health.gd" id="4_qwtrf"] +[ext_resource type="Script" uid="uid://dntc3c582m5w8" path="res://demo/agents/scripts/hitbox.gd" id="5_taq6b"] +[ext_resource type="Script" uid="uid://dq5h6yydckjc1" path="res://demo/agents/scripts/hurtbox.gd" id="6_jnvxm"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_2k81i"] +size = Vector2(140, 40) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_26abe"] +size = Vector2(88, 40) + +[sub_resource type="Curve" id="Curve_noh01"] +_data = [Vector2(0, 0.010989), 0.0, 0.0, 0, 0, Vector2(0.151111, 1), 1.3559, 1.3559, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_sb0wp"] +curve = SubResource("Curve_noh01") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_f5i1x"] +lifetime_randomness = 0.5 +particle_flag_disable_z = true +emission_shape = 3 +emission_box_extents = Vector3(40, 1, 1) +direction = Vector3(0, -1, 0) +spread = 90.0 +initial_velocity_min = 150.0 +initial_velocity_max = 250.0 +angular_velocity_min = -90.0 +angular_velocity_max = 90.0 +gravity = Vector3(0, 0, 0) +radial_accel_min = -90.0 +radial_accel_max = 90.0 +damping_min = 200.0 +damping_max = 200.0 +scale_min = 0.8 +scale_max = 1.2 +scale_curve = SubResource("CurveTexture_sb0wp") + +[sub_resource type="Curve" id="Curve_e33mb"] +_data = [Vector2(0, 0.010989), 0.0, 0.0, 0, 0, Vector2(0.151111, 1), 1.3559, 1.3559, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_qti8k"] +curve = SubResource("Curve_e33mb") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_gmal1"] +lifetime_randomness = 0.5 +particle_flag_disable_z = true +emission_shape = 3 +emission_box_extents = Vector3(40, 1, 1) +direction = Vector3(0, -1, 0) +spread = 90.0 +initial_velocity_min = 150.0 +initial_velocity_max = 250.0 +angular_velocity_min = -90.0 +angular_velocity_max = 90.0 +gravity = Vector3(0, 0, 0) +radial_accel_min = -90.0 +radial_accel_max = 90.0 +damping_min = 200.0 +damping_max = 200.0 +scale_min = 0.8 +scale_max = 1.2 +scale_curve = SubResource("CurveTexture_qti8k") +color = Color(0.913725, 0.8, 0.898039, 1) + +[sub_resource type="CircleShape2D" id="CircleShape2D_0c228"] + +[sub_resource type="Animation" id="Animation_nvm4d"] +resource_name = "RESET" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig/LegR:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(31, 65)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig/LegR:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig/LegR:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/Body:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(5, 53)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/Body:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/Body:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Body/Hat:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -91)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body/HandL:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-60, -53)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/Body/HandR:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(51, -51)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/LegL:position") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-29, 65)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/LegL:rotation") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/LegL:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("FX/Cloud:visible") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Rig:modulate") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(1, 1, 1, 1)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Root/Rig:position") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -76)] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("Root/Rig:rotation") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/23/type = "value" +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/path = NodePath("Root/Rig:scale") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/24/type = "value" +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/path = NodePath("FX/Death:emitting") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/25/type = "value" +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/path = NodePath("Root/Rig/Body/HandL/WeaponNinjaStar:visible") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/26/type = "value" +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/path = NodePath("Root/Hitbox:knockback_enabled") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/27/type = "value" +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/path = NodePath("Root/Hurtbox/HurtboxCollisionShape2D:disabled") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} + +[sub_resource type="Animation" id="Animation_8wj70"] +resource_name = "attack_1" +length = 0.28 +step = 0.01 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(0, -76), Vector2(0, -76)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/LegL:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-48, 48), Vector2(-55, 35), Vector2(-55, 35), Vector2(-29, 65)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/LegL:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.918872, 1.36873, 1.36873, 0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/LegL:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/LegR:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(35, 68), Vector2(31, 65)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/LegR:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [-0.125403, 0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/LegR:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(5, 53), Vector2(5, 53), Vector2(5, 53)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body:rotation") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.204683, 0.274184, 0.274184, 0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1.1, 0.9), Vector2(1.1, 0.9), Vector2(1.1, 0.9), Vector2(1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/Body/Hat:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(2, -91), Vector2(2, -91)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/Body/HandL:position") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-77.4704, -36.9794), Vector2(71.4321, -75.3422), Vector2(71.4321, -75.3422), Vector2(-60, -53)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.8, 1.8), Vector2(1.8, 1.8), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Root/Rig/Body/HandR:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(71.4504, -76.2001), Vector2(-47.4494, -37.9368), Vector2(-47.4494, -37.9368), Vector2(51, -51)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1.6, 1.6), Vector2(1.6, 1.6), Vector2(1.6, 1.6), Vector2(1, 1)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.3), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [true, false, true, true] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("Root/Hitbox:knockback_enabled") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [false, false, false] +} + +[sub_resource type="Animation" id="Animation_s1dey"] +resource_name = "attack_2" +length = 0.3 +step = 0.01 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -76)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/LegL:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-29, 65), Vector2(-29, 65), Vector2(-48, 48)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/LegL:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.397498, 0.918872] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/LegL:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/LegR:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(31, 65), Vector2(50, 51), Vector2(35, 68)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/LegR:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, -0.401688, -0.125403] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/LegR:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(5, 53), Vector2(5, 53)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body:rotation") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, -0.278326, 0.204683] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.9, 1.1), Vector2(1.1, 0.9)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/Body/Hat:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -91)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/Body/HandL:position") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-60, -53), Vector2(-1.7771, -44.1117), Vector2(-77.4704, -36.9794)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Root/Rig/Body/HandR:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(51, -51), Vector2(-70.2132, -64.2738), Vector2(71.4504, -76.2001)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0, 0.15, 0.25), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1.6, 1.6)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0, 0.25, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("Root/Hitbox:knockback_enabled") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [false, false, false] +} + +[sub_resource type="Animation" id="Animation_g7a0r"] +resource_name = "attack_3" +length = 0.35 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig/Body:position") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(-5, 40), Vector2(-5, 40)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig/Body:rotation") +tracks/1/interp = 2 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, -0.349066, 0.436332] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig/Body:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.9, 1.1), Vector2(1.1, 0.9)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/Body/Hat:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -91)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Body/HandL:position") +tracks/6/interp = 2 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.2, 0.25, 0.3), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-60, -53), Vector2(-93.4894, -42.3521), Vector2(6.40698, 1.6281), Vector2(68.5276, -75.9627)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/7/interp = 2 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.2, 0.25, 0.3), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, 1.70101, 0.0, 0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(2, 2), Vector2(3, 3)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body/HandR:position") +tracks/9/interp = 2 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(51, -51), Vector2(-1.40495, -52.6598), Vector2(-66.8689, -27.8787)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/10/interp = 2 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/LegL:position") +tracks/12/interp = 2 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-29, 65), Vector2(-57, 59), Vector2(37, 63)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/LegL:rotation") +tracks/13/interp = 2 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.706805, -0.742333] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/LegL:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/LegR:position") +tracks/15/interp = 2 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(31, 65), Vector2(31, 65), Vector2(-45, 39)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/LegR:rotation") +tracks/16/interp = 2 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, -0.477383, 1.06217] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/LegR:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("FX/Cloud:visible") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.25, 0.35), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Hitbox:knockback_enabled") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0.2, 0.35), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, false] +} + +[sub_resource type="Animation" id="Animation_jcwlt"] +resource_name = "charge" +length = 0.2 +loop_mode = 1 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -76)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/LegL:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(-16, 67), Vector2(-43, 30), Vector2(17, 26), Vector2(51, 50), Vector2(-16, 67)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/LegL:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [0.518326, 0.991314, 0.518326, -1.96385, 0.518326] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/LegL:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/LegR:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(23, 69), Vector2(74, 43), Vector2(6, 23), Vector2(-35, 47), Vector2(23, 69)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/LegR:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [0.811128, -0.351373, 0.811128, 1.40327, 0.811128] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/LegR:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(5, 53), Vector2(5, 53), Vector2(5, 53), Vector2(5, 53)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body:rotation") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [0.553472, 0.61588, 0.553472, 0.61588, 0.553472] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/Body/Hat:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -91)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1.1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/Body/HandL:position") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(8.86381, -27.008), Vector2(17.3173, -25.7316), Vector2(8.86381, -27.008), Vector2(17.3173, -25.7316), Vector2(8.86381, -27.008)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0, 0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Root/Rig/Body/HandR:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(22.4758, -47.2741)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, false] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("Root/Hitbox:knockback_enabled") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, true] +} + +[sub_resource type="Animation" id="Animation_sva81"] +resource_name = "charge_prepare" +length = 0.3 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -76)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/LegL:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-29, 65), Vector2(-46, 66), Vector2(-16, 67)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/LegL:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.518326, 0.518326] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/LegL:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/LegR:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(31, 65), Vector2(55, 35), Vector2(23, 69)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/LegR:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, -1.03322, 0.811128] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/LegR:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(5, 53), Vector2(5, 53)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body:rotation") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, -0.455647, 0.553472] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.1, 0.9), Vector2(0.9, 1.1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/Body/Hat:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(2, -91), Vector2(2, -91), Vector2(2, -91)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0872665] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/Body/HandL:position") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-60, -53), Vector2(-77.6176, -56.3868), Vector2(36.6639, -43.1139)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Root/Rig/Body/HandR:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(51, -51), Vector2(-42.71, -65.1758), Vector2(48.1987, -60.7003)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} + +[sub_resource type="Animation" id="Animation_5k1rd"] +resource_name = "dance" +length = 1.8 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig/Body/Hat:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 1.8), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(2, -91), Vector2(2, -91), Vector2(2, -91)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 1.8), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 1.8), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/Body/HandR:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(47.3684, -50.4762), Vector2(36, -51), Vector2(66, -51), Vector2(36, -51), Vector2(66, -51), Vector2(66, -21), Vector2(66, -81), Vector2(66, -21), Vector2(66, -81), Vector2(66, -21), Vector2(47.3684, -50.4762)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Body:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.1, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(5, 53), Vector2(5, 53), Vector2(5, 56), Vector2(5, 53), Vector2(5, 56), Vector2(5, 53), Vector2(5, 56), Vector2(5, 53)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Body:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.1, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Body:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(0.95, 1.05), Vector2(0.95, 1.05), Vector2(1.05, 0.95), Vector2(0.95, 1.05), Vector2(1.05, 0.95), Vector2(0.95, 1.05), Vector2(1.05, 0.95), Vector2(0.95, 1.05), Vector2(1.05, 0.95), Vector2(0.95, 1.05), Vector2(0.95, 1.05)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/LegR:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(31, 65), Vector2(46, 65), Vector2(16, 65), Vector2(46, 65), Vector2(16, 65), Vector2(31, 65), Vector2(31, 65), Vector2(31, 65)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/LegR:rotation") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/LegR:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/LegL:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(-29, 65), Vector2(-14, 65), Vector2(-44, 65), Vector2(-14, 65), Vector2(-44, 65), Vector2(-29, 65), Vector2(-29, 65), Vector2(-29, 65)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/LegL:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/LegL:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig:position") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.1, 1.8), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(0, -76), Vector2(0, -76), Vector2(0, -76)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig:rotation") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.1, 1.8), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.1, 1.8), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Root/Rig/Body/HandL:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(-31.5789, -50.4762), Vector2(-75, -53), Vector2(-15, -53), Vector2(-75, -53), Vector2(-15, -53), Vector2(-15, -83), Vector2(-15, -23), Vector2(-15, -83), Vector2(-15, -23), Vector2(-15, -83), Vector2(-31.5789, -50.4762)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.1, 1.3, 1.5, 1.7, 1.8), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} + +[sub_resource type="Animation" id="Animation_wei72"] +resource_name = "death" +length = 0.5 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig/LegL:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-29, 65), Vector2(-29, 65), Vector2(-29, 65)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig/LegL:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, -1.0566] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig/LegL:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/LegR:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(31, 65), Vector2(31, 65), Vector2(-12.2578, 72.9572)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/LegR:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, -0.693514] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/LegR:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Body:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(5, 53)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Body:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Body:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body/Hat:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -91)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/Body/HandL:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-60, -53), Vector2(-60, -53), Vector2(-34.0705, -33.1026)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/Body/HandR:position") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(51, -51), Vector2(51, -51), Vector2(27.9362, -34.8835)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = false +tracks/18/path = NodePath("FX/Cloud:visible") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Rig:position") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(0, -76), Vector2(-5, -120), Vector2(0, -40)] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Rig:rotation") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, -0.801138, -1.60228] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Root/Rig:scale") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("Root/Rig:modulate") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3, 0.4, 0.5), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(1, 1, 1, 1), Color(1, 1, 1, 0.321569), Color(1, 1, 1, 0.588235), Color(1, 1, 1, 0)] +} +tracks/23/type = "value" +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/path = NodePath("FX/Death:emitting") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/keys = { +"times": PackedFloat32Array(0, 0.3, 0.5), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [false, true, false] +} +tracks/24/type = "value" +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/path = NodePath("Root/Rig/Body/HandL/WeaponNinjaStar:visible") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/keys = { +"times": PackedFloat32Array(0, 0.5), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, false] +} + +[sub_resource type="Animation" id="Animation_msfb2"] +resource_name = "dodge" +length = 0.4 +capture_included = true +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(0, -76), Vector2(0, -38), Vector2(0, -76)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig:rotation") +tracks/1/interp = 2 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 2, +"values": [0.0, 2.35619, 6.28319, 12.5664] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 0.5), Vector2(1, 0.5), Vector2(1, 0.5), Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/LegL:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-29, 65), Vector2(-24.8287, 40.1066), Vector2(-24.8287, 40.1066), Vector2(-29, 65)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/LegL:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/LegL:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/LegR:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(31, 65), Vector2(26.1794, 41.8884), Vector2(26.1794, 41.8884), Vector2(31, 65)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/LegR:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/LegR:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(5, 53), Vector2(5, 53), Vector2(5, 53)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body:rotation") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/Body/Hat:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(2, -91), Vector2(2, -91), Vector2(2, -91), Vector2(2, -91)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/Body/HandL:position") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-60, -53), Vector2(-19.9999, -52.9358), Vector2(-19.9999, -52.9358), Vector2(-60, -53)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Root/Rig/Body/HandR:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(51, -51), Vector2(21.9955, -54.1155), Vector2(21.9955, -54.1155), Vector2(51, -51)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0, 0.0] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0, 0.1, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0, 0.0001, 0.1, 0.2, 0.3, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 1, +"values": [true, true, true, true, true, true] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("Root/Hurtbox/HurtboxCollisionShape2D:disabled") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, false] +} + +[sub_resource type="Animation" id="Animation_gowr5"] +resource_name = "hurt" +length = 0.25 +step = 0.01 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig/Body:position") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(-9, 29)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig/Body:rotation") +tracks/1/interp = 2 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 2), +"update": 0, +"values": [0.0, -0.459832] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig/Body:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.9, 1.1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = false +tracks/3/path = NodePath("Root/Rig/Body/Hat:position") +tracks/3/interp = 2 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(2, -91), Vector2(-23.375, -110.918)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/4/interp = 2 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, -0.169267] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Body/HandL:position") +tracks/6/interp = 2 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(-60, -53), Vector2(-86.123, -33.8822)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/7/interp = 2 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body/HandR:position") +tracks/9/interp = 2 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(51, -51), Vector2(-4.62756, -33.3235)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/10/interp = 2 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/LegL:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-29, 65)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/LegL:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/LegL:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/LegR:position") +tracks/15/interp = 2 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(31, 65), Vector2(37, 14)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/LegR:rotation") +tracks/16/interp = 2 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, -0.896359] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/LegR:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("FX/Cloud:visible") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.25), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, true] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Rig:modulate") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0, 0.11, 0.22), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(1, 1, 1, 1), Color(0.721569, 0, 0.0352941, 1), Color(1, 1, 1, 1)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Root/Rig/Body/HandL/WeaponNinjaStar:visible") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0, 0.25), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, false] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("Root/Hitbox:knockback_enabled") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0, 0.25), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, false] +} + +[sub_resource type="Animation" id="Animation_gnqgt"] +resource_name = "idle" +length = 0.4 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig/LegR:position") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(31, 65), Vector2(31, 65), Vector2(31, 65)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig/LegR:rotation") +tracks/1/interp = 2 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig/LegR:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.9, 1.1), Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/Body:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(5, 49), Vector2(5, 53)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/Body:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/Body:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.95, 1.05), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Body/Hat:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -91)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body/HandL:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-60, -53), Vector2(-62, -55), Vector2(-60, -53)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/10/interp = 2 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/Body/HandR:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(51, -51), Vector2(49, -53), Vector2(51, -51)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/13/interp = 2 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/LegL:position") +tracks/15/interp = 2 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-29, 65), Vector2(-29, 65), Vector2(-29, 65)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/LegL:rotation") +tracks/16/interp = 2 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/LegL:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.9, 1.1), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("FX/Cloud:visible") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, true] +} + +[sub_resource type="Animation" id="Animation_uow76"] +resource_name = "spit" +length = 0.3 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig/LegL:position") +tracks/0/interp = 2 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.3), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(-29, 65), Vector2(-57, 44)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig/LegL:rotation") +tracks/1/interp = 2 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.3), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.730707] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig/LegL:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.3), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/LegR:position") +tracks/3/interp = 2 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(31, 65), Vector2(46, 48), Vector2(31, 65)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/LegR:rotation") +tracks/4/interp = 2 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, -0.718681, 0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/LegR:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Body:position") +tracks/6/interp = 2 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(4, 46), Vector2(4, 46)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Body:rotation") +tracks/7/interp = 2 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, -0.330061, 0.363712] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Body:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.8, 1.2), Vector2(1.1, 0.9)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body/Hat:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -91)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/Body/HandL:position") +tracks/12/interp = 2 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-60, -53), Vector2(-53.8926, -21.1176), Vector2(-19.8796, -43.7927)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/13/interp = 2 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/Body/HandR:position") +tracks/15/interp = 2 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(51, -51), Vector2(47.6296, -15.5481), Vector2(47.0064, -56.4127)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/16/interp = 2 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} + +[sub_resource type="Animation" id="Animation_5mxvi"] +resource_name = "summon" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig/LegL:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(-29, 65), Vector2(-29, 65)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig/LegL:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig/LegL:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/LegR:position") +tracks/3/interp = 2 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6, 0.8, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(31, 65), Vector2(47, 54), Vector2(43, 56.75), Vector2(47, 54), Vector2(43, 56.75), Vector2(31, 65)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/LegR:rotation") +tracks/4/interp = 2 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6, 0.8, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 0, +"values": [0.0, -0.40126, -0.768424, -0.40126, -0.768424, 0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/LegR:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6, 0.8, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Body:position") +tracks/6/interp = 2 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.2, 0.6, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(5, 53), Vector2(5, 53), Vector2(5, 53)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Body:rotation") +tracks/7/interp = 2 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.2, 0.6, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, -0.179614, -0.179614, 0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Body:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6, 0.8, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(0.9, 1.1), Vector2(1, 1), Vector2(0.9, 1.1), Vector2(1, 1)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body/Hat:position") +tracks/9/interp = 2 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(2, -91), Vector2(2, -91)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/10/interp = 2 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/Body/HandL:position") +tracks/12/interp = 2 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6, 0.8, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(-60, -53), Vector2(-71.1271, -84.0591), Vector2(-76.1533, -94.4691), Vector2(-71.1271, -84.0591), Vector2(-76.1533, -94.4691), Vector2(-60, -53)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/13/interp = 2 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6, 0.8, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, -0.836345, 0.0, -0.836345, 0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6, 0.8, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/Body/HandR:position") +tracks/15/interp = 2 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6, 0.8, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(51, -51), Vector2(61.8744, -83.286), Vector2(62.8802, -95.0655), Vector2(61.8744, -83.286), Vector2(62.8802, -95.0655), Vector2(51, -51)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/16/interp = 2 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6, 0.8, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 0, +"values": [0.0, 0.0, -0.887813, 0.0, -0.887813, 0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.2, 0.4, 0.6, 0.8, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} + +[sub_resource type="Animation" id="Animation_yn0t6"] +resource_name = "throw" +length = 0.1 +step = 0.01 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -76)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig/LegL:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(-48, 64), Vector2(45, 67)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/LegL:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.862915, -0.786391] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/LegR:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(31, 65), Vector2(-27, 64)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/LegR:rotation") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.899266] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Body:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(5, 53)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Body:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [-0.250268, 0.250549] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Body/Hat:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -91)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body/HandR:position") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(37.6892, -51.6964), Vector2(-36.284, -25.5073)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.0] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig:scale") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/LegL:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/LegR:scale") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/Body:scale") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(0.9, 1.1), Vector2(1.1, 0.9)] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Root/Rig/Body/HandL:position") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-70.3036, -52.0327), Vector2(-5.01252, -88.9993), Vector2(66.2323, -78.0635)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.05, 0.1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1.5, 1.5)] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Root/Rig/Body/HandL/WeaponNinjaStar:visible") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0, 0.09, 0.1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, true, false] +} + +[sub_resource type="Animation" id="Animation_kb56n"] +resource_name = "throw_prepare" +length = 0.2 +loop_mode = 1 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -76)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig/LegL:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-48, 64), Vector2(-48, 64), Vector2(-48, 64)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/LegL:rotation") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.644548, 0.862915, 0.644548] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/LegR:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(31, 65)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/LegR:rotation") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Body:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(5, 53), Vector2(5, 53)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Body:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [-0.194275, -0.250268, -0.194275] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Body/Hat:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2, -91)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body/HandL:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-27.2463, -58.3579), Vector2(-70.3036, -52.0327), Vector2(-27.2463, -58.3579)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/Body/HandR:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(37.6892, -51.6964)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/LegL:scale") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/LegR:scale") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/Body:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Root/Rig/Body/HandL/WeaponNinjaStar:visible") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, true] +} + +[sub_resource type="Animation" id="Animation_fh06e"] +resource_name = "walk" +length = 0.6 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig/Body:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(5, 53), Vector2(5, 47), Vector2(5, 53)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig/Body:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig/Body:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.92, 1.08), Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/Body/Hat:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.6), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(2, -91), Vector2(2, -91)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/Body/Hat:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.6), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, 0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/Body/Hat:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.6), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Body/HandL:position") +tracks/6/interp = 2 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-60, -53), Vector2(17, -22), Vector2(-60, -53)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Body/HandL:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Body/HandL:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Root/Rig/Body/HandR:position") +tracks/9/interp = 2 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(51, -51), Vector2(-26, -29), Vector2(51, -51)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Root/Rig/Body/HandR:rotation") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 0.0, 0.0] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Root/Rig/Body/HandR:scale") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Root/Rig/LegL:position") +tracks/12/interp = 2 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-29, 65), Vector2(33, 65), Vector2(-29, 65)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Root/Rig/LegL:rotation") +tracks/13/interp = 2 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, -0.991068, 0.0] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Root/Rig/LegL:scale") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1.1, 1.1), Vector2(1, 1), Vector2(1.1, 1.1)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Root/Rig/LegR:position") +tracks/15/interp = 2 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(31, 65), Vector2(-30, 65), Vector2(31, 65)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Root/Rig/LegR:rotation") +tracks/16/interp = 2 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [0.0, 1.13756, 0.0] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Root/Rig/LegR:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.1, 1.1), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("FX/Cloud:visible") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Root/Hitbox/HitboxCollisionShape2D:disabled") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.6), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [true, true] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Root/Hurtbox/HurtboxCollisionShape2D:disabled") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0, 0.6), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, false] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_ws2ti"] +_data = { +&"RESET": SubResource("Animation_nvm4d"), +&"attack_1": SubResource("Animation_8wj70"), +&"attack_2": SubResource("Animation_s1dey"), +&"attack_3": SubResource("Animation_g7a0r"), +&"charge": SubResource("Animation_jcwlt"), +&"charge_prepare": SubResource("Animation_sva81"), +&"dance": SubResource("Animation_5k1rd"), +&"death": SubResource("Animation_wei72"), +&"dodge": SubResource("Animation_msfb2"), +&"hurt": SubResource("Animation_gowr5"), +&"idle": SubResource("Animation_gnqgt"), +&"spit": SubResource("Animation_uow76"), +&"summon": SubResource("Animation_5mxvi"), +&"throw": SubResource("Animation_yn0t6"), +&"throw_prepare": SubResource("Animation_kb56n"), +&"walk": SubResource("Animation_fh06e") +} + +[node name="AgentBase" type="CharacterBody2D" unique_id=1495761129] +collision_layer = 2 +collision_mask = 3 +motion_mode = 1 +wall_min_slide_angle = 0.0174533 +safe_margin = 0.001 +script = ExtResource("1_n8vy2") + +[node name="Root" type="Node2D" parent="." unique_id=961776610] +metadata/_edit_lock_ = true + +[node name="Rig" type="Node2D" parent="Root" unique_id=99014800] +position = Vector2(0, -76) + +[node name="Shadow" type="Sprite2D" parent="Root/Rig" unique_id=245862530] +modulate = Color(1, 1, 1, 0.258824) +position = Vector2(0, 76) +texture = ExtResource("2_vr0jo") + +[node name="LegL" type="Sprite2D" parent="Root/Rig" unique_id=1846803080] +position = Vector2(-29, 65) +texture = ExtResource("1_1u51b") +region_enabled = true +region_rect = Rect2(104, 67, 35, 28) + +[node name="LegR" type="Sprite2D" parent="Root/Rig" unique_id=1298898798] +position = Vector2(31, 65) +texture = ExtResource("1_1u51b") +region_enabled = true +region_rect = Rect2(105, 97, 34, 27) + +[node name="Body" type="Sprite2D" parent="Root/Rig" unique_id=1986703668] +position = Vector2(5, 53) +texture = ExtResource("1_1u51b") +offset = Vector2(-5, -53) +region_enabled = true +region_rect = Rect2(4.03712, 4.21556, 94.9839, 121.271) + +[node name="Hat" type="Sprite2D" parent="Root/Rig/Body" unique_id=1581505781] +position = Vector2(2, -91) +texture = ExtResource("1_1u51b") +offset = Vector2(-1, -20) +region_enabled = true +region_rect = Rect2(163, 20, 170, 102) + +[node name="HandL" type="Sprite2D" parent="Root/Rig/Body" unique_id=1237044871] +position = Vector2(-60, -53) +texture = ExtResource("1_1u51b") +region_enabled = true +region_rect = Rect2(111.022, 6.27016, 27.6329, 27.1423) + +[node name="WeaponNinjaStar" type="Sprite2D" parent="Root/Rig/Body/HandL" unique_id=524608315] +visible = false +texture = ExtResource("4_1c5xq") + +[node name="HandR" type="Sprite2D" parent="Root/Rig/Body" unique_id=1388852439] +show_behind_parent = true +position = Vector2(51, -51) +texture = ExtResource("1_1u51b") +region_enabled = true +region_rect = Rect2(111, 34, 26.9272, 26.6298) + +[node name="Hitbox" type="Area2D" parent="Root" unique_id=2090984012] +position = Vector2(50, 0) +collision_layer = 0 +collision_mask = 4 +script = ExtResource("5_taq6b") +knockback_strength = 1000.0 + +[node name="HitboxCollisionShape2D" type="CollisionShape2D" parent="Root/Hitbox" unique_id=957217716] +shape = SubResource("RectangleShape2D_2k81i") +disabled = true +debug_color = Color(0.933131, 0.0801983, 0.605982, 0.42) +metadata/_edit_lock_ = true + +[node name="Hurtbox" type="Area2D" parent="Root" unique_id=427615892 node_paths=PackedStringArray("health")] +collision_layer = 8 +collision_mask = 0 +script = ExtResource("6_jnvxm") +health = NodePath("../../Health") + +[node name="HurtboxCollisionShape2D" type="CollisionShape2D" parent="Root/Hurtbox" unique_id=1030183662] +shape = SubResource("RectangleShape2D_26abe") +debug_color = Color(0.466325, 0.590206, 0.107862, 0.42) +metadata/_edit_lock_ = true + +[node name="FX" type="Node2D" parent="." unique_id=1148910240] +position = Vector2(0, -68) +metadata/_edit_lock_ = true + +[node name="Cloud" type="Sprite2D" parent="FX" unique_id=1064689506] +visible = false +scale = Vector2(0.5, 0.5) +texture = ExtResource("2_lv102") +region_enabled = true +region_rect = Rect2(300, 0, 100, 70) + +[node name="Death" type="GPUParticles2D" parent="FX" unique_id=1185317523] +position = Vector2(0, 52) +emitting = false +amount = 16 +texture = ExtResource("4_mnb6v") +lifetime = 0.7 +one_shot = true +explosiveness = 0.7 +fixed_fps = 60 +process_material = SubResource("ParticleProcessMaterial_f5i1x") + +[node name="Summoned" type="GPUParticles2D" parent="FX" unique_id=726264659] +position = Vector2(0, 83) +emitting = false +amount = 16 +texture = ExtResource("4_mnb6v") +lifetime = 1.4 +one_shot = true +explosiveness = 0.5 +fixed_fps = 60 +process_material = SubResource("ParticleProcessMaterial_gmal1") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=67793688] +visible = false +position = Vector2(-1, -7) +rotation = 1.5708 +shape = SubResource("CircleShape2D_0c228") + +[node name="Health" type="Node" parent="." unique_id=531975927] +script = ExtResource("4_qwtrf") + +[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=159211096] +callback_mode_method = 1 +libraries/ = SubResource("AnimationLibrary_ws2ti") +autoplay = &"idle" diff --git a/demo/agents/fireball/fireball.gd b/demo/agents/fireball/fireball.gd new file mode 100644 index 0000000..513a722 --- /dev/null +++ b/demo/agents/fireball/fireball.gd @@ -0,0 +1,56 @@ +#* +#* fireball.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +extends Node2D +## Fireball + +const SPEED := 800.0 +const DEAD_SPEED := 400.0 + +@export var dir: float = 1.0 + +var _is_dead: bool = false + +@onready var fireball_sprite: Sprite2D = $Root/Fireball +@onready var death: GPUParticles2D = $FX/Death +@onready var collision_shape_2d: CollisionShape2D = $Hitbox/CollisionShape2D +@onready var root: Node2D = $Root +@onready var trail: GPUParticles2D = $FX/Trail + + +func _ready() -> void: + var tween := create_tween().set_loops() + tween.tween_property(fireball_sprite, ^"rotation", PI * signf(dir), 1.0).as_relative() + + var tween2 := create_tween().set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN) + tween2.tween_property(fireball_sprite, "position:y", -10.0, 0.5).as_relative().set_ease(Tween.EASE_OUT) + tween2.tween_property(fireball_sprite, "position:y", 0.0, 1.0) + tween2.tween_callback(_die) + + +func _physics_process(delta: float) -> void: + var speed: float = SPEED if not _is_dead else DEAD_SPEED + position += Vector2.RIGHT * speed * dir * delta + + +func _die() -> void: + if _is_dead: + return + _is_dead = true + trail.emitting = false + root.hide() + collision_shape_2d.set_deferred(&"disabled", true) + death.emitting = true + await death.finished + queue_free() + + +func _on_hitbox_area_entered(_area: Area2D) -> void: + _die() diff --git a/demo/agents/fireball/fireball.gd.uid b/demo/agents/fireball/fireball.gd.uid new file mode 100644 index 0000000..8e6a542 --- /dev/null +++ b/demo/agents/fireball/fireball.gd.uid @@ -0,0 +1 @@ +uid://cw0jj6rj3e4dp diff --git a/demo/agents/fireball/fireball.tscn b/demo/agents/fireball/fireball.tscn new file mode 100644 index 0000000..85b1c6b --- /dev/null +++ b/demo/agents/fireball/fireball.tscn @@ -0,0 +1,167 @@ +[gd_scene format=3 uid="uid://wdauoepicegb"] + +[ext_resource type="Script" uid="uid://cw0jj6rj3e4dp" path="res://demo/agents/fireball/fireball.gd" id="1_ituf4"] +[ext_resource type="Texture2D" uid="uid://dwhhxj5557qrb" path="res://demo/assets/shadow.png" id="2_6n8mx"] +[ext_resource type="Texture2D" uid="uid://235liwnxn1n5" path="res://demo/assets/fireball.png" id="3_1an0e"] +[ext_resource type="Script" uid="uid://dntc3c582m5w8" path="res://demo/agents/scripts/hitbox.gd" id="4_rjhgc"] +[ext_resource type="Texture2D" uid="uid://bdusy0qqtw0th" path="res://demo/assets/smoke.png" id="5_dcbp6"] + +[sub_resource type="Curve" id="Curve_mukra"] +_data = [Vector2(0, 0), 0.0, 4.81319, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 2 + +[sub_resource type="CurveTexture" id="CurveTexture_56342"] +curve = SubResource("Curve_mukra") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_gbya7"] +lifetime_randomness = 0.5 +particle_flag_disable_z = true +direction = Vector3(0, -1, 0) +spread = 90.0 +initial_velocity_min = 150.0 +initial_velocity_max = 250.0 +angular_velocity_min = -90.0 +angular_velocity_max = 90.0 +gravity = Vector3(0, 0, 0) +radial_accel_min = -90.0 +radial_accel_max = 90.0 +damping_min = 200.0 +damping_max = 200.0 +scale_min = 0.8 +scale_max = 1.2 +scale_curve = SubResource("CurveTexture_56342") +color = Color(0.552941, 0.552941, 0.552941, 1) + +[sub_resource type="Gradient" id="Gradient_c08h3"] +offsets = PackedFloat32Array(0, 0.549738, 1) +colors = PackedColorArray(0.980453, 0.717632, 0.282353, 1, 0.960906, 0.211521, 0.0390784, 1, 0.201527, 0.201527, 0.201527, 1) + +[sub_resource type="GradientTexture1D" id="GradientTexture1D_fhxvw"] +gradient = SubResource("Gradient_c08h3") + +[sub_resource type="Curve" id="Curve_ugmtv"] +_data = [Vector2(0, 0.010989), 0.0, 0.0, 0, 0, Vector2(0.151111, 1), 1.3559, 1.3559, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_1f5jp"] +curve = SubResource("Curve_ugmtv") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_gilhy"] +lifetime_randomness = 0.5 +particle_flag_disable_z = true +emission_shape = 3 +emission_box_extents = Vector3(40, 1, 1) +direction = Vector3(0, -1, 0) +spread = 90.0 +initial_velocity_min = 150.0 +initial_velocity_max = 250.0 +angular_velocity_min = -90.0 +angular_velocity_max = 90.0 +gravity = Vector3(0, 0, 0) +radial_accel_min = -90.0 +radial_accel_max = 90.0 +damping_min = 200.0 +damping_max = 200.0 +scale_min = 0.8 +scale_max = 1.2 +scale_curve = SubResource("CurveTexture_1f5jp") +color_ramp = SubResource("GradientTexture1D_fhxvw") + +[sub_resource type="CircleShape2D" id="CircleShape2D_7uc1b"] +radius = 25.13 + +[sub_resource type="Animation" id="Animation_wr7y0"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Fireball:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [0] +} + +[sub_resource type="Animation" id="Animation_ey8it"] +resource_name = "default" +length = 0.3 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Fireball:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [0, 1, 2, 0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_cphpk"] +_data = { +&"RESET": SubResource("Animation_wr7y0"), +&"default": SubResource("Animation_ey8it") +} + +[node name="Fireball" type="Node2D" unique_id=943362276] +script = ExtResource("1_ituf4") + +[node name="FX" type="Node2D" parent="." unique_id=1832286385] +position = Vector2(0, -92) + +[node name="Trail" type="GPUParticles2D" parent="FX" unique_id=1635748523] +show_behind_parent = true +amount = 6 +texture = ExtResource("5_dcbp6") +lifetime = 0.4 +fixed_fps = 60 +process_material = SubResource("ParticleProcessMaterial_gbya7") + +[node name="Death" type="GPUParticles2D" parent="FX" unique_id=1295484150] +emitting = false +amount = 6 +texture = ExtResource("5_dcbp6") +lifetime = 0.7 +one_shot = true +explosiveness = 0.7 +fixed_fps = 60 +local_coords = true +process_material = SubResource("ParticleProcessMaterial_gilhy") + +[node name="Root" type="Node2D" parent="." unique_id=892661448] + +[node name="Shadow" type="Sprite2D" parent="Root" unique_id=415632468] +modulate = Color(1, 1, 1, 0.686275) +position = Vector2(0, -1) +scale = Vector2(0.382, 0.297) +texture = ExtResource("2_6n8mx") + +[node name="Fireball" type="Sprite2D" parent="Root" unique_id=1166968307] +position = Vector2(0, -92) +texture = ExtResource("3_1an0e") +hframes = 3 + +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="Root/Fireball" unique_id=1150039106] +remote_path = NodePath("../../../FX") +update_rotation = false +update_scale = false + +[node name="Hitbox" type="Area2D" parent="." unique_id=1286838192] +collision_layer = 0 +collision_mask = 4 +script = ExtResource("4_rjhgc") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox" unique_id=1631538459] +shape = SubResource("CircleShape2D_7uc1b") +debug_color = Color(0.839216, 0.192157, 0.815686, 0.419608) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=585928245] +libraries/ = SubResource("AnimationLibrary_cphpk") +autoplay = &"default" + +[connection signal="area_entered" from="Hitbox" to="." method="_on_hitbox_area_entered"] diff --git a/demo/agents/ninja_star/ninja_star.gd b/demo/agents/ninja_star/ninja_star.gd new file mode 100644 index 0000000..0a1713e --- /dev/null +++ b/demo/agents/ninja_star/ninja_star.gd @@ -0,0 +1,53 @@ +#* +#* ninja_star.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +extends Node2D + +const SPEED := 800.0 +const DEAD_SPEED := 400.0 + +@export var dir: float = 1.0 + +var _is_dead: bool = false + +@onready var ninja_star: Sprite2D = $Root/NinjaStar +@onready var death: GPUParticles2D = $Death +@onready var collision_shape_2d: CollisionShape2D = $Hitbox/CollisionShape2D +@onready var root: Node2D = $Root + + +func _ready() -> void: + var tween := create_tween().set_loops() + tween.tween_property(ninja_star, ^"rotation", TAU * signf(dir), 1.0).as_relative() + + var tween2 := create_tween().set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_IN) + tween2.tween_property(ninja_star, "position:y", -10.0, 0.5).as_relative().set_ease(Tween.EASE_OUT) + tween2.tween_property(ninja_star, "position:y", 0.0, 1.0) + tween2.tween_callback(_die) + + +func _physics_process(delta: float) -> void: + var speed: float = SPEED if not _is_dead else DEAD_SPEED + position += Vector2.RIGHT * speed * dir * delta + + +func _die() -> void: + if _is_dead: + return + _is_dead = true + root.hide() + collision_shape_2d.set_deferred(&"disabled", true) + death.emitting = true + await death.finished + queue_free() + + +func _on_hitbox_area_entered(_area: Area2D) -> void: + _die() diff --git a/demo/agents/ninja_star/ninja_star.gd.uid b/demo/agents/ninja_star/ninja_star.gd.uid new file mode 100644 index 0000000..87a2801 --- /dev/null +++ b/demo/agents/ninja_star/ninja_star.gd.uid @@ -0,0 +1 @@ +uid://ea3wq7unbfaw diff --git a/demo/agents/ninja_star/ninja_star.tscn b/demo/agents/ninja_star/ninja_star.tscn new file mode 100644 index 0000000..e82549d --- /dev/null +++ b/demo/agents/ninja_star/ninja_star.tscn @@ -0,0 +1,80 @@ +[gd_scene format=3 uid="uid://bj5n72nomeaci"] + +[ext_resource type="Script" uid="uid://ea3wq7unbfaw" path="res://demo/agents/ninja_star/ninja_star.gd" id="1_pja57"] +[ext_resource type="Texture2D" uid="uid://2uyxh7sy8qny" path="res://demo/assets/weapon_ninja_star.png" id="1_ptof7"] +[ext_resource type="Texture2D" uid="uid://dwhhxj5557qrb" path="res://demo/assets/shadow.png" id="2_2rj5a"] +[ext_resource type="Script" uid="uid://dntc3c582m5w8" path="res://demo/agents/scripts/hitbox.gd" id="2_iem02"] +[ext_resource type="Texture2D" uid="uid://bdusy0qqtw0th" path="res://demo/assets/smoke.png" id="5_t37aw"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_7uc1b"] +radius = 28.0 + +[sub_resource type="Curve" id="Curve_ugmtv"] +_data = [Vector2(0, 0.010989), 0.0, 0.0, 0, 0, Vector2(0.151111, 1), 1.3559, 1.3559, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0] +point_count = 3 + +[sub_resource type="CurveTexture" id="CurveTexture_1f5jp"] +curve = SubResource("Curve_ugmtv") + +[sub_resource type="ParticleProcessMaterial" id="ParticleProcessMaterial_gilhy"] +lifetime_randomness = 0.5 +particle_flag_disable_z = true +emission_shape = 3 +emission_box_extents = Vector3(40, 1, 1) +direction = Vector3(0, -1, 0) +spread = 90.0 +initial_velocity_min = 150.0 +initial_velocity_max = 250.0 +angular_velocity_min = -90.0 +angular_velocity_max = 90.0 +gravity = Vector3(0, 0, 0) +radial_accel_min = -90.0 +radial_accel_max = 90.0 +damping_min = 200.0 +damping_max = 200.0 +scale_min = 0.8 +scale_max = 1.2 +scale_curve = SubResource("CurveTexture_1f5jp") + +[node name="NinjaStar" type="Node2D" unique_id=1747014584] +script = ExtResource("1_pja57") + +[node name="Root" type="Node2D" parent="." unique_id=996020542] + +[node name="Shadow" type="Sprite2D" parent="Root" unique_id=1298527125] +modulate = Color(1, 1, 1, 0.686275) +position = Vector2(0, -1) +scale = Vector2(0.382, 0.297) +texture = ExtResource("2_2rj5a") + +[node name="NinjaStar" type="Sprite2D" parent="Root" unique_id=1749751253] +position = Vector2(0, -93) +texture = ExtResource("1_ptof7") + +[node name="RemoteTransform2D" type="RemoteTransform2D" parent="Root/NinjaStar" unique_id=2142563158] +remote_path = NodePath("../../../Death") +update_rotation = false +update_scale = false + +[node name="Hitbox" type="Area2D" parent="." unique_id=1818428034] +collision_layer = 0 +collision_mask = 4 +script = ExtResource("2_iem02") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox" unique_id=714067082] +shape = SubResource("CircleShape2D_7uc1b") +debug_color = Color(0.839216, 0.192157, 0.815686, 0.419608) + +[node name="Death" type="GPUParticles2D" parent="." unique_id=792091693] +position = Vector2(0, -93) +emitting = false +amount = 1 +texture = ExtResource("5_t37aw") +lifetime = 0.7 +one_shot = true +explosiveness = 0.7 +fixed_fps = 60 +local_coords = true +process_material = SubResource("ParticleProcessMaterial_gilhy") + +[connection signal="area_entered" from="Hitbox" to="." method="_on_hitbox_area_entered"] diff --git a/demo/agents/player/player.gd b/demo/agents/player/player.gd new file mode 100644 index 0000000..7c5b19a --- /dev/null +++ b/demo/agents/player/player.gd @@ -0,0 +1,103 @@ +#* +#* player.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +extends "res://demo/agents/scripts/agent_base.gd" + +## Player. + +@export var dodge_cooldown: float = 0.4 + +@onready var hsm: LimboHSM = $LimboHSM +@onready var idle_state: LimboState = $LimboHSM/IdleState +@onready var move_state: LimboState = $LimboHSM/MoveState +@onready var attack_state: LimboState = $LimboHSM/AttackState +@onready var dodge_state: LimboState = $LimboHSM/DodgeState + +var can_dodge: bool = true +var attack_pressed: bool = false + + +func _ready() -> void: + super._ready() + can_dodge = true + _init_input_events() + _init_state_machine() + death.connect(func(): remove_from_group(&"player")) + + +func _unhandled_input(event: InputEvent) -> void: + if event.is_echo(): + return + if event.is_action_pressed("attack"): + attack_pressed = true + _process_attack_input() + if event.is_action_pressed("dodge"): + hsm.dispatch("dodge!") + + +func _process_attack_input() -> void: + if not attack_pressed or hsm.get_active_state() == attack_state: + return + hsm.dispatch("attack!") + attack_pressed = false + + +func _init_state_machine() -> void: + hsm.add_transition(idle_state, move_state, idle_state.EVENT_FINISHED) + hsm.add_transition(move_state, idle_state, move_state.EVENT_FINISHED) + hsm.add_transition(idle_state, attack_state, "attack!") + hsm.add_transition(move_state, attack_state, "attack!") + hsm.add_transition(attack_state, move_state, attack_state.EVENT_FINISHED) + hsm.add_transition(hsm.ANYSTATE, dodge_state, "dodge!") + hsm.add_transition(dodge_state, move_state, dodge_state.EVENT_FINISHED) + + dodge_state.set_guard(_can_dodge) + attack_state.set_guard(attack_state.can_enter) + + # Process attack input buffer when move_state is entered. + # This way we can buffer the attack button presses and chain the attacks. + move_state.call_on_enter(_process_attack_input) + + hsm.initialize(self) + hsm.set_active(true) + + +func _init_input_events() -> void: + # Note: Ensures that input events are present even if project.godot wasn't imported. + _add_action(&"move_left", KEY_A) + _add_action(&"move_right", KEY_D) + _add_action(&"move_up", KEY_W) + _add_action(&"move_down", KEY_S) + _add_action(&"dodge", KEY_SPACE) + _add_action(&"attack", KEY_ENTER, KEY_F) + + +func _add_action(p_action: StringName, p_key: Key, p_alt: Key = KEY_NONE) -> void: + if not InputMap.has_action(p_action): + InputMap.add_action(p_action) + var event := InputEventKey.new() + event.keycode = p_key + InputMap.action_add_event(p_action, event) + if p_alt != KEY_NONE: + var alt := InputEventKey.new() + alt.keycode = p_alt + InputMap.action_add_event(p_action, alt) + + +func set_victorious() -> void: + idle_state.idle_animation = &"dance" + + +func _can_dodge() -> bool: + if can_dodge: + can_dodge = false + get_tree().create_timer(dodge_cooldown).timeout.connect(func(): can_dodge = true) + return true + return false diff --git a/demo/agents/player/player.gd.uid b/demo/agents/player/player.gd.uid new file mode 100644 index 0000000..33e8d11 --- /dev/null +++ b/demo/agents/player/player.gd.uid @@ -0,0 +1 @@ +uid://cgqdrwywolo6a diff --git a/demo/agents/player/player.tscn b/demo/agents/player/player.tscn new file mode 100644 index 0000000..9630010 --- /dev/null +++ b/demo/agents/player/player.tscn @@ -0,0 +1,53 @@ +[gd_scene format=3 uid="uid://d07ag5dcje13i"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_mswd4"] +[ext_resource type="Script" uid="uid://cgqdrwywolo6a" path="res://demo/agents/player/player.gd" id="2_24nyi"] +[ext_resource type="Script" uid="uid://cig7kaq6hm5nd" path="res://demo/agents/player/states/idle_state.gd" id="3_ekb12"] +[ext_resource type="Script" uid="uid://bu4henvxerree" path="res://demo/agents/player/states/move_state.gd" id="4_paikn"] +[ext_resource type="Script" uid="uid://csbtng53jffek" path="res://demo/agents/player/states/attack_state.gd" id="5_mpgu6"] +[ext_resource type="Script" uid="uid://di111ridlwuy5" path="res://demo/agents/player/states/dodge_state.gd" id="6_7o4a6"] + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_8pofm"] +size = Vector2(150, 50) + +[node name="Player" unique_id=1780404921 groups=["player"] instance=ExtResource("1_mswd4")] +collision_layer = 0 +collision_mask = 1 +script = ExtResource("2_24nyi") +dodge_cooldown = 0.4 + +[node name="Hitbox" parent="Root" parent_id_path=PackedInt32Array(961776610) index="1" unique_id=2090984012] +collision_mask = 8 + +[node name="HitboxCollisionShape2D" parent="Root/Hitbox" index="0" unique_id=957217716] +shape = SubResource("RectangleShape2D_8pofm") + +[node name="Hurtbox" parent="Root" parent_id_path=PackedInt32Array(961776610) index="2" unique_id=427615892] +collision_layer = 4 + +[node name="Health" parent="." index="3" unique_id=531975927] +max_health = 30.0 + +[node name="LimboHSM" type="LimboHSM" parent="." index="4" unique_id=12190754] + +[node name="IdleState" type="LimboState" parent="LimboHSM" index="0" unique_id=310438372 node_paths=PackedStringArray("animation_player")] +script = ExtResource("3_ekb12") +animation_player = NodePath("../../AnimationPlayer") +idle_animation = &"idle" + +[node name="MoveState" type="LimboState" parent="LimboHSM" index="1" unique_id=925582684 node_paths=PackedStringArray("animation_player")] +script = ExtResource("4_paikn") +animation_player = NodePath("../../AnimationPlayer") +animation = &"walk" + +[node name="AttackState" type="LimboState" parent="LimboHSM" index="2" unique_id=146585969 node_paths=PackedStringArray("animation_player", "hitbox")] +script = ExtResource("5_mpgu6") +animation_player = NodePath("../../AnimationPlayer") +animations = Array[StringName]([&"attack_1", &"attack_2", &"attack_3"]) +hitbox = NodePath("../../Root/Hitbox") + +[node name="DodgeState" type="LimboState" parent="LimboHSM" index="3" unique_id=1308489318 node_paths=PackedStringArray("animation_player", "hurtbox_collision")] +script = ExtResource("6_7o4a6") +animation_player = NodePath("../../AnimationPlayer") +animation = &"dodge" +hurtbox_collision = NodePath("../../Root/Hurtbox/HurtboxCollisionShape2D") diff --git a/demo/agents/player/states/attack_state.gd b/demo/agents/player/states/attack_state.gd new file mode 100644 index 0000000..3af48a5 --- /dev/null +++ b/demo/agents/player/states/attack_state.gd @@ -0,0 +1,60 @@ +#* +#* attack_state.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +extends LimboState + +## Attack state: Perform 3-part combo attack for as long as player hits attack button. + +@export var animation_player: AnimationPlayer +@export var animations: Array[StringName] +@export var hitbox: Hitbox + +## Cooldown duration after third attack in the combo is complete. +@export var combo_cooldown: float = 0.1 + +var anim_index: int = 0 +var last_attack_msec: int = -10000 +var _can_enter: bool = true + + +## This func is used to prevent entering this state using LimboState.set_guard(). +## Entry is denied for a short duration after the third attack in the combo is complete. +func can_enter() -> bool: + return _can_enter + + +func _enter() -> void: + if (Time.get_ticks_msec() - last_attack_msec) < 200: + # Perform next attack animation in the 3-part combo, if an attack was recently performed. + anim_index = (anim_index + 1) % 3 + else: + anim_index = 0 + + var horizontal_move: float = Input.get_axis(&"move_left", &"move_right") + if not is_zero_approx(horizontal_move): + agent.face_dir(horizontal_move) + + hitbox.damage = 2 if anim_index == 2 else 1 # deal 2 damage on a third attack in the combo + animation_player.play(animations[anim_index]) + + await animation_player.animation_finished + if is_active(): + get_root().dispatch(EVENT_FINISHED) + + +func _exit() -> void: + hitbox.damage = 1 + last_attack_msec = Time.get_ticks_msec() + if anim_index == 2 and _can_enter: + # Prevent entering this state for a short duration after the third attack + # in the combo sequence is complete. + _can_enter = false + await get_tree().create_timer(combo_cooldown).timeout + _can_enter = true diff --git a/demo/agents/player/states/attack_state.gd.uid b/demo/agents/player/states/attack_state.gd.uid new file mode 100644 index 0000000..bb9edef --- /dev/null +++ b/demo/agents/player/states/attack_state.gd.uid @@ -0,0 +1 @@ +uid://csbtng53jffek diff --git a/demo/agents/player/states/dodge_state.gd b/demo/agents/player/states/dodge_state.gd new file mode 100644 index 0000000..50b3446 --- /dev/null +++ b/demo/agents/player/states/dodge_state.gd @@ -0,0 +1,48 @@ +#* +#* dodge_state.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +extends LimboState +## Dodge state. + + +@export var animation_player: AnimationPlayer +@export var animation: StringName +@export var duration: float = 0.4 +@export var dodge_speed: float = 1000.0 +@export var hurtbox_collision: CollisionShape2D + +var move_dir: Vector2 +var elapsed_time: float + + +func _enter() -> void: + elapsed_time = 0.0 + hurtbox_collision.disabled = true + + var horizontal_move: float = Input.get_axis(&"move_left", &"move_right") + if is_zero_approx(horizontal_move): + move_dir = Vector2.RIGHT * agent.get_facing() + else: + move_dir = Vector2.RIGHT * signf(horizontal_move) + agent.face_dir(move_dir.x) + + animation_player.play(animation, 0.1) + + +func _exit() -> void: + hurtbox_collision.set_deferred(&"disabled", false) + + +func _update(p_delta: float) -> void: + elapsed_time += p_delta + var desired_velocity: Vector2 = move_dir * dodge_speed + agent.move(desired_velocity) + if elapsed_time > duration: + get_root().dispatch(EVENT_FINISHED) diff --git a/demo/agents/player/states/dodge_state.gd.uid b/demo/agents/player/states/dodge_state.gd.uid new file mode 100644 index 0000000..fc958fc --- /dev/null +++ b/demo/agents/player/states/dodge_state.gd.uid @@ -0,0 +1 @@ +uid://di111ridlwuy5 diff --git a/demo/agents/player/states/idle_state.gd b/demo/agents/player/states/idle_state.gd new file mode 100644 index 0000000..61e7ec2 --- /dev/null +++ b/demo/agents/player/states/idle_state.gd @@ -0,0 +1,27 @@ +#* +#* idle_state.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +extends LimboState +## Idle state. + + +@export var animation_player: AnimationPlayer +@export var idle_animation: StringName + + +func _enter() -> void: + animation_player.play(idle_animation, 0.1) + + +func _update(_delta: float) -> void: + var horizontal_move: float = Input.get_axis(&"move_left", &"move_right") + var vertical_move: float = Input.get_axis(&"move_up", &"move_down") + if horizontal_move != 0.0 or vertical_move != 0.0: + get_root().dispatch(EVENT_FINISHED) diff --git a/demo/agents/player/states/idle_state.gd.uid b/demo/agents/player/states/idle_state.gd.uid new file mode 100644 index 0000000..02047fd --- /dev/null +++ b/demo/agents/player/states/idle_state.gd.uid @@ -0,0 +1 @@ +uid://cig7kaq6hm5nd diff --git a/demo/agents/player/states/move_state.gd b/demo/agents/player/states/move_state.gd new file mode 100644 index 0000000..332732a --- /dev/null +++ b/demo/agents/player/states/move_state.gd @@ -0,0 +1,37 @@ +#* +#* move_state.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +extends LimboState +## Move state. + + +const VERTICAL_FACTOR := 0.8 + +@export var animation_player: AnimationPlayer +@export var animation: StringName +@export var speed: float = 500.0 + + +func _enter() -> void: + animation_player.play(animation, 0.1) + + +func _update(_delta: float) -> void: + var horizontal_move: float = Input.get_axis(&"move_left", &"move_right") + var vertical_move: float = Input.get_axis(&"move_up", &"move_down") + + if not is_zero_approx(horizontal_move): + agent.face_dir(horizontal_move) + + var desired_velocity := Vector2(horizontal_move, vertical_move * VERTICAL_FACTOR) * speed + agent.move(desired_velocity) + + if horizontal_move == 0.0 and vertical_move == 0.0: + get_root().dispatch(EVENT_FINISHED) diff --git a/demo/agents/player/states/move_state.gd.uid b/demo/agents/player/states/move_state.gd.uid new file mode 100644 index 0000000..0739566 --- /dev/null +++ b/demo/agents/player/states/move_state.gd.uid @@ -0,0 +1 @@ +uid://bu4henvxerree diff --git a/demo/agents/scripts/agent_base.gd b/demo/agents/scripts/agent_base.gd new file mode 100644 index 0000000..e17a0e2 --- /dev/null +++ b/demo/agents/scripts/agent_base.gd @@ -0,0 +1,161 @@ +#* +#* agent_base.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +extends CharacterBody2D +## Base agent script that is shared by all agents. + +signal death + +# Resource file to use in summon_minion() method. +const MINION_RESOURCE := "res://demo/agents/03_agent_imp.tscn" + +# Projectile resource. +const NinjaStar := preload("res://demo/agents/ninja_star/ninja_star.tscn") +const Fireball := preload("res://demo/agents/fireball/fireball.tscn") + +var summon_count: int = 0 + +var _frames_since_facing_update: int = 0 +var _is_dead: bool = false +var _moved_this_frame: bool = false + +@onready var animation_player: AnimationPlayer = $AnimationPlayer +@onready var health: Health = $Health +@onready var root: Node2D = $Root +@onready var collision_shape_2d: CollisionShape2D = $CollisionShape2D +@onready var summoning_effect: GPUParticles2D = $FX/Summoned + + +func _ready() -> void: + health.damaged.connect(_damaged) + health.death.connect(die) + + +func _physics_process(_delta: float) -> void: + _post_physics_process.call_deferred() + + +func _post_physics_process() -> void: + if not _moved_this_frame: + velocity = lerp(velocity, Vector2.ZERO, 0.5) + _moved_this_frame = false + + +func move(p_velocity: Vector2) -> void: + velocity = lerp(velocity, p_velocity, 0.2) + move_and_slide() + _moved_this_frame = true + + +## Update agent's facing in the velocity direction. +func update_facing() -> void: + _frames_since_facing_update += 1 + if _frames_since_facing_update > 3: + face_dir(velocity.x) + +## Face specified direction. +func face_dir(dir: float) -> void: + if dir > 0.0 and root.scale.x < 0.0: + root.scale.x = 1.0; + _frames_since_facing_update = 0 + if dir < 0.0 and root.scale.x > 0.0: + root.scale.x = -1.0; + _frames_since_facing_update = 0 + +## Returns 1.0 when agent is facing right. +## Returns -1.0 when agent is facing left. +func get_facing() -> float: + return signf(root.scale.x) + + +func throw_ninja_star() -> void: + var ninja_star := NinjaStar.instantiate() + ninja_star.dir = get_facing() + get_parent().add_child(ninja_star) + ninja_star.global_position = global_position + Vector2.RIGHT * 100.0 * get_facing() + + +func spit_fire() -> void: + var fireball := Fireball.instantiate() + fireball.dir = get_facing() + get_parent().add_child(fireball) + fireball.global_position = global_position + Vector2.RIGHT * 100.0 * get_facing() + + +func summon_minion(p_position: Vector2) -> void: + var minion: CharacterBody2D = load(MINION_RESOURCE).instantiate() + get_parent().add_child(minion) + minion.position = p_position + minion.play_summoning_effect() + summon_count += 1 + minion.death.connect(func(): summon_count -= 1) + + +## Method is used when this agent is summoned from the dungeons of the castle AaaAaaAAAAAaaAAaaaaaa +func play_summoning_effect() -> void: + summoning_effect.emitting = true + + +## Is specified position inside the arena (not inside an obstacle)? +func is_good_position(p_position: Vector2) -> bool: + var space_state := get_world_2d().direct_space_state + var params := PhysicsPointQueryParameters2D.new() + params.position = p_position + params.collision_mask = 1 # Obstacle layer has value 1 + var collision := space_state.intersect_point(params) + return collision.is_empty() + + +## When agent is damaged... +func _damaged(_amount: float, knockback: Vector2) -> void: + apply_knockback(knockback) + animation_player.play(&"hurt") + var btplayer := get_node_or_null(^"BTPlayer") as BTPlayer + if btplayer: + btplayer.set_active(false) + var hsm := get_node_or_null(^"LimboHSM") + if hsm: + hsm.set_active(false) + await animation_player.animation_finished + if btplayer and not _is_dead: + btplayer.restart() + if hsm and not _is_dead: + hsm.set_active(true) + + +## Push agent in the knockback direction for the specified number of physics frames. +func apply_knockback(knockback: Vector2, frames: int = 10) -> void: + if knockback.is_zero_approx(): + return + for i in range(frames): + move(knockback) + await get_tree().physics_frame + + +func die() -> void: + if _is_dead: + return + death.emit() + _is_dead = true + root.process_mode = Node.PROCESS_MODE_DISABLED + animation_player.play(&"death") + collision_shape_2d.set_deferred(&"disabled", true) + + for child in get_children(): + if child is BTPlayer or child is LimboHSM: + child.set_active(false) + + if get_tree(): + await get_tree().create_timer(10.0).timeout + queue_free() + + +func get_health() -> Health: + return health diff --git a/demo/agents/scripts/agent_base.gd.uid b/demo/agents/scripts/agent_base.gd.uid new file mode 100644 index 0000000..de3be76 --- /dev/null +++ b/demo/agents/scripts/agent_base.gd.uid @@ -0,0 +1 @@ +uid://68wbhtvlbkqm diff --git a/demo/agents/scripts/health.gd b/demo/agents/scripts/health.gd new file mode 100644 index 0000000..181c36c --- /dev/null +++ b/demo/agents/scripts/health.gd @@ -0,0 +1,46 @@ +#* +#* health.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +class_name Health +extends Node +## Tracks health and emits signal when damaged or dead. + +## Emitted when health is reduced to 0. +signal death + +## Emitted when health is damaged. +signal damaged(amount: float, knockback: Vector2) + +## Initial health value. +@export var max_health: float = 10.0 + +var _current: float + + +func _ready() -> void: + _current = max_health + + +func take_damage(amount: float, knockback: Vector2) -> void: + if _current <= 0.0: + return + + _current -= amount + _current = max(_current, 0.0) + + if _current <= 0.0: + death.emit() + else: + damaged.emit(amount, knockback) + + +## Returns current health. +func get_current() -> float: + return _current diff --git a/demo/agents/scripts/health.gd.uid b/demo/agents/scripts/health.gd.uid new file mode 100644 index 0000000..f0f4973 --- /dev/null +++ b/demo/agents/scripts/health.gd.uid @@ -0,0 +1 @@ +uid://5byn62y1oa76 diff --git a/demo/agents/scripts/hitbox.gd b/demo/agents/scripts/hitbox.gd new file mode 100644 index 0000000..57cb327 --- /dev/null +++ b/demo/agents/scripts/hitbox.gd @@ -0,0 +1,39 @@ +#* +#* hitbox.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +class_name Hitbox +extends Area2D +## Area that deals damage. + +## Damage value to apply. +@export var damage: float = 1.0 + +## Push back the victim. +@export var knockback_enabled: bool = false + +## Desired pushback speed. +@export var knockback_strength: float = 500.0 + + +func _ready() -> void: + area_entered.connect(_area_entered) + + +func _area_entered(hurtbox: Hurtbox) -> void: + if hurtbox.owner == owner: + return + hurtbox.take_damage(damage, get_knockback(), self) + + +func get_knockback() -> Vector2: + var knockback: Vector2 + if knockback_enabled: + knockback = Vector2.RIGHT.rotated(global_rotation) * knockback_strength + return knockback diff --git a/demo/agents/scripts/hitbox.gd.uid b/demo/agents/scripts/hitbox.gd.uid new file mode 100644 index 0000000..b2caad4 --- /dev/null +++ b/demo/agents/scripts/hitbox.gd.uid @@ -0,0 +1 @@ +uid://dntc3c582m5w8 diff --git a/demo/agents/scripts/hurtbox.gd b/demo/agents/scripts/hurtbox.gd new file mode 100644 index 0000000..333497f --- /dev/null +++ b/demo/agents/scripts/hurtbox.gd @@ -0,0 +1,22 @@ +#* +#* hurtbox.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +class_name Hurtbox +extends Area2D +## Area that registers damage. + +@export var health: Health + +var last_attack_vector: Vector2 + + +func take_damage(amount: float, knockback: Vector2, source: Hitbox) -> void: + last_attack_vector = owner.global_position - source.owner.global_position + health.take_damage(amount, knockback) diff --git a/demo/agents/scripts/hurtbox.gd.uid b/demo/agents/scripts/hurtbox.gd.uid new file mode 100644 index 0000000..aef7b56 --- /dev/null +++ b/demo/agents/scripts/hurtbox.gd.uid @@ -0,0 +1 @@ +uid://dq5h6yydckjc1 diff --git a/demo/agents/tutorial/tutorial_01_welcome.tscn b/demo/agents/tutorial/tutorial_01_welcome.tscn new file mode 100644 index 0000000..0dbdeba --- /dev/null +++ b/demo/agents/tutorial/tutorial_01_welcome.tscn @@ -0,0 +1,31 @@ +[gd_scene format=3 uid="uid://dk67yawiu33jv"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_2vrmp"] +[ext_resource type="Texture2D" uid="uid://b0oeqsc0xksto" path="res://demo/assets/agent_junior_pieces.png" id="2_3h4dj"] +[ext_resource type="BehaviorTree" uid="uid://b1mfh8yad7rmw" path="res://demo/ai/trees/tutorial/tutorial_01_welcome.tres" id="3_ilmgw"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_52mdk"] + +[node name="TutorialWelcome" unique_id=615431780 instance=ExtResource("1_2vrmp")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_3h4dj") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_3h4dj") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_3h4dj") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_3h4dj") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_3h4dj") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_3h4dj") + +[node name="BTPlayer" type="BTPlayer" parent="." index="5" unique_id=1816968691] +behavior_tree = ExtResource("3_ilmgw") +blackboard_plan = SubResource("BlackboardPlan_52mdk") diff --git a/demo/agents/tutorial/tutorial_02_introduction.tscn b/demo/agents/tutorial/tutorial_02_introduction.tscn new file mode 100644 index 0000000..81cd500 --- /dev/null +++ b/demo/agents/tutorial/tutorial_02_introduction.tscn @@ -0,0 +1,31 @@ +[gd_scene format=3 uid="uid://cw3yth564nhrw"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_lia2k"] +[ext_resource type="Texture2D" uid="uid://b0oeqsc0xksto" path="res://demo/assets/agent_junior_pieces.png" id="2_4x2l4"] +[ext_resource type="BehaviorTree" uid="uid://b1i0xo0o676va" path="res://demo/ai/trees/tutorial/tutorial_02_introduction.tres" id="3_3esuy"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_52mdk"] + +[node name="TutorialIntro" unique_id=714259894 instance=ExtResource("1_lia2k")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_4x2l4") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_4x2l4") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_4x2l4") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_4x2l4") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_4x2l4") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_4x2l4") + +[node name="BTPlayer" type="BTPlayer" parent="." index="5" unique_id=1228007443] +behavior_tree = ExtResource("3_3esuy") +blackboard_plan = SubResource("BlackboardPlan_52mdk") diff --git a/demo/agents/tutorial/tutorial_03_types.tscn b/demo/agents/tutorial/tutorial_03_types.tscn new file mode 100644 index 0000000..660030f --- /dev/null +++ b/demo/agents/tutorial/tutorial_03_types.tscn @@ -0,0 +1,31 @@ +[gd_scene format=3 uid="uid://bx4iabilsv3rs"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_p8nwq"] +[ext_resource type="Texture2D" uid="uid://b0oeqsc0xksto" path="res://demo/assets/agent_junior_pieces.png" id="2_hnwhw"] +[ext_resource type="BehaviorTree" uid="uid://cb0ybf24ahnc3" path="res://demo/ai/trees/tutorial/tutorial_03_types.tres" id="3_a31ka"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_52mdk"] + +[node name="TutorialTypes" unique_id=2077894776 instance=ExtResource("1_p8nwq")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_hnwhw") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_hnwhw") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_hnwhw") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_hnwhw") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_hnwhw") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_hnwhw") + +[node name="BTPlayer" type="BTPlayer" parent="." index="5" unique_id=2103835125] +behavior_tree = ExtResource("3_a31ka") +blackboard_plan = SubResource("BlackboardPlan_52mdk") diff --git a/demo/agents/tutorial/tutorial_04_sequence.tscn b/demo/agents/tutorial/tutorial_04_sequence.tscn new file mode 100644 index 0000000..35dd6c7 --- /dev/null +++ b/demo/agents/tutorial/tutorial_04_sequence.tscn @@ -0,0 +1,31 @@ +[gd_scene format=3 uid="uid://bhtm8gnk5hsus"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_oibr1"] +[ext_resource type="Texture2D" uid="uid://b0oeqsc0xksto" path="res://demo/assets/agent_junior_pieces.png" id="2_j52yc"] +[ext_resource type="BehaviorTree" uid="uid://dln8ywvtqedt7" path="res://demo/ai/trees/tutorial/tutorial_04_sequence.tres" id="3_feewj"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_52mdk"] + +[node name="TutorialSequence" unique_id=1493462066 instance=ExtResource("1_oibr1")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_j52yc") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_j52yc") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_j52yc") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_j52yc") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_j52yc") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_j52yc") + +[node name="BTPlayer" type="BTPlayer" parent="." index="5" unique_id=176951390] +behavior_tree = ExtResource("3_feewj") +blackboard_plan = SubResource("BlackboardPlan_52mdk") diff --git a/demo/agents/tutorial/tutorial_05_selector.tscn b/demo/agents/tutorial/tutorial_05_selector.tscn new file mode 100644 index 0000000..b7aa371 --- /dev/null +++ b/demo/agents/tutorial/tutorial_05_selector.tscn @@ -0,0 +1,31 @@ +[gd_scene format=3 uid="uid://5nqbasyipupf"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_62fs7"] +[ext_resource type="Texture2D" uid="uid://b0oeqsc0xksto" path="res://demo/assets/agent_junior_pieces.png" id="2_gdg2c"] +[ext_resource type="BehaviorTree" uid="uid://bf4r652fv5kwi" path="res://demo/ai/trees/tutorial/tutorial_05_selector.tres" id="3_pm5ep"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_52mdk"] + +[node name="TutorialSelector" unique_id=470766063 instance=ExtResource("1_62fs7")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_gdg2c") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_gdg2c") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_gdg2c") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_gdg2c") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_gdg2c") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_gdg2c") + +[node name="BTPlayer" type="BTPlayer" parent="." index="5" unique_id=989842198] +behavior_tree = ExtResource("3_pm5ep") +blackboard_plan = SubResource("BlackboardPlan_52mdk") diff --git a/demo/agents/tutorial/tutorial_06_decorators.tscn b/demo/agents/tutorial/tutorial_06_decorators.tscn new file mode 100644 index 0000000..c9663b8 --- /dev/null +++ b/demo/agents/tutorial/tutorial_06_decorators.tscn @@ -0,0 +1,31 @@ +[gd_scene format=3 uid="uid://ehc00upu3co"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_mbrnd"] +[ext_resource type="Texture2D" uid="uid://b0oeqsc0xksto" path="res://demo/assets/agent_junior_pieces.png" id="2_ttkri"] +[ext_resource type="BehaviorTree" uid="uid://beiki511huxb8" path="res://demo/ai/trees/tutorial/tutorial_06_decorators.tres" id="3_tpgll"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_52mdk"] + +[node name="TutorialDecorators" unique_id=204981587 instance=ExtResource("1_mbrnd")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_ttkri") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_ttkri") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_ttkri") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_ttkri") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_ttkri") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_ttkri") + +[node name="BTPlayer" type="BTPlayer" parent="." index="5" unique_id=1652167388] +behavior_tree = ExtResource("3_tpgll") +blackboard_plan = SubResource("BlackboardPlan_52mdk") diff --git a/demo/agents/tutorial/tutorial_07_more_decorators.tscn b/demo/agents/tutorial/tutorial_07_more_decorators.tscn new file mode 100644 index 0000000..fb8462b --- /dev/null +++ b/demo/agents/tutorial/tutorial_07_more_decorators.tscn @@ -0,0 +1,31 @@ +[gd_scene format=3 uid="uid://brq6c843j1eeo"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_k4qfc"] +[ext_resource type="Texture2D" uid="uid://b0oeqsc0xksto" path="res://demo/assets/agent_junior_pieces.png" id="2_q4r1n"] +[ext_resource type="BehaviorTree" uid="uid://tep50j4d6kgp" path="res://demo/ai/trees/tutorial/tutorial_07_more_decorators.tres" id="3_ta3g6"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_52mdk"] + +[node name="TutorialMoreDecorators" unique_id=709915821 instance=ExtResource("1_k4qfc")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_q4r1n") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_q4r1n") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_q4r1n") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_q4r1n") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_q4r1n") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_q4r1n") + +[node name="BTPlayer" type="BTPlayer" parent="." index="5" unique_id=1128113897] +behavior_tree = ExtResource("3_ta3g6") +blackboard_plan = SubResource("BlackboardPlan_52mdk") diff --git a/demo/agents/tutorial/tutorial_08_final_touch.tscn b/demo/agents/tutorial/tutorial_08_final_touch.tscn new file mode 100644 index 0000000..ed924c4 --- /dev/null +++ b/demo/agents/tutorial/tutorial_08_final_touch.tscn @@ -0,0 +1,31 @@ +[gd_scene format=3 uid="uid://b8yj40s43bw8h"] + +[ext_resource type="PackedScene" uid="uid://ooigbfhfy4wa" path="res://demo/agents/agent_base.tscn" id="1_bjdsc"] +[ext_resource type="Texture2D" uid="uid://b0oeqsc0xksto" path="res://demo/assets/agent_junior_pieces.png" id="2_onjfd"] +[ext_resource type="BehaviorTree" uid="uid://dp0cglcytwcj5" path="res://demo/ai/trees/tutorial/tutorial_08_final_touch.tres" id="3_c5qx4"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_52mdk"] + +[node name="TutorialFinalTouch" unique_id=639776383 instance=ExtResource("1_bjdsc")] + +[node name="LegL" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="1" unique_id=1846803080] +texture = ExtResource("2_onjfd") + +[node name="LegR" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="2" unique_id=1298898798] +texture = ExtResource("2_onjfd") + +[node name="Body" parent="Root/Rig" parent_id_path=PackedInt32Array(99014800) index="3" unique_id=1986703668] +texture = ExtResource("2_onjfd") + +[node name="Hat" parent="Root/Rig/Body" index="0" unique_id=1581505781] +texture = ExtResource("2_onjfd") + +[node name="HandL" parent="Root/Rig/Body" index="1" unique_id=1237044871] +texture = ExtResource("2_onjfd") + +[node name="HandR" parent="Root/Rig/Body" index="2" unique_id=1388852439] +texture = ExtResource("2_onjfd") + +[node name="BTPlayer" type="BTPlayer" parent="." index="5" unique_id=1465699266] +behavior_tree = ExtResource("3_c5qx4") +blackboard_plan = SubResource("BlackboardPlan_52mdk") diff --git a/demo/ai/tasks/arrive_pos.gd b/demo/ai/tasks/arrive_pos.gd new file mode 100644 index 0000000..edb53fb --- /dev/null +++ b/demo/ai/tasks/arrive_pos.gd @@ -0,0 +1,69 @@ +#* +#* arrive_pos.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +@tool +extends BTAction +## Moves the agent to the specified position, favoring horizontal movement. [br] +## Returns [code]SUCCESS[/code] when close to the target position (see [member tolerance]); +## otherwise returns [code]RUNNING[/code]. + +## Blackboard variable that stores the target position (Vector2) +@export var target_position_var := &"pos" + +## Variable that stores desired speed (float) +@export var speed_var := &"speed" + +## How close should the agent be to the target position to return SUCCESS. +@export var tolerance := 50.0 + +## Specifies the node to avoid (valid Node2D is expected). +## If not empty, agent will circle around the node while moving into position. +@export var avoid_var: StringName + + +func _generate_name() -> String: + return "Arrive pos: %s%s" % [ + LimboUtility.decorate_var(target_position_var), + "" if avoid_var.is_empty() else " avoid: " + LimboUtility.decorate_var(avoid_var) + ] + + +func _tick(_delta: float) -> Status: + var target_pos: Vector2 = blackboard.get_var(target_position_var, Vector2.ZERO) + if target_pos.distance_to(agent.global_position) < tolerance: + return SUCCESS + + var speed: float = blackboard.get_var(speed_var, 10.0) + var dist: float = absf(agent.global_position.x - target_pos.x) + var dir: Vector2 = agent.global_position.direction_to(target_pos) + + # Prefer horizontal movement: + var vertical_factor: float = remap(dist, 200.0, 500.0, 1.0, 0.0) + vertical_factor = clampf(vertical_factor, 0.0, 1.0) + dir.y *= vertical_factor + + # Avoid the node specified by `avoid_var`. + # I.e., if `avoid_var` is set, agent will circle around that node while moving into position. + if not avoid_var.is_empty(): + var avoid_node: Node2D = blackboard.get_var(avoid_var) + if is_instance_valid(avoid_node): + var distance_vector: Vector2 = avoid_node.global_position - agent.global_position + if dir.dot(distance_vector) > 0.0: + var side := dir.rotated(PI * 0.5).normalized() + # The closer we are to the avoid target, the stronger is the avoidance. + var strength: float = remap(distance_vector.length(), 200.0, 400.0, 1.0, 0.0) + strength = clampf(strength, 0.0, 1.0) + var avoidance := side * signf(-side.dot(distance_vector)) * strength + dir += avoidance + + var desired_velocity: Vector2 = dir.normalized() * speed + agent.move(desired_velocity) + agent.update_facing() + return RUNNING diff --git a/demo/ai/tasks/arrive_pos.gd.uid b/demo/ai/tasks/arrive_pos.gd.uid new file mode 100644 index 0000000..617c159 --- /dev/null +++ b/demo/ai/tasks/arrive_pos.gd.uid @@ -0,0 +1 @@ +uid://df82exuqnfdb2 diff --git a/demo/ai/tasks/back_away.gd b/demo/ai/tasks/back_away.gd new file mode 100644 index 0000000..3b00388 --- /dev/null +++ b/demo/ai/tasks/back_away.gd @@ -0,0 +1,39 @@ +#* +#* back_away.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +@tool +extends BTAction +## Moves the agent in the opposite direction of its current facing. [br] +## Returns [code]RUNNING[/code] always. + +## Blackboard variable that stores desired speed. +@export var speed_var: StringName = &"speed" + +## How much can we deviate from the "away" direction (in radians). +@export var max_angle_deviation: float = 0.7 + +var _dir: Vector2 +var _desired_velocity: Vector2 + + +# Called each time this task is entered. +func _enter() -> void: + # Determine "away" direction and desired velocity + _dir = Vector2.LEFT * agent.get_facing() + var speed: float = blackboard.get_var(speed_var, 200.0) + var rand_angle = randf_range(-max_angle_deviation, max_angle_deviation) + _desired_velocity = _dir.rotated(rand_angle) * speed + + +# Called each time this task is ticked (aka executed). +func _tick(_delta: float) -> Status: + agent.move(_desired_velocity) + agent.face_dir(-signf(_dir.x)) + return RUNNING diff --git a/demo/ai/tasks/back_away.gd.uid b/demo/ai/tasks/back_away.gd.uid new file mode 100644 index 0000000..b456046 --- /dev/null +++ b/demo/ai/tasks/back_away.gd.uid @@ -0,0 +1 @@ +uid://bi5e8366xi5s5 diff --git a/demo/ai/tasks/face_target.gd b/demo/ai/tasks/face_target.gd new file mode 100644 index 0000000..bf07d64 --- /dev/null +++ b/demo/ai/tasks/face_target.gd @@ -0,0 +1,32 @@ +#* +#* face_target.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +@tool +extends BTAction +## Flips the agent to face the target, returning [code]SUCCESS[/code]. [br] +## Returns [code]FAILURE[/code] if [member target_var] is not a valid [Node2D] instance. + +## Blackboard variable that stores our target (expecting Node2D). +@export var target_var: StringName = &"target" + +# Display a customized name (requires @tool). +func _generate_name() -> String: + return "FaceTarget " + LimboUtility.decorate_var(target_var) + + +# Called each time this task is ticked (aka executed). +func _tick(_delta: float) -> Status: + var target: Node2D = blackboard.get_var(target_var) + if not is_instance_valid(target): + return FAILURE + var dir: float = target.global_position.x - agent.global_position.x + agent.velocity = Vector2.ZERO + agent.face_dir(dir) + return SUCCESS diff --git a/demo/ai/tasks/face_target.gd.uid b/demo/ai/tasks/face_target.gd.uid new file mode 100644 index 0000000..eae4fd5 --- /dev/null +++ b/demo/ai/tasks/face_target.gd.uid @@ -0,0 +1 @@ +uid://dbo0kq2cwb4qv diff --git a/demo/ai/tasks/get_first_in_group.gd b/demo/ai/tasks/get_first_in_group.gd new file mode 100644 index 0000000..bd4e642 --- /dev/null +++ b/demo/ai/tasks/get_first_in_group.gd @@ -0,0 +1,34 @@ +#* +#* get_first_in_group.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +@tool +extends BTAction +## Stores the first node in the [member group] on the blackboard, returning [code]SUCCESS[/code]. [br] +## Returns [code]FAILURE[/code] if the group contains 0 nodes. + +## Name of the SceneTree group. +@export var group: StringName + +## Blackboard variable in which the task will store the acquired node. +@export var output_var: StringName = &"target" + + +func _generate_name() -> String: + return "GetFirstNodeInGroup \"%s\" ➜%s" % [ + group, + LimboUtility.decorate_var(output_var) + ] + +func _tick(_delta: float) -> Status: + var nodes: Array[Node] = agent.get_tree().get_nodes_in_group(group) + if nodes.size() == 0: + return FAILURE + blackboard.set_var(output_var, nodes[0]) + return SUCCESS diff --git a/demo/ai/tasks/get_first_in_group.gd.uid b/demo/ai/tasks/get_first_in_group.gd.uid new file mode 100644 index 0000000..0fc8270 --- /dev/null +++ b/demo/ai/tasks/get_first_in_group.gd.uid @@ -0,0 +1 @@ +uid://ccr43pgd4488l diff --git a/demo/ai/tasks/in_range.gd b/demo/ai/tasks/in_range.gd new file mode 100644 index 0000000..0e1eb28 --- /dev/null +++ b/demo/ai/tasks/in_range.gd @@ -0,0 +1,54 @@ +#* +#* in_range.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +@tool +extends BTCondition +## InRange condition checks if the agent is within a range of target, +## defined by [member distance_min] and [member distance_max]. [br] +## Returns [code]SUCCESS[/code] if the agent is within the given range; +## otherwise, returns [code]FAILURE[/code]. + +## Minimum distance to target. +@export var distance_min: float + +## Maximum distance to target. +@export var distance_max: float + +## Blackboard variable that holds the target (expecting Node2D). +@export var target_var: StringName = &"target" + +var _min_distance_squared: float +var _max_distance_squared: float + + +# Called to generate a display name for the task. +func _generate_name() -> String: + return "InRange (%d, %d) of %s" % [distance_min, distance_max, + LimboUtility.decorate_var(target_var)] + + +# Called to initialize the task. +func _setup() -> void: + ## Small performance optimization + _min_distance_squared = distance_min * distance_min + _max_distance_squared = distance_max * distance_max + + +# Called when the task is executed. +func _tick(_delta: float) -> Status: + var target: Node2D = blackboard.get_var(target_var, null) + if not is_instance_valid(target): + return FAILURE + + var dist_sq: float = agent.global_position.distance_squared_to(target.global_position) + if dist_sq >= _min_distance_squared and dist_sq <= _max_distance_squared: + return SUCCESS + else: + return FAILURE diff --git a/demo/ai/tasks/in_range.gd.uid b/demo/ai/tasks/in_range.gd.uid new file mode 100644 index 0000000..c5e1a9a --- /dev/null +++ b/demo/ai/tasks/in_range.gd.uid @@ -0,0 +1 @@ +uid://b7v2utjmtge0x diff --git a/demo/ai/tasks/is_aligned_with_target.gd b/demo/ai/tasks/is_aligned_with_target.gd new file mode 100644 index 0000000..c15ea3a --- /dev/null +++ b/demo/ai/tasks/is_aligned_with_target.gd @@ -0,0 +1,35 @@ +#* +#* is_aligned_with_target.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +@tool +extends BTCondition +## Checks if the agent is horizontally aligned with the target. [br] +## Returns [code]SUCCESS[/code] if the agent is horizontally aligned with the target. +## Returns [code]FAILURE[/code] if not aligned or if target is not a valid node instance. + + +@export var target_var: StringName = &"target" +@export var tolerance: float = 30.0 + + +# Display a customized name (requires @tool). +func _generate_name() -> String: + return "IsAlignedWithTarget " + LimboUtility.decorate_var(target_var) + + +# Called each time this task is ticked (aka executed). +func _tick(_delta: float) -> Status: + var target := blackboard.get_var(target_var) as Node2D + if not is_instance_valid(target): + return FAILURE + var y_diff: float = absf(target.global_position.y - agent.global_position.y) + if y_diff < tolerance: + return SUCCESS + return FAILURE diff --git a/demo/ai/tasks/is_aligned_with_target.gd.uid b/demo/ai/tasks/is_aligned_with_target.gd.uid new file mode 100644 index 0000000..bbfee1c --- /dev/null +++ b/demo/ai/tasks/is_aligned_with_target.gd.uid @@ -0,0 +1 @@ +uid://dbhd2dvt77sm4 diff --git a/demo/ai/tasks/move_forward.gd b/demo/ai/tasks/move_forward.gd new file mode 100644 index 0000000..bac5483 --- /dev/null +++ b/demo/ai/tasks/move_forward.gd @@ -0,0 +1,39 @@ +#* +#* move_forward.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +@tool +extends BTAction +## Applies velocity in the direction the agent is facing on each tick +## until the [member duration] is exceeded. [br] +## Returns [code]SUCCESS[/code] if the elapsed time exceeds [member duration]. [br] +## Returns [code]RUNNING[/code] if the elapsed time does not exceed [member duration]. [br] + +## Blackboard variable that stores desired speed. +@export var speed_var: StringName = &"speed" + +## How long to perform this task (in seconds). +@export var duration: float = 0.1 + +# Display a customized name (requires @tool). +func _generate_name() -> String: + return "MoveForward speed: %s duration: %ss" % [ + LimboUtility.decorate_var(speed_var), + duration] + +# Called each time this task is ticked (aka executed). +func _tick(_delta: float) -> Status: + var facing: float = agent.get_facing() + var speed: float = blackboard.get_var(speed_var, 100.0) + var desired_velocity: Vector2 = Vector2.RIGHT * facing * speed + agent.move(desired_velocity) + agent.update_facing() + if elapsed_time > duration: + return SUCCESS + return RUNNING diff --git a/demo/ai/tasks/move_forward.gd.uid b/demo/ai/tasks/move_forward.gd.uid new file mode 100644 index 0000000..964ef16 --- /dev/null +++ b/demo/ai/tasks/move_forward.gd.uid @@ -0,0 +1 @@ +uid://b8ljqe213ud7d diff --git a/demo/ai/tasks/pursue.gd b/demo/ai/tasks/pursue.gd new file mode 100644 index 0000000..aee5eaa --- /dev/null +++ b/demo/ai/tasks/pursue.gd @@ -0,0 +1,79 @@ +#* +#* pursue.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +@tool +extends BTAction +## Move towards the target until the agent is flanking it. [br] +## Returns [code]RUNNING[/code] while moving towards the target but not yet at the desired position. [br] +## Returns [code]SUCCESS[/code] when at the desired position relative to the target (flanking it). [br] +## Returns [code]FAILURE[/code] if the target is not a valid [Node2D] instance. [br] + +## How close should the agent be to the desired position to return SUCCESS. +const TOLERANCE := 30.0 + +## Blackboard variable that stores our target (expecting Node2D). +@export var target_var: StringName = &"target" + +## Blackboard variable that stores desired speed. +@export var speed_var: StringName = &"speed" + +## Desired distance from target. +@export var approach_distance: float = 100.0 + +var _waypoint: Vector2 + + +# Display a customized name (requires @tool). +func _generate_name() -> String: + return "Pursue %s" % [LimboUtility.decorate_var(target_var)] + + +# Called each time this task is entered. +func _enter() -> void: + var target: Node2D = blackboard.get_var(target_var, null) + if is_instance_valid(target): + # Movement is performed in smaller steps. + # For each step, we select a new waypoint. + _select_new_waypoint(_get_desired_position(target)) + + +# Called each time this task is ticked (aka executed). +func _tick(_delta: float) -> Status: + var target: Node2D = blackboard.get_var(target_var, null) + if not is_instance_valid(target): + return FAILURE + + var desired_pos: Vector2 = _get_desired_position(target) + if agent.global_position.distance_to(desired_pos) < TOLERANCE: + return SUCCESS + + if agent.global_position.distance_to(_waypoint) < TOLERANCE: + _select_new_waypoint(desired_pos) + + var speed: float = blackboard.get_var(speed_var, 200.0) + var desired_velocity: Vector2 = agent.global_position.direction_to(_waypoint) * speed + agent.move(desired_velocity) + agent.update_facing() + return RUNNING + + +## Get the closest flanking position to target. +func _get_desired_position(target: Node2D) -> Vector2: + var side: float = signf(agent.global_position.x - target.global_position.x) + var desired_pos: Vector2 = target.global_position + desired_pos.x += approach_distance * side + return desired_pos + + +## Select an intermidiate waypoint towards the desired position. +func _select_new_waypoint(desired_position: Vector2) -> void: + var distance_vector: Vector2 = desired_position - agent.global_position + var angle_variation: float = randf_range(-0.2, 0.2) + _waypoint = agent.global_position + distance_vector.limit_length(150.0).rotated(angle_variation) diff --git a/demo/ai/tasks/pursue.gd.uid b/demo/ai/tasks/pursue.gd.uid new file mode 100644 index 0000000..443b39e --- /dev/null +++ b/demo/ai/tasks/pursue.gd.uid @@ -0,0 +1 @@ +uid://dcjgktglb1slf diff --git a/demo/ai/tasks/select_flanking_pos.gd b/demo/ai/tasks/select_flanking_pos.gd new file mode 100644 index 0000000..78687ff --- /dev/null +++ b/demo/ai/tasks/select_flanking_pos.gd @@ -0,0 +1,74 @@ +#* +#* select_flanking_pos.gd +#* ============================================================================= +#* Copyright (c) 2023-present Serhii Snitsaruk and the LimboAI contributors. +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* +@tool +extends BTAction +## Selects a position on the target's side and stores it on the +## blackboard, returning [code]SUCCESS[/code]. [br] +## Returns [code]FAILURE[/code] if the target is not valid. + +enum AgentSide { + CLOSEST, + FARTHEST, + BACK, + FRONT, +} + +## Blackboard variable that holds current target (should be a Node2D instance). +@export var target_var: StringName = &"target" + +## Which agent's side should we flank? +@export var flank_side: AgentSide = AgentSide.CLOSEST + +## Minimum range relative to the target. +@export var range_min: int = 300 + +## Maximum range relative to the target. +@export var range_max: int = 400 + +## Blackboard variable that will be used to store selected position. +@export var position_var: StringName = &"pos" + + +# Display a customized name (requires @tool). +func _generate_name() -> String: + return "SelectFlankingPos target: %s range: [%s, %s] side: %s ➜%s" % [ + LimboUtility.decorate_var(target_var), + range_min, + range_max, + AgentSide.keys()[flank_side], + LimboUtility.decorate_var(position_var)] + + +# Called each time this task is ticked (aka executed). +func _tick(_delta: float) -> Status: + var target := blackboard.get_var(target_var) as Node2D + if not is_instance_valid(target): + return FAILURE + + var dir: float # 1.0 is right, -1.0 is left (relative to target) + match flank_side: + AgentSide.FARTHEST: + dir = signf(target.global_position.x - agent.global_position.x) + AgentSide.CLOSEST : + dir = -signf(target.global_position.x - agent.global_position.x) + AgentSide.BACK: + dir = -target.get_facing() + AgentSide.FRONT: + dir = target.get_facing() + + var flank_pos: Vector2 + var offset := Vector2(dir * randf_range(range_min, range_max), 0.0) + flank_pos = target.global_position + offset + if not agent.is_good_position(flank_pos): + # Choose the opposite side if the preferred side is not good (i.e., inside a collision shape). + flank_pos = target.global_position - offset + blackboard.set_var(position_var, flank_pos) + return SUCCESS diff --git a/demo/ai/tasks/select_flanking_pos.gd.uid b/demo/ai/tasks/select_flanking_pos.gd.uid new file mode 100644 index 0000000..314bdc6 --- /dev/null +++ b/demo/ai/tasks/select_flanking_pos.gd.uid @@ -0,0 +1 @@ +uid://ct71h72pech3b diff --git a/demo/ai/tasks/select_random_nearby_pos.gd b/demo/ai/tasks/select_random_nearby_pos.gd new file mode 100644 index 0000000..1b108a5 --- /dev/null +++ b/demo/ai/tasks/select_random_nearby_pos.gd @@ -0,0 +1,34 @@ +@tool +extends BTAction +## Selects a random position nearby within the specified range and stores it on the blackboard. [br] +## Returns [code]SUCCESS[/code]. + +## Minimum distance to the desired position. +@export var range_min: float = 300.0 + +## Maximum distance to the desired position. +@export var range_max: float = 500.0 + +## Blackboard variable that will be used to store the desired position. +@export var position_var: StringName = &"pos" + + +# Display a customized name (requires @tool). +func _generate_name() -> String: + return "SelectRandomNearbyPos range: [%s, %s] ➜%s" % [ + range_min, range_max, + LimboUtility.decorate_var(position_var)] + + +# Called each time this task is ticked (aka executed). +func _tick(_delta: float) -> Status: + var pos: Vector2 + var is_good_position: bool = false + while not is_good_position: + # Randomize until we find a good position (good position == not outside the arena). + var angle: float = randf() * TAU + var rand_distance: float = randf_range(range_min, range_max) + pos = agent.global_position + Vector2(sin(angle), cos(angle)) * rand_distance + is_good_position = agent.is_good_position(pos) + blackboard.set_var(position_var, pos) + return SUCCESS diff --git a/demo/ai/tasks/select_random_nearby_pos.gd.uid b/demo/ai/tasks/select_random_nearby_pos.gd.uid new file mode 100644 index 0000000..3a9684d --- /dev/null +++ b/demo/ai/tasks/select_random_nearby_pos.gd.uid @@ -0,0 +1 @@ +uid://bicxffqmm7ek diff --git a/demo/ai/trees/01_agent_melee_simple.tres b/demo/ai/trees/01_agent_melee_simple.tres new file mode 100644 index 0000000..b0b58a7 --- /dev/null +++ b/demo/ai/trees/01_agent_melee_simple.tres @@ -0,0 +1,108 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://bpdm5jnegi38"] + +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_2jpsu"] +[ext_resource type="Script" uid="uid://dcjgktglb1slf" path="res://demo/ai/tasks/pursue.gd" id="2_h5db5"] +[ext_resource type="Script" uid="uid://dbo0kq2cwb4qv" path="res://demo/ai/tasks/face_target.gd" id="3_bpmfp"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_46tbn"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" +var/var/name = &"var" +var/var/type = 3 +var/var/value = 0.0 +var/var/hint = 0 +var/var/hint_string = "" +var/var2/name = &"var2" +var/var2/type = 3 +var/var2/value = 0.578 +var/var2/hint = 0 +var/var2/hint_string = "" +var/var3/name = &"var3" +var/var3/type = 3 +var/var3/value = -1.161 +var/var3/hint = 0 +var/var3/hint_string = "" +var/var4/name = &"var4" +var/var4/type = 3 +var/var4/value = 0.754 +var/var4/hint = 0 +var/var4/hint_string = "" +var/var5/name = &"var5" +var/var5/type = 3 +var/var5/value = 0.0 +var/var5/hint = 0 +var/var5/hint_string = "" + +[sub_resource type="BBNode" id="BBNode_nrd4b"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_qiw21"] +animation_player = SubResource("BBNode_nrd4b") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTRandomWait" id="BTRandomWait_xlud8"] +min_duration = 0.7 +max_duration = 1.5 + +[sub_resource type="BTSequence" id="BTSequence_yhjh1"] +custom_name = "Pause before action" +children = [SubResource("BTPlayAnimation_qiw21"), SubResource("BTRandomWait_xlud8")] + +[sub_resource type="BBNode" id="BBNode_wpj6d"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_olf37"] +animation_player = SubResource("BBNode_wpj6d") +animation_name = &"walk" +blend = 0.1 + +[sub_resource type="BTAction" id="BTAction_ulbrf"] +script = ExtResource("1_2jpsu") +group = &"player" + +[sub_resource type="BTAction" id="BTAction_a4jqi"] +script = ExtResource("2_h5db5") + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_xek5v"] +children = [SubResource("BTAction_a4jqi")] +time_limit = 2.0 + +[sub_resource type="BTSequence" id="BTSequence_1xfnq"] +custom_name = "Pursue player" +children = [SubResource("BTPlayAnimation_olf37"), SubResource("BTAction_ulbrf"), SubResource("BTTimeLimit_xek5v")] + +[sub_resource type="BTAction" id="BTAction_kidxn"] +script = ExtResource("3_bpmfp") + +[sub_resource type="BTWait" id="BTWait_tadkc"] +duration = 0.1 + +[sub_resource type="BBNode" id="BBNode_s8evu"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_ppmxd"] +await_completion = 2.0 +animation_player = SubResource("BBNode_s8evu") +animation_name = &"attack_1" + +[sub_resource type="BTSequence" id="BTSequence_ww5v2"] +custom_name = "Melee attack" +children = [SubResource("BTAction_kidxn"), SubResource("BTWait_tadkc"), SubResource("BTPlayAnimation_ppmxd")] + +[sub_resource type="BTSequence" id="BTSequence_pxl2k"] +children = [SubResource("BTSequence_yhjh1"), SubResource("BTSequence_1xfnq"), SubResource("BTSequence_ww5v2")] + +[resource] +description = "Welcome to the [b]LimboAI[/b] demo project! This demo project consists of three parts: +- If you're new to behavior trees, you can access the [b]Tutorial[/b] by clicking the \"Begin Tutorial\" button on the toolbar. +- To experience the demo game, just click the \"Switch to Game\" button. +- On this screen, you can inspect the AI behavior tree in action for each agent in the game." +blackboard_plan = SubResource("BlackboardPlan_46tbn") +root_task = SubResource("BTSequence_pxl2k") diff --git a/demo/ai/trees/02_agent_charger.tres b/demo/ai/trees/02_agent_charger.tres new file mode 100644 index 0000000..ba59c7e --- /dev/null +++ b/demo/ai/trees/02_agent_charger.tres @@ -0,0 +1,113 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://ylife72ym5et"] + +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_657p6"] +[ext_resource type="Script" uid="uid://ct71h72pech3b" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_t3udh"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="3_u2ra5"] +[ext_resource type="Script" uid="uid://dbo0kq2cwb4qv" path="res://demo/ai/tasks/face_target.gd" id="4_xwjl7"] +[ext_resource type="Script" uid="uid://b8ljqe213ud7d" path="res://demo/ai/tasks/move_forward.gd" id="5_ucvak"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_qd806"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" +var/charge_speed/name = &"charge_speed" +var/charge_speed/type = 3 +var/charge_speed/value = 1000.0 +var/charge_speed/hint = 1 +var/charge_speed/hint_string = "10,1000,10" + +[sub_resource type="BBNode" id="BBNode_yrurg"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_ha2ag"] +animation_player = SubResource("BBNode_yrurg") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTRandomWait" id="BTRandomWait_cedqr"] +max_duration = 3.0 + +[sub_resource type="BTSequence" id="BTSequence_l3v31"] +custom_name = "Short break" +children = [SubResource("BTPlayAnimation_ha2ag"), SubResource("BTRandomWait_cedqr")] + +[sub_resource type="BTAction" id="BTAction_pp23y"] +script = ExtResource("1_657p6") +group = &"player" + +[sub_resource type="BTAction" id="BTAction_pmvd0"] +script = ExtResource("2_t3udh") +range_min = 500 +range_max = 600 +position_var = &"flank_pos" + +[sub_resource type="BBNode" id="BBNode_xh3wr"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_h0poo"] +animation_player = SubResource("BBNode_xh3wr") +animation_name = &"walk" +blend = 0.1 + +[sub_resource type="BTAction" id="BTAction_87mi0"] +script = ExtResource("3_u2ra5") +target_position_var = &"flank_pos" + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_is5ag"] +children = [SubResource("BTAction_87mi0")] +time_limit = 3.0 + +[sub_resource type="BTSequence" id="BTSequence_p6pgg"] +custom_name = "Flank target" +children = [SubResource("BTAction_pp23y"), SubResource("BTAction_pmvd0"), SubResource("BTPlayAnimation_h0poo"), SubResource("BTTimeLimit_is5ag")] + +[sub_resource type="BTAction" id="BTAction_q5g4a"] +script = ExtResource("4_xwjl7") + +[sub_resource type="BBNode" id="BBNode_bfijg"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_4okoy"] +await_completion = 2.0 +animation_player = SubResource("BBNode_bfijg") +animation_name = &"charge_prepare" +blend = 0.1 + +[sub_resource type="BTWait" id="BTWait_ovu3r"] +duration = 0.6 + +[sub_resource type="BTSequence" id="BTSequence_mde2g"] +custom_name = "Anticipation" +children = [SubResource("BTAction_q5g4a"), SubResource("BTPlayAnimation_4okoy"), SubResource("BTWait_ovu3r")] + +[sub_resource type="BBNode" id="BBNode_kpp70"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_8s1wq"] +animation_player = SubResource("BBNode_kpp70") +animation_name = &"charge" +blend = 0.05 + +[sub_resource type="BTAction" id="BTAction_o18uk"] +script = ExtResource("5_ucvak") +speed_var = &"charge_speed" +duration = 1.5 + +[sub_resource type="BTSequence" id="BTSequence_8lur1"] +custom_name = "Charge!" +children = [SubResource("BTPlayAnimation_8s1wq"), SubResource("BTAction_o18uk")] + +[sub_resource type="BTSequence" id="BTSequence_pjuov"] +custom_name = "Charge Attack" +children = [SubResource("BTSequence_l3v31"), SubResource("BTSequence_p6pgg"), SubResource("BTSequence_mde2g"), SubResource("BTSequence_8lur1")] + +[resource] +description = "A [dec]Decorator[/dec] is a type of task that typically has only one child. Decorators are commonly used to alter the behavior or status of their child task. In this behavior tree, the [dec]TimeLimit[/dec] decorator sets a maximum time for the [act]Arrive[/act] action to complete its work. If the child task exceeds this time limit without finishing, it will be aborted, and the TimeLimit decorator will return [FAILURE]." +blackboard_plan = SubResource("BlackboardPlan_qd806") +root_task = SubResource("BTSequence_pjuov") diff --git a/demo/ai/trees/03_agent_imp.tres b/demo/ai/trees/03_agent_imp.tres new file mode 100644 index 0000000..292783d --- /dev/null +++ b/demo/ai/trees/03_agent_imp.tres @@ -0,0 +1,109 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://c2bxoo68ywb27"] + +[ext_resource type="Script" uid="uid://bicxffqmm7ek" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="1_cdtqu"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="2_31fsn"] +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="3_y1r1a"] +[ext_resource type="Script" uid="uid://dcjgktglb1slf" path="res://demo/ai/tasks/pursue.gd" id="4_jlgat"] +[ext_resource type="Script" uid="uid://dbo0kq2cwb4qv" path="res://demo/ai/tasks/face_target.gd" id="5_o4ggh"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_46tbn"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" + +[sub_resource type="BBNode" id="BBNode_3y70b"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_klk26"] +animation_player = SubResource("BBNode_3y70b") +animation_name = &"walk" +blend = 0.1 + +[sub_resource type="BTAction" id="BTAction_chmiy"] +script = ExtResource("1_cdtqu") +range_min = 200.0 + +[sub_resource type="BTAction" id="BTAction_5kivl"] +script = ExtResource("2_31fsn") + +[sub_resource type="BTSequence" id="BTSequence_k184c"] +custom_name = "Chaotic Walk" +children = [SubResource("BTPlayAnimation_klk26"), SubResource("BTAction_chmiy"), SubResource("BTAction_5kivl")] + +[sub_resource type="BTProbability" id="BTProbability_ifsry"] +children = [SubResource("BTSequence_k184c")] + +[sub_resource type="BBNode" id="BBNode_nrd4b"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_qiw21"] +animation_player = SubResource("BBNode_nrd4b") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTRandomWait" id="BTRandomWait_xlud8"] +min_duration = 0.7 +max_duration = 1.5 + +[sub_resource type="BTSequence" id="BTSequence_n5ltc"] +custom_name = "Pause before action" +children = [SubResource("BTPlayAnimation_qiw21"), SubResource("BTRandomWait_xlud8")] + +[sub_resource type="BBNode" id="BBNode_wpj6d"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_olf37"] +animation_player = SubResource("BBNode_wpj6d") +animation_name = &"walk" +blend = 0.1 + +[sub_resource type="BTAction" id="BTAction_ulbrf"] +script = ExtResource("3_y1r1a") +group = &"player" + +[sub_resource type="BTAction" id="BTAction_a4jqi"] +script = ExtResource("4_jlgat") + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_xek5v"] +children = [SubResource("BTAction_a4jqi")] +time_limit = 2.0 + +[sub_resource type="BTSequence" id="BTSequence_1xfnq"] +custom_name = "Pursue player" +children = [SubResource("BTPlayAnimation_olf37"), SubResource("BTAction_ulbrf"), SubResource("BTTimeLimit_xek5v")] + +[sub_resource type="BTAction" id="BTAction_kidxn"] +script = ExtResource("5_o4ggh") + +[sub_resource type="BTWait" id="BTWait_tadkc"] +duration = 0.1 + +[sub_resource type="BBNode" id="BBNode_s8evu"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_ppmxd"] +await_completion = 2.0 +animation_player = SubResource("BBNode_s8evu") +animation_name = &"attack_1" + +[sub_resource type="BTSequence" id="BTSequence_ww5v2"] +custom_name = "Melee attack" +children = [SubResource("BTAction_kidxn"), SubResource("BTWait_tadkc"), SubResource("BTPlayAnimation_ppmxd")] + +[sub_resource type="BTSequence" id="BTSequence_pxl2k"] +custom_name = "Engage player" +children = [SubResource("BTSequence_n5ltc"), SubResource("BTSequence_1xfnq"), SubResource("BTSequence_ww5v2")] + +[sub_resource type="BTSelector" id="BTSelector_y3llm"] +children = [SubResource("BTProbability_ifsry"), SubResource("BTSequence_pxl2k")] + +[resource] +description = "Here, the [dec]Probability[/dec] decorator allows the execution of its branch in 50% of cases. This introduces a slight variation to the behavior each time the [comp]Chaotic walk[/comp] sequence is considered by the [comp]Selector[/comp]. This sequence can be selected several times in a row as long as the Probability decorator permits it. The [comp]Engage player[/comp] sequence is only executed if Probability returns [FAILURE]." +blackboard_plan = SubResource("BlackboardPlan_46tbn") +root_task = SubResource("BTSelector_y3llm") diff --git a/demo/ai/trees/04_agent_skirmisher.tres b/demo/ai/trees/04_agent_skirmisher.tres new file mode 100644 index 0000000..2a5d6a4 --- /dev/null +++ b/demo/ai/trees/04_agent_skirmisher.tres @@ -0,0 +1,178 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://qqmjvbeibatn"] + +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_2883n"] +[ext_resource type="Script" uid="uid://ct71h72pech3b" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_cjso2"] +[ext_resource type="Script" uid="uid://dcjgktglb1slf" path="res://demo/ai/tasks/pursue.gd" id="2_lpckh"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="3_treio"] +[ext_resource type="Script" uid="uid://dbo0kq2cwb4qv" path="res://demo/ai/tasks/face_target.gd" id="4_57x51"] +[ext_resource type="Script" uid="uid://b7v2utjmtge0x" path="res://demo/ai/tasks/in_range.gd" id="5_p5dih"] +[ext_resource type="Script" uid="uid://bi5e8366xi5s5" path="res://demo/ai/tasks/back_away.gd" id="6_fkv0k"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_46tbn"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" +var/fast_speed/name = &"fast_speed" +var/fast_speed/type = 3 +var/fast_speed/value = 600.0 +var/fast_speed/hint = 1 +var/fast_speed/hint_string = "10,1000,10" +var/slow_speed/name = &"slow_speed" +var/slow_speed/type = 3 +var/slow_speed/value = 300.0 +var/slow_speed/hint = 1 +var/slow_speed/hint_string = "10,1000,10" + +[sub_resource type="BTAction" id="BTAction_ulbrf"] +script = ExtResource("1_2883n") +group = &"player" + +[sub_resource type="BBNode" id="BBNode_nrd4b"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_qiw21"] +animation_player = SubResource("BBNode_nrd4b") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTRandomWait" id="BTRandomWait_xlud8"] +min_duration = 2.0 +max_duration = 3.0 + +[sub_resource type="BTSequence" id="BTSequence_yhjh1"] +custom_name = "Summoning sickness" +children = [SubResource("BTAction_ulbrf"), SubResource("BTPlayAnimation_qiw21"), SubResource("BTRandomWait_xlud8")] + +[sub_resource type="BTRunLimit" id="BTRunLimit_tq3e1"] +children = [SubResource("BTSequence_yhjh1")] + +[sub_resource type="BTCondition" id="BTCondition_uk4dg"] +script = ExtResource("5_p5dih") +distance_max = 300.0 + +[sub_resource type="BBNode" id="BBNode_7c0g0"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_sty80"] +animation_player = SubResource("BBNode_7c0g0") +animation_name = &"walk" +blend = 0.1 +speed = 1.2 + +[sub_resource type="BTAction" id="BTAction_jryg6"] +script = ExtResource("2_lpckh") + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_lkphr"] +children = [SubResource("BTAction_jryg6")] +time_limit = 1.0 + +[sub_resource type="BTAction" id="BTAction_kidxn"] +script = ExtResource("4_57x51") + +[sub_resource type="BTWait" id="BTWait_tadkc"] +duration = 0.2 + +[sub_resource type="BBNode" id="BBNode_kcqly"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_hngi6"] +await_completion = 2.0 +animation_player = SubResource("BBNode_kcqly") +animation_name = &"attack_3" + +[sub_resource type="BTWait" id="BTWait_cm8jy"] +duration = 0.5 + +[sub_resource type="BTSequence" id="BTSequence_ww5v2"] +custom_name = "Melee attack" +children = [SubResource("BTCondition_uk4dg"), SubResource("BTPlayAnimation_sty80"), SubResource("BTTimeLimit_lkphr"), SubResource("BTAction_kidxn"), SubResource("BTWait_tadkc"), SubResource("BTPlayAnimation_hngi6"), SubResource("BTWait_cm8jy")] + +[sub_resource type="BTCooldown" id="BTCooldown_ksvfy"] +children = [SubResource("BTSequence_ww5v2")] +duration = 2.0 + +[sub_resource type="BTCondition" id="BTCondition_fpufi"] +script = ExtResource("5_p5dih") +distance_max = 300.0 + +[sub_resource type="BBNode" id="BBNode_3iqcf"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_ee0ff"] +animation_player = SubResource("BBNode_3iqcf") +animation_name = &"walk" +blend = 0.1 +speed = -0.7 + +[sub_resource type="BTAction" id="BTAction_4ye2y"] +script = ExtResource("6_fkv0k") +speed_var = &"slow_speed" + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_cns1i"] +children = [SubResource("BTAction_4ye2y")] +time_limit = 1.5 + +[sub_resource type="BTAlwaysSucceed" id="BTAlwaysSucceed_nw4ep"] +children = [SubResource("BTTimeLimit_cns1i")] + +[sub_resource type="BBNode" id="BBNode_81x7t"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_e61er"] +animation_player = SubResource("BBNode_81x7t") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTRandomWait" id="BTRandomWait_jw0cm"] + +[sub_resource type="BTSequence" id="BTSequence_y12eg"] +custom_name = "Disengage" +children = [SubResource("BTCondition_fpufi"), SubResource("BTPlayAnimation_ee0ff"), SubResource("BTAlwaysSucceed_nw4ep"), SubResource("BTPlayAnimation_e61er"), SubResource("BTRandomWait_jw0cm")] + +[sub_resource type="BBNode" id="BBNode_wpj6d"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_olf37"] +animation_player = SubResource("BBNode_wpj6d") +animation_name = &"walk" +blend = 0.1 +speed = 1.2 + +[sub_resource type="BTAction" id="BTAction_g5ayy"] +script = ExtResource("2_cjso2") +flank_side = 2 +range_min = 90 +range_max = 90 +position_var = &"flank_pos" + +[sub_resource type="BTAction" id="BTAction_tv4lt"] +script = ExtResource("3_treio") +target_position_var = &"flank_pos" +speed_var = &"fast_speed" +avoid_var = &"target" + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_xek5v"] +children = [SubResource("BTAction_tv4lt")] + +[sub_resource type="BTSequence" id="BTSequence_rgwic"] +custom_name = "Flank from behind" +children = [SubResource("BTPlayAnimation_olf37"), SubResource("BTAction_g5ayy"), SubResource("BTTimeLimit_xek5v")] + +[sub_resource type="BTSelector" id="BTSelector_2jnau"] +children = [SubResource("BTRunLimit_tq3e1"), SubResource("BTCooldown_ksvfy"), SubResource("BTSequence_y12eg"), SubResource("BTSequence_rgwic")] + +[resource] +description = "Like actions, conditions do not contain child tasks within them. Instead, they evaluate specific criteria and return either a [SUCCESS] or [FAILURE] based on the agent's or environment's state (for example, \"IsLowOnHealth\", \"IsTargetInSight\"). Conditions are commonly employed alongside sequences to interrupt their execution if a particular requirement is not met. + +In our example, if the target is not within the specified range, the [con]InRange[/con] condition will return [FAILURE], causing the [comp]sequence[/comp] to be aborted. +" +blackboard_plan = SubResource("BlackboardPlan_46tbn") +root_task = SubResource("BTSelector_2jnau") diff --git a/demo/ai/trees/05_agent_ranged.tres b/demo/ai/trees/05_agent_ranged.tres new file mode 100644 index 0000000..e78c1c0 --- /dev/null +++ b/demo/ai/trees/05_agent_ranged.tres @@ -0,0 +1,169 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://cqluon1y1hnn5"] + +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_4xk1i"] +[ext_resource type="Script" uid="uid://dbhd2dvt77sm4" path="res://demo/ai/tasks/is_aligned_with_target.gd" id="2_a8qex"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="3_q4r2p"] +[ext_resource type="Script" uid="uid://ct71h72pech3b" path="res://demo/ai/tasks/select_flanking_pos.gd" id="4_53hao"] +[ext_resource type="Script" uid="uid://dbo0kq2cwb4qv" path="res://demo/ai/tasks/face_target.gd" id="5_aexyq"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_46tbn"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" +var/run_speed/name = &"run_speed" +var/run_speed/type = 3 +var/run_speed/value = 600.0 +var/run_speed/hint = 1 +var/run_speed/hint_string = "10,1000,10" + +[sub_resource type="BBNode" id="BBNode_nrd4b"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_qiw21"] +animation_player = SubResource("BBNode_nrd4b") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTRandomWait" id="BTRandomWait_xlud8"] +min_duration = 0.7 +max_duration = 1.5 + +[sub_resource type="BTAction" id="BTAction_c4cxo"] +script = ExtResource("1_4xk1i") +group = &"player" + +[sub_resource type="BTSequence" id="BTSequence_yhjh1"] +custom_name = "Take a break" +children = [SubResource("BTPlayAnimation_qiw21"), SubResource("BTRandomWait_xlud8"), SubResource("BTAction_c4cxo")] + +[sub_resource type="BBNode" id="BBNode_ok0r5"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_unftu"] +animation_player = SubResource("BBNode_ok0r5") +animation_name = &"walk" +blend = 0.1 +speed = 1.5 + +[sub_resource type="BTAction" id="BTAction_op6l6"] +script = ExtResource("4_53hao") +flank_side = 1 +range_min = 400 +range_max = 1000 + +[sub_resource type="BTAction" id="BTAction_ycjun"] +script = ExtResource("3_q4r2p") +speed_var = &"run_speed" +avoid_var = &"target" + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_gadc6"] +children = [SubResource("BTAction_ycjun")] +time_limit = 7.0 + +[sub_resource type="BTAction" id="BTAction_poqpu"] +script = ExtResource("5_aexyq") + +[sub_resource type="BTSequence" id="BTSequence_0gdqn"] +custom_name = "Change flank" +children = [SubResource("BTPlayAnimation_unftu"), SubResource("BTAction_op6l6"), SubResource("BTTimeLimit_gadc6"), SubResource("BTAction_poqpu")] + +[sub_resource type="BTCooldown" id="BTCooldown_2lneu"] +children = [SubResource("BTSequence_0gdqn")] +duration = 7.0 + +[sub_resource type="BTProbability" id="BTProbability_6sydk"] +children = [SubResource("BTCooldown_2lneu")] +run_chance = 0.3 + +[sub_resource type="BTAction" id="BTAction_kuuw2"] +script = ExtResource("4_53hao") +range_min = 400 +range_max = 1000 +position_var = &"shoot_pos" + +[sub_resource type="BBNode" id="BBNode_kc64r"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_panch"] +animation_player = SubResource("BBNode_kc64r") +animation_name = &"walk" +blend = 0.1 + +[sub_resource type="BTAction" id="BTAction_66hsk"] +script = ExtResource("3_q4r2p") +target_position_var = &"shoot_pos" + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_24ath"] +children = [SubResource("BTAction_66hsk")] + +[sub_resource type="BTAction" id="BTAction_enw2m"] +script = ExtResource("5_aexyq") + +[sub_resource type="BTCondition" id="BTCondition_1fnyc"] +script = ExtResource("2_a8qex") +tolerance = 150.0 + +[sub_resource type="BBNode" id="BBNode_s6vt4"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_qa8jy"] +animation_player = SubResource("BBNode_s6vt4") +animation_name = &"throw_prepare" +blend = 0.1 + +[sub_resource type="BTWait" id="BTWait_gbcyb"] + +[sub_resource type="BBNode" id="BBNode_qkfqt"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_0ktds"] +await_completion = 1.0 +animation_player = SubResource("BBNode_qkfqt") +animation_name = &"throw" +blend = 0.05 + +[sub_resource type="BBNode" id="BBNode_1yxc5"] +resource_name = "." +saved_value = NodePath(".") + +[sub_resource type="BTCallMethod" id="BTCallMethod_yx4fk"] +node = SubResource("BBNode_1yxc5") +method = &"throw_ninja_star" + +[sub_resource type="BTWait" id="BTWait_d2ib4"] +duration = 0.2 + +[sub_resource type="BTSequence" id="BTSequence_rgbq3"] +custom_name = "Throw ninja star" +children = [SubResource("BTPlayAnimation_qa8jy"), SubResource("BTWait_gbcyb"), SubResource("BTPlayAnimation_0ktds"), SubResource("BTCallMethod_yx4fk"), SubResource("BTWait_d2ib4")] +metadata/_weight_ = 1.0 + +[sub_resource type="BTRepeat" id="BTRepeat_g08ia"] +children = [SubResource("BTSequence_rgbq3")] +times = 3 + +[sub_resource type="BTSequence" id="BTSequence_lhg7f"] +custom_name = "Get into position" +children = [SubResource("BTAction_kuuw2"), SubResource("BTPlayAnimation_panch"), SubResource("BTTimeLimit_24ath"), SubResource("BTAction_enw2m"), SubResource("BTCondition_1fnyc"), SubResource("BTRepeat_g08ia")] +metadata/_weight_ = 1.0 + +[sub_resource type="BTSelector" id="BTSelector_1rrya"] +children = [SubResource("BTProbability_6sydk"), SubResource("BTSequence_lhg7f")] + +[sub_resource type="BTSequence" id="BTSequence_pxl2k"] +custom_name = "Main" +children = [SubResource("BTSequence_yhjh1"), SubResource("BTSelector_1rrya")] + +[resource] +description = "Here, the [dec]Probability[/dec] decorator permits the execution of its branch in 30% of cases. This introduces a slight variation to the behavior each time the \"Change flank\" sequence is considered by the [comp]Selector[/comp]. + +The [dec]Repeat[/dec] decorator is handy for doing something multiple times within a behavior tree. In our example, it's used to make the [comp]Throw ninja star[/comp] sequence perform three times in a row." +blackboard_plan = SubResource("BlackboardPlan_46tbn") +root_task = SubResource("BTSequence_pxl2k") diff --git a/demo/ai/trees/06_agent_melee_combo.tres b/demo/ai/trees/06_agent_melee_combo.tres new file mode 100644 index 0000000..c29eb6b --- /dev/null +++ b/demo/ai/trees/06_agent_melee_combo.tres @@ -0,0 +1,149 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://cpncl1db8j12f"] + +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_sf4l8"] +[ext_resource type="Script" uid="uid://ct71h72pech3b" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_5nwkp"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="3_3tom2"] +[ext_resource type="Script" uid="uid://dbo0kq2cwb4qv" path="res://demo/ai/tasks/face_target.gd" id="4_hi228"] +[ext_resource type="Script" uid="uid://b8ljqe213ud7d" path="res://demo/ai/tasks/move_forward.gd" id="5_au5yc"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_46tbn"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" +var/charge_speed/name = &"charge_speed" +var/charge_speed/type = 3 +var/charge_speed/value = 1000.0 +var/charge_speed/hint = 0 +var/charge_speed/hint_string = "" + +[sub_resource type="BBNode" id="BBNode_nrd4b"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_qiw21"] +animation_player = SubResource("BBNode_nrd4b") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTRandomWait" id="BTRandomWait_xlud8"] +min_duration = 0.7 +max_duration = 1.5 + +[sub_resource type="BTAction" id="BTAction_ulbrf"] +script = ExtResource("1_sf4l8") +group = &"player" + +[sub_resource type="BTSequence" id="BTSequence_yhjh1"] +custom_name = "Pause before action" +children = [SubResource("BTPlayAnimation_qiw21"), SubResource("BTRandomWait_xlud8"), SubResource("BTAction_ulbrf")] + +[sub_resource type="BTAction" id="BTAction_85keo"] +script = ExtResource("2_5nwkp") + +[sub_resource type="BBNode" id="BBNode_wpj6d"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_olf37"] +animation_player = SubResource("BBNode_wpj6d") +animation_name = &"walk" +blend = 0.1 + +[sub_resource type="BTAction" id="BTAction_ygjnc"] +script = ExtResource("3_3tom2") + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_xek5v"] +children = [SubResource("BTAction_ygjnc")] + +[sub_resource type="BTSequence" id="BTSequence_1xfnq"] +custom_name = "Align with player" +children = [SubResource("BTAction_85keo"), SubResource("BTPlayAnimation_olf37"), SubResource("BTTimeLimit_xek5v")] + +[sub_resource type="BTAction" id="BTAction_kidxn"] +script = ExtResource("4_hi228") + +[sub_resource type="BBNode" id="BBNode_giv5l"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_usdja"] +animation_player = SubResource("BBNode_giv5l") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTWait" id="BTWait_tadkc"] +duration = 0.4 + +[sub_resource type="BBNode" id="BBNode_s8evu"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_ppmxd"] +await_completion = 2.0 +animation_player = SubResource("BBNode_s8evu") +animation_name = &"attack_1" + +[sub_resource type="BTAction" id="BTAction_u22bc"] +script = ExtResource("5_au5yc") +speed_var = &"charge_speed" + +[sub_resource type="BTParallel" id="BTParallel_ec2e3"] +children = [SubResource("BTPlayAnimation_ppmxd"), SubResource("BTAction_u22bc")] +num_successes_required = 2 + +[sub_resource type="BTWait" id="BTWait_c0lo0"] +duration = 0.2 + +[sub_resource type="BBNode" id="BBNode_3oljv"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_q4uis"] +await_completion = 2.0 +animation_player = SubResource("BBNode_3oljv") +animation_name = &"attack_2" + +[sub_resource type="BTAction" id="BTAction_yuxl3"] +script = ExtResource("5_au5yc") +speed_var = &"charge_speed" + +[sub_resource type="BTParallel" id="BTParallel_thojy"] +children = [SubResource("BTPlayAnimation_q4uis"), SubResource("BTAction_yuxl3")] +num_successes_required = 2 + +[sub_resource type="BTWait" id="BTWait_y3pmv"] +duration = 0.2 + +[sub_resource type="BBNode" id="BBNode_ot40l"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_ye5pt"] +await_completion = 2.0 +animation_player = SubResource("BBNode_ot40l") +animation_name = &"attack_3" + +[sub_resource type="BTAction" id="BTAction_rwp18"] +script = ExtResource("5_au5yc") +speed_var = &"charge_speed" + +[sub_resource type="BTParallel" id="BTParallel_qmdfb"] +children = [SubResource("BTPlayAnimation_ye5pt"), SubResource("BTAction_rwp18")] +num_successes_required = 2 + +[sub_resource type="BTWait" id="BTWait_nxyko"] +duration = 0.5 + +[sub_resource type="BTSequence" id="BTSequence_ww5v2"] +custom_name = "Combo Melee attack" +children = [SubResource("BTAction_kidxn"), SubResource("BTPlayAnimation_usdja"), SubResource("BTWait_tadkc"), SubResource("BTParallel_ec2e3"), SubResource("BTWait_c0lo0"), SubResource("BTParallel_thojy"), SubResource("BTWait_y3pmv"), SubResource("BTParallel_qmdfb"), SubResource("BTWait_nxyko")] + +[sub_resource type="BTSequence" id="BTSequence_pxl2k"] +children = [SubResource("BTSequence_yhjh1"), SubResource("BTSequence_1xfnq"), SubResource("BTSequence_ww5v2")] + +[resource] +description = "In some scenarios, you might need to execute multiple tasks at the same time until specific conditions are fulfilled. To achieve this, the [comp]Parallel[/comp] composite is an invaluable tool. This composite task allows its children to be executed simultaneously during each tick until a specified number of successes or failures is reached. In this example, it will execute both the [act]PlayAnimation[/act] and [act]MoveForward[/act] actions each tick until both actions have finished with a [SUCCESS] status." +blackboard_plan = SubResource("BlackboardPlan_46tbn") +root_task = SubResource("BTSequence_pxl2k") diff --git a/demo/ai/trees/07_agent_melee_nuanced.tres b/demo/ai/trees/07_agent_melee_nuanced.tres new file mode 100644 index 0000000..d2933a7 --- /dev/null +++ b/demo/ai/trees/07_agent_melee_nuanced.tres @@ -0,0 +1,203 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://c2u6sljqkim0n"] + +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_08fik"] +[ext_resource type="Script" uid="uid://ct71h72pech3b" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_te3yo"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="3_svwk8"] +[ext_resource type="Script" uid="uid://dbo0kq2cwb4qv" path="res://demo/ai/tasks/face_target.gd" id="4_mvsyw"] +[ext_resource type="Script" uid="uid://dcjgktglb1slf" path="res://demo/ai/tasks/pursue.gd" id="5_r1ou0"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_46tbn"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" +var/flank_speed/name = &"flank_speed" +var/flank_speed/type = 3 +var/flank_speed/value = 600.0 +var/flank_speed/hint = 1 +var/flank_speed/hint_string = "10,1000,10" + +[sub_resource type="BBNode" id="BBNode_nrd4b"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_qiw21"] +animation_player = SubResource("BBNode_nrd4b") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTRandomWait" id="BTRandomWait_xlud8"] +min_duration = 0.7 +max_duration = 1.5 + +[sub_resource type="BTAction" id="BTAction_c4cxo"] +script = ExtResource("1_08fik") +group = &"player" + +[sub_resource type="BTSequence" id="BTSequence_yhjh1"] +custom_name = "Pause before action" +children = [SubResource("BTPlayAnimation_qiw21"), SubResource("BTRandomWait_xlud8"), SubResource("BTAction_c4cxo")] + +[sub_resource type="BBNode" id="BBNode_kc64r"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_panch"] +animation_player = SubResource("BBNode_kc64r") +animation_name = &"walk" +blend = 0.1 +speed = 1.5 + +[sub_resource type="BTAction" id="BTAction_6e48s"] +script = ExtResource("2_te3yo") +flank_side = 1 +range_min = 400 +range_max = 600 +position_var = &"flank_pos" + +[sub_resource type="BTAction" id="BTAction_66hsk"] +script = ExtResource("3_svwk8") +target_position_var = &"flank_pos" +speed_var = &"flank_speed" +avoid_var = &"target" + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_24ath"] +children = [SubResource("BTAction_66hsk")] + +[sub_resource type="BTAction" id="BTAction_enw2m"] +script = ExtResource("4_mvsyw") + +[sub_resource type="BTSequence" id="BTSequence_lhg7f"] +custom_name = "Flank player" +children = [SubResource("BTPlayAnimation_panch"), SubResource("BTAction_6e48s"), SubResource("BTTimeLimit_24ath"), SubResource("BTAction_enw2m")] +metadata/_weight_ = 1.0 + +[sub_resource type="BTCooldown" id="BTCooldown_skw41"] +children = [SubResource("BTSequence_lhg7f")] +duration = 6.0 +metadata/_weight_ = 2.0 + +[sub_resource type="BBNode" id="BBNode_wpj6d"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_olf37"] +animation_player = SubResource("BBNode_wpj6d") +animation_name = &"walk" +blend = 0.1 + +[sub_resource type="BTAction" id="BTAction_a4jqi"] +script = ExtResource("5_r1ou0") + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_xek5v"] +children = [SubResource("BTAction_a4jqi")] +time_limit = 2.0 + +[sub_resource type="BTAction" id="BTAction_kidxn"] +script = ExtResource("4_mvsyw") + +[sub_resource type="BTWait" id="BTWait_tadkc"] +duration = 0.1 + +[sub_resource type="BBNode" id="BBNode_g8qww"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_a8yqu"] +await_completion = 2.0 +animation_player = SubResource("BBNode_g8qww") +animation_name = &"attack_2" + +[sub_resource type="BTWait" id="BTWait_vjstl"] +duration = 0.1 + +[sub_resource type="BBNode" id="BBNode_rfop0"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_8oyw6"] +await_completion = 2.0 +animation_player = SubResource("BBNode_rfop0") +animation_name = &"attack_3" + +[sub_resource type="BTSequence" id="BTSequence_1xfnq"] +custom_name = "Approach and melee attack" +children = [SubResource("BTPlayAnimation_olf37"), SubResource("BTTimeLimit_xek5v"), SubResource("BTAction_kidxn"), SubResource("BTWait_tadkc"), SubResource("BTPlayAnimation_a8yqu"), SubResource("BTWait_vjstl"), SubResource("BTPlayAnimation_8oyw6")] +metadata/_weight_ = 4.0 + +[sub_resource type="BTAction" id="BTAction_mf87t"] +script = ExtResource("2_te3yo") +range_min = 350 +range_max = 600 + +[sub_resource type="BBNode" id="BBNode_cx111"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_mfbeu"] +animation_player = SubResource("BBNode_cx111") +animation_name = &"walk" +blend = 0.1 + +[sub_resource type="BTAction" id="BTAction_6nx58"] +script = ExtResource("3_svwk8") + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_tidwl"] +children = [SubResource("BTAction_6nx58")] +time_limit = 3.0 + +[sub_resource type="BTAction" id="BTAction_8q20y"] +script = ExtResource("4_mvsyw") + +[sub_resource type="BBNode" id="BBNode_s6vt4"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_qa8jy"] +animation_player = SubResource("BBNode_s6vt4") +animation_name = &"throw_prepare" +blend = 0.1 +speed = 0.7 + +[sub_resource type="BTWait" id="BTWait_gbcyb"] + +[sub_resource type="BBNode" id="BBNode_qkfqt"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_0ktds"] +await_completion = 1.0 +animation_player = SubResource("BBNode_qkfqt") +animation_name = &"throw" +blend = 0.05 + +[sub_resource type="BBNode" id="BBNode_1yxc5"] +resource_name = "." +saved_value = NodePath(".") + +[sub_resource type="BTCallMethod" id="BTCallMethod_yx4fk"] +node = SubResource("BBNode_1yxc5") +method = &"throw_ninja_star" + +[sub_resource type="BTRandomWait" id="BTRandomWait_2pmoe"] +max_duration = 1.5 + +[sub_resource type="BTSequence" id="BTSequence_rgbq3"] +custom_name = "Throw ninja star" +children = [SubResource("BTAction_mf87t"), SubResource("BTPlayAnimation_mfbeu"), SubResource("BTTimeLimit_tidwl"), SubResource("BTAction_8q20y"), SubResource("BTPlayAnimation_qa8jy"), SubResource("BTWait_gbcyb"), SubResource("BTPlayAnimation_0ktds"), SubResource("BTCallMethod_yx4fk"), SubResource("BTRandomWait_2pmoe")] +metadata/_weight_ = 2.0 + +[sub_resource type="BTProbabilitySelector" id="BTProbabilitySelector_rjsiq"] +children = [SubResource("BTCooldown_skw41"), SubResource("BTSequence_1xfnq"), SubResource("BTSequence_rgbq3")] +abort_on_failure = true + +[sub_resource type="BTSequence" id="BTSequence_pxl2k"] +custom_name = "Main" +children = [SubResource("BTSequence_yhjh1"), SubResource("BTProbabilitySelector_rjsiq")] + +[resource] +description = "[comp]ProbabilitySelector[/comp] chooses a child task to execute based on attached probabilities. Probability distribution is calculated based on weights assigned to each child task. +" +blackboard_plan = SubResource("BlackboardPlan_46tbn") +root_task = SubResource("BTSequence_pxl2k") diff --git a/demo/ai/trees/08_agent_demon.tres b/demo/ai/trees/08_agent_demon.tres new file mode 100644 index 0000000..1070df2 --- /dev/null +++ b/demo/ai/trees/08_agent_demon.tres @@ -0,0 +1,182 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://cpcnbi81jqge4"] + +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_ce4la"] +[ext_resource type="Script" uid="uid://b7v2utjmtge0x" path="res://demo/ai/tasks/in_range.gd" id="2_atyuj"] +[ext_resource type="Script" uid="uid://dbo0kq2cwb4qv" path="res://demo/ai/tasks/face_target.gd" id="3_3mw7l"] +[ext_resource type="Script" uid="uid://bi5e8366xi5s5" path="res://demo/ai/tasks/back_away.gd" id="4_6dr32"] +[ext_resource type="Script" uid="uid://ct71h72pech3b" path="res://demo/ai/tasks/select_flanking_pos.gd" id="5_dho0d"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="6_0pfsl"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_8ay3j"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" + +[sub_resource type="BBNode" id="BBNode_lpri5"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_p3e7a"] +animation_player = SubResource("BBNode_lpri5") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTRandomWait" id="BTRandomWait_j6cjm"] +min_duration = 2.0 +max_duration = 3.0 + +[sub_resource type="BTSequence" id="BTSequence_5thv4"] +custom_name = "Chill" +children = [SubResource("BTPlayAnimation_p3e7a"), SubResource("BTRandomWait_j6cjm")] + +[sub_resource type="BTCooldown" id="BTCooldown_oms7a"] +children = [SubResource("BTSequence_5thv4")] +trigger_on_failure = true + +[sub_resource type="BTAction" id="BTAction_ohfp7"] +script = ExtResource("1_ce4la") +group = &"player" + +[sub_resource type="BTCondition" id="BTCondition_7a5nv"] +script = ExtResource("2_atyuj") +distance_max = 150.0 + +[sub_resource type="BTAction" id="BTAction_ddvrs"] +script = ExtResource("3_3mw7l") + +[sub_resource type="BBNode" id="BBNode_c4nfu"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_yytkn"] +await_completion = 3.0 +animation_player = SubResource("BBNode_c4nfu") +animation_name = &"attack_3" +blend = 0.1 + +[sub_resource type="BTCooldown" id="BTCooldown_ejg6q"] +children = [SubResource("BTPlayAnimation_yytkn")] +duration = 3.0 + +[sub_resource type="BTSequence" id="BTSequence_eikr4"] +custom_name = "Melee" +children = [SubResource("BTAction_ohfp7"), SubResource("BTCondition_7a5nv"), SubResource("BTAction_ddvrs"), SubResource("BTCooldown_ejg6q")] + +[sub_resource type="BTCondition" id="BTCondition_h75v8"] +script = ExtResource("2_atyuj") +distance_max = 300.0 + +[sub_resource type="BTAction" id="BTAction_wpt7j"] +script = ExtResource("3_3mw7l") + +[sub_resource type="BBNode" id="BBNode_iv62h"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_wnaul"] +animation_player = SubResource("BBNode_iv62h") +animation_name = &"walk" +blend = 0.1 +speed = -1.0 + +[sub_resource type="BTAction" id="BTAction_h2efl"] +script = ExtResource("4_6dr32") + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_wm5g2"] +children = [SubResource("BTAction_h2efl")] +time_limit = 1.0 + +[sub_resource type="BTSequence" id="BTSequence_wh4dl"] +custom_name = "Back away" +children = [SubResource("BTCondition_h75v8"), SubResource("BTAction_wpt7j"), SubResource("BTPlayAnimation_wnaul"), SubResource("BTTimeLimit_wm5g2")] + +[sub_resource type="BTComment" id="BTComment_mqte5"] +custom_name = "Get into position" + +[sub_resource type="BBNode" id="BBNode_edmui"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_vjtpq"] +animation_player = SubResource("BBNode_edmui") +animation_name = &"walk" +blend = 0.1 + +[sub_resource type="BTAction" id="BTAction_4mmh0"] +script = ExtResource("5_dho0d") +range_max = 700 + +[sub_resource type="BTAction" id="BTAction_vb5c3"] +script = ExtResource("6_0pfsl") + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_jyks2"] +children = [SubResource("BTAction_vb5c3")] + +[sub_resource type="BTComment" id="BTComment_ym6nj"] +custom_name = "Short break before action" + +[sub_resource type="BTAction" id="BTAction_fkevy"] +script = ExtResource("3_3mw7l") + +[sub_resource type="BBNode" id="BBNode_lh25u"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_vcjeq"] +animation_player = SubResource("BBNode_lh25u") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTWait" id="BTWait_42smh"] +duration = 0.2 + +[sub_resource type="BTComment" id="BTComment_nbp2b"] +custom_name = "Spit fire!" + +[sub_resource type="BBNode" id="BBNode_cqw71"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_214yn"] +await_completion = 3.0 +animation_player = SubResource("BBNode_cqw71") +animation_name = &"spit" +blend = 0.1 + +[sub_resource type="BBNode" id="BBNode_dv5b5"] +resource_name = "." +saved_value = NodePath(".") + +[sub_resource type="BTCallMethod" id="BTCallMethod_lk7i6"] +node = SubResource("BBNode_dv5b5") +method = &"spit_fire" + +[sub_resource type="BTComment" id="BTComment_fndxk"] +custom_name = "Wind down" + +[sub_resource type="BBNode" id="BBNode_m68ui"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_m7gyp"] +animation_player = SubResource("BBNode_m68ui") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTRandomWait" id="BTRandomWait_v0el8"] +min_duration = 0.7 +max_duration = 1.5 + +[sub_resource type="BTSequence" id="BTSequence_djtph"] +custom_name = "Spit fire" +children = [SubResource("BTComment_mqte5"), SubResource("BTPlayAnimation_vjtpq"), SubResource("BTAction_4mmh0"), SubResource("BTTimeLimit_jyks2"), SubResource("BTComment_ym6nj"), SubResource("BTAction_fkevy"), SubResource("BTPlayAnimation_vcjeq"), SubResource("BTWait_42smh"), SubResource("BTComment_nbp2b"), SubResource("BTPlayAnimation_214yn"), SubResource("BTCallMethod_lk7i6"), SubResource("BTComment_fndxk"), SubResource("BTPlayAnimation_m7gyp"), SubResource("BTRandomWait_v0el8")] + +[sub_resource type="BTSelector" id="BTSelector_feba6"] +children = [SubResource("BTCooldown_oms7a"), SubResource("BTSequence_eikr4"), SubResource("BTSequence_wh4dl"), SubResource("BTSequence_djtph")] + +[resource] +description = "Here, we use the [con]InRange[/con] condition task together with [comp]Sequence[/comp] and [comp]Selector[/comp] to create a reactive behavior for this agent. When the player comes close, this agent will attempt to hit them with a melee attack and move away afterward for a better ranged position." +blackboard_plan = SubResource("BlackboardPlan_8ay3j") +root_task = SubResource("BTSelector_feba6") diff --git a/demo/ai/trees/09_agent_summoner.tres b/demo/ai/trees/09_agent_summoner.tres new file mode 100644 index 0000000..2b6edbb --- /dev/null +++ b/demo/ai/trees/09_agent_summoner.tres @@ -0,0 +1,147 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://cpxk7jnqpwwlc"] + +[ext_resource type="Script" uid="uid://bicxffqmm7ek" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="1_sgn0p"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="2_pshl2"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_58oq1"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 300.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" +var/summon_cooldown/name = &"summon_cooldown" +var/summon_cooldown/type = 1 +var/summon_cooldown/value = false +var/summon_cooldown/hint = 0 +var/summon_cooldown/hint_string = "" + +[sub_resource type="BBNode" id="BBNode_b7euf"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_sot6a"] +animation_player = SubResource("BBNode_b7euf") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTRandomWait" id="BTRandomWait_0wc6p"] + +[sub_resource type="BTSequence" id="BTSequence_kwkxc"] +custom_name = "Summoning sickness" +children = [SubResource("BTPlayAnimation_sot6a"), SubResource("BTRandomWait_0wc6p")] + +[sub_resource type="BTRunLimit" id="BTRunLimit_x2jr4"] +children = [SubResource("BTSequence_kwkxc")] + +[sub_resource type="BBVariant" id="BBVariant_y3x7n"] +resource_name = "6" +saved_value = 6 +type = 2 + +[sub_resource type="BTCheckAgentProperty" id="BTCheckAgentProperty_olmdj"] +property = &"summon_count" +check_type = 1 +value = SubResource("BBVariant_y3x7n") + +[sub_resource type="BTComment" id="BTComment_ef6y0"] +custom_name = "Variable $summon_cooldown is updated by the Cooldown task below" + +[sub_resource type="BBVariant" id="BBVariant_hgde2"] +resource_name = "false" +saved_value = false +type = 1 + +[sub_resource type="BTCheckVar" id="BTCheckVar_hc3o3"] +children = [SubResource("BTComment_ef6y0")] +variable = &"summon_cooldown" +value = SubResource("BBVariant_hgde2") + +[sub_resource type="BBNode" id="BBNode_q8bei"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_6leni"] +animation_player = SubResource("BBNode_q8bei") +animation_name = &"summon" +blend = 0.1 + +[sub_resource type="BTWait" id="BTWait_8og18"] +duration = 0.5 + +[sub_resource type="BTAction" id="BTAction_yeyns"] +script = ExtResource("1_sgn0p") +position_var = &"minion_pos" + +[sub_resource type="BBVariant" id="BBVariant_wfjwy"] +resource_name = "$minion_pos" +value_source = 1 +variable = &"minion_pos" +type = 5 + +[sub_resource type="BBNode" id="BBNode_v271m"] +resource_name = "." +saved_value = NodePath(".") + +[sub_resource type="BTCallMethod" id="BTCallMethod_4ath5"] +node = SubResource("BBNode_v271m") +method = &"summon_minion" +args = Array[BBVariant]([SubResource("BBVariant_wfjwy")]) + +[sub_resource type="BTCooldown" id="BTCooldown_25f70"] +children = [SubResource("BTCallMethod_4ath5")] +duration = 6.0 +cooldown_state_var = &"summon_cooldown" + +[sub_resource type="BTWait" id="BTWait_tdhfn"] + +[sub_resource type="BTSequence" id="BTSequence_2n742"] +custom_name = "Summon minion" +children = [SubResource("BTCheckAgentProperty_olmdj"), SubResource("BTCheckVar_hc3o3"), SubResource("BTPlayAnimation_6leni"), SubResource("BTWait_8og18"), SubResource("BTAction_yeyns"), SubResource("BTCooldown_25f70"), SubResource("BTWait_tdhfn")] + +[sub_resource type="BTAction" id="BTAction_33wje"] +script = ExtResource("1_sgn0p") +range_max = 700.0 + +[sub_resource type="BBNode" id="BBNode_w5fh2"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_qbxm8"] +animation_player = SubResource("BBNode_w5fh2") +animation_name = &"walk" +blend = 0.1 + +[sub_resource type="BTAction" id="BTAction_dfifw"] +script = ExtResource("2_pshl2") + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_i05cm"] +children = [SubResource("BTAction_dfifw")] +time_limit = 3.0 + +[sub_resource type="BBNode" id="BBNode_vinxt"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_t7drr"] +animation_player = SubResource("BBNode_vinxt") +animation_name = &"idle" +blend = 0.1 + +[sub_resource type="BTRandomWait" id="BTRandomWait_axjfh"] + +[sub_resource type="BTSequence" id="BTSequence_ks71q"] +custom_name = "Chill" +children = [SubResource("BTPlayAnimation_t7drr"), SubResource("BTRandomWait_axjfh")] + +[sub_resource type="BTSequence" id="BTSequence_dss4d"] +custom_name = "Reposition" +children = [SubResource("BTAction_33wje"), SubResource("BTPlayAnimation_qbxm8"), SubResource("BTTimeLimit_i05cm"), SubResource("BTSequence_ks71q")] + +[sub_resource type="BTSelector" id="BTSelector_gp6q5"] +children = [SubResource("BTRunLimit_x2jr4"), SubResource("BTSequence_2n742"), SubResource("BTSequence_dss4d")] + +[resource] +description = "[con]CheckAgentProperty[/con] examines the agent’s property value and compares it to a given value or a blackboard variable. In this example, it checks if the [color=cyan]summon_count[/color] property is less than 6. +You can also check or share a [dec]Cooldown[/dec] in different parts of the behavior tree if you provide a blackboard variable for the [dec]Cooldown[/dec] decorator to use. [con]CheckVar[/con] is responsible here for examining the cooldown variable named \"summon_cooldown\"." +blackboard_plan = SubResource("BlackboardPlan_58oq1") +root_task = SubResource("BTSelector_gp6q5") diff --git a/demo/ai/trees/tutorial/tutorial_01_welcome.tres b/demo/ai/trees/tutorial/tutorial_01_welcome.tres new file mode 100644 index 0000000..aebe0f9 --- /dev/null +++ b/demo/ai/trees/tutorial/tutorial_01_welcome.tres @@ -0,0 +1,29 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://b1mfh8yad7rmw"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_ewfwq"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" + +[sub_resource type="BBNode" id="BBNode_fq0jf"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_rsejo"] +animation_player = SubResource("BBNode_fq0jf") +animation_name = &"idle" + +[sub_resource type="BTSequence" id="BTSequence_4bq32"] +children = [SubResource("BTPlayAnimation_rsejo")] + +[resource] +description = "Welcome to the [b]LimboAI Tutorial[/b]! + +Here, you'll learn how to use behavior trees to craft AI for your games. We'll start with the basics and gradually move to more advanced topics. Strap in for a quick and engaging introduction to behavior trees. + +Press ➡ button in the top-right corner to proceed. +Press ⬅ button any time you want to go back to a previous chapter." +blackboard_plan = SubResource("BlackboardPlan_ewfwq") +root_task = SubResource("BTSequence_4bq32") diff --git a/demo/ai/trees/tutorial/tutorial_02_introduction.tres b/demo/ai/trees/tutorial/tutorial_02_introduction.tres new file mode 100644 index 0000000..3e2bae8 --- /dev/null +++ b/demo/ai/trees/tutorial/tutorial_02_introduction.tres @@ -0,0 +1,45 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://b1i0xo0o676va"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_ewfwq"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" +var/flank_speed/name = &"flank_speed" +var/flank_speed/type = 3 +var/flank_speed/value = 600.0 +var/flank_speed/hint = 1 +var/flank_speed/hint_string = "10,1000,10" + +[sub_resource type="BBNode" id="BBNode_wu06u"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_dubaq"] +animation_player = SubResource("BBNode_wu06u") +animation_name = &"idle" + +[sub_resource type="BTWait" id="BTWait_meli1"] +duration = 5.0 + +[sub_resource type="BBNode" id="BBNode_mgehh"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_0fqno"] +animation_player = SubResource("BBNode_mgehh") +animation_name = &"dance" + +[sub_resource type="BTWait" id="BTWait_m3h4o"] +duration = 5.0 + +[sub_resource type="BTSequence" id="BTSequence_rbfdh"] +children = [SubResource("BTPlayAnimation_dubaq"), SubResource("BTWait_meli1"), SubResource("BTPlayAnimation_0fqno"), SubResource("BTWait_m3h4o")] + +[resource] +description = "Behavior trees are designed to simplify the creation of responsive and modular behaviors for games. They consist of tasks that represent specific actions or decision-making rules. Tasks can be broadly categorized into two groups: control tasks and leaf tasks. [b]Control tasks[/b] dictate the execution flow within the tree, while [b]leaf tasks[/b] represent specific actions to perform (such as moving or attacking) or conditions that need to be checked. Typically, it's the leaf tasks that perform the actual work in behavior trees. + +A behavior tree is usually processed each frame (physics frame by default). It is traversed from top to bottom, with the control tasks determining the control flow. Each task has a [color=cyan]_tick[/color] method, which performs the task's work and returns a status indicating its progress: [SUCCESS], [FAILURE], or [RUNNING]. [SUCCESS] and [FAILURE] indicate the outcome of finished work, while [RUNNING] status is returned when a task requires more than one tick to complete its job. These statuses determine how the tree progresses, with the [RUNNING] status usually meaning that the tree will continue execution during the next frame." +blackboard_plan = SubResource("BlackboardPlan_ewfwq") +root_task = SubResource("BTSequence_rbfdh") diff --git a/demo/ai/trees/tutorial/tutorial_03_types.tres b/demo/ai/trees/tutorial/tutorial_03_types.tres new file mode 100644 index 0000000..d617453 --- /dev/null +++ b/demo/ai/trees/tutorial/tutorial_03_types.tres @@ -0,0 +1,86 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://cb0ybf24ahnc3"] + +[ext_resource type="Script" uid="uid://bicxffqmm7ek" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="1_as4cg"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="2_dlpnp"] +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="3_uv18s"] +[ext_resource type="Script" uid="uid://b7v2utjmtge0x" path="res://demo/ai/tasks/in_range.gd" id="4_k3g8t"] +[ext_resource type="Script" uid="uid://dbo0kq2cwb4qv" path="res://demo/ai/tasks/face_target.gd" id="5_thvy5"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_ewfwq"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" + +[sub_resource type="BBNode" id="BBNode_20ku0"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_57u80"] +animation_player = SubResource("BBNode_20ku0") +animation_name = &"walk" + +[sub_resource type="BTAction" id="BTAction_11xvc"] +script = ExtResource("1_as4cg") + +[sub_resource type="BTAction" id="BTAction_tdkpj"] +script = ExtResource("2_dlpnp") + +[sub_resource type="BTSequence" id="BTSequence_echit"] +children = [SubResource("BTPlayAnimation_57u80"), SubResource("BTAction_11xvc"), SubResource("BTAction_tdkpj")] + +[sub_resource type="BTProbability" id="BTProbability_g0ol3"] +children = [SubResource("BTSequence_echit")] + +[sub_resource type="BTAction" id="BTAction_124bm"] +script = ExtResource("3_uv18s") +group = &"player" + +[sub_resource type="BTCondition" id="BTCondition_n25o8"] +script = ExtResource("4_k3g8t") +distance_max = 200.0 + +[sub_resource type="BTAction" id="BTAction_1hfgr"] +script = ExtResource("5_thvy5") + +[sub_resource type="BBNode" id="BBNode_ilr2h"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_mrsu3"] +animation_player = SubResource("BBNode_ilr2h") +animation_name = &"attack_1" + +[sub_resource type="BTSequence" id="BTSequence_5vug3"] +children = [SubResource("BTAction_124bm"), SubResource("BTCondition_n25o8"), SubResource("BTAction_1hfgr"), SubResource("BTPlayAnimation_mrsu3")] + +[sub_resource type="BBNode" id="BBNode_fq0jf"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_rsejo"] +animation_player = SubResource("BBNode_fq0jf") +animation_name = &"idle" + +[sub_resource type="BTWait" id="BTWait_dl31p"] +duration = 2.0 + +[sub_resource type="BTSequence" id="BTSequence_vx4uy"] +children = [SubResource("BTPlayAnimation_rsejo"), SubResource("BTWait_dl31p")] + +[sub_resource type="BTSelector" id="BTSelector_tdpek"] +children = [SubResource("BTProbability_g0ol3"), SubResource("BTSequence_5vug3"), SubResource("BTSequence_vx4uy")] + +[resource] +description = "There are four types of tasks: +[ul][act]Actions[/act] are leaf tasks that perform the actual work.[/ul] +[ul][con]Conditions[/con] are leaf tasks that conduct various checks.[/ul] +[ul][comp]Composites[/comp] can have one or more child tasks, and dictate the execution flow of their children.[/ul] +[ul][dec]Decorators[/dec] can only have a single child and they change how their child task operates.[/ul] + +Let's take a look into actions first. [act]Actions[/act] are responsible for most of the work and often change the game state in a significant manner. For instance, [act]PlayAnimation[/act] instructs the AnimationPlayer to start a specified animation, with the option to wait for its completion. On the other hand, the [act]Wait[/act] task simply pauses for a set duration before returning [SUCCESS]. + +Next, we'll explore the core composite tasks, such as [comp]Sequence[/comp] and [comp]Selector[/comp]. These are among the most crucial composites that you should know about." +blackboard_plan = SubResource("BlackboardPlan_ewfwq") +root_task = SubResource("BTSelector_tdpek") diff --git a/demo/ai/trees/tutorial/tutorial_04_sequence.tres b/demo/ai/trees/tutorial/tutorial_04_sequence.tres new file mode 100644 index 0000000..7e7e572 --- /dev/null +++ b/demo/ai/trees/tutorial/tutorial_04_sequence.tres @@ -0,0 +1,55 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://dln8ywvtqedt7"] + +[ext_resource type="Script" uid="uid://bicxffqmm7ek" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="1_gk66j"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="2_v5eou"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_ewfwq"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" + +[sub_resource type="BBNode" id="BBNode_fq0jf"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_rsejo"] +animation_player = SubResource("BBNode_fq0jf") +animation_name = &"idle" + +[sub_resource type="BTWait" id="BTWait_dl31p"] +duration = 3.0 + +[sub_resource type="BBNode" id="BBNode_6d0yy"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_wsspf"] +animation_player = SubResource("BBNode_6d0yy") +animation_name = &"walk" + +[sub_resource type="BTAction" id="BTAction_fc1oo"] +script = ExtResource("1_gk66j") + +[sub_resource type="BTAction" id="BTAction_djl5v"] +script = ExtResource("2_v5eou") + +[sub_resource type="BTFail" id="BTFail_i2f36"] + +[sub_resource type="BTComment" id="BTComment_4i06i"] +custom_name = "👇️ Sequence is never going to reach this task, because it fails at the previous step." + +[sub_resource type="BTWait" id="BTWait_yxpnx"] +duration = 888.0 + +[sub_resource type="BTSequence" id="BTSequence_vx4uy"] +children = [SubResource("BTPlayAnimation_rsejo"), SubResource("BTWait_dl31p"), SubResource("BTPlayAnimation_wsspf"), SubResource("BTAction_fc1oo"), SubResource("BTAction_djl5v"), SubResource("BTFail_i2f36"), SubResource("BTComment_4i06i"), SubResource("BTWait_yxpnx")] + +[resource] +description = "The [comp]Sequence[/comp] is one of the core composite tasks. It executes its child tasks sequentially, from first to last, until one of them returns [FAILURE], or all of them result in [SUCCESS]. In other words, if any child task results in [FAILURE], the Sequence execution will be aborted, and the Sequence itself will return [FAILURE]. + +In our example, you can observe a simple [comp]Sequence[/comp] in action. Notice how it fails when it reaches the [act]Fail[/act] action and never proceeds to the [act]Wait 888 sec[/act] action afterward. By the way, the simple [act]Fail[/act] task is quite useful for troubleshooting. Its sole function is to return [FAILURE]. +" +blackboard_plan = SubResource("BlackboardPlan_ewfwq") +root_task = SubResource("BTSequence_vx4uy") diff --git a/demo/ai/trees/tutorial/tutorial_05_selector.tres b/demo/ai/trees/tutorial/tutorial_05_selector.tres new file mode 100644 index 0000000..a305037 --- /dev/null +++ b/demo/ai/trees/tutorial/tutorial_05_selector.tres @@ -0,0 +1,96 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://bf4r652fv5kwi"] + +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_3ed74"] +[ext_resource type="Script" uid="uid://bicxffqmm7ek" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="1_rvh1c"] +[ext_resource type="Script" uid="uid://b7v2utjmtge0x" path="res://demo/ai/tasks/in_range.gd" id="2_jfsyt"] +[ext_resource type="Script" uid="uid://dcjgktglb1slf" path="res://demo/ai/tasks/pursue.gd" id="2_nnswb"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="2_t62a0"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_ewfwq"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" + +[sub_resource type="BTCondition" id="BTCondition_x0uu7"] +script = ExtResource("2_jfsyt") +distance_max = 200.0 + +[sub_resource type="BBNode" id="BBNode_icf24"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_iiei3"] +animation_player = SubResource("BBNode_icf24") +animation_name = &"walk" + +[sub_resource type="BTAction" id="BTAction_824oc"] +script = ExtResource("1_rvh1c") +range_min = 700.0 +range_max = 800.0 + +[sub_resource type="BTAction" id="BTAction_y1you"] +script = ExtResource("2_t62a0") + +[sub_resource type="BBNode" id="BBNode_ayt56"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_l1tdg"] +animation_player = SubResource("BBNode_ayt56") +animation_name = &"idle" + +[sub_resource type="BTWait" id="BTWait_hh8ys"] +duration = 3.0 + +[sub_resource type="BTSequence" id="BTSequence_cgwor"] +children = [SubResource("BTCondition_x0uu7"), SubResource("BTPlayAnimation_iiei3"), SubResource("BTAction_824oc"), SubResource("BTAction_y1you"), SubResource("BTPlayAnimation_l1tdg"), SubResource("BTWait_hh8ys")] + +[sub_resource type="BTCondition" id="BTCondition_d6aub"] +script = ExtResource("2_jfsyt") +distance_min = 200.0 +distance_max = 10000.0 + +[sub_resource type="BBNode" id="BBNode_6d0yy"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_wsspf"] +animation_player = SubResource("BBNode_6d0yy") +animation_name = &"walk" + +[sub_resource type="BTAction" id="BTAction_wc11r"] +script = ExtResource("2_nnswb") + +[sub_resource type="BBNode" id="BBNode_aw5jj"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_3aihc"] +animation_player = SubResource("BBNode_aw5jj") +animation_name = &"idle" + +[sub_resource type="BTWait" id="BTWait_1o163"] +duration = 3.0 + +[sub_resource type="BTSequence" id="BTSequence_vx4uy"] +children = [SubResource("BTCondition_d6aub"), SubResource("BTPlayAnimation_wsspf"), SubResource("BTAction_wc11r"), SubResource("BTPlayAnimation_3aihc"), SubResource("BTWait_1o163")] + +[sub_resource type="BTAction" id="BTAction_2murg"] +script = ExtResource("1_3ed74") +group = &"player" + +[sub_resource type="BTSelector" id="BTSelector_ddhoo"] +children = [SubResource("BTSequence_cgwor"), SubResource("BTSequence_vx4uy"), SubResource("BTAction_2murg")] + +[resource] +description = "The [comp]Selector[/comp] is another essential composite task. It executes its child tasks sequentially, from first to last, until one of them returns [SUCCESS] or all of them result in [FAILURE]. In other words, when a child task results in [FAILURE], it moves on to the next one until it finds the one that returns [SUCCESS]. Once a child task results in [SUCCESS], the Selector stops and also returns [SUCCESS]. + +To understand the [comp]Selector[/comp], it helps to see it as the opposite of the [comp]Sequence[/comp]. While the Sequence continues iterating over children as long as they return [SUCCESS], the Selector does the same but as long as they return [FAILURE]. The purpose of the Selector is to find a child that succeeds. It's often useful to place higher priority tasks at the top so that the Selector attempts them first. + +[comp]Selector[/comp] is frequently used with [comp]Sequence[/comp] and [con]Condition[/con] tasks to control the behavior tree's flow. A condition task would prevent a Sequence from proceeding if it evaluates to [FAILURE], and thus the Selector would try the next child. + +In our example, the [con]InRange[/con] condition checks how far Junior is from the target. When Junior is farther than 200 pixels from the target, he'll attempt to approach it. If he is closer than 200 pixels from the target, he would try to walk away. Thanks to the Selector, only one of these behaviors will be performed at a time, based on the result of the [con]InRange[/con] check. Junior seems to have a dilemma — unable to decide whether to stay or go." +blackboard_plan = SubResource("BlackboardPlan_ewfwq") +root_task = SubResource("BTSelector_ddhoo") diff --git a/demo/ai/trees/tutorial/tutorial_06_decorators.tres b/demo/ai/trees/tutorial/tutorial_06_decorators.tres new file mode 100644 index 0000000..b250f4a --- /dev/null +++ b/demo/ai/trees/tutorial/tutorial_06_decorators.tres @@ -0,0 +1,121 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://beiki511huxb8"] + +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_3xoj7"] +[ext_resource type="Script" uid="uid://b7v2utjmtge0x" path="res://demo/ai/tasks/in_range.gd" id="2_08b67"] +[ext_resource type="Script" uid="uid://dbo0kq2cwb4qv" path="res://demo/ai/tasks/face_target.gd" id="3_orhnl"] +[ext_resource type="Script" uid="uid://bicxffqmm7ek" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="4_oyght"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="5_5o1gy"] +[ext_resource type="Script" uid="uid://dcjgktglb1slf" path="res://demo/ai/tasks/pursue.gd" id="6_rpn40"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_ewfwq"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" + +[sub_resource type="BTAction" id="BTAction_2murg"] +script = ExtResource("1_3xoj7") +group = &"player" + +[sub_resource type="BTRunLimit" id="BTRunLimit_60b8b"] +children = [SubResource("BTAction_2murg")] + +[sub_resource type="BTCondition" id="BTCondition_m15aa"] +script = ExtResource("2_08b67") +distance_max = 200.0 + +[sub_resource type="BTAction" id="BTAction_oc76s"] +script = ExtResource("3_orhnl") + +[sub_resource type="BBNode" id="BBNode_6d0yy"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_wsspf"] +await_completion = 5.0 +animation_player = SubResource("BBNode_6d0yy") +animation_name = &"attack_1" + +[sub_resource type="BTSequence" id="BTSequence_e0f8v"] +children = [SubResource("BTCondition_m15aa"), SubResource("BTAction_oc76s"), SubResource("BTPlayAnimation_wsspf")] + +[sub_resource type="BTCooldown" id="BTCooldown_3tvjt"] +children = [SubResource("BTSequence_e0f8v")] +duration = 5.0 + +[sub_resource type="BTCondition" id="BTCondition_x0uu7"] +script = ExtResource("2_08b67") +distance_max = 200.0 + +[sub_resource type="BBNode" id="BBNode_icf24"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_iiei3"] +animation_player = SubResource("BBNode_icf24") +animation_name = &"walk" + +[sub_resource type="BTAction" id="BTAction_824oc"] +script = ExtResource("4_oyght") +range_min = 700.0 +range_max = 800.0 + +[sub_resource type="BTAction" id="BTAction_y1you"] +script = ExtResource("5_5o1gy") + +[sub_resource type="BBNode" id="BBNode_ayt56"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_l1tdg"] +animation_player = SubResource("BBNode_ayt56") +animation_name = &"idle" + +[sub_resource type="BTWait" id="BTWait_hh8ys"] +duration = 3.0 + +[sub_resource type="BTSequence" id="BTSequence_cgwor"] +children = [SubResource("BTCondition_x0uu7"), SubResource("BTPlayAnimation_iiei3"), SubResource("BTAction_824oc"), SubResource("BTAction_y1you"), SubResource("BTPlayAnimation_l1tdg"), SubResource("BTWait_hh8ys")] + +[sub_resource type="BTCondition" id="BTCondition_d6aub"] +script = ExtResource("2_08b67") +distance_min = 200.0 +distance_max = 10000.0 + +[sub_resource type="BBNode" id="BBNode_rpwld"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_dug2k"] +animation_player = SubResource("BBNode_rpwld") +animation_name = &"walk" + +[sub_resource type="BTAction" id="BTAction_wc11r"] +script = ExtResource("6_rpn40") + +[sub_resource type="BBNode" id="BBNode_aw5jj"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_3aihc"] +animation_player = SubResource("BBNode_aw5jj") +animation_name = &"idle" + +[sub_resource type="BTWait" id="BTWait_1o163"] +duration = 0.5 + +[sub_resource type="BTSequence" id="BTSequence_vx4uy"] +children = [SubResource("BTCondition_d6aub"), SubResource("BTPlayAnimation_dug2k"), SubResource("BTAction_wc11r"), SubResource("BTPlayAnimation_3aihc"), SubResource("BTWait_1o163")] + +[sub_resource type="BTSelector" id="BTSelector_ddhoo"] +children = [SubResource("BTRunLimit_60b8b"), SubResource("BTCooldown_3tvjt"), SubResource("BTSequence_cgwor"), SubResource("BTSequence_vx4uy")] + +[resource] +description = "Let's improve our previous behavior, and take the opportunity to discuss [dec]Decorators[/dec]. As mentioned earlier, decorators are control tasks that should only have a single child. Typically, a decorator either alters how its child operates or modifies its return status. They are often a useful tool for introducing variance into behaviors that otherwise lack it. + +In our example, we utilize the [dec]RunLimit[/dec] decorator to restrict its child from running more than once. After executing the first time, the child will never receive another tick. This is quite handy for all sorts of setup logic! + +Now, let's examine another decorator we use here - the [dec]Cooldown[/dec]. This decorator executes its child task only if the specified duration time has passed since the previous execution of the child task. The first time the attack sequence results in [SUCCESS], it triggers the cooldown, preventing the [comp]Sequence[/comp] from being executed for the next 5 seconds. During this period, the Cooldown returns [FAILURE] until the specified duration time elapses. It's important to note that it only counts executions that finished with [SUCCESS]. This means that [con]InRange[/con] can be utilized here without triggering the Cooldown!" +blackboard_plan = SubResource("BlackboardPlan_ewfwq") +root_task = SubResource("BTSelector_ddhoo") diff --git a/demo/ai/trees/tutorial/tutorial_07_more_decorators.tres b/demo/ai/trees/tutorial/tutorial_07_more_decorators.tres new file mode 100644 index 0000000..94d5dee --- /dev/null +++ b/demo/ai/trees/tutorial/tutorial_07_more_decorators.tres @@ -0,0 +1,131 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://tep50j4d6kgp"] + +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_f605f"] +[ext_resource type="Script" uid="uid://b7v2utjmtge0x" path="res://demo/ai/tasks/in_range.gd" id="2_mj1cj"] +[ext_resource type="Script" uid="uid://dbo0kq2cwb4qv" path="res://demo/ai/tasks/face_target.gd" id="3_86p0r"] +[ext_resource type="Script" uid="uid://bi5e8366xi5s5" path="res://demo/ai/tasks/back_away.gd" id="4_u0vk1"] +[ext_resource type="Script" uid="uid://dcjgktglb1slf" path="res://demo/ai/tasks/pursue.gd" id="6_1yikm"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_ewfwq"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" + +[sub_resource type="BTAction" id="BTAction_2murg"] +script = ExtResource("1_f605f") +group = &"player" + +[sub_resource type="BTRunLimit" id="BTRunLimit_60b8b"] +children = [SubResource("BTAction_2murg")] + +[sub_resource type="BTCondition" id="BTCondition_m15aa"] +script = ExtResource("2_mj1cj") +distance_max = 200.0 + +[sub_resource type="BTAction" id="BTAction_oc76s"] +script = ExtResource("3_86p0r") + +[sub_resource type="BBNode" id="BBNode_6d0yy"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_wsspf"] +await_completion = 5.0 +animation_player = SubResource("BBNode_6d0yy") +animation_name = &"attack_1" + +[sub_resource type="BBNode" id="BBNode_w45kn"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_d2lad"] +await_completion = 5.0 +animation_player = SubResource("BBNode_w45kn") +animation_name = &"attack_2" + +[sub_resource type="BTSequence" id="BTSequence_e0f8v"] +children = [SubResource("BTCondition_m15aa"), SubResource("BTAction_oc76s"), SubResource("BTPlayAnimation_wsspf"), SubResource("BTPlayAnimation_d2lad")] + +[sub_resource type="BTCooldown" id="BTCooldown_3tvjt"] +children = [SubResource("BTSequence_e0f8v")] +duration = 5.0 + +[sub_resource type="BTCondition" id="BTCondition_x0uu7"] +script = ExtResource("2_mj1cj") +distance_max = 200.0 + +[sub_resource type="BBNode" id="BBNode_wksgd"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_umlwj"] +animation_player = SubResource("BBNode_wksgd") +animation_name = &"walk" + +[sub_resource type="BTAction" id="BTAction_6q0k4"] +script = ExtResource("4_u0vk1") + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_6eii7"] +children = [SubResource("BTAction_6q0k4")] +time_limit = 2.0 + +[sub_resource type="BTAlwaysSucceed" id="BTAlwaysSucceed_ieord"] +children = [SubResource("BTTimeLimit_6eii7")] + +[sub_resource type="BBNode" id="BBNode_ayt56"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_l1tdg"] +animation_player = SubResource("BBNode_ayt56") +animation_name = &"idle" + +[sub_resource type="BTWait" id="BTWait_hh8ys"] +duration = 3.0 + +[sub_resource type="BTSequence" id="BTSequence_cgwor"] +children = [SubResource("BTCondition_x0uu7"), SubResource("BTPlayAnimation_umlwj"), SubResource("BTAlwaysSucceed_ieord"), SubResource("BTPlayAnimation_l1tdg"), SubResource("BTWait_hh8ys")] + +[sub_resource type="BTCondition" id="BTCondition_d6aub"] +script = ExtResource("2_mj1cj") +distance_min = 200.0 +distance_max = 10000.0 + +[sub_resource type="BBNode" id="BBNode_rpwld"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_dug2k"] +animation_player = SubResource("BBNode_rpwld") +animation_name = &"walk" + +[sub_resource type="BTAction" id="BTAction_wc11r"] +script = ExtResource("6_1yikm") + +[sub_resource type="BBNode" id="BBNode_aw5jj"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_3aihc"] +animation_player = SubResource("BBNode_aw5jj") +animation_name = &"idle" + +[sub_resource type="BTWait" id="BTWait_1o163"] +duration = 0.5 + +[sub_resource type="BTSequence" id="BTSequence_vx4uy"] +children = [SubResource("BTCondition_d6aub"), SubResource("BTPlayAnimation_dug2k"), SubResource("BTAction_wc11r"), SubResource("BTPlayAnimation_3aihc"), SubResource("BTWait_1o163")] + +[sub_resource type="BTSelector" id="BTSelector_ddhoo"] +children = [SubResource("BTRunLimit_60b8b"), SubResource("BTCooldown_3tvjt"), SubResource("BTSequence_cgwor"), SubResource("BTSequence_vx4uy")] + +[resource] +description = "Let's explore some other [dec]Decorators[/dec]. Here's a slightly improved version of the previous behavior. We incorporate the [dec]TimeLimit[/dec] decorator with the [act]Back Away[/act] action to achieve a similar effect as before (walking away from the target). The TimeLimit decorator ensures that the child task does not take too long to finish its work. If the time runs out, the task's execution will be aborted, and TimeLimit will return [FAILURE]. + +Another useful decorator is [dec]AlwaysSucceed[/dec], which converts any [FAILURE] returned by its child into [SUCCESS]. We use this decorator here because TimeLimit may result in [FAILURE], but we still want the [comp]Sequence[/comp] to continue. Also, there are similar decorators such as [dec]AlwaysFail[/dec] and [dec]Invert[/dec], which you can use in your behavior trees as needed. + +We also add a second attack, so that Junior feels more badass now. We've got a little hit-and-run behavior going on here!" +blackboard_plan = SubResource("BlackboardPlan_ewfwq") +root_task = SubResource("BTSelector_ddhoo") diff --git a/demo/ai/trees/tutorial/tutorial_08_final_touch.tres b/demo/ai/trees/tutorial/tutorial_08_final_touch.tres new file mode 100644 index 0000000..d66f079 --- /dev/null +++ b/demo/ai/trees/tutorial/tutorial_08_final_touch.tres @@ -0,0 +1,184 @@ +[gd_resource type="BehaviorTree" format=3 uid="uid://dp0cglcytwcj5"] + +[ext_resource type="Script" uid="uid://ccr43pgd4488l" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_o5ahw"] +[ext_resource type="Script" uid="uid://ct71h72pech3b" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_er25a"] +[ext_resource type="Script" uid="uid://df82exuqnfdb2" path="res://demo/ai/tasks/arrive_pos.gd" id="3_ed1xo"] +[ext_resource type="Script" uid="uid://dbo0kq2cwb4qv" path="res://demo/ai/tasks/face_target.gd" id="4_128ei"] +[ext_resource type="Script" uid="uid://b7v2utjmtge0x" path="res://demo/ai/tasks/in_range.gd" id="5_er18b"] +[ext_resource type="Script" uid="uid://bi5e8366xi5s5" path="res://demo/ai/tasks/back_away.gd" id="6_1urfq"] +[ext_resource type="Script" uid="uid://dcjgktglb1slf" path="res://demo/ai/tasks/pursue.gd" id="7_ekws5"] + +[sub_resource type="BlackboardPlan" id="BlackboardPlan_ewfwq"] +var/speed/name = &"speed" +var/speed/type = 3 +var/speed/value = 400.0 +var/speed/hint = 1 +var/speed/hint_string = "10,1000,10" + +[sub_resource type="BTAction" id="BTAction_2murg"] +script = ExtResource("1_o5ahw") +group = &"player" + +[sub_resource type="BTRunLimit" id="BTRunLimit_60b8b"] +children = [SubResource("BTAction_2murg")] + +[sub_resource type="BTCondition" id="BTCondition_m15aa"] +script = ExtResource("5_er18b") +distance_max = 200.0 + +[sub_resource type="BTAction" id="BTAction_oc76s"] +script = ExtResource("4_128ei") + +[sub_resource type="BBNode" id="BBNode_6d0yy"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_wsspf"] +await_completion = 5.0 +animation_player = SubResource("BBNode_6d0yy") +animation_name = &"attack_1" + +[sub_resource type="BBNode" id="BBNode_w45kn"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_d2lad"] +await_completion = 5.0 +animation_player = SubResource("BBNode_w45kn") +animation_name = &"attack_2" + +[sub_resource type="BTSequence" id="BTSequence_e0f8v"] +children = [SubResource("BTCondition_m15aa"), SubResource("BTAction_oc76s"), SubResource("BTPlayAnimation_wsspf"), SubResource("BTPlayAnimation_d2lad")] + +[sub_resource type="BTCooldown" id="BTCooldown_3tvjt"] +children = [SubResource("BTSequence_e0f8v")] +duration = 5.0 + +[sub_resource type="BTCondition" id="BTCondition_x0uu7"] +script = ExtResource("5_er18b") +distance_max = 200.0 + +[sub_resource type="BBNode" id="BBNode_wksgd"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_umlwj"] +animation_player = SubResource("BBNode_wksgd") +animation_name = &"walk" + +[sub_resource type="BTAction" id="BTAction_6q0k4"] +script = ExtResource("6_1urfq") + +[sub_resource type="BTTimeLimit" id="BTTimeLimit_6eii7"] +children = [SubResource("BTAction_6q0k4")] +time_limit = 2.0 + +[sub_resource type="BTAlwaysSucceed" id="BTAlwaysSucceed_ieord"] +children = [SubResource("BTTimeLimit_6eii7")] + +[sub_resource type="BBNode" id="BBNode_ayt56"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_l1tdg"] +animation_player = SubResource("BBNode_ayt56") +animation_name = &"idle" + +[sub_resource type="BTWait" id="BTWait_hh8ys"] +duration = 3.0 + +[sub_resource type="BTSequence" id="BTSequence_cgwor"] +children = [SubResource("BTCondition_x0uu7"), SubResource("BTPlayAnimation_umlwj"), SubResource("BTAlwaysSucceed_ieord"), SubResource("BTPlayAnimation_l1tdg"), SubResource("BTWait_hh8ys")] + +[sub_resource type="BTAction" id="BTAction_n0rxm"] +script = ExtResource("2_er25a") +range_min = 400 +range_max = 500 + +[sub_resource type="BBNode" id="BBNode_icf24"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_iiei3"] +animation_player = SubResource("BBNode_icf24") +animation_name = &"walk" + +[sub_resource type="BTAction" id="BTAction_g2up4"] +script = ExtResource("3_ed1xo") + +[sub_resource type="BTAction" id="BTAction_d5lkr"] +script = ExtResource("4_128ei") + +[sub_resource type="BBNode" id="BBNode_h4k80"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_40yja"] +animation_player = SubResource("BBNode_h4k80") +animation_name = &"throw_prepare" + +[sub_resource type="BTWait" id="BTWait_2dc1v"] + +[sub_resource type="BBNode" id="BBNode_slipn"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_qnpjq"] +await_completion = 5.0 +animation_player = SubResource("BBNode_slipn") +animation_name = &"throw" + +[sub_resource type="BBNode" id="BBNode_qaqnn"] +resource_name = "." +saved_value = NodePath(".") + +[sub_resource type="BTCallMethod" id="BTCallMethod_yd0fn"] +node = SubResource("BBNode_qaqnn") +method = &"throw_ninja_star" + +[sub_resource type="BTSequence" id="BTSequence_ws7nq"] +children = [SubResource("BTAction_n0rxm"), SubResource("BTPlayAnimation_iiei3"), SubResource("BTAction_g2up4"), SubResource("BTAction_d5lkr"), SubResource("BTPlayAnimation_40yja"), SubResource("BTWait_2dc1v"), SubResource("BTPlayAnimation_qnpjq"), SubResource("BTCallMethod_yd0fn")] + +[sub_resource type="BTProbability" id="BTProbability_omklt"] +children = [SubResource("BTSequence_ws7nq")] +run_chance = 0.25 + +[sub_resource type="BTCondition" id="BTCondition_d6aub"] +script = ExtResource("5_er18b") +distance_min = 200.0 +distance_max = 10000.0 + +[sub_resource type="BBNode" id="BBNode_rpwld"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_dug2k"] +animation_player = SubResource("BBNode_rpwld") +animation_name = &"walk" + +[sub_resource type="BTAction" id="BTAction_wc11r"] +script = ExtResource("7_ekws5") + +[sub_resource type="BBNode" id="BBNode_aw5jj"] +resource_name = "AnimationPlayer" +saved_value = NodePath("AnimationPlayer") + +[sub_resource type="BTPlayAnimation" id="BTPlayAnimation_3aihc"] +animation_player = SubResource("BBNode_aw5jj") +animation_name = &"idle" + +[sub_resource type="BTWait" id="BTWait_1o163"] +duration = 0.5 + +[sub_resource type="BTSequence" id="BTSequence_vx4uy"] +children = [SubResource("BTCondition_d6aub"), SubResource("BTPlayAnimation_dug2k"), SubResource("BTAction_wc11r"), SubResource("BTPlayAnimation_3aihc"), SubResource("BTWait_1o163")] + +[sub_resource type="BTSelector" id="BTSelector_ddhoo"] +children = [SubResource("BTRunLimit_60b8b"), SubResource("BTCooldown_3tvjt"), SubResource("BTSequence_cgwor"), SubResource("BTProbability_omklt"), SubResource("BTSequence_vx4uy")] + +[resource] +description = "And for the final touch, we've added throwing ninja stars to our previous behavior. The [dec]Probability[/dec] decorator adds a little variance so that we don't throw ninja stars all the time. This decorator executes its child task with a certain probability, so when it's not 100%, sometimes it will return [FAILURE] instead. Some of the work in this [comp]Sequence[/comp] is done by actions you've seen already, and the [act]CallMethod[/act] action invokes the [color=cyan]throw_ninja_star[/color] method on the agent node. By the way, the agent is always the owner of the BTPlayer node, which executes this behavior tree. + +This concludes our tutorial. Hopefully, this little endeavor has been useful to you. You can learn more by reading the [b]Online Documentation[/b], which covers topics like creating your own tasks. Also, check out the [b]Showcase[/b], which presents behaviors of agents made for this little demo. Simply click \"End Tutorial\" to return to the [b]Showcase[/b]." +blackboard_plan = SubResource("BlackboardPlan_ewfwq") +root_task = SubResource("BTSelector_ddhoo") diff --git a/demo/assets/agent_bobby.png b/demo/assets/agent_bobby.png new file mode 100644 index 0000000..14de872 Binary files /dev/null and b/demo/assets/agent_bobby.png differ diff --git a/demo/assets/agent_bobby.png.import b/demo/assets/agent_bobby.png.import new file mode 100644 index 0000000..0d5bb2e --- /dev/null +++ b/demo/assets/agent_bobby.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dlo1ine6p5di4" +path="res://.godot/imported/agent_bobby.png-8c7c0553d4eefdb06245554fd2603238.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/agent_bobby.png" +dest_files=["res://.godot/imported/agent_bobby.png-8c7c0553d4eefdb06245554fd2603238.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/agent_charger.png b/demo/assets/agent_charger.png new file mode 100644 index 0000000..3b6ea44 Binary files /dev/null and b/demo/assets/agent_charger.png differ diff --git a/demo/assets/agent_charger.png.import b/demo/assets/agent_charger.png.import new file mode 100644 index 0000000..30af55c --- /dev/null +++ b/demo/assets/agent_charger.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ce16nc0wy2s8" +path="res://.godot/imported/agent_charger.png-4fbef6fc86342f0b358c84f3e6790641.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/agent_charger.png" +dest_files=["res://.godot/imported/agent_charger.png-4fbef6fc86342f0b358c84f3e6790641.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/agent_combo.png b/demo/assets/agent_combo.png new file mode 100644 index 0000000..ca9d815 Binary files /dev/null and b/demo/assets/agent_combo.png differ diff --git a/demo/assets/agent_combo.png.import b/demo/assets/agent_combo.png.import new file mode 100644 index 0000000..c5c16f2 --- /dev/null +++ b/demo/assets/agent_combo.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bo0ibp7tvjbba" +path="res://.godot/imported/agent_combo.png-1aabf55a6f7673e34d40eadba34cb086.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/agent_combo.png" +dest_files=["res://.godot/imported/agent_combo.png-1aabf55a6f7673e34d40eadba34cb086.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/agent_demon.png b/demo/assets/agent_demon.png new file mode 100644 index 0000000..a92603e Binary files /dev/null and b/demo/assets/agent_demon.png differ diff --git a/demo/assets/agent_demon.png.import b/demo/assets/agent_demon.png.import new file mode 100644 index 0000000..d518614 --- /dev/null +++ b/demo/assets/agent_demon.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1tx7u8ho0r4v" +path="res://.godot/imported/agent_demon.png-8a62722d1d31985ee3a39cfef745c53a.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/agent_demon.png" +dest_files=["res://.godot/imported/agent_demon.png-8a62722d1d31985ee3a39cfef745c53a.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/agent_imp.png b/demo/assets/agent_imp.png new file mode 100644 index 0000000..cadf474 Binary files /dev/null and b/demo/assets/agent_imp.png differ diff --git a/demo/assets/agent_imp.png.import b/demo/assets/agent_imp.png.import new file mode 100644 index 0000000..6ee640b --- /dev/null +++ b/demo/assets/agent_imp.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://h70okn6hmxum" +path="res://.godot/imported/agent_imp.png-9fb23c43583296c91b2a8a01f05daad9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/agent_imp.png" +dest_files=["res://.godot/imported/agent_imp.png-9fb23c43583296c91b2a8a01f05daad9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/agent_junior_pieces.png b/demo/assets/agent_junior_pieces.png new file mode 100644 index 0000000..e8cf873 Binary files /dev/null and b/demo/assets/agent_junior_pieces.png differ diff --git a/demo/assets/agent_junior_pieces.png.import b/demo/assets/agent_junior_pieces.png.import new file mode 100644 index 0000000..373c547 --- /dev/null +++ b/demo/assets/agent_junior_pieces.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0oeqsc0xksto" +path="res://.godot/imported/agent_junior_pieces.png-95690b27968ceea039daac5098fd3722.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/agent_junior_pieces.png" +dest_files=["res://.godot/imported/agent_junior_pieces.png-95690b27968ceea039daac5098fd3722.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/agent_melee_nuanced.png b/demo/assets/agent_melee_nuanced.png new file mode 100644 index 0000000..3a7585b Binary files /dev/null and b/demo/assets/agent_melee_nuanced.png differ diff --git a/demo/assets/agent_melee_nuanced.png.import b/demo/assets/agent_melee_nuanced.png.import new file mode 100644 index 0000000..4b06c76 --- /dev/null +++ b/demo/assets/agent_melee_nuanced.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://usu3j55d6dgc" +path="res://.godot/imported/agent_melee_nuanced.png-653a64ea55e3175afadb5b209be8b1d0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/agent_melee_nuanced.png" +dest_files=["res://.godot/imported/agent_melee_nuanced.png-653a64ea55e3175afadb5b209be8b1d0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/agent_melee_simple.png b/demo/assets/agent_melee_simple.png new file mode 100644 index 0000000..502d196 Binary files /dev/null and b/demo/assets/agent_melee_simple.png differ diff --git a/demo/assets/agent_melee_simple.png.import b/demo/assets/agent_melee_simple.png.import new file mode 100644 index 0000000..391ebd2 --- /dev/null +++ b/demo/assets/agent_melee_simple.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cw8s50856x8ct" +path="res://.godot/imported/agent_melee_simple.png-78a6d279aa99849a5b7788dd5762650f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/agent_melee_simple.png" +dest_files=["res://.godot/imported/agent_melee_simple.png-78a6d279aa99849a5b7788dd5762650f.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/agent_ranged.png b/demo/assets/agent_ranged.png new file mode 100644 index 0000000..3debe06 Binary files /dev/null and b/demo/assets/agent_ranged.png differ diff --git a/demo/assets/agent_ranged.png.import b/demo/assets/agent_ranged.png.import new file mode 100644 index 0000000..13199a3 --- /dev/null +++ b/demo/assets/agent_ranged.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cjts4ennjtepg" +path="res://.godot/imported/agent_ranged.png-a7be7db55c56f7b1c12ada6338a036cf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/agent_ranged.png" +dest_files=["res://.godot/imported/agent_ranged.png-a7be7db55c56f7b1c12ada6338a036cf.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/agent_skirmisher.png b/demo/assets/agent_skirmisher.png new file mode 100644 index 0000000..7552e96 Binary files /dev/null and b/demo/assets/agent_skirmisher.png differ diff --git a/demo/assets/agent_skirmisher.png.import b/demo/assets/agent_skirmisher.png.import new file mode 100644 index 0000000..b3f825e --- /dev/null +++ b/demo/assets/agent_skirmisher.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://l042ovqqsy3l" +path="res://.godot/imported/agent_skirmisher.png-fb22c42e0c82e689e3a451b83b1f6ff9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/agent_skirmisher.png" +dest_files=["res://.godot/imported/agent_skirmisher.png-fb22c42e0c82e689e3a451b83b1f6ff9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/agent_summoner.png b/demo/assets/agent_summoner.png new file mode 100644 index 0000000..0147818 Binary files /dev/null and b/demo/assets/agent_summoner.png differ diff --git a/demo/assets/agent_summoner.png.import b/demo/assets/agent_summoner.png.import new file mode 100644 index 0000000..0391835 --- /dev/null +++ b/demo/assets/agent_summoner.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ombnpn2edldt" +path="res://.godot/imported/agent_summoner.png-3beb6fd299df05d9586c6b74edd2bbc6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/agent_summoner.png" +dest_files=["res://.godot/imported/agent_summoner.png-3beb6fd299df05d9586c6b74edd2bbc6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/arrow_left.png b/demo/assets/arrow_left.png new file mode 100644 index 0000000..c6af99e Binary files /dev/null and b/demo/assets/arrow_left.png differ diff --git a/demo/assets/arrow_left.png.import b/demo/assets/arrow_left.png.import new file mode 100644 index 0000000..320e0de --- /dev/null +++ b/demo/assets/arrow_left.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dc1wu244fnetf" +path="res://.godot/imported/arrow_left.png-a7d3530ca98c17c281c9ef74dcdcb927.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/arrow_left.png" +dest_files=["res://.godot/imported/arrow_left.png-a7d3530ca98c17c281c9ef74dcdcb927.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/arrow_right.png b/demo/assets/arrow_right.png new file mode 100644 index 0000000..70ec85b Binary files /dev/null and b/demo/assets/arrow_right.png differ diff --git a/demo/assets/arrow_right.png.import b/demo/assets/arrow_right.png.import new file mode 100644 index 0000000..52088aa --- /dev/null +++ b/demo/assets/arrow_right.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjakugmqbbtw7" +path="res://.godot/imported/arrow_right.png-21f7ddc963756a50bd3974181b5e0d02.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/arrow_right.png" +dest_files=["res://.godot/imported/arrow_right.png-21f7ddc963756a50bd3974181b5e0d02.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/dummy.png b/demo/assets/dummy.png new file mode 100644 index 0000000..531fd19 Binary files /dev/null and b/demo/assets/dummy.png differ diff --git a/demo/assets/dummy.png.import b/demo/assets/dummy.png.import new file mode 100644 index 0000000..04c4e7a --- /dev/null +++ b/demo/assets/dummy.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cltutcxjx8jnl" +path="res://.godot/imported/dummy.png-30069efb95d1cabfca0861ca5010c667.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/dummy.png" +dest_files=["res://.godot/imported/dummy.png-30069efb95d1cabfca0861ca5010c667.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/env_clouds.png b/demo/assets/env_clouds.png new file mode 100644 index 0000000..ab61eff Binary files /dev/null and b/demo/assets/env_clouds.png differ diff --git a/demo/assets/env_clouds.png.import b/demo/assets/env_clouds.png.import new file mode 100644 index 0000000..b9f60a0 --- /dev/null +++ b/demo/assets/env_clouds.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://65b6yuobhxf8" +path="res://.godot/imported/env_clouds.png-28d790def9247e51c19b24eae86c1a64.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/env_clouds.png" +dest_files=["res://.godot/imported/env_clouds.png-28d790def9247e51c19b24eae86c1a64.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/env_gong.png b/demo/assets/env_gong.png new file mode 100644 index 0000000..4fd80e2 Binary files /dev/null and b/demo/assets/env_gong.png differ diff --git a/demo/assets/env_gong.png.import b/demo/assets/env_gong.png.import new file mode 100644 index 0000000..e627591 --- /dev/null +++ b/demo/assets/env_gong.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://i476iia1ua8q" +path="res://.godot/imported/env_gong.png-22c1657db8aed530e7d811b2b20b4a2d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/env_gong.png" +dest_files=["res://.godot/imported/env_gong.png-22c1657db8aed530e7d811b2b20b4a2d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/env_ground.png b/demo/assets/env_ground.png new file mode 100644 index 0000000..cfb2749 Binary files /dev/null and b/demo/assets/env_ground.png differ diff --git a/demo/assets/env_ground.png.import b/demo/assets/env_ground.png.import new file mode 100644 index 0000000..bde6778 --- /dev/null +++ b/demo/assets/env_ground.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cc7b22sy46gwn" +path="res://.godot/imported/env_ground.png-b29c6c47be0779294403cf6615d9dae2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/env_ground.png" +dest_files=["res://.godot/imported/env_ground.png-b29c6c47be0779294403cf6615d9dae2.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/env_plants.png b/demo/assets/env_plants.png new file mode 100644 index 0000000..3008cf4 Binary files /dev/null and b/demo/assets/env_plants.png differ diff --git a/demo/assets/env_plants.png.import b/demo/assets/env_plants.png.import new file mode 100644 index 0000000..3777cf7 --- /dev/null +++ b/demo/assets/env_plants.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://4kw2ks8doc0w" +path="res://.godot/imported/env_plants.png-40a908ca223303e0aacba2fca71781c6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/env_plants.png" +dest_files=["res://.godot/imported/env_plants.png-40a908ca223303e0aacba2fca71781c6.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/env_rocks.png b/demo/assets/env_rocks.png new file mode 100644 index 0000000..55c7830 Binary files /dev/null and b/demo/assets/env_rocks.png differ diff --git a/demo/assets/env_rocks.png.import b/demo/assets/env_rocks.png.import new file mode 100644 index 0000000..1130417 --- /dev/null +++ b/demo/assets/env_rocks.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3g14elmg0m36" +path="res://.godot/imported/env_rocks.png-12fea7b4727d1ddca76c06fd66910dd0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/env_rocks.png" +dest_files=["res://.godot/imported/env_rocks.png-12fea7b4727d1ddca76c06fd66910dd0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/fireball.png b/demo/assets/fireball.png new file mode 100644 index 0000000..6d2ddf6 Binary files /dev/null and b/demo/assets/fireball.png differ diff --git a/demo/assets/fireball.png.import b/demo/assets/fireball.png.import new file mode 100644 index 0000000..a62f328 --- /dev/null +++ b/demo/assets/fireball.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://235liwnxn1n5" +path="res://.godot/imported/fireball.png-22a46715cd71373bf765d22c23e664a9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/fireball.png" +dest_files=["res://.godot/imported/fireball.png-22a46715cd71373bf765d22c23e664a9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/fonts/junction_bold.otf b/demo/assets/fonts/junction_bold.otf new file mode 100644 index 0000000..45a6697 Binary files /dev/null and b/demo/assets/fonts/junction_bold.otf differ diff --git a/demo/assets/fonts/junction_bold.otf.import b/demo/assets/fonts/junction_bold.otf.import new file mode 100644 index 0000000..b6c4ddd --- /dev/null +++ b/demo/assets/fonts/junction_bold.otf.import @@ -0,0 +1,36 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://n231m6uqsq6x" +path="res://.godot/imported/junction_bold.otf-4db2200a8b1a6423bafe2a4e7c7abbde.fontdata" + +[deps] + +source_file="res://demo/assets/fonts/junction_bold.otf" +dest_files=["res://.godot/imported/junction_bold.otf-4db2200a8b1a6423bafe2a4e7c7abbde.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +disable_embedded_bitmaps=true +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +modulate_color_glyphs=false +hinting=1 +subpixel_positioning=1 +keep_rounding_remainders=true +oversampling=0.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[] +language_support={} +script_support={} +opentype_features={} diff --git a/demo/assets/fonts/knewave_regular.ttf b/demo/assets/fonts/knewave_regular.ttf new file mode 100644 index 0000000..a98f750 Binary files /dev/null and b/demo/assets/fonts/knewave_regular.ttf differ diff --git a/demo/assets/fonts/knewave_regular.ttf.import b/demo/assets/fonts/knewave_regular.ttf.import new file mode 100644 index 0000000..71cd660 --- /dev/null +++ b/demo/assets/fonts/knewave_regular.ttf.import @@ -0,0 +1,36 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://d25vkmce7mhlt" +path="res://.godot/imported/knewave_regular.ttf-955953b059f713782c7b07e66ab341ec.fontdata" + +[deps] + +source_file="res://demo/assets/fonts/knewave_regular.ttf" +dest_files=["res://.godot/imported/knewave_regular.ttf-955953b059f713782c7b07e66ab341ec.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +disable_embedded_bitmaps=true +multichannel_signed_distance_field=false +msdf_pixel_range=8 +msdf_size=48 +allow_system_fallback=true +force_autohinter=false +modulate_color_glyphs=false +hinting=1 +subpixel_positioning=1 +keep_rounding_remainders=true +oversampling=0.0 +Fallbacks=null +fallbacks=[] +Compress=null +compress=true +preload=[] +language_support={} +script_support={} +opentype_features={} diff --git a/demo/assets/fx.png b/demo/assets/fx.png new file mode 100644 index 0000000..1bd586d Binary files /dev/null and b/demo/assets/fx.png differ diff --git a/demo/assets/fx.png.import b/demo/assets/fx.png.import new file mode 100644 index 0000000..b772704 --- /dev/null +++ b/demo/assets/fx.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dj4oayt5ttvh8" +path="res://.godot/imported/fx.png-6477c60e66067f48f360430ec23ddc02.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/fx.png" +dest_files=["res://.godot/imported/fx.png-6477c60e66067f48f360430ec23ddc02.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/hp_bar.png b/demo/assets/hp_bar.png new file mode 100644 index 0000000..1bc265b Binary files /dev/null and b/demo/assets/hp_bar.png differ diff --git a/demo/assets/hp_bar.png.import b/demo/assets/hp_bar.png.import new file mode 100644 index 0000000..c075ed1 --- /dev/null +++ b/demo/assets/hp_bar.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://hnwi23oef752" +path="res://.godot/imported/hp_bar.png-c23edb5054c777f587fbf3d4206298bd.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/hp_bar.png" +dest_files=["res://.godot/imported/hp_bar.png-c23edb5054c777f587fbf3d4206298bd.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/hp_over.png b/demo/assets/hp_over.png new file mode 100644 index 0000000..b04a763 Binary files /dev/null and b/demo/assets/hp_over.png differ diff --git a/demo/assets/hp_over.png.import b/demo/assets/hp_over.png.import new file mode 100644 index 0000000..15eee25 --- /dev/null +++ b/demo/assets/hp_over.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cls8jtnu413o8" +path="res://.godot/imported/hp_over.png-417c2786f2f485db8c5f858f3f94e7e9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/hp_over.png" +dest_files=["res://.godot/imported/hp_over.png-417c2786f2f485db8c5f858f3f94e7e9.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/hp_under.png b/demo/assets/hp_under.png new file mode 100644 index 0000000..79d4747 Binary files /dev/null and b/demo/assets/hp_under.png differ diff --git a/demo/assets/hp_under.png.import b/demo/assets/hp_under.png.import new file mode 100644 index 0000000..e1550c4 --- /dev/null +++ b/demo/assets/hp_under.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dlw15foygohrk" +path="res://.godot/imported/hp_under.png-c993a547f4fdb0f3b9d06eb23ae4e804.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/hp_under.png" +dest_files=["res://.godot/imported/hp_under.png-c993a547f4fdb0f3b9d06eb23ae4e804.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/icon.svg b/demo/assets/icon.svg new file mode 100644 index 0000000..b53af7e --- /dev/null +++ b/demo/assets/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/demo/assets/icon.svg.import b/demo/assets/icon.svg.import new file mode 100644 index 0000000..ff970a5 --- /dev/null +++ b/demo/assets/icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://do6oi8vmfneur" +path="res://.godot/imported/icon.svg-e526cd5ce5fe587ad30e60477eb51fdf.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/icon.svg" +dest_files=["res://.godot/imported/icon.svg-e526cd5ce5fe587ad30e60477eb51fdf.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/demo/assets/logo.png b/demo/assets/logo.png new file mode 100644 index 0000000..0533077 Binary files /dev/null and b/demo/assets/logo.png differ diff --git a/demo/assets/logo.png.import b/demo/assets/logo.png.import new file mode 100644 index 0000000..8f92f8f --- /dev/null +++ b/demo/assets/logo.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://tyu0ua1ju38l" +path="res://.godot/imported/logo.png-627f053fd17248d48d9d002bdb02afc3.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/logo.png" +dest_files=["res://.godot/imported/logo.png-627f053fd17248d48d9d002bdb02afc3.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/shadow.png b/demo/assets/shadow.png new file mode 100644 index 0000000..683dc83 Binary files /dev/null and b/demo/assets/shadow.png differ diff --git a/demo/assets/shadow.png.import b/demo/assets/shadow.png.import new file mode 100644 index 0000000..338f87d --- /dev/null +++ b/demo/assets/shadow.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwhhxj5557qrb" +path="res://.godot/imported/shadow.png-f4b948130f51dfdf8369bd133baa3734.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/shadow.png" +dest_files=["res://.godot/imported/shadow.png-f4b948130f51dfdf8369bd133baa3734.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/smoke.png b/demo/assets/smoke.png new file mode 100644 index 0000000..725246d Binary files /dev/null and b/demo/assets/smoke.png differ diff --git a/demo/assets/smoke.png.import b/demo/assets/smoke.png.import new file mode 100644 index 0000000..ee5b264 --- /dev/null +++ b/demo/assets/smoke.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bdusy0qqtw0th" +path="res://.godot/imported/smoke.png-d041a59b8025f6af550257daa38b3580.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/smoke.png" +dest_files=["res://.godot/imported/smoke.png-d041a59b8025f6af550257daa38b3580.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/assets/ui.theme b/demo/assets/ui.theme new file mode 100644 index 0000000..e010fad Binary files /dev/null and b/demo/assets/ui.theme differ diff --git a/demo/assets/weapon_ninja_star.png b/demo/assets/weapon_ninja_star.png new file mode 100644 index 0000000..4b8e539 Binary files /dev/null and b/demo/assets/weapon_ninja_star.png differ diff --git a/demo/assets/weapon_ninja_star.png.import b/demo/assets/weapon_ninja_star.png.import new file mode 100644 index 0000000..e042d34 --- /dev/null +++ b/demo/assets/weapon_ninja_star.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://2uyxh7sy8qny" +path="res://.godot/imported/weapon_ninja_star.png-be058a7d9eff80095d1c513b22f898e0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://demo/assets/weapon_ninja_star.png" +dest_files=["res://.godot/imported/weapon_ninja_star.png-be058a7d9eff80095d1c513b22f898e0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +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/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +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=1 diff --git a/demo/props/dummy.gd b/demo/props/dummy.gd new file mode 100644 index 0000000..06fc9f3 --- /dev/null +++ b/demo/props/dummy.gd @@ -0,0 +1,15 @@ +extends CharacterBody2D + +@onready var animation_player: AnimationPlayer = $AnimationPlayer +@onready var hurtbox: Hurtbox = $Hurtbox +@onready var root: Node2D = $Root + + +func _on_health_damaged(_amount: float, _knockback: Vector2) -> void: + root.scale.x = -signf(hurtbox.last_attack_vector.x) + animation_player.clear_queue() + animation_player.play(&"hurt", 0.1) + + +func get_facing() -> float: + return signf(root.scale.x) diff --git a/demo/props/dummy.gd.uid b/demo/props/dummy.gd.uid new file mode 100644 index 0000000..8721937 --- /dev/null +++ b/demo/props/dummy.gd.uid @@ -0,0 +1 @@ +uid://mapy7metn1kt diff --git a/demo/props/dummy.tscn b/demo/props/dummy.tscn new file mode 100644 index 0000000..e33f7fd --- /dev/null +++ b/demo/props/dummy.tscn @@ -0,0 +1,403 @@ +[gd_scene format=3 uid="uid://c5fhe3tulhlco"] + +[ext_resource type="Script" uid="uid://mapy7metn1kt" path="res://demo/props/dummy.gd" id="1_kqftw"] +[ext_resource type="Texture2D" uid="uid://cltutcxjx8jnl" path="res://demo/assets/dummy.png" id="1_vdhcl"] +[ext_resource type="Texture2D" uid="uid://dwhhxj5557qrb" path="res://demo/assets/shadow.png" id="2_535g7"] +[ext_resource type="Script" uid="uid://dq5h6yydckjc1" path="res://demo/agents/scripts/hurtbox.gd" id="4_pkfnd"] +[ext_resource type="Script" uid="uid://5byn62y1oa76" path="res://demo/agents/scripts/health.gd" id="5_8qcls"] + +[sub_resource type="Animation" id="Animation_1o3gy"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/Stick:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -1)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/Stick:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/Stick:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Stick/Body:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -49)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Stick/Body:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Stick/Body:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} + +[sub_resource type="Animation" id="Animation_3r20x"] +resource_name = "hurt" +length = 0.25 +step = 0.05 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/Stick:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(0, -1), Vector2(0, -1)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/Stick:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [0.0, -0.273996] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/Stick:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 0.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Stick/Body:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(0, -49), Vector2(0, -49), Vector2(0, -49), Vector2(0, -49)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Stick/Body:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [0.0, -0.524778, -0.267304, -0.377565] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Stick/Body:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.1, 0.15, 0.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.9, 1.1), Vector2(0.9, 1.1), Vector2(0.9, 1.1)] +} + +[sub_resource type="Animation" id="Animation_sf5ej"] +resource_name = "idle" +length = 1.2 +loop_mode = 1 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Rig:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Rig:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Rig:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Root/Rig/Stick:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, -1)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Root/Rig/Stick:rotation") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Root/Rig/Stick:scale") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Root/Rig/Stick/Body:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6, 0.9, 1.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(0, -49), Vector2(0, -49), Vector2(0, -49), Vector2(0, -49), Vector2(0, -49)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Root/Rig/Stick/Body:rotation") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6, 0.9, 1.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [-0.0523599, 0.0, 0.0523599, 0.0, -0.0523599] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Root/Rig/Stick/Body:scale") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 0.3, 0.6, 0.9, 1.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(0.95, 1.05), Vector2(1.05, 0.95), Vector2(0.95, 1.05), Vector2(1.05, 0.95), Vector2(0.95, 1.05)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_blnjx"] +_data = { +&"RESET": SubResource("Animation_1o3gy"), +&"hurt": SubResource("Animation_3r20x"), +&"idle": SubResource("Animation_sf5ej") +} + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_pknym"] +size = Vector2(80, 35) + +[node name="Dummy" type="CharacterBody2D" unique_id=1624821985 groups=["player"]] +script = ExtResource("1_kqftw") + +[node name="Root" type="Node2D" parent="." unique_id=96637686] +metadata/_edit_lock_ = true + +[node name="Rig" type="Node2D" parent="Root" unique_id=1280195022] + +[node name="Shadow" type="Sprite2D" parent="Root/Rig" unique_id=1313418452] +modulate = Color(1, 1, 1, 0.290196) +texture = ExtResource("2_535g7") + +[node name="Stick" type="Sprite2D" parent="Root/Rig" unique_id=1439552851] +position = Vector2(0, -1) +texture = ExtResource("1_vdhcl") +offset = Vector2(-1, -28) +region_enabled = true +region_rect = Rect2(100.613, 0, 22.3875, 64.0292) + +[node name="Body" type="Sprite2D" parent="Root/Rig/Stick" unique_id=809406421] +position = Vector2(0, -49) +texture = ExtResource("1_vdhcl") +offset = Vector2(-1, -56) +region_enabled = true +region_rect = Rect2(0, 0, 99.6683, 136) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=841280958] +libraries/ = SubResource("AnimationLibrary_blnjx") +autoplay = &"idle" +next/hurt = &"idle" +blend_times = [&"hurt", &"idle", 0.3, &"idle", &"hurt", 0.05] + +[node name="Hurtbox" type="Area2D" parent="." unique_id=242929745 node_paths=PackedStringArray("health")] +collision_layer = 4 +collision_mask = 0 +script = ExtResource("4_pkfnd") +health = NodePath("../Health") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Hurtbox" unique_id=2061671598] +shape = SubResource("RectangleShape2D_pknym") +debug_color = Color(0.466325, 0.590206, 0.107862, 0.42) +metadata/_edit_lock_ = true + +[node name="Health" type="Node" parent="." unique_id=1678447554] +script = ExtResource("5_8qcls") +max_health = 10000000.0 + +[connection signal="damaged" from="Health" to="." method="_on_health_damaged"] diff --git a/demo/props/gong.gd b/demo/props/gong.gd new file mode 100644 index 0000000..adf21ed --- /dev/null +++ b/demo/props/gong.gd @@ -0,0 +1,15 @@ +extends StaticBody2D + +signal gong_struck + +var enabled: bool = true + +@onready var animation_player: AnimationPlayer = $AnimationPlayer + + +func _on_health_damaged(_amount: float, _knockback: Vector2) -> void: + if not enabled: + return + animation_player.play(&"struck") + gong_struck.emit() + enabled = false diff --git a/demo/props/gong.gd.uid b/demo/props/gong.gd.uid new file mode 100644 index 0000000..c7a4e90 --- /dev/null +++ b/demo/props/gong.gd.uid @@ -0,0 +1 @@ +uid://d3cmj6skb7k07 diff --git a/demo/props/gong.tscn b/demo/props/gong.tscn new file mode 100644 index 0000000..cd6a382 --- /dev/null +++ b/demo/props/gong.tscn @@ -0,0 +1,928 @@ +[gd_scene format=3 uid="uid://bpd1wmw2f7bvg"] + +[ext_resource type="Script" uid="uid://d3cmj6skb7k07" path="res://demo/props/gong.gd" id="1_77c1i"] +[ext_resource type="Texture2D" uid="uid://i476iia1ua8q" path="res://demo/assets/env_gong.png" id="1_kbnv6"] +[ext_resource type="Texture2D" uid="uid://dwhhxj5557qrb" path="res://demo/assets/shadow.png" id="1_vl1mv"] +[ext_resource type="Texture2D" uid="uid://dj4oayt5ttvh8" path="res://demo/assets/fx.png" id="2_dib3m"] +[ext_resource type="Script" uid="uid://dq5h6yydckjc1" path="res://demo/agents/scripts/hurtbox.gd" id="5_xeb5y"] +[ext_resource type="Script" uid="uid://5byn62y1oa76" path="res://demo/agents/scripts/health.gd" id="6_6a3q1"] + +[sub_resource type="Animation" id="Animation_i5ovs"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Gong:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Gong:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Gong:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("FX/WaveL1: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("FX/WaveL1:modulate") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(0.329412, 0.352941, 0.392157, 1)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("FX/WaveL1:position") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-65, -89)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("FX/WaveL1:rotation") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.57058] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("FX/WaveL1:scale") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.5, 0.5)] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("FX/WaverR1:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(70, -89)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("FX/WaverR1:rotation") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [4.71215] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("FX/WaverR1:scale") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.5, 0.5)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("FX/WaverR1:visible") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("FX/WaverR1:modulate") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(0.329412, 0.352941, 0.392157, 1)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("FX/WaveL2:position") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-65, -89)] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("FX/WaveL2:rotation") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.57058] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("FX/WaveL2:scale") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.5, 0.5)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("FX/WaverR2:position") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(70, -89)] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("FX/WaverR2:rotation") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [4.71215] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("FX/WaverR2:scale") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.5, 0.5)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("FX/WaveL3:position") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-65, -89)] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("FX/WaveL3:rotation") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [1.57058] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("FX/WaveL3:scale") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.5, 0.5)] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("FX/WaverR3:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(70, -89)] +} +tracks/23/type = "value" +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/path = NodePath("FX/WaverR3:rotation") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [4.71215] +} +tracks/24/type = "value" +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/path = NodePath("FX/WaverR3:scale") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.5, 0.5)] +} +tracks/25/type = "value" +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/path = NodePath("FX/WaveL2:visible") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/26/type = "value" +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/path = NodePath("FX/WaveL2:modulate") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(0.329412, 0.352941, 0.392157, 1)] +} +tracks/27/type = "value" +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/path = NodePath("FX/WaverR2:visible") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/28/type = "value" +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/path = NodePath("FX/WaverR2:modulate") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(0.329412, 0.352941, 0.392157, 1)] +} +tracks/29/type = "value" +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/path = NodePath("FX/WaveL3:visible") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/30/type = "value" +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/path = NodePath("FX/WaveL3:modulate") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(0.329412, 0.352941, 0.392157, 1)] +} +tracks/31/type = "value" +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/path = NodePath("FX/WaverR3:visible") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/32/type = "value" +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/path = NodePath("FX/WaverR3:modulate") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Color(0.329412, 0.352941, 0.392157, 1)] +} + +[sub_resource type="Animation" id="Animation_ie54r"] +resource_name = "struck" +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Root/Gong:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0, 0)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Root/Gong:rotation") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Root/Gong:scale") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), +"update": 0, +"values": [Vector2(1.1, 0.9), Vector2(0.9, 1.1), Vector2(1.08, 0.92), Vector2(0.92, 1.08), Vector2(1.06, 0.94), Vector2(0.94, 1.06), Vector2(1.04, 0.96), Vector2(0.96, 1.04), Vector2(1.02, 0.98), Vector2(0.98, 1.02), Vector2(1, 1)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("FX/WaveL1:visible") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("FX/WaveL1:modulate") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(0.329412, 0.352941, 0.392157, 1), Color(0.607843, 0.898039, 1, 0)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("FX/WaveL1:position") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(-65, -89), Vector2(-165, -89)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("FX/WaveL1:rotation") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [1.57058, 1.57058] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("FX/WaveL1:scale") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(0.5, 0.5), Vector2(1, 1)] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("FX/WaverR1:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(70, -89), Vector2(170, -89)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("FX/WaverR1:rotation") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [4.71215, 4.71215] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("FX/WaverR1:scale") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector2(0.5, 0.5), Vector2(1, 1)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("FX/WaverR1:visible") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("FX/WaverR1:modulate") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0.1, 1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Color(0.329412, 0.352941, 0.392157, 1), Color(0.607843, 0.898039, 1, 0)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("FX/WaveL2:position") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 0.2, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-65, -89), Vector2(-65, -89), Vector2(-165, -89)] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("FX/WaveL2:rotation") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 0.2, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [1.57058, 1.57058, 1.57058] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("FX/WaveL2:scale") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 0.2, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(0.5, 0.5), Vector2(0.5, 0.5), Vector2(1, 1)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("FX/WaverR2:position") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 0.2, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(70, -89), Vector2(70, -89), Vector2(170, -89)] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("FX/WaverR2:rotation") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 0.2, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [4.71215, 4.71215, 4.71215] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("FX/WaverR2:scale") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0, 0.2, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(0.5, 0.5), Vector2(0.5, 0.5), Vector2(1, 1)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("FX/WaveL3:position") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 0.4, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-65, -89), Vector2(-65, -89), Vector2(-165, -89)] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("FX/WaveL3:rotation") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [1.57058, 1.57058] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("FX/WaveL3:scale") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0, 0.4, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(0.5, 0.5), Vector2(0.5, 0.5), Vector2(1, 1)] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("FX/WaverR3:position") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0, 0.4, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(70, -89), Vector2(70, -89), Vector2(170, -89)] +} +tracks/23/type = "value" +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/path = NodePath("FX/WaverR3:rotation") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/keys = { +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [4.71215, 4.71215] +} +tracks/24/type = "value" +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/path = NodePath("FX/WaverR3:scale") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/keys = { +"times": PackedFloat32Array(0, 0.4, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(0.5, 0.5), Vector2(0.5, 0.5), Vector2(1, 1)] +} +tracks/25/type = "value" +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/path = NodePath("FX/WaveL2:visible") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/26/type = "value" +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/path = NodePath("FX/WaveL2:modulate") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/keys = { +"times": PackedFloat32Array(0, 0.2, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(0.329412, 0.352941, 0.392157, 1), Color(0.329412, 0.352941, 0.392157, 1), Color(0.607843, 0.898039, 1, 0)] +} +tracks/27/type = "value" +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/path = NodePath("FX/WaverR2:visible") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/keys = { +"times": PackedFloat32Array(0, 0.2), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/28/type = "value" +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/path = NodePath("FX/WaverR2:modulate") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/keys = { +"times": PackedFloat32Array(0, 0.2, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(0.329412, 0.352941, 0.392157, 1), Color(0.329412, 0.352941, 0.392157, 1), Color(0.607843, 0.898039, 1, 0)] +} +tracks/29/type = "value" +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/path = NodePath("FX/WaveL3:visible") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/keys = { +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/30/type = "value" +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/path = NodePath("FX/WaveL3:modulate") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/keys = { +"times": PackedFloat32Array(-0.00147765, 0.4, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(0.329412, 0.352941, 0.392157, 1), Color(0.329412, 0.352941, 0.392157, 1), Color(0.607843, 0.898039, 1, 0)] +} +tracks/31/type = "value" +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/path = NodePath("FX/WaverR3:visible") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/keys = { +"times": PackedFloat32Array(0, 0.4), +"transitions": PackedFloat32Array(1, 1), +"update": 1, +"values": [false, true] +} +tracks/32/type = "value" +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/path = NodePath("FX/WaverR3:modulate") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/keys = { +"times": PackedFloat32Array(-0.00147765, 0.4, 1), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Color(0.329412, 0.352941, 0.392157, 1), Color(0.329412, 0.352941, 0.392157, 1), Color(0.607843, 0.898039, 1, 0)] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_332s2"] +_data = { +&"RESET": SubResource("Animation_i5ovs"), +&"struck": SubResource("Animation_ie54r") +} + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_nixvt"] +radius = 20.91 +height = 186.37 + +[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_ru7jf"] +radius = 39.2 +height = 253.42 + +[node name="Gong" type="StaticBody2D" unique_id=2141737009] +script = ExtResource("1_77c1i") +metadata/_edit_horizontal_guides_ = [111.0] + +[node name="Root" type="Node2D" parent="." unique_id=352779074] +metadata/_edit_lock_ = true + +[node name="Shadow" type="Sprite2D" parent="Root" unique_id=601999401] +modulate = Color(1, 1, 1, 0.329412) +position = Vector2(0, -8) +scale = Vector2(2.31, 1.7) +texture = ExtResource("1_vl1mv") + +[node name="Gong" type="Sprite2D" parent="Root" unique_id=1370778628] +texture = ExtResource("1_kbnv6") +offset = Vector2(0, -110) + +[node name="FX" type="Node2D" parent="." unique_id=386112793] +metadata/_edit_lock_ = true + +[node name="WaveL1" type="Sprite2D" parent="FX" unique_id=2147205537] +visible = false +modulate = Color(0.329412, 0.352941, 0.392157, 1) +position = Vector2(-65, -89) +rotation = 1.57058 +scale = Vector2(0.5, 0.5) +texture = ExtResource("2_dib3m") +region_enabled = true +region_rect = Rect2(0, 0, 191, 74) + +[node name="WaverR1" type="Sprite2D" parent="FX" unique_id=1896556449] +visible = false +modulate = Color(0.329412, 0.352941, 0.392157, 1) +position = Vector2(70, -89) +rotation = 4.71215 +scale = Vector2(0.5, 0.5) +texture = ExtResource("2_dib3m") +region_enabled = true +region_rect = Rect2(0, 0, 191, 74) + +[node name="WaveL2" type="Sprite2D" parent="FX" unique_id=1276066901] +visible = false +modulate = Color(0.329412, 0.352941, 0.392157, 1) +position = Vector2(-65, -89) +rotation = 1.57058 +scale = Vector2(0.5, 0.5) +texture = ExtResource("2_dib3m") +region_enabled = true +region_rect = Rect2(0, 0, 191, 74) + +[node name="WaverR2" type="Sprite2D" parent="FX" unique_id=89798751] +visible = false +modulate = Color(0.329412, 0.352941, 0.392157, 1) +position = Vector2(70, -89) +rotation = 4.71215 +scale = Vector2(0.5, 0.5) +texture = ExtResource("2_dib3m") +region_enabled = true +region_rect = Rect2(0, 0, 191, 74) + +[node name="WaveL3" type="Sprite2D" parent="FX" unique_id=574959018] +visible = false +modulate = Color(0.329412, 0.352941, 0.392157, 1) +position = Vector2(-65, -89) +rotation = 1.57058 +scale = Vector2(0.5, 0.5) +texture = ExtResource("2_dib3m") +region_enabled = true +region_rect = Rect2(0, 0, 191, 74) + +[node name="WaverR3" type="Sprite2D" parent="FX" unique_id=807347373] +visible = false +modulate = Color(0.329412, 0.352941, 0.392157, 1) +position = Vector2(70, -89) +rotation = 4.71215 +scale = Vector2(0.5, 0.5) +texture = ExtResource("2_dib3m") +region_enabled = true +region_rect = Rect2(0, 0, 191, 74) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=2024851481] +libraries/ = SubResource("AnimationLibrary_332s2") + +[node name="GongSFX" type="AudioStreamPlayer" parent="." unique_id=475942010] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="." unique_id=810084465] +position = Vector2(0, -14.395) +rotation = 1.5708 +shape = SubResource("CapsuleShape2D_nixvt") + +[node name="Hurtbox" type="Area2D" parent="." unique_id=1306563145 node_paths=PackedStringArray("health")] +collision_layer = 8 +collision_mask = 0 +script = ExtResource("5_xeb5y") +health = NodePath("../Health") + +[node name="CollisionShape2D2" type="CollisionShape2D" parent="Hurtbox" unique_id=715587618] +position = Vector2(0, -14.395) +rotation = 1.5708 +shape = SubResource("CapsuleShape2D_ru7jf") +debug_color = Color(0.886275, 0.109804, 0.756863, 0.419608) + +[node name="Health" type="Node" parent="." unique_id=883950545] +script = ExtResource("6_6a3q1") +max_health = 100000000000.0 + +[connection signal="damaged" from="Health" to="." method="_on_health_damaged"] diff --git a/demo/scenes/base/arena.tscn b/demo/scenes/base/arena.tscn new file mode 100644 index 0000000..119567e --- /dev/null +++ b/demo/scenes/base/arena.tscn @@ -0,0 +1,5140 @@ +[gd_scene format=3 uid="uid://bsig1usigbbuy"] + +[ext_resource type="Texture2D" uid="uid://65b6yuobhxf8" path="res://demo/assets/env_clouds.png" id="1_1blat"] +[ext_resource type="Texture2D" uid="uid://b3g14elmg0m36" path="res://demo/assets/env_rocks.png" id="1_145kx"] +[ext_resource type="Texture2D" uid="uid://cc7b22sy46gwn" path="res://demo/assets/env_ground.png" id="1_vifjc"] +[ext_resource type="Texture2D" uid="uid://4kw2ks8doc0w" path="res://demo/assets/env_plants.png" id="2_kesm7"] + +[sub_resource type="Animation" id="Animation_gwtgs"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Environment/Clouds/Cloud11:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(3784, 345)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Environment/Clouds/Cloud1:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(764, 358)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Environment/Clouds/Cloud13:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(4005, 2983)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Environment/Clouds/Cloud5:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-152, 2723)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Environment/Clouds/Cloud6:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(3293, 936)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Environment/Clouds/Cloud2:position") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(85, 1505)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Environment/Clouds/Cloud16:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(3434, 3542)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Environment/Clouds/Cloud7:position") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1380, 3802)] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Environment/Clouds/Cloud3:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(503, 1222)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Environment/Clouds/Cloud14:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(4174, 3309)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Environment/Clouds/Cloud15:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(4695, 2800)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Environment/Clouds/Cloud8:position") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(152, 3383)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Environment/Clouds/Cloud4:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(164, 1669)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Environment/Clouds/Cloud9:position") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(328, 3474)] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Environment/Clouds/Cloud10:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(933, 515)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Environment/Clouds/Cloud12:position") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(4570, 1222)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Environment/Clouds/Cloud11:scale") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Environment/Clouds/Cloud1:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Environment/Clouds/Cloud13:scale") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Environment/Clouds/Cloud5:scale") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Environment/Clouds/Cloud6:scale") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Environment/Clouds/Cloud2:scale") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("Environment/Clouds/Cloud16:scale") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/23/type = "value" +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/path = NodePath("Environment/Clouds/Cloud7:scale") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/24/type = "value" +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/path = NodePath("Environment/Clouds/Cloud3:scale") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/25/type = "value" +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/path = NodePath("Environment/Clouds/Cloud14:scale") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/26/type = "value" +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/path = NodePath("Environment/Clouds/Cloud15:scale") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/27/type = "value" +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/path = NodePath("Environment/Clouds/Cloud8:scale") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/28/type = "value" +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/path = NodePath("Environment/Clouds/Cloud4:scale") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/29/type = "value" +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/path = NodePath("Environment/Clouds/Cloud9:scale") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/30/type = "value" +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/path = NodePath("Environment/Clouds/Cloud10:scale") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/31/type = "value" +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/path = NodePath("Environment/Clouds/Cloud12:scale") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/32/type = "value" +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/path = NodePath("Environment/Clouds/Cloud1:visible") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/33/type = "value" +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/path = NodePath("Environment/Clouds/Cloud13:visible") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/34/type = "value" +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/path = NodePath("Environment/Clouds/Cloud5:visible") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/35/type = "value" +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/path = NodePath("Environment/Clouds/Cloud6:visible") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/36/type = "value" +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/path = NodePath("Environment/Clouds/Cloud2:visible") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/37/type = "value" +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/path = NodePath("Environment/Clouds/Cloud16:visible") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/38/type = "value" +tracks/38/imported = false +tracks/38/enabled = true +tracks/38/path = NodePath("Environment/Clouds/Cloud7:visible") +tracks/38/interp = 1 +tracks/38/loop_wrap = true +tracks/38/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/39/type = "value" +tracks/39/imported = false +tracks/39/enabled = true +tracks/39/path = NodePath("Environment/Clouds/Cloud3:visible") +tracks/39/interp = 1 +tracks/39/loop_wrap = true +tracks/39/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/40/type = "value" +tracks/40/imported = false +tracks/40/enabled = true +tracks/40/path = NodePath("Environment/Clouds/Cloud14:visible") +tracks/40/interp = 1 +tracks/40/loop_wrap = true +tracks/40/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/41/type = "value" +tracks/41/imported = false +tracks/41/enabled = true +tracks/41/path = NodePath("Environment/Clouds/Cloud15:visible") +tracks/41/interp = 1 +tracks/41/loop_wrap = true +tracks/41/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/42/type = "value" +tracks/42/imported = false +tracks/42/enabled = true +tracks/42/path = NodePath("Environment/Clouds/Cloud8:visible") +tracks/42/interp = 1 +tracks/42/loop_wrap = true +tracks/42/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/43/type = "value" +tracks/43/imported = false +tracks/43/enabled = true +tracks/43/path = NodePath("Environment/Clouds/Cloud4:visible") +tracks/43/interp = 1 +tracks/43/loop_wrap = true +tracks/43/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/44/type = "value" +tracks/44/imported = false +tracks/44/enabled = true +tracks/44/path = NodePath("Environment/Clouds/Cloud9:visible") +tracks/44/interp = 1 +tracks/44/loop_wrap = true +tracks/44/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/45/type = "value" +tracks/45/imported = false +tracks/45/enabled = true +tracks/45/path = NodePath("Environment/Clouds/Cloud10:visible") +tracks/45/interp = 1 +tracks/45/loop_wrap = true +tracks/45/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/46/type = "value" +tracks/46/imported = false +tracks/46/enabled = true +tracks/46/path = NodePath("Environment/Clouds/Cloud12:visible") +tracks/46/interp = 1 +tracks/46/loop_wrap = true +tracks/46/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/47/type = "value" +tracks/47/imported = false +tracks/47/enabled = true +tracks/47/path = NodePath("Environment/Clouds/Cloud11:visible") +tracks/47/interp = 1 +tracks/47/loop_wrap = true +tracks/47/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/48/type = "value" +tracks/48/imported = false +tracks/48/enabled = true +tracks/48/path = NodePath("Environment/Clouds/Cloud17:position") +tracks/48/interp = 1 +tracks/48/loop_wrap = true +tracks/48/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2737.13, 367.814)] +} +tracks/49/type = "value" +tracks/49/imported = false +tracks/49/enabled = true +tracks/49/path = NodePath("Environment/Clouds/Cloud17:scale") +tracks/49/interp = 1 +tracks/49/loop_wrap = true +tracks/49/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1.35085, 1.15254)] +} +tracks/50/type = "value" +tracks/50/imported = false +tracks/50/enabled = true +tracks/50/path = NodePath("Environment/Clouds/Cloud18:position") +tracks/50/interp = 1 +tracks/50/loop_wrap = true +tracks/50/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1254.92, 3539.61)] +} +tracks/51/type = "value" +tracks/51/imported = false +tracks/51/enabled = true +tracks/51/path = NodePath("Environment/Clouds/Cloud18:scale") +tracks/51/interp = 1 +tracks/51/loop_wrap = true +tracks/51/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.898305, 0.898305)] +} +tracks/52/type = "value" +tracks/52/imported = false +tracks/52/enabled = true +tracks/52/path = NodePath("Environment/Clouds/Cloud19:position") +tracks/52/interp = 1 +tracks/52/loop_wrap = true +tracks/52/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-2912.7, 1260.29)] +} +tracks/53/type = "value" +tracks/53/imported = false +tracks/53/enabled = true +tracks/53/path = NodePath("Environment/Clouds/Cloud19:scale") +tracks/53/interp = 1 +tracks/53/loop_wrap = true +tracks/53/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1.10169, 1.10169)] +} +tracks/54/type = "value" +tracks/54/imported = false +tracks/54/enabled = true +tracks/54/path = NodePath("Environment/Clouds/Cloud20:position") +tracks/54/interp = 1 +tracks/54/loop_wrap = true +tracks/54/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-3251.5, 3437.56)] +} +tracks/55/type = "value" +tracks/55/imported = false +tracks/55/enabled = true +tracks/55/path = NodePath("Environment/Clouds/Cloud20:scale") +tracks/55/interp = 1 +tracks/55/loop_wrap = true +tracks/55/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/56/type = "value" +tracks/56/imported = false +tracks/56/enabled = true +tracks/56/path = NodePath("Environment/Clouds/Cloud21:position") +tracks/56/interp = 1 +tracks/56/loop_wrap = true +tracks/56/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-3181.26, 3581.44)] +} +tracks/57/type = "value" +tracks/57/imported = false +tracks/57/enabled = true +tracks/57/path = NodePath("Environment/Clouds/Cloud21:scale") +tracks/57/interp = 1 +tracks/57/loop_wrap = true +tracks/57/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.949153, 0.949153)] +} +tracks/58/type = "value" +tracks/58/imported = false +tracks/58/enabled = true +tracks/58/path = NodePath("Environment/Clouds/Cloud22:position") +tracks/58/interp = 1 +tracks/58/loop_wrap = true +tracks/58/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-420.856, 367.017)] +} +tracks/59/type = "value" +tracks/59/imported = false +tracks/59/enabled = true +tracks/59/path = NodePath("Environment/Clouds/Cloud22:scale") +tracks/59/interp = 1 +tracks/59/loop_wrap = true +tracks/59/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/60/type = "value" +tracks/60/imported = false +tracks/60/enabled = true +tracks/60/path = NodePath("Environment/Clouds/Cloud17:visible") +tracks/60/interp = 1 +tracks/60/loop_wrap = true +tracks/60/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/61/type = "value" +tracks/61/imported = false +tracks/61/enabled = true +tracks/61/path = NodePath("Environment/Clouds/Cloud18:visible") +tracks/61/interp = 1 +tracks/61/loop_wrap = true +tracks/61/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/62/type = "value" +tracks/62/imported = false +tracks/62/enabled = true +tracks/62/path = NodePath("Environment/Clouds/Cloud19:visible") +tracks/62/interp = 1 +tracks/62/loop_wrap = true +tracks/62/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/63/type = "value" +tracks/63/imported = false +tracks/63/enabled = true +tracks/63/path = NodePath("Environment/Clouds/Cloud20:visible") +tracks/63/interp = 1 +tracks/63/loop_wrap = true +tracks/63/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/64/type = "value" +tracks/64/imported = false +tracks/64/enabled = true +tracks/64/path = NodePath("Environment/Clouds/Cloud21:visible") +tracks/64/interp = 1 +tracks/64/loop_wrap = true +tracks/64/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/65/type = "value" +tracks/65/imported = false +tracks/65/enabled = true +tracks/65/path = NodePath("Environment/Clouds/Cloud22:visible") +tracks/65/interp = 1 +tracks/65/loop_wrap = true +tracks/65/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/66/type = "value" +tracks/66/imported = false +tracks/66/enabled = true +tracks/66/path = NodePath("Environment/Clouds/Cloud28:position") +tracks/66/interp = 1 +tracks/66/loop_wrap = true +tracks/66/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-461, 1787)] +} +tracks/67/type = "value" +tracks/67/imported = false +tracks/67/enabled = true +tracks/67/path = NodePath("Environment/Clouds/Cloud28:scale") +tracks/67/interp = 1 +tracks/67/loop_wrap = true +tracks/67/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1.10169, 1.10169)] +} +tracks/68/type = "value" +tracks/68/imported = false +tracks/68/enabled = true +tracks/68/path = NodePath("Environment/Clouds/Cloud23:position") +tracks/68/interp = 1 +tracks/68/loop_wrap = true +tracks/68/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1493, 3040)] +} +tracks/69/type = "value" +tracks/69/imported = false +tracks/69/enabled = true +tracks/69/path = NodePath("Environment/Clouds/Cloud23:scale") +tracks/69/interp = 1 +tracks/69/loop_wrap = true +tracks/69/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.898305, 0.898305)] +} +tracks/70/type = "value" +tracks/70/imported = false +tracks/70/enabled = true +tracks/70/path = NodePath("Environment/Clouds/Cloud24:position") +tracks/70/interp = 1 +tracks/70/loop_wrap = true +tracks/70/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-510, 2429)] +} +tracks/71/type = "value" +tracks/71/imported = false +tracks/71/enabled = true +tracks/71/path = NodePath("Environment/Clouds/Cloud24:scale") +tracks/71/interp = 1 +tracks/71/loop_wrap = true +tracks/71/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1.15254, 1.15254)] +} +tracks/72/type = "value" +tracks/72/imported = false +tracks/72/enabled = true +tracks/72/path = NodePath("Environment/Clouds/Cloud25:position") +tracks/72/interp = 1 +tracks/72/loop_wrap = true +tracks/72/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-712, 1373)] +} +tracks/73/type = "value" +tracks/73/imported = false +tracks/73/enabled = true +tracks/73/path = NodePath("Environment/Clouds/Cloud25:scale") +tracks/73/interp = 1 +tracks/73/loop_wrap = true +tracks/73/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1.10169, 1.10169)] +} +tracks/74/type = "value" +tracks/74/imported = false +tracks/74/enabled = true +tracks/74/path = NodePath("Environment/Clouds/Cloud26:position") +tracks/74/interp = 1 +tracks/74/loop_wrap = true +tracks/74/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-269, 2004)] +} +tracks/75/type = "value" +tracks/75/imported = false +tracks/75/enabled = true +tracks/75/path = NodePath("Environment/Clouds/Cloud26:scale") +tracks/75/interp = 1 +tracks/75/loop_wrap = true +tracks/75/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.79661, 0.79661)] +} +tracks/76/type = "value" +tracks/76/imported = false +tracks/76/enabled = true +tracks/76/path = NodePath("Environment/Clouds/Cloud27:position") +tracks/76/interp = 1 +tracks/76/loop_wrap = true +tracks/76/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(-1656, 2353)] +} +tracks/77/type = "value" +tracks/77/imported = false +tracks/77/enabled = true +tracks/77/path = NodePath("Environment/Clouds/Cloud27:scale") +tracks/77/interp = 1 +tracks/77/loop_wrap = true +tracks/77/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.949153, 0.949153)] +} +tracks/78/type = "value" +tracks/78/imported = false +tracks/78/enabled = true +tracks/78/path = NodePath("Environment/Clouds/Cloud23:visible") +tracks/78/interp = 1 +tracks/78/loop_wrap = true +tracks/78/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/79/type = "value" +tracks/79/imported = false +tracks/79/enabled = true +tracks/79/path = NodePath("Environment/Clouds/Cloud24:visible") +tracks/79/interp = 1 +tracks/79/loop_wrap = true +tracks/79/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/80/type = "value" +tracks/80/imported = false +tracks/80/enabled = true +tracks/80/path = NodePath("Environment/Clouds/Cloud25:visible") +tracks/80/interp = 1 +tracks/80/loop_wrap = true +tracks/80/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/81/type = "value" +tracks/81/imported = false +tracks/81/enabled = true +tracks/81/path = NodePath("Environment/Clouds/Cloud26:visible") +tracks/81/interp = 1 +tracks/81/loop_wrap = true +tracks/81/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/82/type = "value" +tracks/82/imported = false +tracks/82/enabled = true +tracks/82/path = NodePath("Environment/Clouds/Cloud27:visible") +tracks/82/interp = 1 +tracks/82/loop_wrap = true +tracks/82/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/83/type = "value" +tracks/83/imported = false +tracks/83/enabled = true +tracks/83/path = NodePath("Environment/Clouds/Cloud28:visible") +tracks/83/interp = 1 +tracks/83/loop_wrap = true +tracks/83/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/84/type = "value" +tracks/84/imported = false +tracks/84/enabled = true +tracks/84/path = NodePath("Environment/Clouds/Cloud29:position") +tracks/84/interp = 1 +tracks/84/loop_wrap = true +tracks/84/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(3890, 2612.5)] +} +tracks/85/type = "value" +tracks/85/imported = false +tracks/85/enabled = true +tracks/85/path = NodePath("Environment/Clouds/Cloud29:scale") +tracks/85/interp = 1 +tracks/85/loop_wrap = true +tracks/85/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/86/type = "value" +tracks/86/imported = false +tracks/86/enabled = true +tracks/86/path = NodePath("Environment/Clouds/Cloud30:position") +tracks/86/interp = 1 +tracks/86/loop_wrap = true +tracks/86/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(3832, 1394.5)] +} +tracks/87/type = "value" +tracks/87/imported = false +tracks/87/enabled = true +tracks/87/path = NodePath("Environment/Clouds/Cloud30:scale") +tracks/87/interp = 1 +tracks/87/loop_wrap = true +tracks/87/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/88/type = "value" +tracks/88/imported = false +tracks/88/enabled = true +tracks/88/path = NodePath("Environment/Clouds/Cloud31:position") +tracks/88/interp = 1 +tracks/88/loop_wrap = true +tracks/88/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(3472, 3106)] +} +tracks/89/type = "value" +tracks/89/imported = false +tracks/89/enabled = true +tracks/89/path = NodePath("Environment/Clouds/Cloud31:scale") +tracks/89/interp = 1 +tracks/89/loop_wrap = true +tracks/89/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/90/type = "value" +tracks/90/imported = false +tracks/90/enabled = true +tracks/90/path = NodePath("Environment/Clouds/Cloud32:position") +tracks/90/interp = 1 +tracks/90/loop_wrap = true +tracks/90/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(3095, 2689.5)] +} +tracks/91/type = "value" +tracks/91/imported = false +tracks/91/enabled = true +tracks/91/path = NodePath("Environment/Clouds/Cloud32:scale") +tracks/91/interp = 1 +tracks/91/loop_wrap = true +tracks/91/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/92/type = "value" +tracks/92/imported = false +tracks/92/enabled = true +tracks/92/path = NodePath("Environment/Clouds/Cloud33:position") +tracks/92/interp = 1 +tracks/92/loop_wrap = true +tracks/92/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(4016, 1558.5)] +} +tracks/93/type = "value" +tracks/93/imported = false +tracks/93/enabled = true +tracks/93/path = NodePath("Environment/Clouds/Cloud33:scale") +tracks/93/interp = 1 +tracks/93/loop_wrap = true +tracks/93/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/94/type = "value" +tracks/94/imported = false +tracks/94/enabled = true +tracks/94/path = NodePath("Environment/Clouds/Cloud29:visible") +tracks/94/interp = 1 +tracks/94/loop_wrap = true +tracks/94/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/95/type = "value" +tracks/95/imported = false +tracks/95/enabled = true +tracks/95/path = NodePath("Environment/Clouds/Cloud30:visible") +tracks/95/interp = 1 +tracks/95/loop_wrap = true +tracks/95/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/96/type = "value" +tracks/96/imported = false +tracks/96/enabled = true +tracks/96/path = NodePath("Environment/Clouds/Cloud31:visible") +tracks/96/interp = 1 +tracks/96/loop_wrap = true +tracks/96/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/97/type = "value" +tracks/97/imported = false +tracks/97/enabled = true +tracks/97/path = NodePath("Environment/Clouds/Cloud32:visible") +tracks/97/interp = 1 +tracks/97/loop_wrap = true +tracks/97/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/98/type = "value" +tracks/98/imported = false +tracks/98/enabled = true +tracks/98/path = NodePath("Environment/Clouds/Cloud33:visible") +tracks/98/interp = 1 +tracks/98/loop_wrap = true +tracks/98/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/99/type = "value" +tracks/99/imported = false +tracks/99/enabled = true +tracks/99/path = NodePath("Environment/Clouds/Cloud34:position") +tracks/99/interp = 1 +tracks/99/loop_wrap = true +tracks/99/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(3863, 1375)] +} +tracks/100/type = "value" +tracks/100/imported = false +tracks/100/enabled = true +tracks/100/path = NodePath("Environment/Clouds/Cloud34:scale") +tracks/100/interp = 1 +tracks/100/loop_wrap = true +tracks/100/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/101/type = "value" +tracks/101/imported = false +tracks/101/enabled = true +tracks/101/path = NodePath("Environment/Clouds/Cloud35:position") +tracks/101/interp = 1 +tracks/101/loop_wrap = true +tracks/101/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(3521.25, 3087)] +} +tracks/102/type = "value" +tracks/102/imported = false +tracks/102/enabled = true +tracks/102/path = NodePath("Environment/Clouds/Cloud35:scale") +tracks/102/interp = 1 +tracks/102/loop_wrap = true +tracks/102/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/103/type = "value" +tracks/103/imported = false +tracks/103/enabled = true +tracks/103/path = NodePath("Environment/Clouds/Cloud36:position") +tracks/103/interp = 1 +tracks/103/loop_wrap = true +tracks/103/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(3609.25, 3161)] +} +tracks/104/type = "value" +tracks/104/imported = false +tracks/104/enabled = true +tracks/104/path = NodePath("Environment/Clouds/Cloud36:scale") +tracks/104/interp = 1 +tracks/104/loop_wrap = true +tracks/104/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/105/type = "value" +tracks/105/imported = false +tracks/105/enabled = true +tracks/105/path = NodePath("Environment/Clouds/Cloud37:position") +tracks/105/interp = 1 +tracks/105/loop_wrap = true +tracks/105/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(3754.25, 1447)] +} +tracks/106/type = "value" +tracks/106/imported = false +tracks/106/enabled = true +tracks/106/path = NodePath("Environment/Clouds/Cloud37:scale") +tracks/106/interp = 1 +tracks/106/loop_wrap = true +tracks/106/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/107/type = "value" +tracks/107/imported = false +tracks/107/enabled = true +tracks/107/path = NodePath("Environment/Clouds/Cloud38:position") +tracks/107/interp = 1 +tracks/107/loop_wrap = true +tracks/107/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(2915.25, 2833)] +} +tracks/108/type = "value" +tracks/108/imported = false +tracks/108/enabled = true +tracks/108/path = NodePath("Environment/Clouds/Cloud38:scale") +tracks/108/interp = 1 +tracks/108/loop_wrap = true +tracks/108/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(0.898305, 0.898305)] +} +tracks/109/type = "value" +tracks/109/imported = false +tracks/109/enabled = true +tracks/109/path = NodePath("Environment/Clouds/Cloud39:position") +tracks/109/interp = 1 +tracks/109/loop_wrap = true +tracks/109/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(3270.25, 2207)] +} +tracks/110/type = "value" +tracks/110/imported = false +tracks/110/enabled = true +tracks/110/path = NodePath("Environment/Clouds/Cloud39:scale") +tracks/110/interp = 1 +tracks/110/loop_wrap = true +tracks/110/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector2(1, 1)] +} +tracks/111/type = "value" +tracks/111/imported = false +tracks/111/enabled = true +tracks/111/path = NodePath("Environment/Clouds/Cloud34:visible") +tracks/111/interp = 1 +tracks/111/loop_wrap = true +tracks/111/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/112/type = "value" +tracks/112/imported = false +tracks/112/enabled = true +tracks/112/path = NodePath("Environment/Clouds/Cloud35:visible") +tracks/112/interp = 1 +tracks/112/loop_wrap = true +tracks/112/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/113/type = "value" +tracks/113/imported = false +tracks/113/enabled = true +tracks/113/path = NodePath("Environment/Clouds/Cloud36:visible") +tracks/113/interp = 1 +tracks/113/loop_wrap = true +tracks/113/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [true] +} +tracks/114/type = "value" +tracks/114/imported = false +tracks/114/enabled = true +tracks/114/path = NodePath("Environment/Clouds/Cloud37:visible") +tracks/114/interp = 1 +tracks/114/loop_wrap = true +tracks/114/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/115/type = "value" +tracks/115/imported = false +tracks/115/enabled = true +tracks/115/path = NodePath("Environment/Clouds/Cloud38:visible") +tracks/115/interp = 1 +tracks/115/loop_wrap = true +tracks/115/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/116/type = "value" +tracks/116/imported = false +tracks/116/enabled = true +tracks/116/path = NodePath("Environment/Clouds/Cloud39:visible") +tracks/116/interp = 1 +tracks/116/loop_wrap = true +tracks/116/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} + +[sub_resource type="Animation" id="Animation_75lmk"] +resource_name = "float" +length = 60.2 +loop_mode = 1 +step = 0.2 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("Environment/Clouds/Cloud11:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-878, 345), Vector2(8280, 329), Vector2(-878, 345)] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("Environment/Clouds/Cloud1:position") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-149, 377), Vector2(6644, 318), Vector2(-149, 377)] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("Environment/Clouds/Cloud13:position") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-856, 3012), Vector2(6701, 2975), Vector2(-856, 3012)] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("Environment/Clouds/Cloud5:position") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-152, 2723), Vector2(6304, 2691), Vector2(-152, 2723)] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("Environment/Clouds/Cloud6:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-1169, 936), Vector2(6941, 936), Vector2(-1169, 936)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("Environment/Clouds/Cloud2:position") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-210, 1505), Vector2(7109, 1489), Vector2(-210, 1505)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("Environment/Clouds/Cloud16:position") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-733, 3542), Vector2(6978, 3478), Vector2(-733, 3542)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("Environment/Clouds/Cloud7:position") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-1427, 3831), Vector2(6420, 3842), Vector2(-1427, 3831)] +} +tracks/8/type = "value" +tracks/8/imported = false +tracks/8/enabled = true +tracks/8/path = NodePath("Environment/Clouds/Cloud3:position") +tracks/8/interp = 1 +tracks/8/loop_wrap = true +tracks/8/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-258, 1222), Vector2(6551, 1238), Vector2(-258, 1222)] +} +tracks/9/type = "value" +tracks/9/imported = false +tracks/9/enabled = true +tracks/9/path = NodePath("Environment/Clouds/Cloud14:position") +tracks/9/interp = 1 +tracks/9/loop_wrap = true +tracks/9/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-259, 3309), Vector2(7190, 3301), Vector2(-259, 3309)] +} +tracks/10/type = "value" +tracks/10/imported = false +tracks/10/enabled = true +tracks/10/path = NodePath("Environment/Clouds/Cloud15:position") +tracks/10/interp = 1 +tracks/10/loop_wrap = true +tracks/10/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-947, 2800), Vector2(7711, 2824), Vector2(-947, 2800)] +} +tracks/11/type = "value" +tracks/11/imported = false +tracks/11/enabled = true +tracks/11/path = NodePath("Environment/Clouds/Cloud8:position") +tracks/11/interp = 1 +tracks/11/loop_wrap = true +tracks/11/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-171, 3383), Vector2(6224, 3431), Vector2(-171, 3383)] +} +tracks/12/type = "value" +tracks/12/imported = false +tracks/12/enabled = true +tracks/12/path = NodePath("Environment/Clouds/Cloud4:position") +tracks/12/interp = 1 +tracks/12/loop_wrap = true +tracks/12/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-26, 1669), Vector2(6716, 1797), Vector2(-26, 1669)] +} +tracks/13/type = "value" +tracks/13/imported = false +tracks/13/enabled = true +tracks/13/path = NodePath("Environment/Clouds/Cloud9:position") +tracks/13/interp = 1 +tracks/13/loop_wrap = true +tracks/13/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-500, 3474), Vector2(6192, 3626), Vector2(-500, 3474)] +} +tracks/14/type = "value" +tracks/14/imported = false +tracks/14/enabled = true +tracks/14/path = NodePath("Environment/Clouds/Cloud10:position") +tracks/14/interp = 1 +tracks/14/loop_wrap = true +tracks/14/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-285, 515), Vector2(6173, 595), Vector2(-285, 515)] +} +tracks/15/type = "value" +tracks/15/imported = false +tracks/15/enabled = true +tracks/15/path = NodePath("Environment/Clouds/Cloud12:position") +tracks/15/interp = 1 +tracks/15/loop_wrap = true +tracks/15/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(-444, 1222), Vector2(8090, 1286), Vector2(-444, 1222)] +} +tracks/16/type = "value" +tracks/16/imported = false +tracks/16/enabled = true +tracks/16/path = NodePath("Environment/Clouds/Cloud11:scale") +tracks/16/interp = 1 +tracks/16/loop_wrap = true +tracks/16/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/17/type = "value" +tracks/17/imported = false +tracks/17/enabled = true +tracks/17/path = NodePath("Environment/Clouds/Cloud1:scale") +tracks/17/interp = 1 +tracks/17/loop_wrap = true +tracks/17/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.69, 1.3), Vector2(1, 1)] +} +tracks/18/type = "value" +tracks/18/imported = false +tracks/18/enabled = true +tracks/18/path = NodePath("Environment/Clouds/Cloud13:scale") +tracks/18/interp = 1 +tracks/18/loop_wrap = true +tracks/18/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/19/type = "value" +tracks/19/imported = false +tracks/19/enabled = true +tracks/19/path = NodePath("Environment/Clouds/Cloud5:scale") +tracks/19/interp = 1 +tracks/19/loop_wrap = true +tracks/19/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.8, 0.8), Vector2(1, 1)] +} +tracks/20/type = "value" +tracks/20/imported = false +tracks/20/enabled = true +tracks/20/path = NodePath("Environment/Clouds/Cloud6:scale") +tracks/20/interp = 1 +tracks/20/loop_wrap = true +tracks/20/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.2, 1.2), Vector2(1, 1)] +} +tracks/21/type = "value" +tracks/21/imported = false +tracks/21/enabled = true +tracks/21/path = NodePath("Environment/Clouds/Cloud2:scale") +tracks/21/interp = 1 +tracks/21/loop_wrap = true +tracks/21/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.3, 1.3), Vector2(1, 1)] +} +tracks/22/type = "value" +tracks/22/imported = false +tracks/22/enabled = true +tracks/22/path = NodePath("Environment/Clouds/Cloud16:scale") +tracks/22/interp = 1 +tracks/22/loop_wrap = true +tracks/22/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.8, 0.8), Vector2(1, 1)] +} +tracks/23/type = "value" +tracks/23/imported = false +tracks/23/enabled = true +tracks/23/path = NodePath("Environment/Clouds/Cloud7:scale") +tracks/23/interp = 1 +tracks/23/loop_wrap = true +tracks/23/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.2, 1.2), Vector2(1, 1)] +} +tracks/24/type = "value" +tracks/24/imported = false +tracks/24/enabled = true +tracks/24/path = NodePath("Environment/Clouds/Cloud3:scale") +tracks/24/interp = 1 +tracks/24/loop_wrap = true +tracks/24/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.2, 1.2), Vector2(1, 1)] +} +tracks/25/type = "value" +tracks/25/imported = false +tracks/25/enabled = true +tracks/25/path = NodePath("Environment/Clouds/Cloud14:scale") +tracks/25/interp = 1 +tracks/25/loop_wrap = true +tracks/25/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.3, 1.3), Vector2(1, 1)] +} +tracks/26/type = "value" +tracks/26/imported = false +tracks/26/enabled = true +tracks/26/path = NodePath("Environment/Clouds/Cloud15:scale") +tracks/26/interp = 1 +tracks/26/loop_wrap = true +tracks/26/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.6, 0.6), Vector2(1, 1)] +} +tracks/27/type = "value" +tracks/27/imported = false +tracks/27/enabled = true +tracks/27/path = NodePath("Environment/Clouds/Cloud8:scale") +tracks/27/interp = 1 +tracks/27/loop_wrap = true +tracks/27/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/28/type = "value" +tracks/28/imported = false +tracks/28/enabled = true +tracks/28/path = NodePath("Environment/Clouds/Cloud4:scale") +tracks/28/interp = 1 +tracks/28/loop_wrap = true +tracks/28/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.3, 1.3), Vector2(1, 1)] +} +tracks/29/type = "value" +tracks/29/imported = false +tracks/29/enabled = true +tracks/29/path = NodePath("Environment/Clouds/Cloud9:scale") +tracks/29/interp = 1 +tracks/29/loop_wrap = true +tracks/29/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(0.9, 0.9), Vector2(1, 1)] +} +tracks/30/type = "value" +tracks/30/imported = false +tracks/30/enabled = true +tracks/30/path = NodePath("Environment/Clouds/Cloud10:scale") +tracks/30/interp = 1 +tracks/30/loop_wrap = true +tracks/30/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.2, 1.2), Vector2(1, 1)] +} +tracks/31/type = "value" +tracks/31/imported = false +tracks/31/enabled = true +tracks/31/path = NodePath("Environment/Clouds/Cloud12:scale") +tracks/31/interp = 1 +tracks/31/loop_wrap = true +tracks/31/keys = { +"times": PackedFloat32Array(0, 59, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1.2, 1.2), Vector2(1, 1)] +} +tracks/32/type = "value" +tracks/32/imported = false +tracks/32/enabled = true +tracks/32/path = NodePath("Environment/Clouds/Cloud1:visible") +tracks/32/interp = 1 +tracks/32/loop_wrap = true +tracks/32/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/33/type = "value" +tracks/33/imported = false +tracks/33/enabled = true +tracks/33/path = NodePath("Environment/Clouds/Cloud13:visible") +tracks/33/interp = 1 +tracks/33/loop_wrap = true +tracks/33/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/34/type = "value" +tracks/34/imported = false +tracks/34/enabled = true +tracks/34/path = NodePath("Environment/Clouds/Cloud5:visible") +tracks/34/interp = 1 +tracks/34/loop_wrap = true +tracks/34/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/35/type = "value" +tracks/35/imported = false +tracks/35/enabled = true +tracks/35/path = NodePath("Environment/Clouds/Cloud6:visible") +tracks/35/interp = 1 +tracks/35/loop_wrap = true +tracks/35/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/36/type = "value" +tracks/36/imported = false +tracks/36/enabled = true +tracks/36/path = NodePath("Environment/Clouds/Cloud2:visible") +tracks/36/interp = 1 +tracks/36/loop_wrap = true +tracks/36/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/37/type = "value" +tracks/37/imported = false +tracks/37/enabled = true +tracks/37/path = NodePath("Environment/Clouds/Cloud16:visible") +tracks/37/interp = 1 +tracks/37/loop_wrap = true +tracks/37/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/38/type = "value" +tracks/38/imported = false +tracks/38/enabled = true +tracks/38/path = NodePath("Environment/Clouds/Cloud7:visible") +tracks/38/interp = 1 +tracks/38/loop_wrap = true +tracks/38/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/39/type = "value" +tracks/39/imported = false +tracks/39/enabled = true +tracks/39/path = NodePath("Environment/Clouds/Cloud3:visible") +tracks/39/interp = 1 +tracks/39/loop_wrap = true +tracks/39/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/40/type = "value" +tracks/40/imported = false +tracks/40/enabled = true +tracks/40/path = NodePath("Environment/Clouds/Cloud14:visible") +tracks/40/interp = 1 +tracks/40/loop_wrap = true +tracks/40/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/41/type = "value" +tracks/41/imported = false +tracks/41/enabled = true +tracks/41/path = NodePath("Environment/Clouds/Cloud15:visible") +tracks/41/interp = 1 +tracks/41/loop_wrap = true +tracks/41/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/42/type = "value" +tracks/42/imported = false +tracks/42/enabled = true +tracks/42/path = NodePath("Environment/Clouds/Cloud8:visible") +tracks/42/interp = 1 +tracks/42/loop_wrap = true +tracks/42/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/43/type = "value" +tracks/43/imported = false +tracks/43/enabled = true +tracks/43/path = NodePath("Environment/Clouds/Cloud4:visible") +tracks/43/interp = 1 +tracks/43/loop_wrap = true +tracks/43/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/44/type = "value" +tracks/44/imported = false +tracks/44/enabled = true +tracks/44/path = NodePath("Environment/Clouds/Cloud9:visible") +tracks/44/interp = 1 +tracks/44/loop_wrap = true +tracks/44/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/45/type = "value" +tracks/45/imported = false +tracks/45/enabled = true +tracks/45/path = NodePath("Environment/Clouds/Cloud10:visible") +tracks/45/interp = 1 +tracks/45/loop_wrap = true +tracks/45/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/46/type = "value" +tracks/46/imported = false +tracks/46/enabled = true +tracks/46/path = NodePath("Environment/Clouds/Cloud12:visible") +tracks/46/interp = 1 +tracks/46/loop_wrap = true +tracks/46/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/47/type = "value" +tracks/47/imported = false +tracks/47/enabled = true +tracks/47/path = NodePath("Environment/Clouds/Cloud11:visible") +tracks/47/interp = 1 +tracks/47/loop_wrap = true +tracks/47/keys = { +"times": PackedFloat32Array(0, 59, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/48/type = "value" +tracks/48/imported = false +tracks/48/enabled = true +tracks/48/path = NodePath("Environment/Clouds/Cloud17:position") +tracks/48/interp = 1 +tracks/48/loop_wrap = true +tracks/48/keys = { +"times": PackedFloat32Array(0, 12, 47, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-1928, 1432), Vector2(-1928, 1432), Vector2(4049, 1536), Vector2(-1928, 1432)] +} +tracks/49/type = "value" +tracks/49/imported = false +tracks/49/enabled = true +tracks/49/path = NodePath("Environment/Clouds/Cloud17:scale") +tracks/49/interp = 1 +tracks/49/loop_wrap = true +tracks/49/keys = { +"times": PackedFloat32Array(0, 12, 47, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1.35085, 1.15254), Vector2(1.35085, 1.15254), Vector2(1.35085, 1.15254), Vector2(1.35085, 1.15254)] +} +tracks/50/type = "value" +tracks/50/imported = false +tracks/50/enabled = true +tracks/50/path = NodePath("Environment/Clouds/Cloud18:position") +tracks/50/interp = 1 +tracks/50/loop_wrap = true +tracks/50/keys = { +"times": PackedFloat32Array(0, 12, 47, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-865, 3055), Vector2(-865, 3055), Vector2(3895.5, 3103.47), Vector2(-865, 3055)] +} +tracks/51/type = "value" +tracks/51/imported = false +tracks/51/enabled = true +tracks/51/path = NodePath("Environment/Clouds/Cloud18:scale") +tracks/51/interp = 1 +tracks/51/loop_wrap = true +tracks/51/keys = { +"times": PackedFloat32Array(0, 12, 47, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(0.898305, 0.898305), Vector2(0.898305, 0.898305), Vector2(0.898305, 0.898305), Vector2(0.898305, 0.898305)] +} +tracks/52/type = "value" +tracks/52/imported = false +tracks/52/enabled = true +tracks/52/path = NodePath("Environment/Clouds/Cloud19:position") +tracks/52/interp = 1 +tracks/52/loop_wrap = true +tracks/52/keys = { +"times": PackedFloat32Array(0, 12, 47, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-1050, 1157), Vector2(-1050, 1157), Vector2(3710.5, 1205.47), Vector2(-1050, 1157)] +} +tracks/53/type = "value" +tracks/53/imported = false +tracks/53/enabled = true +tracks/53/path = NodePath("Environment/Clouds/Cloud19:scale") +tracks/53/interp = 1 +tracks/53/loop_wrap = true +tracks/53/keys = { +"times": PackedFloat32Array(0, 12, 47, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1.10169, 1.10169), Vector2(1.10169, 1.10169), Vector2(1.10169, 1.10169), Vector2(1.10169, 1.10169)] +} +tracks/54/type = "value" +tracks/54/imported = false +tracks/54/enabled = true +tracks/54/path = NodePath("Environment/Clouds/Cloud20:position") +tracks/54/interp = 1 +tracks/54/loop_wrap = true +tracks/54/keys = { +"times": PackedFloat32Array(0, 12, 47, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-2964, 2611), Vector2(-2964, 2611), Vector2(4117, 2739), Vector2(-2964, 2611)] +} +tracks/55/type = "value" +tracks/55/imported = false +tracks/55/enabled = true +tracks/55/path = NodePath("Environment/Clouds/Cloud20:scale") +tracks/55/interp = 1 +tracks/55/loop_wrap = true +tracks/55/keys = { +"times": PackedFloat32Array(0, 12, 47, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/56/type = "value" +tracks/56/imported = false +tracks/56/enabled = true +tracks/56/path = NodePath("Environment/Clouds/Cloud21:position") +tracks/56/interp = 1 +tracks/56/loop_wrap = true +tracks/56/keys = { +"times": PackedFloat32Array(0, 12, 47, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-493, 2589), Vector2(-493, 2589), Vector2(4267.5, 2637.47), Vector2(-493, 2589)] +} +tracks/57/type = "value" +tracks/57/imported = false +tracks/57/enabled = true +tracks/57/path = NodePath("Environment/Clouds/Cloud21:scale") +tracks/57/interp = 1 +tracks/57/loop_wrap = true +tracks/57/keys = { +"times": PackedFloat32Array(0, 12, 47, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(0.949153, 0.949153), Vector2(0.949153, 0.949153), Vector2(0.949153, 0.949153), Vector2(0.949153, 0.949153)] +} +tracks/58/type = "value" +tracks/58/imported = false +tracks/58/enabled = true +tracks/58/path = NodePath("Environment/Clouds/Cloud22:position") +tracks/58/interp = 1 +tracks/58/loop_wrap = true +tracks/58/keys = { +"times": PackedFloat32Array(0, 12, 47, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-1333, 2015), Vector2(-1333, 2015), Vector2(3427.5, 2063.47), Vector2(-1333, 2015)] +} +tracks/59/type = "value" +tracks/59/imported = false +tracks/59/enabled = true +tracks/59/path = NodePath("Environment/Clouds/Cloud22:scale") +tracks/59/interp = 1 +tracks/59/loop_wrap = true +tracks/59/keys = { +"times": PackedFloat32Array(0, 12, 47, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/60/type = "value" +tracks/60/imported = false +tracks/60/enabled = true +tracks/60/path = NodePath("Environment/Clouds/Cloud17:visible") +tracks/60/interp = 1 +tracks/60/loop_wrap = true +tracks/60/keys = { +"times": PackedFloat32Array(0, 47, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/61/type = "value" +tracks/61/imported = false +tracks/61/enabled = true +tracks/61/path = NodePath("Environment/Clouds/Cloud18:visible") +tracks/61/interp = 1 +tracks/61/loop_wrap = true +tracks/61/keys = { +"times": PackedFloat32Array(0, 47, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/62/type = "value" +tracks/62/imported = false +tracks/62/enabled = true +tracks/62/path = NodePath("Environment/Clouds/Cloud19:visible") +tracks/62/interp = 1 +tracks/62/loop_wrap = true +tracks/62/keys = { +"times": PackedFloat32Array(0, 47, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/63/type = "value" +tracks/63/imported = false +tracks/63/enabled = true +tracks/63/path = NodePath("Environment/Clouds/Cloud20:visible") +tracks/63/interp = 1 +tracks/63/loop_wrap = true +tracks/63/keys = { +"times": PackedFloat32Array(0, 47, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/64/type = "value" +tracks/64/imported = false +tracks/64/enabled = true +tracks/64/path = NodePath("Environment/Clouds/Cloud21:visible") +tracks/64/interp = 1 +tracks/64/loop_wrap = true +tracks/64/keys = { +"times": PackedFloat32Array(0, 47, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/65/type = "value" +tracks/65/imported = false +tracks/65/enabled = true +tracks/65/path = NodePath("Environment/Clouds/Cloud22:visible") +tracks/65/interp = 1 +tracks/65/loop_wrap = true +tracks/65/keys = { +"times": PackedFloat32Array(0, 47, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/66/type = "value" +tracks/66/imported = false +tracks/66/enabled = true +tracks/66/path = NodePath("Environment/Clouds/Cloud28:position") +tracks/66/interp = 1 +tracks/66/loop_wrap = true +tracks/66/keys = { +"times": PackedFloat32Array(0, 30, 56, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-461, 1787), Vector2(-461, 1787), Vector2(3829.5, 1787), Vector2(-461, 1787)] +} +tracks/67/type = "value" +tracks/67/imported = false +tracks/67/enabled = true +tracks/67/path = NodePath("Environment/Clouds/Cloud28:scale") +tracks/67/interp = 1 +tracks/67/loop_wrap = true +tracks/67/keys = { +"times": PackedFloat32Array(0, 30, 56, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(0.9, 0.9), Vector2(1, 1)] +} +tracks/68/type = "value" +tracks/68/imported = false +tracks/68/enabled = true +tracks/68/path = NodePath("Environment/Clouds/Cloud23:position") +tracks/68/interp = 1 +tracks/68/loop_wrap = true +tracks/68/keys = { +"times": PackedFloat32Array(0, 30, 56, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-1493, 3040), Vector2(-1493, 3040), Vector2(3139.75, 3040), Vector2(-1493, 3040)] +} +tracks/69/type = "value" +tracks/69/imported = false +tracks/69/enabled = true +tracks/69/path = NodePath("Environment/Clouds/Cloud23:scale") +tracks/69/interp = 1 +tracks/69/loop_wrap = true +tracks/69/keys = { +"times": PackedFloat32Array(0, 30, 56, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1.3, 1.3), Vector2(1, 1)] +} +tracks/70/type = "value" +tracks/70/imported = false +tracks/70/enabled = true +tracks/70/path = NodePath("Environment/Clouds/Cloud24:position") +tracks/70/interp = 1 +tracks/70/loop_wrap = true +tracks/70/keys = { +"times": PackedFloat32Array(0, 30, 56, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-510, 2429), Vector2(-510, 2429), Vector2(4122.75, 2429), Vector2(-510, 2429)] +} +tracks/71/type = "value" +tracks/71/imported = false +tracks/71/enabled = true +tracks/71/path = NodePath("Environment/Clouds/Cloud24:scale") +tracks/71/interp = 1 +tracks/71/loop_wrap = true +tracks/71/keys = { +"times": PackedFloat32Array(0, 30, 56, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1.3, 1.3), Vector2(1, 1)] +} +tracks/72/type = "value" +tracks/72/imported = false +tracks/72/enabled = true +tracks/72/path = NodePath("Environment/Clouds/Cloud25:position") +tracks/72/interp = 1 +tracks/72/loop_wrap = true +tracks/72/keys = { +"times": PackedFloat32Array(0, 30, 56, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-712, 1373), Vector2(-712, 1373), Vector2(3920.75, 1373), Vector2(-712, 1373)] +} +tracks/73/type = "value" +tracks/73/imported = false +tracks/73/enabled = true +tracks/73/path = NodePath("Environment/Clouds/Cloud25:scale") +tracks/73/interp = 1 +tracks/73/loop_wrap = true +tracks/73/keys = { +"times": PackedFloat32Array(0, 30, 56, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1.3, 1.3), Vector2(1, 1)] +} +tracks/74/type = "value" +tracks/74/imported = false +tracks/74/enabled = true +tracks/74/path = NodePath("Environment/Clouds/Cloud26:position") +tracks/74/interp = 1 +tracks/74/loop_wrap = true +tracks/74/keys = { +"times": PackedFloat32Array(0, 30, 56, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-269, 2004), Vector2(-269, 2004), Vector2(4021.5, 2004), Vector2(-269, 2004)] +} +tracks/75/type = "value" +tracks/75/imported = false +tracks/75/enabled = true +tracks/75/path = NodePath("Environment/Clouds/Cloud26:scale") +tracks/75/interp = 1 +tracks/75/loop_wrap = true +tracks/75/keys = { +"times": PackedFloat32Array(0, 30, 56, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(0.9, 0.9), Vector2(1, 1)] +} +tracks/76/type = "value" +tracks/76/imported = false +tracks/76/enabled = true +tracks/76/path = NodePath("Environment/Clouds/Cloud27:position") +tracks/76/interp = 1 +tracks/76/loop_wrap = true +tracks/76/keys = { +"times": PackedFloat32Array(0, 30, 56, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(-1656, 2353), Vector2(-1656, 2353), Vector2(2634.5, 2353), Vector2(-1656, 2353)] +} +tracks/77/type = "value" +tracks/77/imported = false +tracks/77/enabled = true +tracks/77/path = NodePath("Environment/Clouds/Cloud27:scale") +tracks/77/interp = 1 +tracks/77/loop_wrap = true +tracks/77/keys = { +"times": PackedFloat32Array(0, 30, 56, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(0.9, 0.9), Vector2(1, 1)] +} +tracks/78/type = "value" +tracks/78/imported = false +tracks/78/enabled = true +tracks/78/path = NodePath("Environment/Clouds/Cloud23:visible") +tracks/78/interp = 1 +tracks/78/loop_wrap = true +tracks/78/keys = { +"times": PackedFloat32Array(0, 56, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/79/type = "value" +tracks/79/imported = false +tracks/79/enabled = true +tracks/79/path = NodePath("Environment/Clouds/Cloud24:visible") +tracks/79/interp = 1 +tracks/79/loop_wrap = true +tracks/79/keys = { +"times": PackedFloat32Array(0, 56, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/80/type = "value" +tracks/80/imported = false +tracks/80/enabled = true +tracks/80/path = NodePath("Environment/Clouds/Cloud25:visible") +tracks/80/interp = 1 +tracks/80/loop_wrap = true +tracks/80/keys = { +"times": PackedFloat32Array(0, 56, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/81/type = "value" +tracks/81/imported = false +tracks/81/enabled = true +tracks/81/path = NodePath("Environment/Clouds/Cloud26:visible") +tracks/81/interp = 1 +tracks/81/loop_wrap = true +tracks/81/keys = { +"times": PackedFloat32Array(0, 56, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/82/type = "value" +tracks/82/imported = false +tracks/82/enabled = true +tracks/82/path = NodePath("Environment/Clouds/Cloud27:visible") +tracks/82/interp = 1 +tracks/82/loop_wrap = true +tracks/82/keys = { +"times": PackedFloat32Array(0, 56, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/83/type = "value" +tracks/83/imported = false +tracks/83/enabled = true +tracks/83/path = NodePath("Environment/Clouds/Cloud28:visible") +tracks/83/interp = 1 +tracks/83/loop_wrap = true +tracks/83/keys = { +"times": PackedFloat32Array(0, 56, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/84/type = "value" +tracks/84/imported = false +tracks/84/enabled = true +tracks/84/path = NodePath("Environment/Clouds/Cloud29:position") +tracks/84/interp = 1 +tracks/84/loop_wrap = true +tracks/84/keys = { +"times": PackedFloat32Array(0, 20, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(3890, 2612.5), Vector2(7216.5, 2622.5), Vector2(3890, 2612.5)] +} +tracks/85/type = "value" +tracks/85/imported = false +tracks/85/enabled = true +tracks/85/path = NodePath("Environment/Clouds/Cloud29:scale") +tracks/85/interp = 1 +tracks/85/loop_wrap = true +tracks/85/keys = { +"times": PackedFloat32Array(0, 20, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/86/type = "value" +tracks/86/imported = false +tracks/86/enabled = true +tracks/86/path = NodePath("Environment/Clouds/Cloud30:position") +tracks/86/interp = 1 +tracks/86/loop_wrap = true +tracks/86/keys = { +"times": PackedFloat32Array(0, 20, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(3832, 1394.5), Vector2(7158.5, 1404.5), Vector2(3832, 1394.5)] +} +tracks/87/type = "value" +tracks/87/imported = false +tracks/87/enabled = true +tracks/87/path = NodePath("Environment/Clouds/Cloud30:scale") +tracks/87/interp = 1 +tracks/87/loop_wrap = true +tracks/87/keys = { +"times": PackedFloat32Array(0, 20, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/88/type = "value" +tracks/88/imported = false +tracks/88/enabled = true +tracks/88/path = NodePath("Environment/Clouds/Cloud31:position") +tracks/88/interp = 1 +tracks/88/loop_wrap = true +tracks/88/keys = { +"times": PackedFloat32Array(0, 20, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(3472, 3106), Vector2(6798.5, 3116), Vector2(3472, 3106)] +} +tracks/89/type = "value" +tracks/89/imported = false +tracks/89/enabled = true +tracks/89/path = NodePath("Environment/Clouds/Cloud31:scale") +tracks/89/interp = 1 +tracks/89/loop_wrap = true +tracks/89/keys = { +"times": PackedFloat32Array(0, 20, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/90/type = "value" +tracks/90/imported = false +tracks/90/enabled = true +tracks/90/path = NodePath("Environment/Clouds/Cloud32:position") +tracks/90/interp = 1 +tracks/90/loop_wrap = true +tracks/90/keys = { +"times": PackedFloat32Array(0, 20, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(3095, 2689.5), Vector2(6421.5, 2699.5), Vector2(3095, 2689.5)] +} +tracks/91/type = "value" +tracks/91/imported = false +tracks/91/enabled = true +tracks/91/path = NodePath("Environment/Clouds/Cloud32:scale") +tracks/91/interp = 1 +tracks/91/loop_wrap = true +tracks/91/keys = { +"times": PackedFloat32Array(0, 20, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/92/type = "value" +tracks/92/imported = false +tracks/92/enabled = true +tracks/92/path = NodePath("Environment/Clouds/Cloud33:position") +tracks/92/interp = 1 +tracks/92/loop_wrap = true +tracks/92/keys = { +"times": PackedFloat32Array(0, 20, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(4016, 1558.5), Vector2(7342.5, 1568.5), Vector2(4016, 1558.5)] +} +tracks/93/type = "value" +tracks/93/imported = false +tracks/93/enabled = true +tracks/93/path = NodePath("Environment/Clouds/Cloud33:scale") +tracks/93/interp = 1 +tracks/93/loop_wrap = true +tracks/93/keys = { +"times": PackedFloat32Array(0, 20, 60), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1, 1)] +} +tracks/94/type = "value" +tracks/94/imported = false +tracks/94/enabled = true +tracks/94/path = NodePath("Environment/Clouds/Cloud29:visible") +tracks/94/interp = 1 +tracks/94/loop_wrap = true +tracks/94/keys = { +"times": PackedFloat32Array(0, 20, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/95/type = "value" +tracks/95/imported = false +tracks/95/enabled = true +tracks/95/path = NodePath("Environment/Clouds/Cloud30:visible") +tracks/95/interp = 1 +tracks/95/loop_wrap = true +tracks/95/keys = { +"times": PackedFloat32Array(0, 20, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/96/type = "value" +tracks/96/imported = false +tracks/96/enabled = true +tracks/96/path = NodePath("Environment/Clouds/Cloud31:visible") +tracks/96/interp = 1 +tracks/96/loop_wrap = true +tracks/96/keys = { +"times": PackedFloat32Array(0, 20, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/97/type = "value" +tracks/97/imported = false +tracks/97/enabled = true +tracks/97/path = NodePath("Environment/Clouds/Cloud32:visible") +tracks/97/interp = 1 +tracks/97/loop_wrap = true +tracks/97/keys = { +"times": PackedFloat32Array(0, 20, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/98/type = "value" +tracks/98/imported = false +tracks/98/enabled = true +tracks/98/path = NodePath("Environment/Clouds/Cloud33:visible") +tracks/98/interp = 1 +tracks/98/loop_wrap = true +tracks/98/keys = { +"times": PackedFloat32Array(0, 20, 60.2), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 1, +"values": [true, false, true] +} +tracks/99/type = "value" +tracks/99/imported = false +tracks/99/enabled = true +tracks/99/path = NodePath("Environment/Clouds/Cloud34:position") +tracks/99/interp = 1 +tracks/99/loop_wrap = true +tracks/99/keys = { +"times": PackedFloat32Array(0, 22, 35, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(3863, 1375), Vector2(3863, 1375), Vector2(7431, 1375), Vector2(3863, 1375)] +} +tracks/100/type = "value" +tracks/100/imported = false +tracks/100/enabled = true +tracks/100/path = NodePath("Environment/Clouds/Cloud34:scale") +tracks/100/interp = 1 +tracks/100/loop_wrap = true +tracks/100/keys = { +"times": PackedFloat32Array(0, 22, 35, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1.3, 1.3), Vector2(1, 1)] +} +tracks/101/type = "value" +tracks/101/imported = false +tracks/101/enabled = true +tracks/101/path = NodePath("Environment/Clouds/Cloud35:position") +tracks/101/interp = 1 +tracks/101/loop_wrap = true +tracks/101/keys = { +"times": PackedFloat32Array(0, 22, 35, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(3521.25, 3087), Vector2(3521.25, 3087), Vector2(7089.25, 3087), Vector2(3521.25, 3087)] +} +tracks/102/type = "value" +tracks/102/imported = false +tracks/102/enabled = true +tracks/102/path = NodePath("Environment/Clouds/Cloud35:scale") +tracks/102/interp = 1 +tracks/102/loop_wrap = true +tracks/102/keys = { +"times": PackedFloat32Array(0, 22, 35, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1.3, 1.3), Vector2(1, 1)] +} +tracks/103/type = "value" +tracks/103/imported = false +tracks/103/enabled = true +tracks/103/path = NodePath("Environment/Clouds/Cloud36:position") +tracks/103/interp = 1 +tracks/103/loop_wrap = true +tracks/103/keys = { +"times": PackedFloat32Array(0, 22, 35, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(3609.25, 3161), Vector2(3609.25, 3161), Vector2(7177.25, 3161), Vector2(3609.25, 3161)] +} +tracks/104/type = "value" +tracks/104/imported = false +tracks/104/enabled = true +tracks/104/path = NodePath("Environment/Clouds/Cloud36:scale") +tracks/104/interp = 1 +tracks/104/loop_wrap = true +tracks/104/keys = { +"times": PackedFloat32Array(0, 22, 35, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1.3, 1.3), Vector2(1, 1)] +} +tracks/105/type = "value" +tracks/105/imported = false +tracks/105/enabled = true +tracks/105/path = NodePath("Environment/Clouds/Cloud37:position") +tracks/105/interp = 1 +tracks/105/loop_wrap = true +tracks/105/keys = { +"times": PackedFloat32Array(0, 22, 35, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(3754.25, 1447), Vector2(3754.25, 1447), Vector2(7322.25, 1447), Vector2(3754.25, 1447)] +} +tracks/106/type = "value" +tracks/106/imported = false +tracks/106/enabled = true +tracks/106/path = NodePath("Environment/Clouds/Cloud37:scale") +tracks/106/interp = 1 +tracks/106/loop_wrap = true +tracks/106/keys = { +"times": PackedFloat32Array(0, 22, 35, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1.3, 1.3), Vector2(1, 1)] +} +tracks/107/type = "value" +tracks/107/imported = false +tracks/107/enabled = true +tracks/107/path = NodePath("Environment/Clouds/Cloud38:position") +tracks/107/interp = 1 +tracks/107/loop_wrap = true +tracks/107/keys = { +"times": PackedFloat32Array(0, 22, 35, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(2915.25, 2833), Vector2(2915.25, 2833), Vector2(6483.25, 2833), Vector2(2915.25, 2833)] +} +tracks/108/type = "value" +tracks/108/imported = false +tracks/108/enabled = true +tracks/108/path = NodePath("Environment/Clouds/Cloud38:scale") +tracks/108/interp = 1 +tracks/108/loop_wrap = true +tracks/108/keys = { +"times": PackedFloat32Array(0, 22, 35, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(0.898305, 0.898305), Vector2(0.898305, 0.898305), Vector2(1.3, 1.3), Vector2(0.898305, 0.898305)] +} +tracks/109/type = "value" +tracks/109/imported = false +tracks/109/enabled = true +tracks/109/path = NodePath("Environment/Clouds/Cloud39:position") +tracks/109/interp = 1 +tracks/109/loop_wrap = true +tracks/109/keys = { +"times": PackedFloat32Array(0, 22, 35, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(3270.25, 2207), Vector2(3270.25, 2207), Vector2(6838.25, 2207), Vector2(3270.25, 2207)] +} +tracks/110/type = "value" +tracks/110/imported = false +tracks/110/enabled = true +tracks/110/path = NodePath("Environment/Clouds/Cloud39:scale") +tracks/110/interp = 1 +tracks/110/loop_wrap = true +tracks/110/keys = { +"times": PackedFloat32Array(0, 22, 35, 60), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [Vector2(1, 1), Vector2(1, 1), Vector2(1.3, 1.3), Vector2(1, 1)] +} +tracks/111/type = "value" +tracks/111/imported = false +tracks/111/enabled = true +tracks/111/path = NodePath("Environment/Clouds/Cloud34:visible") +tracks/111/interp = 1 +tracks/111/loop_wrap = true +tracks/111/keys = { +"times": PackedFloat32Array(0, 22, 35, 60.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [true, true, false, true] +} +tracks/112/type = "value" +tracks/112/imported = false +tracks/112/enabled = true +tracks/112/path = NodePath("Environment/Clouds/Cloud35:visible") +tracks/112/interp = 1 +tracks/112/loop_wrap = true +tracks/112/keys = { +"times": PackedFloat32Array(0, 22, 35, 60.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [true, true, false, true] +} +tracks/113/type = "value" +tracks/113/imported = false +tracks/113/enabled = true +tracks/113/path = NodePath("Environment/Clouds/Cloud36:visible") +tracks/113/interp = 1 +tracks/113/loop_wrap = true +tracks/113/keys = { +"times": PackedFloat32Array(0, 22, 35, 60.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [true, true, false, true] +} +tracks/114/type = "value" +tracks/114/imported = false +tracks/114/enabled = true +tracks/114/path = NodePath("Environment/Clouds/Cloud37:visible") +tracks/114/interp = 1 +tracks/114/loop_wrap = true +tracks/114/keys = { +"times": PackedFloat32Array(0, 22, 35, 60.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [true, true, false, true] +} +tracks/115/type = "value" +tracks/115/imported = false +tracks/115/enabled = true +tracks/115/path = NodePath("Environment/Clouds/Cloud38:visible") +tracks/115/interp = 1 +tracks/115/loop_wrap = true +tracks/115/keys = { +"times": PackedFloat32Array(0, 22, 35, 60.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [true, true, false, true] +} +tracks/116/type = "value" +tracks/116/imported = false +tracks/116/enabled = true +tracks/116/path = NodePath("Environment/Clouds/Cloud39:visible") +tracks/116/interp = 1 +tracks/116/loop_wrap = true +tracks/116/keys = { +"times": PackedFloat32Array(0, 22, 35, 60.2), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [true, true, false, true] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_an3cu"] +_data = { +&"RESET": SubResource("Animation_gwtgs"), +&"float": SubResource("Animation_75lmk") +} + +[node name="Arena" type="Node2D" unique_id=1303894317] +y_sort_enabled = true +metadata/_edit_vertical_guides_ = [962.0] +metadata/_edit_horizontal_guides_ = [541.0] + +[node name="Environment" type="Node2D" parent="." unique_id=175230854] +top_level = true +z_index = -1 +metadata/_edit_lock_ = true + +[node name="Sky" type="ColorRect" parent="Environment" unique_id=94360692] +custom_minimum_size = Vector2(6000, 4000) +offset_left = -2048.0 +offset_top = -1498.0 +offset_right = 3952.0 +offset_bottom = 2502.0 +color = Color(0.537255, 0.745098, 0.854902, 1) +metadata/_edit_lock_ = true + +[node name="Clouds" type="Node2D" parent="Environment" unique_id=1185008864] +modulate = Color(1, 1, 1, 0.792157) +position = Vector2(-1998, -1508) +metadata/_edit_lock_ = true + +[node name="Cloud1" type="Sprite2D" parent="Environment/Clouds" unique_id=1782305988] +position = Vector2(764, 358) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud13" type="Sprite2D" parent="Environment/Clouds" unique_id=1252495143] +position = Vector2(4005, 2983) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud5" type="Sprite2D" parent="Environment/Clouds" unique_id=389507928] +position = Vector2(-152, 2723) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud6" type="Sprite2D" parent="Environment/Clouds" unique_id=1742425530] +position = Vector2(3293, 936) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud2" type="Sprite2D" parent="Environment/Clouds" unique_id=1794557101] +position = Vector2(85, 1505) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud16" type="Sprite2D" parent="Environment/Clouds" unique_id=704025637] +position = Vector2(3434, 3542) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud7" type="Sprite2D" parent="Environment/Clouds" unique_id=1758028189] +position = Vector2(1380, 3802) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud3" type="Sprite2D" parent="Environment/Clouds" unique_id=5985139] +position = Vector2(503, 1222) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud14" type="Sprite2D" parent="Environment/Clouds" unique_id=1330626069] +position = Vector2(4174, 3309) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud15" type="Sprite2D" parent="Environment/Clouds" unique_id=1777532225] +position = Vector2(4695, 2800) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud8" type="Sprite2D" parent="Environment/Clouds" unique_id=861693928] +position = Vector2(152, 3383) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud4" type="Sprite2D" parent="Environment/Clouds" unique_id=1235780171] +position = Vector2(164, 1669) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud9" type="Sprite2D" parent="Environment/Clouds" unique_id=408696617] +position = Vector2(328, 3474) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud10" type="Sprite2D" parent="Environment/Clouds" unique_id=1102819776] +position = Vector2(933, 515) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud12" type="Sprite2D" parent="Environment/Clouds" unique_id=282167481] +position = Vector2(4570, 1222) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud11" type="Sprite2D" parent="Environment/Clouds" unique_id=104859307] +position = Vector2(3784, 345) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud17" type="Sprite2D" parent="Environment/Clouds" unique_id=688649489] +position = Vector2(-2737.13, 367.814) +scale = Vector2(1.35085, 1.15254) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud18" type="Sprite2D" parent="Environment/Clouds" unique_id=1423782481] +position = Vector2(-1254.92, 3539.61) +scale = Vector2(0.898305, 0.898305) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud19" type="Sprite2D" parent="Environment/Clouds" unique_id=799657629] +position = Vector2(-2912.7, 1260.29) +scale = Vector2(1.10169, 1.10169) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud20" type="Sprite2D" parent="Environment/Clouds" unique_id=1746397113] +position = Vector2(-3251.5, 3437.56) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud21" type="Sprite2D" parent="Environment/Clouds" unique_id=793226263] +position = Vector2(-3181.26, 3581.44) +scale = Vector2(0.949153, 0.949153) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud22" type="Sprite2D" parent="Environment/Clouds" unique_id=1847174493] +position = Vector2(-420.856, 367.017) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud23" type="Sprite2D" parent="Environment/Clouds" unique_id=1919417791] +position = Vector2(-1493, 3040) +scale = Vector2(0.898305, 0.898305) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud24" type="Sprite2D" parent="Environment/Clouds" unique_id=180281898] +position = Vector2(-510, 2429) +scale = Vector2(1.15254, 1.15254) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud25" type="Sprite2D" parent="Environment/Clouds" unique_id=1773030771] +position = Vector2(-712, 1373) +scale = Vector2(1.10169, 1.10169) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud26" type="Sprite2D" parent="Environment/Clouds" unique_id=1931257210] +position = Vector2(-269, 2004) +scale = Vector2(0.79661, 0.79661) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud27" type="Sprite2D" parent="Environment/Clouds" unique_id=470231770] +position = Vector2(-1656, 2353) +scale = Vector2(0.949153, 0.949153) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud28" type="Sprite2D" parent="Environment/Clouds" unique_id=661644150] +position = Vector2(-461, 1787) +scale = Vector2(1.10169, 1.10169) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud29" type="Sprite2D" parent="Environment/Clouds" unique_id=1947496116] +position = Vector2(3890, 2612.5) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud30" type="Sprite2D" parent="Environment/Clouds" unique_id=83669870] +position = Vector2(3832, 1394.5) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud31" type="Sprite2D" parent="Environment/Clouds" unique_id=502334406] +position = Vector2(3472, 3106) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud32" type="Sprite2D" parent="Environment/Clouds" unique_id=1291497498] +position = Vector2(3095, 2689.5) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud33" type="Sprite2D" parent="Environment/Clouds" unique_id=1219460084] +position = Vector2(4016, 1558.5) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud34" type="Sprite2D" parent="Environment/Clouds" unique_id=1323216290] +position = Vector2(3863, 1375) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud35" type="Sprite2D" parent="Environment/Clouds" unique_id=2050955602] +position = Vector2(3521.25, 3087) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud36" type="Sprite2D" parent="Environment/Clouds" unique_id=1407363416] +position = Vector2(3609.25, 3161) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud37" type="Sprite2D" parent="Environment/Clouds" unique_id=1588183735] +visible = false +position = Vector2(3754.25, 1447) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud38" type="Sprite2D" parent="Environment/Clouds" unique_id=1059182738] +visible = false +position = Vector2(2915.25, 2833) +scale = Vector2(0.898305, 0.898305) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud39" type="Sprite2D" parent="Environment/Clouds" unique_id=279424614] +visible = false +position = Vector2(3270.25, 2207) +texture = ExtResource("1_1blat") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="CloudsAnimationPlayer" type="AnimationPlayer" parent="Environment" unique_id=2119891123] +root_node = NodePath("../..") +libraries/ = SubResource("AnimationLibrary_an3cu") +autoplay = &"float" + +[node name="Ground" type="Node2D" parent="Environment" unique_id=874051147] +metadata/_edit_lock_ = true + +[node name="Rocks" type="Sprite2D" parent="Environment/Ground" unique_id=283935549] +position = Vector2(986, 1264) +texture = ExtResource("1_145kx") + +[node name="Floor" type="Sprite2D" parent="Environment/Ground" unique_id=648311670] +position = Vector2(938, 568) +texture = ExtResource("1_vifjc") + +[node name="Limits" type="StaticBody2D" parent="Environment" unique_id=315801938] +metadata/_edit_lock_ = true + +[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Environment/Limits" unique_id=1080117001] +visible = false +polygon = PackedVector2Array(-814, 535, -380, 190, -306, -21, 87, -46, 346, -330, 870, -373, 1115, -418, 1363, -334, 1613, -324, 1854, -225, 2208, -197, 2675, 309, 2642, 741, 2244, 1140, 1618, 1271, 1360, 1193, 865, 1423, 706, 1377, -113, 1192, -452, 1035, -488, 902, -625, 803, -734, 680, -1660, 719, -1331, 2205, 3170, 2304, 3988, 404, 2999, -1433, 131, -1364, -1715, 264, -1659, 716, -737, 676) +metadata/_edit_lock_ = true + +[node name="Props" type="Node2D" parent="." unique_id=733079127] +y_sort_enabled = true +metadata/_edit_lock_ = true + +[node name="Shrooms" type="Node2D" parent="Props" unique_id=294405219] +y_sort_enabled = true +metadata/_edit_lock_ = true + +[node name="ShroomFat1" type="Sprite2D" parent="Props/Shrooms" unique_id=277584058] +position = Vector2(316, -293) +rotation = -0.47206 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomFat3" type="Sprite2D" parent="Props/Shrooms" unique_id=1790663544] +position = Vector2(889.983, -375.68) +rotation = 0.0723415 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomRed1" type="Sprite2D" parent="Props/Shrooms" unique_id=1748738025] +position = Vector2(211, -172) +rotation = -0.554414 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomRed2" type="Sprite2D" parent="Props/Shrooms" unique_id=1318271633] +position = Vector2(477, -354) +rotation = -0.131447 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomRed3" type="Sprite2D" parent="Props/Shrooms" unique_id=86356241] +position = Vector2(1069, -418) +rotation = 0.210047 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomRed4" type="Sprite2D" parent="Props/Shrooms" unique_id=1184667220] +position = Vector2(1184, -390) +rotation = -0.111158 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomRed5" type="Sprite2D" parent="Props/Shrooms" unique_id=443468967] +position = Vector2(1522, -323) +rotation = -0.111158 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomRed6" type="Sprite2D" parent="Props/Shrooms" unique_id=779543340] +position = Vector2(1776, -257) +rotation = 0.0517097 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomRed7" type="Sprite2D" parent="Props/Shrooms" unique_id=1008453314] +position = Vector2(2002, -212) +rotation = -0.0711099 +scale = Vector2(1.26843, 1.26843) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomBlue1" type="Sprite2D" parent="Props/Shrooms" unique_id=1634405537] +position = Vector2(-18, -43) +rotation = -0.390338 +scale = Vector2(1.27499, 1.17746) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomBlue2" type="Sprite2D" parent="Props/Shrooms" unique_id=1735955382] +position = Vector2(653, -364) +rotation = -0.390338 +scale = Vector2(1.27499, 1.17746) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomBlue3" type="Sprite2D" parent="Props/Shrooms" unique_id=2090682284] +position = Vector2(1251, -379) +rotation = -0.0470768 +scale = Vector2(1.27499, 1.17746) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomBlue4" type="Sprite2D" parent="Props/Shrooms" unique_id=1462090493] +position = Vector2(1357, -339) +rotation = 0.382315 +scale = Vector2(1.27499, 1.17746) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomBlue5" type="Sprite2D" parent="Props/Shrooms" unique_id=118520721] +position = Vector2(2188, -215) +rotation = 0.177698 +scale = Vector2(1.27499, 1.17746) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomThinFlip1" type="Sprite2D" parent="Props/Shrooms" unique_id=1429604456] +position = Vector2(451.932, -348.31) +rotation = -3.01653 +scale = Vector2(0.729666, -0.765873) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThinFlip2" type="Sprite2D" parent="Props/Shrooms" unique_id=1244651965] +position = Vector2(1324, -351) +rotation = -2.73344 +scale = Vector2(0.729666, -0.765873) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThinFlip3" type="Sprite2D" parent="Props/Shrooms" unique_id=608100048] +position = Vector2(2151.93, -234.31) +rotation = -3.0381 +scale = Vector2(0.729666, -0.765873) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomFat2" type="Sprite2D" parent="Props/Shrooms" unique_id=653980702] +position = Vector2(1901.98, -226.68) +rotation = -0.202467 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomYellow1" type="Sprite2D" parent="Props/Shrooms" unique_id=1751607583] +position = Vector2(53, -53) +rotation = 0.0837674 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow2" type="Sprite2D" parent="Props/Shrooms" unique_id=719689599] +position = Vector2(283, -266) +rotation = -0.486485 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow4" type="Sprite2D" parent="Props/Shrooms" unique_id=1543480481] +position = Vector2(1009, -410) +rotation = 0.0837674 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow5" type="Sprite2D" parent="Props/Shrooms" unique_id=720236395] +position = Vector2(1632, -326) +rotation = -0.179329 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow6" type="Sprite2D" parent="Props/Shrooms" unique_id=305001162] +position = Vector2(1668, -313) +rotation = 0.49724 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow7" type="Sprite2D" parent="Props/Shrooms" unique_id=137154030] +position = Vector2(2082, -232) +rotation = -0.300902 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomThin2" type="Sprite2D" parent="Props/Shrooms" unique_id=2115951525] +position = Vector2(-112.5, -30.0442) +rotation = -0.0993826 +scale = Vector2(0.762573, 0.762573) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin3" type="Sprite2D" parent="Props/Shrooms" unique_id=114749882] +position = Vector2(104, -70) +rotation = 0.0063462 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin4" type="Sprite2D" parent="Props/Shrooms" unique_id=1664867481] +position = Vector2(202.5, -223.044) +rotation = -0.108585 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin5" type="Sprite2D" parent="Props/Shrooms" unique_id=832600134] +position = Vector2(381.5, -325.044) +rotation = -0.027 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin6" type="Sprite2D" parent="Props/Shrooms" unique_id=1816721734] +position = Vector2(542.5, -367.044) +rotation = -0.027 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin7" type="Sprite2D" parent="Props/Shrooms" unique_id=613424330] +position = Vector2(790.5, -372.044) +rotation = 0.336266 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin8" type="Sprite2D" parent="Props/Shrooms" unique_id=802491016] +position = Vector2(1266, -377) +rotation = 0.481942 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin9" type="Sprite2D" parent="Props/Shrooms" unique_id=190595696] +position = Vector2(1436.5, -326.044) +rotation = -0.0734592 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin10" type="Sprite2D" parent="Props/Shrooms" unique_id=246429750] +position = Vector2(1666.5, -292.044) +rotation = -0.106563 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomRed8" type="Sprite2D" parent="Props/Shrooms" unique_id=1787774519] +position = Vector2(2289, -167) +rotation = 0.0517097 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomThin1" type="Sprite2D" parent="Props/Shrooms" unique_id=112794598] +position = Vector2(-122, -58) +rotation = 0.434625 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin11" type="Sprite2D" parent="Props/Shrooms" unique_id=190087175] +position = Vector2(2088.5, -233.044) +rotation = -0.0820285 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin12" type="Sprite2D" parent="Props/Shrooms" unique_id=54047855] +position = Vector2(-800, 471) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin13" type="Sprite2D" parent="Props/Shrooms" unique_id=947023667] +position = Vector2(-457, 62) +rotation = -0.368511 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin14" type="Sprite2D" parent="Props/Shrooms" unique_id=1043156928] +position = Vector2(-350.5, -23.0442) +rotation = 0.348356 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThinFlip4" type="Sprite2D" parent="Props/Shrooms" unique_id=1347196972] +position = Vector2(-660.068, 388.69) +rotation = -3.01653 +scale = Vector2(0.729666, -0.765873) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomFat4" type="Sprite2D" parent="Props/Shrooms" unique_id=638187909] +position = Vector2(-819, 547) +rotation = -0.338786 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomFat5" type="Sprite2D" parent="Props/Shrooms" unique_id=1653335383] +position = Vector2(-510, 252) +rotation = -0.121513 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomFat6" type="Sprite2D" parent="Props/Shrooms" unique_id=2006301771] +position = Vector2(-192, -54) +rotation = -0.182008 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomBlue6" type="Sprite2D" parent="Props/Shrooms" unique_id=1866894407] +position = Vector2(-713, 715) +rotation = -0.434928 +scale = Vector2(1.11803, 1.02553) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomBlue7" type="Sprite2D" parent="Props/Shrooms" unique_id=1435632458] +position = Vector2(-724, 448) +rotation = 0.0185129 +scale = Vector2(1.27499, 1.17746) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomBlue8" type="Sprite2D" parent="Props/Shrooms" unique_id=1095287211] +position = Vector2(-405, -1.00002) +rotation = 0.0185129 +scale = Vector2(1.08529, 0.99636) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomRed9" type="Sprite2D" parent="Props/Shrooms" unique_id=1232935582] +position = Vector2(-725, 776) +rotation = -0.737596 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomYellow3" type="Sprite2D" parent="Props/Shrooms" unique_id=1323672946] +position = Vector2(-601, 352) +rotation = 0.0245847 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow8" type="Sprite2D" parent="Props/Shrooms" unique_id=567593782] +position = Vector2(-394, 213) +rotation = 0.304539 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow9" type="Sprite2D" parent="Props/Shrooms" unique_id=2027885169] +position = Vector2(-297, -12) +rotation = 0.0245847 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomThin15" type="Sprite2D" parent="Props/Shrooms" unique_id=1293565294] +position = Vector2(-472, 2) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomYellow10" type="Sprite2D" parent="Props/Shrooms" unique_id=618671653] +position = Vector2(2302, -93.9999) +rotation = 0.443771 +scale = Vector2(1.48644, 1.42174) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomFat7" type="Sprite2D" parent="Props/Shrooms" unique_id=626715618] +position = Vector2(2673, 269) +rotation = 0.249999 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomFat8" type="Sprite2D" parent="Props/Shrooms" unique_id=1200122863] +position = Vector2(2408.98, -10.6802) +rotation = 0.249999 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomRed10" type="Sprite2D" parent="Props/Shrooms" unique_id=215458182] +position = Vector2(2673, 603) +rotation = -0.205529 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomRed11" type="Sprite2D" parent="Props/Shrooms" unique_id=1064485389] +position = Vector2(2457, 62.9999) +rotation = 0.133289 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomThinFlip5" type="Sprite2D" parent="Props/Shrooms" unique_id=8451084] +position = Vector2(2758.93, 383.69) +rotation = -2.72375 +scale = Vector2(0.729666, -0.765873) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomYellow11" type="Sprite2D" parent="Props/Shrooms" unique_id=1766488643] +position = Vector2(2680, 496) +rotation = 0.443771 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow12" type="Sprite2D" parent="Props/Shrooms" unique_id=1275420685] +position = Vector2(2502, 122) +rotation = 0.443771 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomRed12" type="Sprite2D" parent="Props/Shrooms" unique_id=1431956024] +position = Vector2(2558, 184) +rotation = 0.439175 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomBlue9" type="Sprite2D" parent="Props/Shrooms" unique_id=1675200660] +position = Vector2(2721, 315) +rotation = 0.0185129 +scale = Vector2(1.27499, 1.17746) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomThin16" type="Sprite2D" parent="Props/Shrooms" unique_id=938396202] +position = Vector2(2610, 225) +rotation = -0.321984 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin17" type="Sprite2D" parent="Props/Shrooms" unique_id=1843034571] +position = Vector2(2387.5, 11.9558) +rotation = -0.0440143 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomRed13" type="Sprite2D" parent="Props/Shrooms" unique_id=238279738] +position = Vector2(-556, 849) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomRed14" type="Sprite2D" parent="Props/Shrooms" unique_id=2073400019] +position = Vector2(770, 1513) +rotation = 0.159869 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomRed15" type="Sprite2D" parent="Props/Shrooms" unique_id=1929854044] +position = Vector2(1349, 1241) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomRed16" type="Sprite2D" parent="Props/Shrooms" unique_id=277974821] +position = Vector2(1261, 1284) +rotation = -0.542647 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomRed17" type="Sprite2D" parent="Props/Shrooms" unique_id=112621081] +position = Vector2(2312, 1116) +rotation = -0.294691 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomRed18" type="Sprite2D" parent="Props/Shrooms" unique_id=1149167851] +position = Vector2(2508, 864) +rotation = -0.259673 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -124) +region_enabled = true +region_rect = Rect2(667.382, 0, 217.218, 259.018) + +[node name="ShroomYellow13" type="Sprite2D" parent="Props/Shrooms" unique_id=383113753] +position = Vector2(-503, 876) +rotation = 0.218248 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow14" type="Sprite2D" parent="Props/Shrooms" unique_id=507025888] +position = Vector2(58, 1208) +rotation = 0.116333 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow15" type="Sprite2D" parent="Props/Shrooms" unique_id=468797911] +position = Vector2(529, 1365) +rotation = 0.0404178 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow16" type="Sprite2D" parent="Props/Shrooms" unique_id=406980109] +position = Vector2(934, 1419) +rotation = -0.0691034 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow17" type="Sprite2D" parent="Props/Shrooms" unique_id=2075131859] +position = Vector2(1605.04, 1336.65) +rotation = -0.0585388 +scale = Vector2(1, 1.00276) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow18" type="Sprite2D" parent="Props/Shrooms" unique_id=888582472] +position = Vector2(1943, 1282) +rotation = 0.0341268 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomYellow19" type="Sprite2D" parent="Props/Shrooms" unique_id=829261394] +position = Vector2(2631, 819) +rotation = -0.0863327 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomFat9" type="Sprite2D" parent="Props/Shrooms" unique_id=739579164] +position = Vector2(-379, 1132) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomThinFlip6" type="Sprite2D" parent="Props/Shrooms" unique_id=574701742] +position = Vector2(-583, 1039) +rotation = -2.70279 +scale = Vector2(0.729666, -0.765873) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThinFlip7" type="Sprite2D" parent="Props/Shrooms" unique_id=1622002294] +position = Vector2(168.932, 1262.69) +rotation = -2.70279 +scale = Vector2(0.729666, -0.765873) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThinFlip8" type="Sprite2D" parent="Props/Shrooms" unique_id=1177053358] +position = Vector2(903.932, 1420.69) +rotation = -3.09863 +scale = Vector2(0.729666, -0.765873) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThinFlip9" type="Sprite2D" parent="Props/Shrooms" unique_id=1317724332] +position = Vector2(1684.93, 1303.69) +rotation = -3.09863 +scale = Vector2(0.729666, -0.765873) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin18" type="Sprite2D" parent="Props/Shrooms" unique_id=201287789] +position = Vector2(-277.5, 1192.96) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin19" type="Sprite2D" parent="Props/Shrooms" unique_id=1421897402] +position = Vector2(104.5, 1254.96) +rotation = 0.328221 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin20" type="Sprite2D" parent="Props/Shrooms" unique_id=459206643] +position = Vector2(673, 1509) +rotation = 0.388862 +scale = Vector2(0.799106, 0.799106) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomFat10" type="Sprite2D" parent="Props/Shrooms" unique_id=1547146549] +position = Vector2(-683.017, 859.32) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomFat11" type="Sprite2D" parent="Props/Shrooms" unique_id=180256954] +position = Vector2(357.983, 1353.32) +rotation = -0.210709 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomFat12" type="Sprite2D" parent="Props/Shrooms" unique_id=800785738] +position = Vector2(1047, 1369) +rotation = 0.0773245 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomFat13" type="Sprite2D" parent="Props/Shrooms" unique_id=530290733] +position = Vector2(1796.98, 1283.32) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomFat14" type="Sprite2D" parent="Props/Shrooms" unique_id=1785742916] +position = Vector2(2416, 1002) +rotation = -0.543407 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -118) +region_enabled = true +region_rect = Rect2(364.026, 0, 303.355, 246.522) + +[node name="ShroomThin21" type="Sprite2D" parent="Props/Shrooms" unique_id=1852751933] +position = Vector2(446.5, 1378.96) +rotation = 0.388862 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin22" type="Sprite2D" parent="Props/Shrooms" unique_id=1987425522] +position = Vector2(1842, 1288) +rotation = 0.47074 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin23" type="Sprite2D" parent="Props/Shrooms" unique_id=2105952007] +position = Vector2(2473, 905) +rotation = -0.509121 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin24" type="Sprite2D" parent="Props/Shrooms" unique_id=1234337526] +position = Vector2(2570.5, 827.956) +rotation = -0.0398957 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomBlue10" type="Sprite2D" parent="Props/Shrooms" unique_id=1574769730] +position = Vector2(-80, 1198) +rotation = -0.110138 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomBlue11" type="Sprite2D" parent="Props/Shrooms" unique_id=1111128698] +position = Vector2(-231, 1209) +rotation = 0.335187 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomBlue12" type="Sprite2D" parent="Props/Shrooms" unique_id=1714151571] +position = Vector2(638, 1380) +rotation = -0.110138 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomBlue13" type="Sprite2D" parent="Props/Shrooms" unique_id=652718913] +position = Vector2(1454, 1249) +rotation = -0.110138 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomBlue14" type="Sprite2D" parent="Props/Shrooms" unique_id=1955398738] +position = Vector2(2203, 1198) +rotation = -0.110138 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomBlue15" type="Sprite2D" parent="Props/Shrooms" unique_id=1742085427] +position = Vector2(2100, 1241) +rotation = -0.440792 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomBlue16" type="Sprite2D" parent="Props/Shrooms" unique_id=1861929028] +position = Vector2(2712, 770) +rotation = -0.0419129 +scale = Vector2(1.27499, 1.17746) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -115) +region_enabled = true +region_rect = Rect2(175.8, 0, 188.1, 246.522) + +[node name="ShroomThinFlip10" type="Sprite2D" parent="Props/Shrooms" unique_id=690215062] +position = Vector2(2238.93, 1162.69) +rotation = 2.58643 +scale = Vector2(0.729666, -0.765873) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin25" type="Sprite2D" parent="Props/Shrooms" unique_id=1338714292] +position = Vector2(2136.5, 1225.96) +rotation = -0.0459579 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin26" type="Sprite2D" parent="Props/Shrooms" unique_id=1592765710] +position = Vector2(1512, 1310) +rotation = -0.223667 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomThin27" type="Sprite2D" parent="Props/Shrooms" unique_id=1327648575] +position = Vector2(-12.5, 1227.96) +rotation = -0.194346 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomYellow20" type="Sprite2D" parent="Props/Shrooms" unique_id=1800629271] +position = Vector2(-577, 977) +rotation = -0.196464 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="ShroomThin28" type="Sprite2D" parent="Props/Shrooms" unique_id=289672184] +position = Vector2(-645, 1030) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -110) +region_enabled = true +region_rect = Rect2(886.896, 0, 99.9249, 222.903) + +[node name="ShroomYellow21" type="Sprite2D" parent="Props/Shrooms" unique_id=167178781] +y_sort_enabled = true +position = Vector2(731, -360) +rotation = 0.0837674 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -116) +region_enabled = true +region_rect = Rect2(-0.296913, 2.76804, 172.051, 239.67) + +[node name="Grass" type="Node2D" parent="Props" unique_id=1804092297] +y_sort_enabled = true +metadata/_edit_lock_ = true + +[node name="Grass1" type="Sprite2D" parent="Props/Grass" unique_id=687474158] +position = Vector2(-438, -25) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass2" type="Sprite2D" parent="Props/Grass" unique_id=2033741597] +position = Vector2(-356, -28) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass3" type="Sprite2D" parent="Props/Grass" unique_id=512550627] +position = Vector2(-210, -64) +rotation = -0.191355 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass4" type="Sprite2D" parent="Props/Grass" unique_id=508183552] +position = Vector2(-279, -60) +rotation = -0.351512 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass5" type="Sprite2D" parent="Props/Grass" unique_id=797657195] +position = Vector2(-140, -66) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass6" type="Sprite2D" parent="Props/Grass" unique_id=182024287] +position = Vector2(-76, -63) +rotation = 0.150085 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass7" type="Sprite2D" parent="Props/Grass" unique_id=237828605] +position = Vector2(-6, -64) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass8" type="Sprite2D" parent="Props/Grass" unique_id=1961455243] +position = Vector2(51, -70) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass9" type="Sprite2D" parent="Props/Grass" unique_id=1989262095] +position = Vector2(105, -82) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass10" type="Sprite2D" parent="Props/Grass" unique_id=1681609463] +position = Vector2(162, -106) +rotation = -0.447914 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass11" type="Sprite2D" parent="Props/Grass" unique_id=1153979015] +position = Vector2(178, -174) +rotation = -0.826729 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass12" type="Sprite2D" parent="Props/Grass" unique_id=1277918831] +position = Vector2(209, -232) +rotation = -0.708204 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass13" type="Sprite2D" parent="Props/Grass" unique_id=1067995060] +position = Vector2(241, -276) +rotation = -0.614925 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass14" type="Sprite2D" parent="Props/Grass" unique_id=943762154] +position = Vector2(334, -323) +rotation = -0.476317 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass15" type="Sprite2D" parent="Props/Grass" unique_id=1676272013] +position = Vector2(385, -352) +rotation = -0.3282 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass16" type="Sprite2D" parent="Props/Grass" unique_id=552886220] +position = Vector2(441, -376) +rotation = -0.219466 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass17" type="Sprite2D" parent="Props/Grass" unique_id=61694489] +position = Vector2(513, -388) +rotation = -0.0260885 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass18" type="Sprite2D" parent="Props/Grass" unique_id=1683881822] +position = Vector2(571, -394) +rotation = 0.123957 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass19" type="Sprite2D" parent="Props/Grass" unique_id=1072465962] +position = Vector2(627.224, -381.064) +rotation = 0.0929263 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass20" type="Sprite2D" parent="Props/Grass" unique_id=653711132] +position = Vector2(692, -382) +rotation = 0.10344 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass21" type="Sprite2D" parent="Props/Grass" unique_id=289181577] +position = Vector2(760, -376) +rotation = 0.000137895 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass22" type="Sprite2D" parent="Props/Grass" unique_id=596826942] +position = Vector2(813, -380) +rotation = 0.193515 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass23" type="Sprite2D" parent="Props/Grass" unique_id=2103146235] +position = Vector2(863, -394) +rotation = 0.0942186 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass24" type="Sprite2D" parent="Props/Grass" unique_id=280821603] +position = Vector2(953, -417) +rotation = -0.108891 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass25" type="Sprite2D" parent="Props/Grass" unique_id=465233245] +position = Vector2(1025, -436) +rotation = -0.219926 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass26" type="Sprite2D" parent="Props/Grass" unique_id=1352540381] +position = Vector2(1090, -444) +rotation = -0.0691996 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass27" type="Sprite2D" parent="Props/Grass" unique_id=2088337026] +position = Vector2(1148, -438) +rotation = 0.0942186 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass28" type="Sprite2D" parent="Props/Grass" unique_id=1338352638] +position = Vector2(1206, -419) +rotation = 0.325109 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass29" type="Sprite2D" parent="Props/Grass" unique_id=131675668] +position = Vector2(1288, -387) +rotation = 0.372396 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass30" type="Sprite2D" parent="Props/Grass" unique_id=1949589080] +position = Vector2(1341, -367) +rotation = 0.4261 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass31" type="Sprite2D" parent="Props/Grass" unique_id=1187787772] +position = Vector2(1392.22, -349.064) +rotation = 0.248156 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass32" type="Sprite2D" parent="Props/Grass" unique_id=2033560070] +position = Vector2(1470, -345) +rotation = 0.140579 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass33" type="Sprite2D" parent="Props/Grass" unique_id=1388397494] +position = Vector2(1537, -344) +rotation = 0.151143 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass34" type="Sprite2D" parent="Props/Grass" unique_id=919610389] +position = Vector2(1603, -342) +rotation = 0.101008 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass35" type="Sprite2D" parent="Props/Grass" unique_id=538991561] +position = Vector2(1659, -336) +rotation = 0.248156 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass36" type="Sprite2D" parent="Props/Grass" unique_id=1854567989] +position = Vector2(1719, -319) +rotation = 0.28446 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass37" type="Sprite2D" parent="Props/Grass" unique_id=644015537] +position = Vector2(1781.22, -292.064) +rotation = 0.440044 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass38" type="Sprite2D" parent="Props/Grass" unique_id=257928879] +position = Vector2(1842.22, -257.064) +rotation = 0.352407 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass39" type="Sprite2D" parent="Props/Grass" unique_id=1128256782] +position = Vector2(1915, -248) +rotation = 0.342354 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass40" type="Sprite2D" parent="Props/Grass" unique_id=195087128] +position = Vector2(1987, -236) +rotation = 0.0942217 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass41" type="Sprite2D" parent="Props/Grass" unique_id=2145841287] +position = Vector2(2063, -246) +rotation = 0.0141966 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass42" type="Sprite2D" parent="Props/Grass" unique_id=1408052456] +position = Vector2(2133, -247) +rotation = 0.107299 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass43" type="Sprite2D" parent="Props/Grass" unique_id=1898129897] +position = Vector2(2205, -237) +rotation = 0.352407 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass44" type="Sprite2D" parent="Props/Grass" unique_id=53906324] +position = Vector2(2271.22, -219.064) +rotation = 0.342354 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass45" type="Sprite2D" parent="Props/Grass" unique_id=1869650379] +position = Vector2(2301, -137) +rotation = 0.940869 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass46" type="Sprite2D" parent="Props/Grass" unique_id=903034290] +position = Vector2(2351, -42) +rotation = 0.458519 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass47" type="Sprite2D" parent="Props/Grass" unique_id=1002859118] +position = Vector2(2442, -4) +rotation = 0.3067 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass48" type="Sprite2D" parent="Props/Grass" unique_id=2128938075] +position = Vector2(2491, 36.0001) +rotation = 0.534738 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass49" type="Sprite2D" parent="Props/Grass" unique_id=2055600487] +position = Vector2(2517.19, 77.2042) +rotation = 0.830507 +scale = Vector2(1.00312, 1) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass50" type="Sprite2D" parent="Props/Grass" unique_id=1866079242] +position = Vector2(2575, 147) +rotation = 0.976222 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass51" type="Sprite2D" parent="Props/Grass" unique_id=2001707652] +position = Vector2(2552, 127) +rotation = 0.668316 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass52" type="Sprite2D" parent="Props/Grass" unique_id=1791971325] +position = Vector2(2618, 199) +rotation = 0.534738 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass53" type="Sprite2D" parent="Props/Grass" unique_id=783145130] +position = Vector2(2711, 264) +rotation = 0.830507 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass54" type="Sprite2D" parent="Props/Grass" unique_id=138448940] +position = Vector2(-368, 174) +rotation = -0.456926 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass55" type="Sprite2D" parent="Props/Grass" unique_id=123652820] +position = Vector2(-443, 208) +rotation = -0.199051 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass56" type="Sprite2D" parent="Props/Grass" unique_id=191237187] +position = Vector2(-496, 229) +rotation = -0.456926 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass57" type="Sprite2D" parent="Props/Grass" unique_id=1507907002] +position = Vector2(-593, 303) +rotation = -0.456926 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass58" type="Sprite2D" parent="Props/Grass" unique_id=2035094497] +position = Vector2(-652, 357) +rotation = -0.456926 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass59" type="Sprite2D" parent="Props/Grass" unique_id=1425995256] +position = Vector2(-698.776, 402.936) +rotation = -0.456926 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass60" type="Sprite2D" parent="Props/Grass" unique_id=1796238573] +position = Vector2(-771, 447) +rotation = -0.456926 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass61" type="Sprite2D" parent="Props/Grass" unique_id=699271605] +position = Vector2(-801, 488) +rotation = -0.986285 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass62" type="Sprite2D" parent="Props/Grass" unique_id=196022966] +position = Vector2(2713, 523) +rotation = -0.236838 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass63" type="Sprite2D" parent="Props/Grass" unique_id=1941469595] +position = Vector2(2723, 333) +rotation = -0.0377601 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass74" type="Sprite2D" parent="Props/Grass" unique_id=1458659148] +position = Vector2(-528, 883) +rotation = 0.425283 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass75" type="Sprite2D" parent="Props/Grass" unique_id=1309841373] +position = Vector2(-567, 879) +rotation = -0.145538 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass76" type="Sprite2D" parent="Props/Grass" unique_id=1532705088] +position = Vector2(-618, 878) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass77" type="Sprite2D" parent="Props/Grass" unique_id=1465876269] +position = Vector2(-702, 875) +rotation = -0.136894 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass78" type="Sprite2D" parent="Props/Grass" unique_id=1305668767] +position = Vector2(-640, 870) +rotation = 0.0992107 +scale = Vector2(0.89227, 0.890196) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass73" type="Sprite2D" parent="Props/Grass" unique_id=1072152626] +position = Vector2(2726, 803) +rotation = -0.177835 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass72" type="Sprite2D" parent="Props/Grass" unique_id=46662648] +position = Vector2(2687.59, 820.894) +rotation = -0.335356 +scale = Vector2(0.996004, 0.997321) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass71" type="Sprite2D" parent="Props/Grass" unique_id=2032720859] +position = Vector2(2635, 831) +rotation = -0.335356 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass70" type="Sprite2D" parent="Props/Grass" unique_id=462183479] +position = Vector2(2584, 850) +rotation = -0.335356 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass69" type="Sprite2D" parent="Props/Grass" unique_id=1113914163] +position = Vector2(2534, 878) +rotation = -0.335356 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass68" type="Sprite2D" parent="Props/Grass" unique_id=1190460320] +position = Vector2(2485, 937) +rotation = -0.335356 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass67" type="Sprite2D" parent="Props/Grass" unique_id=1835926965] +position = Vector2(2472, 984) +rotation = -0.335356 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass66" type="Sprite2D" parent="Props/Grass" unique_id=2047227429] +position = Vector2(2442, 1015) +rotation = -0.335356 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass65" type="Sprite2D" parent="Props/Grass" unique_id=1713062353] +position = Vector2(2404, 1033) +rotation = -0.335356 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass64" type="Sprite2D" parent="Props/Grass" unique_id=481054252] +position = Vector2(2357, 1063) +rotation = -0.419734 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass79" type="Sprite2D" parent="Props/Grass" unique_id=2020853259] +position = Vector2(2328, 1128) +rotation = -0.449816 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass80" type="Sprite2D" parent="Props/Grass" unique_id=889050889] +position = Vector2(2321, 1180) +rotation = -0.194528 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass81" type="Sprite2D" parent="Props/Grass" unique_id=2060105202] +position = Vector2(2309, 1201) +rotation = -0.24821 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass82" type="Sprite2D" parent="Props/Grass" unique_id=815997639] +position = Vector2(2283, 1232) +rotation = -0.335356 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass83" type="Sprite2D" parent="Props/Grass" unique_id=770006847] +position = Vector2(2231, 1246) +rotation = -0.0390497 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass84" type="Sprite2D" parent="Props/Grass" unique_id=548283780] +position = Vector2(2172, 1251) +rotation = -0.0459226 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass85" type="Sprite2D" parent="Props/Grass" unique_id=236523524] +position = Vector2(2116, 1252) +rotation = -0.140489 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass86" type="Sprite2D" parent="Props/Grass" unique_id=1737129773] +position = Vector2(2062, 1263) +rotation = -0.295208 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass87" type="Sprite2D" parent="Props/Grass" unique_id=316839507] +position = Vector2(2011, 1282) +rotation = -0.261242 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass88" type="Sprite2D" parent="Props/Grass" unique_id=1664332570] +position = Vector2(1964, 1309) +rotation = -0.138799 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass89" type="Sprite2D" parent="Props/Grass" unique_id=233434085] +position = Vector2(1906, 1315) +rotation = 0.0341306 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass90" type="Sprite2D" parent="Props/Grass" unique_id=1254834676] +position = Vector2(1857, 1309) +rotation = -0.00321719 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass91" type="Sprite2D" parent="Props/Grass" unique_id=1555585640] +position = Vector2(1795, 1307) +rotation = -0.0304235 +scale = Vector2(0.994353, 0.99967) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass92" type="Sprite2D" parent="Props/Grass" unique_id=631071256] +position = Vector2(1639, 1358) +rotation = -0.250016 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass93" type="Sprite2D" parent="Props/Grass" unique_id=1228373694] +position = Vector2(1563, 1353) +rotation = 0.257884 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass94" type="Sprite2D" parent="Props/Grass" unique_id=1762553081] +position = Vector2(1739, 1322) +rotation = -0.22541 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass95" type="Sprite2D" parent="Props/Grass" unique_id=934988323] +position = Vector2(1691, 1341) +rotation = -0.244855 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass96" type="Sprite2D" parent="Props/Grass" unique_id=219044881] +position = Vector2(1506, 1318) +rotation = 0.717251 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass97" type="Sprite2D" parent="Props/Grass" unique_id=1433162729] +position = Vector2(1466, 1276) +rotation = 0.644911 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass98" type="Sprite2D" parent="Props/Grass" unique_id=1294353389] +position = Vector2(1425, 1259) +rotation = 0.0565641 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass99" type="Sprite2D" parent="Props/Grass" unique_id=475130493] +position = Vector2(1366, 1265) +rotation = -0.149705 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass100" type="Sprite2D" parent="Props/Grass" unique_id=1255671583] +position = Vector2(1308, 1292) +rotation = -0.153005 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass101" type="Sprite2D" parent="Props/Grass" unique_id=320628739] +position = Vector2(1255, 1311) +rotation = 0.0565641 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass102" type="Sprite2D" parent="Props/Grass" unique_id=23835566] +position = Vector2(1137, 1337) +rotation = 0.0565641 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass103" type="Sprite2D" parent="Props/Grass" unique_id=452222029] +position = Vector2(1096, 1376) +rotation = -0.369265 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass104" type="Sprite2D" parent="Props/Grass" unique_id=415359261] +position = Vector2(1051, 1418) +rotation = -0.358503 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass105" type="Sprite2D" parent="Props/Grass" unique_id=12424041] +position = Vector2(947, 1450) +rotation = -0.124099 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass106" type="Sprite2D" parent="Props/Grass" unique_id=762240781] +position = Vector2(988, 1444) +rotation = 0.0565641 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass107" type="Sprite2D" parent="Props/Grass" unique_id=14977069] +position = Vector2(1203, 1319) +rotation = -0.10731 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass108" type="Sprite2D" parent="Props/Grass" unique_id=1083720539] +position = Vector2(851, 1493) +rotation = -0.241176 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass109" type="Sprite2D" parent="Props/Grass" unique_id=389310614] +position = Vector2(894, 1462) +rotation = -0.0791258 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass110" type="Sprite2D" parent="Props/Grass" unique_id=1157089736] +position = Vector2(823, 1532) +rotation = -0.36178 +scale = Vector2(0.896039, 0.929433) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass111" type="Sprite2D" parent="Props/Grass" unique_id=961802756] +position = Vector2(778, 1556) +rotation = -0.183817 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass112" type="Sprite2D" parent="Props/Grass" unique_id=515527066] +position = Vector2(711, 1555) +rotation = 0.23761 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass113" type="Sprite2D" parent="Props/Grass" unique_id=1425865781] +position = Vector2(661, 1543) +rotation = 0.23761 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass114" type="Sprite2D" parent="Props/Grass" unique_id=86389955] +position = Vector2(678, 1421) +rotation = 0.450015 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass115" type="Sprite2D" parent="Props/Grass" unique_id=1235180294] +position = Vector2(653, 1408) +rotation = 0.246509 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass116" type="Sprite2D" parent="Props/Grass" unique_id=667791651] +position = Vector2(603, 1405) +rotation = -0.0914229 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass117" type="Sprite2D" parent="Props/Grass" unique_id=1549436545] +position = Vector2(547, 1414) +rotation = -0.119099 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass118" type="Sprite2D" parent="Props/Grass" unique_id=1518097522] +position = Vector2(489, 1402) +rotation = 0.450015 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass119" type="Sprite2D" parent="Props/Grass" unique_id=845796398] +position = Vector2(436, 1385) +rotation = 0.305517 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass120" type="Sprite2D" parent="Props/Grass" unique_id=1374211825] +position = Vector2(395, 1383) +rotation = -0.203084 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass121" type="Sprite2D" parent="Props/Grass" unique_id=950512685] +position = Vector2(352, 1390) +rotation = -0.194154 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass122" type="Sprite2D" parent="Props/Grass" unique_id=2053854875] +position = Vector2(257, 1351) +rotation = 0.488442 +scale = Vector2(0.984626, 0.967626) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass123" type="Sprite2D" parent="Props/Grass" unique_id=1476263589] +position = Vector2(288, 1385) +rotation = 0.450015 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass124" type="Sprite2D" parent="Props/Grass" unique_id=190965239] +position = Vector2(221, 1329) +rotation = 0.132079 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass125" type="Sprite2D" parent="Props/Grass" unique_id=230770935] +position = Vector2(174, 1314) +rotation = 0.346821 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass126" type="Sprite2D" parent="Props/Grass" unique_id=1877601726] +position = Vector2(133, 1299) +rotation = 0.450015 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass127" type="Sprite2D" parent="Props/Grass" unique_id=1770581729] +position = Vector2(88, 1271) +rotation = 0.450015 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass128" type="Sprite2D" parent="Props/Grass" unique_id=2117133250] +position = Vector2(44.224, 1260.94) +rotation = 0.0963627 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass129" type="Sprite2D" parent="Props/Grass" unique_id=2070175742] +position = Vector2(-4.776, 1248.94) +rotation = 0.0963627 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass130" type="Sprite2D" parent="Props/Grass" unique_id=1117328285] +position = Vector2(-52.776, 1239.94) +rotation = 0.0963627 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass131" type="Sprite2D" parent="Props/Grass" unique_id=1127886691] +position = Vector2(-113, 1228) +rotation = 0.0963627 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass132" type="Sprite2D" parent="Props/Grass" unique_id=125134466] +position = Vector2(-168, 1233) +rotation = -0.0568394 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass133" type="Sprite2D" parent="Props/Grass" unique_id=418069536] +position = Vector2(-225, 1238) +rotation = 0.0963627 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass134" type="Sprite2D" parent="Props/Grass" unique_id=1034413955] +position = Vector2(-281, 1225) +rotation = 0.599394 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass135" type="Sprite2D" parent="Props/Grass" unique_id=256601729] +position = Vector2(-313, 1160) +rotation = -0.539764 +scale = Vector2(0.920388, 0.98772) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass136" type="Sprite2D" parent="Props/Grass" unique_id=1322336207] +position = Vector2(-366, 1176) +rotation = 0.109422 +scale = Vector2(0.936615, 0.872008) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass137" type="Sprite2D" parent="Props/Grass" unique_id=515940573] +position = Vector2(-423, 1151) +rotation = 0.527011 +scale = Vector2(0.824352, 0.816612) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass138" type="Sprite2D" parent="Props/Grass" unique_id=1813960168] +position = Vector2(-471, 1133) +rotation = 0.452393 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass139" type="Sprite2D" parent="Props/Grass" unique_id=534215461] +position = Vector2(-541, 1058) +rotation = 0.138139 +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass140" type="Sprite2D" parent="Props/Grass" unique_id=2006002509] +position = Vector2(-590, 1054) +rotation = -0.110402 +scale = Vector2(0.845736, 0.853483) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) + +[node name="Grass141" type="Sprite2D" parent="Props/Grass" unique_id=394125180] +position = Vector2(-642, 1052) +texture = ExtResource("2_kesm7") +offset = Vector2(0, -42) +region_enabled = true +region_rect = Rect2(996.053, 4.65938, 177.044, 92.8809) diff --git a/demo/scenes/base/clouds.tscn b/demo/scenes/base/clouds.tscn new file mode 100644 index 0000000..0617b4e --- /dev/null +++ b/demo/scenes/base/clouds.tscn @@ -0,0 +1,256 @@ +[gd_scene format=3 uid="uid://dt2jlrqffpyw"] + +[ext_resource type="Texture2D" uid="uid://65b6yuobhxf8" path="res://demo/assets/env_clouds.png" id="1_eigiy"] + +[node name="Clouds" type="Node2D" unique_id=1316063806] +modulate = Color(1, 1, 1, 0.792157) +position = Vector2(-1998, -1508) +metadata/_edit_lock_ = true + +[node name="Cloud1" type="Sprite2D" parent="." unique_id=346543694] +position = Vector2(764, 358) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud13" type="Sprite2D" parent="." unique_id=1310596915] +position = Vector2(4005, 2983) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud5" type="Sprite2D" parent="." unique_id=1151157084] +position = Vector2(-152, 2723) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud6" type="Sprite2D" parent="." unique_id=1521937570] +position = Vector2(3293, 936) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud2" type="Sprite2D" parent="." unique_id=1457814274] +position = Vector2(85, 1505) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud16" type="Sprite2D" parent="." unique_id=610994406] +position = Vector2(3434, 3542) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud7" type="Sprite2D" parent="." unique_id=1091074189] +position = Vector2(1380, 3802) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud3" type="Sprite2D" parent="." unique_id=587568980] +position = Vector2(503, 1222) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud14" type="Sprite2D" parent="." unique_id=249322954] +position = Vector2(4174, 3309) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud15" type="Sprite2D" parent="." unique_id=1986754018] +position = Vector2(4695, 2800) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud8" type="Sprite2D" parent="." unique_id=1289034421] +position = Vector2(152, 3383) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud4" type="Sprite2D" parent="." unique_id=2146530292] +position = Vector2(164, 1669) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud9" type="Sprite2D" parent="." unique_id=1179513086] +position = Vector2(328, 3474) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud10" type="Sprite2D" parent="." unique_id=2004713213] +position = Vector2(933, 515) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud12" type="Sprite2D" parent="." unique_id=1841978383] +position = Vector2(4570, 1222) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud11" type="Sprite2D" parent="." unique_id=1209290561] +position = Vector2(3784, 345) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud17" type="Sprite2D" parent="." unique_id=1856882004] +position = Vector2(-2737.13, 367.814) +scale = Vector2(1.35085, 1.15254) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud18" type="Sprite2D" parent="." unique_id=1574598246] +position = Vector2(-1254.92, 3539.61) +scale = Vector2(0.898305, 0.898305) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud19" type="Sprite2D" parent="." unique_id=499606043] +position = Vector2(-2912.7, 1260.29) +scale = Vector2(1.10169, 1.10169) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud20" type="Sprite2D" parent="." unique_id=322162562] +position = Vector2(-3251.5, 3437.56) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud21" type="Sprite2D" parent="." unique_id=982013307] +position = Vector2(-3181.26, 3581.44) +scale = Vector2(0.949153, 0.949153) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud22" type="Sprite2D" parent="." unique_id=1793374239] +position = Vector2(-420.856, 367.017) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud23" type="Sprite2D" parent="." unique_id=1946131207] +position = Vector2(-1493, 3040) +scale = Vector2(0.898305, 0.898305) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud24" type="Sprite2D" parent="." unique_id=1235780655] +position = Vector2(-510, 2429) +scale = Vector2(1.15254, 1.15254) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud25" type="Sprite2D" parent="." unique_id=1491249731] +position = Vector2(-712, 1373) +scale = Vector2(1.10169, 1.10169) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud26" type="Sprite2D" parent="." unique_id=629483814] +position = Vector2(-269, 2004) +scale = Vector2(0.79661, 0.79661) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud27" type="Sprite2D" parent="." unique_id=1177358018] +position = Vector2(-1656, 2353) +scale = Vector2(0.949153, 0.949153) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud28" type="Sprite2D" parent="." unique_id=598900470] +position = Vector2(-461, 1787) +scale = Vector2(1.10169, 1.10169) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud29" type="Sprite2D" parent="." unique_id=23062617] +position = Vector2(3890, 2612.5) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud30" type="Sprite2D" parent="." unique_id=273926207] +position = Vector2(3832, 1394.5) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud31" type="Sprite2D" parent="." unique_id=1688883745] +position = Vector2(3472, 3106) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud32" type="Sprite2D" parent="." unique_id=64646907] +position = Vector2(3095, 2689.5) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud33" type="Sprite2D" parent="." unique_id=1037012955] +position = Vector2(4016, 1558.5) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud34" type="Sprite2D" parent="." unique_id=1048463283] +position = Vector2(3863, 1375) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(12, 7, 455, 168) + +[node name="Cloud35" type="Sprite2D" parent="." unique_id=215970958] +position = Vector2(3521.25, 3087) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud36" type="Sprite2D" parent="." unique_id=1367917321] +position = Vector2(3609.25, 3161) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(507, 7, 193, 88) + +[node name="Cloud37" type="Sprite2D" parent="." unique_id=927414965] +visible = false +position = Vector2(3754.25, 1447) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(501, 99, 210, 92) + +[node name="Cloud38" type="Sprite2D" parent="." unique_id=106187033] +visible = false +position = Vector2(2915.25, 2833) +scale = Vector2(0.898305, 0.898305) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) + +[node name="Cloud39" type="Sprite2D" parent="." unique_id=1996480093] +visible = false +position = Vector2(3270.25, 2207) +texture = ExtResource("1_eigiy") +region_enabled = true +region_rect = Rect2(10, 189, 644, 165) diff --git a/demo/scenes/base/code_edit.gd b/demo/scenes/base/code_edit.gd new file mode 100644 index 0000000..5416996 --- /dev/null +++ b/demo/scenes/base/code_edit.gd @@ -0,0 +1,140 @@ +#* +#* code_edit.gd +#* ============================================================================= +#* Copyright 2024 Serhii Snitsaruk +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* + +extends CodeEdit + +const RESERVED_WORDS := [ + # Control flow. + "break", + "continue", + "elif", + "else", + "for", + "if", + "match", + "pass", + "return", + "when", + "while", + # Declarations. + "class", + "class_name", + "const", + "enum", + "extends", + "func", + "namespace", + "signal", + "static", + "trait", + "var", + # Other keywords. + "await", + "breakpoint", + "self", + "super", + "yield", + # Operators. + "and", + "as", + "in", + "is", + "not", + "or", + # Special values. + "false", + "null", + "true", + # Constants. + "INF", + "NAN", + "PI", + "TAU", + # Functions. + "assert", + "preload", +] + +const TYPE_WORDS := [ + "bool", + "int", + "float", + "void", + "String", + "Vector2", + "Vector2i", + "Rect2", + "Rect2i", + "Vector3", + "Vector3i", + "Transform2D", + "Vector4", + "Vector4i", + "Plane", + "Quaternion", + "AABB", + "Basis", + "Transform3D", + "Projection", + "Color", + "StringName", + "NodePath", + "RID", + "Callable", + "Signal", + "Dictionary", + "Array", + "PackedByteArray", + "PackedInt32Array", + "PackedInt64Array", + "PackedFloat32Array", + "PackedFloat64Array", + "PackedStringArray", + "PackedVector2Array", + "PackedVector3Array", + "PackedColorArray", + # Other types + "Status", +] + + +func _ready() -> void: + var highlighter := CodeHighlighter.new() + syntax_highlighter = highlighter + highlighter.number_color = Color.AQUAMARINE + highlighter.symbol_color = Color.CORNFLOWER_BLUE + highlighter.function_color = Color.DEEP_SKY_BLUE + highlighter.member_variable_color = Color.LIGHT_BLUE + + # Engine types + for c in ClassDB.get_class_list(): + syntax_highlighter.add_keyword_color(c, Color.AQUAMARINE) + + syntax_highlighter.add_color_region("#", "", Color.DIM_GRAY, true) + syntax_highlighter.add_color_region("@", " ", Color.GOLDENROD) + syntax_highlighter.add_color_region("\"", "\"", Color.GOLD) + + for keyword in RESERVED_WORDS: + syntax_highlighter.add_keyword_color(keyword, Color.INDIAN_RED) + + for typeword in TYPE_WORDS: + syntax_highlighter.add_keyword_color(typeword, Color.AQUAMARINE) + + +func set_source_code(source_code: String) -> void: + # Hide license header + var idx: int = source_code.find("#*") + while idx != - 1: + source_code = source_code.substr(0, idx) + source_code.substr(source_code.findn("\n", idx) + 1) + idx = source_code.findn("#*", idx) + + text = "" # Workaround + text = source_code diff --git a/demo/scenes/base/code_edit.gd.uid b/demo/scenes/base/code_edit.gd.uid new file mode 100644 index 0000000..667ed34 --- /dev/null +++ b/demo/scenes/base/code_edit.gd.uid @@ -0,0 +1 @@ +uid://cb8thyd7vi2nj diff --git a/demo/scenes/base/toggle_fullscreen.gd b/demo/scenes/base/toggle_fullscreen.gd new file mode 100644 index 0000000..172889a --- /dev/null +++ b/demo/scenes/base/toggle_fullscreen.gd @@ -0,0 +1,18 @@ +extends Button + + +func _ready() -> void: + pressed.connect(_toggle_fullscreen) + + # Set scaling properties and base resolution + get_window().mode = Window.MODE_FULLSCREEN + get_window().content_scale_aspect = Window.CONTENT_SCALE_ASPECT_KEEP + get_window().content_scale_mode = Window.CONTENT_SCALE_MODE_CANVAS_ITEMS + get_window().content_scale_size = Vector2i(1920,1080) + + +func _toggle_fullscreen() -> void: + if get_window().mode != Window.MODE_FULLSCREEN: + get_window().mode = Window.MODE_FULLSCREEN + else: + get_window().mode = Window.MODE_MAXIMIZED diff --git a/demo/scenes/base/toggle_fullscreen.gd.uid b/demo/scenes/base/toggle_fullscreen.gd.uid new file mode 100644 index 0000000..10e1acb --- /dev/null +++ b/demo/scenes/base/toggle_fullscreen.gd.uid @@ -0,0 +1 @@ +uid://c5p1i8ofpv7qn diff --git a/demo/scenes/game.gd b/demo/scenes/game.gd new file mode 100644 index 0000000..0fbcd77 --- /dev/null +++ b/demo/scenes/game.gd @@ -0,0 +1,84 @@ +extends Node2D + +const Simple := preload("res://demo/agents/01_agent_melee_simple.tscn") +const Charger := preload("res://demo/agents/02_agent_charger.tscn") +const Imp := preload("res://demo/agents/03_agent_imp.tscn") +const Skirmisher := preload("res://demo/agents/04_agent_skirmisher.tscn") +const Ranged := preload("res://demo/agents/05_agent_ranged.tscn") +const Combo := preload("res://demo/agents/06_agent_melee_combo.tscn") +const Nuanced := preload("res://demo/agents/07_agent_melee_nuanced.tscn") +const Demon := preload("res://demo/agents/08_agent_demon.tscn") +const Summoner := preload("res://demo/agents/09_agent_summoner.tscn") + +const WAVES: Array = [ + [Simple, Simple, Nuanced], + [Simple, Nuanced, Charger], + [Simple, Simple, Simple, Ranged, Nuanced], + [Simple, Simple, Summoner], + [Ranged, Skirmisher, Nuanced, Simple, Simple], + [Nuanced, Nuanced, Combo, Ranged, Simple], + [Demon, Charger, Simple, Simple, Simple, Skirmisher], + [Demon, Demon, Nuanced, Combo], + [Summoner, Ranged, Nuanced, Nuanced, Ranged, Skirmisher, Simple], + [Demon, Demon, Summoner, Skirmisher, Nuanced, Nuanced, Combo], +] + +@export var wave_index: int = -1 +@export var agents_alive: int = 0 + +@onready var gong: StaticBody2D = $Gong +@onready var player: CharacterBody2D = $Player +@onready var spawn_points: Node2D = $SpawnPoints +@onready var hp_bar: TextureProgressBar = %HPBar +@onready var round_counter: Label = %RoundCounter + + +func _ready() -> void: + hp_bar.max_value = player.get_health().max_health + player.get_health().damaged.connect(func(_a,_b): hp_bar.value = player.get_health().get_current()) + player.death.connect(_on_player_death) + + +func _update_round_counter() -> void: + round_counter.text = "Round %s/%s" % [wave_index + 1, WAVES.size()] + + +func _on_gong_gong_struck() -> void: + _start_round() + + +func _start_round() -> void: + wave_index += 1 + if wave_index >= WAVES.size(): + player.set_victorious() + round_counter.text = "Victorious!" + return + + await get_tree().create_timer(3.0).timeout + _update_round_counter() + + var spawns: Array = spawn_points.get_children() + spawns.shuffle() + for i in WAVES[wave_index].size(): + var agent_resource: PackedScene = WAVES[wave_index][i] + var agent: CharacterBody2D = agent_resource.instantiate() + add_child(agent) + agent.global_position = spawns[i].global_position + agent.death.connect(_on_agent_death) + agent.play_summoning_effect() + agents_alive += 1 + + +func _on_agent_death() -> void: + agents_alive -= 1 + if agents_alive == 0: + _start_round() + + +func _on_player_death() -> void: + await get_tree().create_timer(3.0).timeout + get_tree().reload_current_scene() + + +func _on_switch_to_showcase_pressed() -> void: + get_tree().change_scene_to_file("res://demo/scenes/showcase.tscn") diff --git a/demo/scenes/game.gd.uid b/demo/scenes/game.gd.uid new file mode 100644 index 0000000..9e1f203 --- /dev/null +++ b/demo/scenes/game.gd.uid @@ -0,0 +1 @@ +uid://bwhv180m71qs4 diff --git a/demo/scenes/game.tscn b/demo/scenes/game.tscn new file mode 100644 index 0000000..5791786 --- /dev/null +++ b/demo/scenes/game.tscn @@ -0,0 +1,196 @@ +[gd_scene format=3 uid="uid://clyhgbpfpmtw7"] + +[ext_resource type="Script" uid="uid://bwhv180m71qs4" path="res://demo/scenes/game.gd" id="1_qw71e"] +[ext_resource type="Theme" uid="uid://boqtjf88xcpu4" path="res://demo/assets/ui.theme" id="2_r21q3"] +[ext_resource type="Texture2D" uid="uid://tyu0ua1ju38l" path="res://demo/assets/logo.png" id="3_g0us4"] +[ext_resource type="FontFile" uid="uid://d25vkmce7mhlt" path="res://demo/assets/fonts/knewave_regular.ttf" id="4_w0vii"] +[ext_resource type="Script" uid="uid://c5p1i8ofpv7qn" path="res://demo/scenes/base/toggle_fullscreen.gd" id="5_m16ov"] +[ext_resource type="Texture2D" uid="uid://dlw15foygohrk" path="res://demo/assets/hp_under.png" id="6_622dk"] +[ext_resource type="Texture2D" uid="uid://cls8jtnu413o8" path="res://demo/assets/hp_over.png" id="7_430mt"] +[ext_resource type="Texture2D" uid="uid://hnwi23oef752" path="res://demo/assets/hp_bar.png" id="8_invih"] +[ext_resource type="PackedScene" uid="uid://bsig1usigbbuy" path="res://demo/scenes/base/arena.tscn" id="9_k3uu1"] +[ext_resource type="PackedScene" uid="uid://bpd1wmw2f7bvg" path="res://demo/props/gong.tscn" id="10_tftjb"] +[ext_resource type="PackedScene" uid="uid://d07ag5dcje13i" path="res://demo/agents/player/player.tscn" id="11_bndob"] + +[sub_resource type="LabelSettings" id="LabelSettings_qvxvp"] +font = ExtResource("4_w0vii") +font_size = 33 +outline_size = 11 +outline_color = Color(0.258915, 0.234974, 0.191974, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_628x3"] +font = ExtResource("4_w0vii") +font_size = 36 +font_color = Color(1, 1, 0.239216, 1) +outline_size = 20 +outline_color = Color(0.211521, 0.23888, 0.290166, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_grcwx"] +font = ExtResource("4_w0vii") +font_size = 37 +outline_size = 12 +outline_color = Color(0.317525, 0.344884, 0.388373, 1) + +[node name="Game" type="Node2D" unique_id=1801956992] +y_sort_enabled = true +script = ExtResource("1_qw71e") + +[node name="UI Layer" type="CanvasLayer" parent="." unique_id=876263967] + +[node name="Control" type="Control" parent="UI Layer" unique_id=1705458422] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("2_r21q3") + +[node name="Toolbar" type="PanelContainer" parent="UI Layer/Control" unique_id=103915776] +custom_minimum_size = Vector2(0, 54.26) +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +offset_bottom = 64.0 +grow_horizontal = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="UI Layer/Control/Toolbar" unique_id=817546466] +layout_mode = 2 +theme_override_constants/separation = 4 + +[node name="ToggleFullscreen" type="Button" parent="UI Layer/Control/Toolbar/HBoxContainer" unique_id=2008513897] +layout_mode = 2 +focus_mode = 0 +theme_override_fonts/font = ExtResource("4_w0vii") +theme_override_font_sizes/font_size = 22 +text = "Toggle Fullscreen" +script = ExtResource("5_m16ov") + +[node name="Switch to Showcase" type="Button" parent="UI Layer/Control/Toolbar/HBoxContainer" unique_id=767941678] +layout_mode = 2 +focus_mode = 0 +theme_override_fonts/font = ExtResource("4_w0vii") +theme_override_font_sizes/font_size = 22 +text = "Switch to Showcase +" + +[node name="RoundCounter" type="Label" parent="UI Layer/Control/Toolbar/HBoxContainer" unique_id=1893018503] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 6 +text = "Strike the Gong to begin!" +label_settings = SubResource("LabelSettings_qvxvp") + +[node name="HPBar" type="TextureProgressBar" parent="UI Layer/Control/Toolbar/HBoxContainer" unique_id=1903605432] +unique_name_in_owner = true +layout_mode = 2 +value = 100.0 +texture_under = ExtResource("6_622dk") +texture_over = ExtResource("7_430mt") +texture_progress = ExtResource("8_invih") + +[node name="Logo" type="TextureRect" parent="UI Layer/Control" unique_id=801119834] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -1899.0 +offset_top = -130.0 +offset_right = -1643.0 +offset_bottom = -45.0 +grow_horizontal = 0 +grow_vertical = 0 +texture = ExtResource("3_g0us4") + +[node name="Demo project" type="Label" parent="UI Layer/Control/Logo" unique_id=2028180824] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -316.0 +offset_top = -72.0 +offset_right = 13.0 +offset_bottom = 74.0 +grow_horizontal = 0 +grow_vertical = 0 +text = "demo project" +label_settings = SubResource("LabelSettings_628x3") +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="Keys" type="Label" parent="UI Layer/Control" unique_id=1538454448] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -336.0 +offset_top = -208.0 +offset_right = -18.0 +offset_bottom = -25.0 +grow_horizontal = 0 +grow_vertical = 0 +text = "Move WASD +Dodge SPACE +Attack ENTER / F +" +label_settings = SubResource("LabelSettings_grcwx") + +[node name="Arena" parent="." unique_id=937680588 instance=ExtResource("9_k3uu1")] +metadata/_edit_lock_ = true + +[node name="Gong" parent="." unique_id=1864183725 instance=ExtResource("10_tftjb")] +position = Vector2(923, -21) + +[node name="Player" parent="." unique_id=831866403 instance=ExtResource("11_bndob")] +position = Vector2(843, 455) + +[node name="Camera2D" type="Camera2D" parent="Player" unique_id=1335653447] +position = Vector2(0, -100) +zoom = Vector2(0.88, 0.88) +process_callback = 0 +position_smoothing_enabled = true +drag_horizontal_enabled = true +drag_vertical_enabled = true +drag_top_margin = 0.1 +drag_bottom_margin = 0.1 + +[node name="SpawnPoints" type="Node2D" parent="." unique_id=855023223] + +[node name="SpawnPosition1" type="Marker2D" parent="SpawnPoints" unique_id=986754785] +position = Vector2(512, -180) + +[node name="SpawnPosition2" type="Marker2D" parent="SpawnPoints" unique_id=719842184] +position = Vector2(1421, -150) + +[node name="SpawnPosition3" type="Marker2D" parent="SpawnPoints" unique_id=1706242731] +position = Vector2(1512, 300) + +[node name="SpawnPosition4" type="Marker2D" parent="SpawnPoints" unique_id=2114504959] +position = Vector2(2264, 345) + +[node name="SpawnPosition5" type="Marker2D" parent="SpawnPoints" unique_id=1530300617] +position = Vector2(1655, 789) + +[node name="SpawnPosition6" type="Marker2D" parent="SpawnPoints" unique_id=576952141] +position = Vector2(823, 826) + +[node name="SpawnPosition7" type="Marker2D" parent="SpawnPoints" unique_id=904857911] +position = Vector2(67, 648) + +[node name="SpawnPosition8" type="Marker2D" parent="SpawnPoints" unique_id=1858692741] +position = Vector2(-399, 434) + +[node name="SpawnPosition9" type="Marker2D" parent="SpawnPoints" unique_id=346880510] +position = Vector2(629, 417) + +[node name="SpawnPosition10" type="Marker2D" parent="SpawnPoints" unique_id=423676587] +position = Vector2(1859, 3) + +[connection signal="pressed" from="UI Layer/Control/Toolbar/HBoxContainer/Switch to Showcase" to="." method="_on_switch_to_showcase_pressed"] +[connection signal="gong_struck" from="Gong" to="." method="_on_gong_gong_struck"] diff --git a/demo/scenes/showcase.gd b/demo/scenes/showcase.gd new file mode 100644 index 0000000..2b09558 --- /dev/null +++ b/demo/scenes/showcase.gd @@ -0,0 +1,156 @@ +#* +#* showcase.gd +#* ============================================================================= +#* Copyright 2024 Serhii Snitsaruk +#* +#* Use of this source code is governed by an MIT-style +#* license that can be found in the LICENSE file or at +#* https://opensource.org/licenses/MIT. +#* ============================================================================= +#* + +extends Node2D + +@onready var behavior_tree_view: BehaviorTreeView = %BehaviorTreeView +@onready var camera: Camera2D = $Camera2D +@onready var agent_selection: MenuButton = %AgentSelection +@onready var previous: Button = %Previous +@onready var next: Button = %Next +@onready var minimize_description: Button = %MinimizeDescription +@onready var description: RichTextLabel = %Description +@onready var begin_tutorial: Button = %BeginTutorial +@onready var navigation_hint: Label = %NavigationHint +@onready var scene_title: Label = %SceneTitle +@onready var code_popup = %CodePopup +@onready var code_edit = %CodeEdit + +var bt_player: BTPlayer +var selected_tree_index: int = -1 +var agent_files: Array[String] +var agents_dir: String +var is_tutorial: bool = false + + +func _ready() -> void: + code_popup.hide() + + agent_selection.get_popup().id_pressed.connect(_on_agent_selection_id_pressed) + previous.pressed.connect(func(): _on_agent_selection_id_pressed(selected_tree_index - 1)) + next.pressed.connect(func(): _on_agent_selection_id_pressed(selected_tree_index + 1)) + + _initialize() + + +func _physics_process(_delta: float) -> void: + var inst: BTInstance = bt_player.get_bt_instance() + var bt_data: BehaviorTreeData = BehaviorTreeData.create_from_bt_instance(inst) + behavior_tree_view.update_tree(bt_data) + + +func _initialize() -> void: + if is_tutorial: + _populate_agent_files("res://demo/agents/tutorial/") + begin_tutorial.text = "End Tutorial" + navigation_hint.text = "Navigate ➤" + scene_title.text = "Tutorial" + _on_agent_selection_id_pressed(0) + else: + _populate_agent_files("res://demo/agents/") + begin_tutorial.text = "Begin Tutorial" + navigation_hint.text = "Select Agent ➤" + scene_title.text = "Showcase" + _on_agent_selection_id_pressed(0) + + +func _attach_camera(agent: CharacterBody2D) -> void: + await get_tree().process_frame + camera.get_parent().remove_child(camera) + agent.add_child(camera) + camera.position = Vector2(400.0, 0.0) + + +func _populate_agent_files(p_path: String = "res://demo/agents/") -> void: + var popup: PopupMenu = agent_selection.get_popup() + popup.clear() + popup.reset_size() + agent_files.clear() + agents_dir = p_path + + var dir := DirAccess.open(p_path) + if dir: + dir.list_dir_begin() + var file_name: String = dir.get_next() + while file_name != "": + if dir.current_is_dir() or file_name.begins_with("agent_base"): + file_name = dir.get_next() + continue + agent_files.append(file_name.get_file().trim_suffix(".remap")) + file_name = dir.get_next() + dir.list_dir_end() + + agent_files.sort() + for i in agent_files.size(): + popup.add_item(agent_files[i], i) + + +func _load_agent(file_name: String) -> void: + var agent_res := load(file_name) as PackedScene + assert(agent_res != null) + + for child in get_children(): + if child is CharacterBody2D and child.name != "Dummy": + child.die() + + var agent: CharacterBody2D = agent_res.instantiate() + add_child(agent) + bt_player = agent.find_child("BTPlayer") + description.text = _parse_description(bt_player.behavior_tree.description) + _attach_camera(agent) + + +func _parse_description(p_desc: String) -> String: + return p_desc \ + .replace("[SUCCESS]", "[color=PaleGreen]SUCCESS[/color]") \ + .replace("[FAILURE]", "[color=IndianRed]FAILURE[/color]") \ + .replace("[RUNNING]", "[color=orange]RUNNING[/color]") \ + .replace("[comp]", "[color=CornflowerBlue][b]") \ + .replace("[/comp]", "[/b][/color]") \ + .replace("[act]", "[color=white][b]") \ + .replace("[/act]", "[/b][/color]") \ + .replace("[dec]", "[color=MediumOrchid][b]") \ + .replace("[/dec]", "[/b][/color]") \ + .replace("[con]", "[color=orange][b]") \ + .replace("[/con]", "[/b][/color]") + + +func _on_agent_selection_id_pressed(id: int) -> void: + assert(id >= 0 and id < agent_files.size()) + selected_tree_index = id + _load_agent(agents_dir.path_join(agent_files[id])) + agent_selection.text = bt_player.behavior_tree.resource_path.get_file() + if agent_selection.text.to_lower() != agent_selection.text: + # Treat filename as a title + agent_selection.text = agent_selection.text.trim_suffix(".tres") + previous.disabled = id == 0 + next.disabled = id == (agent_files.size() - 1) + + +func _on_switch_to_game_pressed() -> void: + get_tree().change_scene_to_file("res://demo/scenes/game.tscn") + + +func _on_minimize_description_button_down() -> void: + description.visible = not description.visible + minimize_description.text = "-" if description.visible else "+" + + +func _on_tutorial_pressed() -> void: + is_tutorial = not is_tutorial + _initialize() + + +func _on_behavior_tree_view_task_selected(_type_name: String, p_script_path: String) -> void: + if not p_script_path.is_empty(): + var sc: Script = load(p_script_path) + code_edit.set_source_code(sc.source_code) + code_popup.popup.call_deferred() diff --git a/demo/scenes/showcase.gd.uid b/demo/scenes/showcase.gd.uid new file mode 100644 index 0000000..3420d58 --- /dev/null +++ b/demo/scenes/showcase.gd.uid @@ -0,0 +1 @@ +uid://qpj1dk7ugnja diff --git a/demo/scenes/showcase.tscn b/demo/scenes/showcase.tscn new file mode 100644 index 0000000..c0932e8 --- /dev/null +++ b/demo/scenes/showcase.tscn @@ -0,0 +1,289 @@ +[gd_scene format=3 uid="uid://b3ae14mc2ty3y"] + +[ext_resource type="Script" uid="uid://qpj1dk7ugnja" path="res://demo/scenes/showcase.gd" id="1_l12ql"] +[ext_resource type="Theme" uid="uid://boqtjf88xcpu4" path="res://demo/assets/ui.theme" id="2_3d7dj"] +[ext_resource type="FontFile" uid="uid://d25vkmce7mhlt" path="res://demo/assets/fonts/knewave_regular.ttf" id="3_7vli5"] +[ext_resource type="FontFile" uid="uid://n231m6uqsq6x" path="res://demo/assets/fonts/junction_bold.otf" id="4_7ubu6"] +[ext_resource type="Texture2D" uid="uid://dc1wu244fnetf" path="res://demo/assets/arrow_left.png" id="5_bvrtp"] +[ext_resource type="Texture2D" uid="uid://tyu0ua1ju38l" path="res://demo/assets/logo.png" id="5_rwygb"] +[ext_resource type="Script" uid="uid://c5p1i8ofpv7qn" path="res://demo/scenes/base/toggle_fullscreen.gd" id="6_uggpo"] +[ext_resource type="Texture2D" uid="uid://bjakugmqbbtw7" path="res://demo/assets/arrow_right.png" id="7_5do2y"] +[ext_resource type="PackedScene" uid="uid://bsig1usigbbuy" path="res://demo/scenes/base/arena.tscn" id="7_42nq6"] +[ext_resource type="PackedScene" uid="uid://c5fhe3tulhlco" path="res://demo/props/dummy.tscn" id="8_apshw"] +[ext_resource type="Script" uid="uid://cb8thyd7vi2nj" path="res://demo/scenes/base/code_edit.gd" id="9_txke7"] + +[sub_resource type="LabelSettings" id="LabelSettings_rdr7a"] +font = ExtResource("3_7vli5") +font_size = 33 +outline_size = 11 +outline_color = Color(0.258915, 0.234974, 0.191974, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_3uhve"] +font = ExtResource("3_7vli5") +font_size = 26 +font_color = Color(0.804089, 0.811917, 0.823636, 1) +outline_size = 10 +outline_color = Color(0.145083, 0.168536, 0.203708, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_la4ui"] +font = ExtResource("3_7vli5") +font_size = 36 +font_color = Color(1, 1, 0.239216, 1) +outline_size = 20 +outline_color = Color(0.211521, 0.23888, 0.290166, 1) + +[sub_resource type="LabelSettings" id="LabelSettings_tlprv"] +font = ExtResource("3_7vli5") +font_size = 23 +font_color = Color(0.804089, 0.811917, 0.823636, 1) +outline_size = 10 +outline_color = Color(0.145083, 0.168536, 0.203708, 1) + +[node name="AgentShowcase" type="Node2D" unique_id=1288213603] +y_sort_enabled = true +script = ExtResource("1_l12ql") + +[node name="UI Layer" type="CanvasLayer" parent="." unique_id=820288795] + +[node name="Control" type="Control" parent="UI Layer" unique_id=527678231] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme = ExtResource("2_3d7dj") + +[node name="Toolbar" type="PanelContainer" parent="UI Layer/Control" unique_id=593294706] +custom_minimum_size = Vector2(0, 54.26) +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +offset_right = -612.0 +offset_bottom = 58.0 +grow_horizontal = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="UI Layer/Control/Toolbar" unique_id=1993711483] +layout_mode = 2 +theme_override_constants/separation = 4 + +[node name="ToggleFullscreen" type="Button" parent="UI Layer/Control/Toolbar/HBoxContainer" unique_id=1916564581] +layout_mode = 2 +focus_mode = 0 +theme_override_fonts/font = ExtResource("3_7vli5") +theme_override_font_sizes/font_size = 22 +text = "Toggle Fullscreen" +script = ExtResource("6_uggpo") + +[node name="SwitchToGame" type="Button" parent="UI Layer/Control/Toolbar/HBoxContainer" unique_id=330565684] +layout_mode = 2 +focus_mode = 0 +theme_override_fonts/font = ExtResource("3_7vli5") +theme_override_font_sizes/font_size = 22 +text = "Switch to Game" + +[node name="BeginTutorial" type="Button" parent="UI Layer/Control/Toolbar/HBoxContainer" unique_id=700159127] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +theme_override_fonts/font = ExtResource("3_7vli5") +theme_override_font_sizes/font_size = 22 +text = "Begin Tutorial +" + +[node name="SceneTitle" type="Label" parent="UI Layer/Control/Toolbar/HBoxContainer" unique_id=238378066] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 6 +text = "Tutorial" +label_settings = SubResource("LabelSettings_rdr7a") + +[node name="NavigationHint" type="Label" parent="UI Layer/Control/Toolbar/HBoxContainer" unique_id=345394561] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 8 +text = "Select Agent ➤" +label_settings = SubResource("LabelSettings_3uhve") +horizontal_alignment = 2 + +[node name="BehaviorInspector" type="PanelContainer" parent="UI Layer/Control" unique_id=260656634] +layout_mode = 1 +anchors_preset = 11 +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -612.0 +grow_horizontal = 0 +grow_vertical = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="UI Layer/Control/BehaviorInspector" unique_id=1926929085] +custom_minimum_size = Vector2(600, 0) +layout_mode = 2 +theme_override_constants/separation = 4 + +[node name="HBoxContainer" type="HBoxContainer" parent="UI Layer/Control/BehaviorInspector/VBoxContainer" unique_id=1851644467] +layout_mode = 2 +theme_override_constants/separation = 4 + +[node name="Previous" type="Button" parent="UI Layer/Control/BehaviorInspector/VBoxContainer/HBoxContainer" unique_id=172731598] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +theme_override_font_sizes/font_size = 28 +icon = ExtResource("5_bvrtp") + +[node name="AgentSelection" type="MenuButton" parent="UI Layer/Control/BehaviorInspector/VBoxContainer/HBoxContainer" unique_id=206153490] +unique_name_in_owner = true +custom_minimum_size = Vector2(400, 50) +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_fonts/font = ExtResource("4_7ubu6") +theme_override_font_sizes/font_size = 30 +text = "02_agent_imp.tres +" +flat = false + +[node name="Next" type="Button" parent="UI Layer/Control/BehaviorInspector/VBoxContainer/HBoxContainer" unique_id=594431451] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 0 +theme_override_font_sizes/font_size = 28 +icon = ExtResource("7_5do2y") + +[node name="BehaviorTreeView" type="BehaviorTreeView" parent="UI Layer/Control/BehaviorInspector/VBoxContainer" unique_id=656954310] +unique_name_in_owner = true +custom_minimum_size = Vector2(600, 0) +layout_mode = 2 +size_flags_vertical = 3 + +[node name="PanelContainer" type="PanelContainer" parent="UI Layer/Control" unique_id=1137916148] +layout_mode = 1 +anchors_preset = 12 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -8.0 +offset_right = -612.0 +grow_horizontal = 2 +grow_vertical = 0 + +[node name="Control" type="Control" parent="UI Layer/Control/PanelContainer" unique_id=1979729221] +layout_mode = 2 + +[node name="Logo" type="TextureRect" parent="UI Layer/Control/PanelContainer/Control" unique_id=259622260] +layout_mode = 1 +offset_top = -128.0 +offset_right = 256.0 +offset_bottom = -43.0 +texture = ExtResource("5_rwygb") + +[node name="Demo project" type="Label" parent="UI Layer/Control/PanelContainer/Control/Logo" unique_id=1003790860] +layout_mode = 1 +anchors_preset = 3 +anchor_left = 1.0 +anchor_top = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -316.0 +offset_top = -72.0 +offset_right = 13.0 +offset_bottom = 74.0 +grow_horizontal = 0 +grow_vertical = 0 +text = "demo project" +label_settings = SubResource("LabelSettings_la4ui") +horizontal_alignment = 2 +vertical_alignment = 1 + +[node name="Header" type="HBoxContainer" parent="UI Layer/Control/PanelContainer/Control" unique_id=1409843934] +layout_mode = 0 +offset_left = 3.0 +offset_top = -43.0 +offset_right = 1299.0 +offset_bottom = -7.0 +theme_override_constants/separation = 8 + +[node name="Label" type="Label" parent="UI Layer/Control/PanelContainer/Control/Header" unique_id=213429430] +layout_mode = 2 +size_flags_horizontal = 10 +text = "Description" +label_settings = SubResource("LabelSettings_tlprv") + +[node name="MinimizeDescription" type="Button" parent="UI Layer/Control/PanelContainer/Control/Header" unique_id=2146499049] +unique_name_in_owner = true +custom_minimum_size = Vector2(32, 32) +layout_mode = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +focus_mode = 0 +theme_override_fonts/font = ExtResource("3_7vli5") +text = "-" + +[node name="MarginContainer" type="MarginContainer" parent="UI Layer/Control/PanelContainer" unique_id=791995614] +layout_mode = 2 +theme_override_constants/margin_left = 20 +theme_override_constants/margin_top = 6 +theme_override_constants/margin_bottom = 6 + +[node name="VBoxContainer" type="VBoxContainer" parent="UI Layer/Control/PanelContainer/MarginContainer" unique_id=2091956890] +layout_mode = 2 +theme_override_constants/separation = 0 + +[node name="Description" type="RichTextLabel" parent="UI Layer/Control/PanelContainer/MarginContainer/VBoxContainer" unique_id=430231376] +unique_name_in_owner = true +custom_minimum_size = Vector2(0, 140) +layout_mode = 2 +size_flags_vertical = 3 +theme_override_font_sizes/normal_font_size = 20 +theme_override_font_sizes/bold_font_size = 20 +theme_override_font_sizes/bold_italics_font_size = 20 +theme_override_font_sizes/italics_font_size = 20 +theme_override_font_sizes/mono_font_size = 20 +bbcode_enabled = true +text = "[b]Behavior Trees[/b] are composed of tasks that represent specific actions or decision-making rules. Tasks can be broadly categorized into two main types: control tasks and leaf tasks. Control tasks determine the execution flow within the tree. They include Sequence, Selector, and Invert. Leaf tasks represent specific actions to perform, like moving or attacking, or conditions that need to be checked. The BTTask class provides the foundation for various building blocks of the Behavior Trees. BT tasks can share data with the help of the Blackboard." +fit_content = true + +[node name="CodePopup" type="PopupPanel" parent="UI Layer/Control" unique_id=542471976] +unique_name_in_owner = true +oversampling_override = 1.0 +position = Vector2i(0, 60) +size = Vector2i(1024, 708) +visible = true + +[node name="CodeEdit" type="CodeEdit" parent="UI Layer/Control/CodePopup" unique_id=50454680] +unique_name_in_owner = true +custom_minimum_size = Vector2(800, 700) +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 4.0 +offset_top = 4.0 +offset_right = -4.0 +offset_bottom = -4.0 +grow_horizontal = 2 +grow_vertical = 2 +gutters_draw_line_numbers = true +script = ExtResource("9_txke7") + +[node name="Camera2D" type="Camera2D" parent="." unique_id=686501120] +position = Vector2(400, 0) +zoom = Vector2(0.88, 0.88) +process_callback = 0 +position_smoothing_enabled = true +drag_horizontal_enabled = true +drag_vertical_enabled = true +drag_left_margin = 0.1 +drag_top_margin = 0.1 +drag_right_margin = 0.0 +drag_bottom_margin = 0.1 + +[node name="Arena" parent="." unique_id=1958497507 instance=ExtResource("7_42nq6")] +metadata/_edit_lock_ = true + +[node name="Dummy" parent="." unique_id=1431895392 instance=ExtResource("8_apshw")] +position = Vector2(1106, 423) + +[connection signal="pressed" from="UI Layer/Control/Toolbar/HBoxContainer/SwitchToGame" to="." method="_on_switch_to_game_pressed"] +[connection signal="pressed" from="UI Layer/Control/Toolbar/HBoxContainer/BeginTutorial" to="." method="_on_tutorial_pressed"] +[connection signal="task_selected" from="UI Layer/Control/BehaviorInspector/VBoxContainer/BehaviorTreeView" to="." method="_on_behavior_tree_view_task_selected"] +[connection signal="button_down" from="UI Layer/Control/PanelContainer/Control/Header/MinimizeDescription" to="." method="_on_minimize_description_button_down"]