diff --git a/addons/limboai/LICENSE.md b/addons/limboai/LICENSE.md new file mode 100644 index 0000000..07c690f --- /dev/null +++ b/addons/limboai/LICENSE.md @@ -0,0 +1,7 @@ +Copyright (c) 2023-2025 Serhii Snitsaruk and the LimboAI contributors. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the βSoftwareβ), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED βAS ISβ, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/addons/limboai/LOGO_LICENSE.md b/addons/limboai/LOGO_LICENSE.md new file mode 100644 index 0000000..cd0de07 --- /dev/null +++ b/addons/limboai/LOGO_LICENSE.md @@ -0,0 +1,5 @@ +LimboAI Logo +Copyright (c) 2023 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/ \ No newline at end of file diff --git a/addons/limboai/README.md b/addons/limboai/README.md new file mode 100644 index 0000000..186c676 --- /dev/null +++ b/addons/limboai/README.md @@ -0,0 +1,139 @@ +
+
+
+
+
+
+
+## Features
+
+- **Behavior Trees (BT):**
+ - Easily create, edit, and save `BehaviorTree` resources in the editor.
+ - Execute `BehaviorTree` resources using the `BTPlayer` node.
+ - Create complex behaviors by combining and nesting tasks in a hierarchy.
+ - Control execution flow using composite, decorator, and condition tasks.
+ - [Create custom tasks](https://limboai.readthedocs.io/en/stable/getting-started/custom-tasks.html) by extending core classes: `BTAction`, `BTCondition`, `BTDecorator`, and `BTComposite`.
+ - Built-in class documentation.
+ - Blackboard system: Share data seamlessly between tasks using the `Blackboard`.
+ - Blackboard plans: Define variables in the BehaviorTree resource and override their values in the BTPlayer node.
+ - Plan editor: Manage variables, their data types and property hints.
+ - Blackboard scopes: Prevent name conflicts and enable advanced techniques like [sharing data between several agents](https://limboai.readthedocs.io/en/stable/getting-started/using-blackboard.html#sharing-data-between-several-agents).
+ - Blackboard parameters: [Export a BB parameter](https://limboai.readthedocs.io/en/stable/getting-started/using-blackboard.html#task-parameters), for which user can provide a value or bind it to a blackboard variable (can be used in custom tasks).
+ - Inspector support for specifying blackboard variables (custom editor for exported `StringName` properties ending with "_var").
+ - Use the `BTSubtree` task to execute a tree from a different resource file, promoting organization and reusability.
+ - Visual Debugger: Inspect the execution of any BT in a running scene to identify and troubleshoot issues.
+ - Visualize BT in-game using `BehaviorTreeView` node (for custom in-game tools).
+ - Monitor tree performance with custom performance monitors.
+
+- **Hierarchical State Machines (HSM):**
+ - Extend the `LimboState` class to implement state logic.
+ - `LimboHSM` node serves as a state machine that manages `LimboState` instances and transitions.
+ - `LimboHSM` is a state itself and can be nested within other `LimboHSM` instances.
+ - [Event-based](https://limboai.readthedocs.io/en/stable/getting-started/hsm.html#events-and-transitions): Transitions are associated with events and are triggered by the state machine when the relevant event is dispatched, allowing for better decoupling of transitions from state logic.
+ - Combine state machines with behavior trees using `BTState` for advanced reactive AI.
+ - Delegation Option: Using the vanilla `LimboState`, [delegate the implementation](https://limboai.readthedocs.io/en/stable/getting-started/hsm.html#single-file-state-machine-setup) to your callback functions, making it perfect for rapid prototyping and game jams.
+ - π Note: State machine setup and initialization require code; there is no GUI editor.
+
+- **Tested:** Behavior tree tasks and HSM are covered by unit tests.
+
+- **GDExtension:** LimboAI can be [used as extension](https://limboai.readthedocs.io/en/stable/getting-started/gdextension.html). Custom engine builds are not necessary.
+
+- **Demo + Tutorial:** Check out our extensive demo project, which includes an introduction to behavior trees using examples.
+
+## First steps
+
+Follow the [First steps](https://limboai.readthedocs.io/en/stable/index.html#first-steps) guide to learn how to get started with LimboAI and the demo project.
+
+## Getting LimboAI
+
+LimboAI can be used as either a C++ module or as a GDExtension shared library. GDExtension version is more convenient to use but somewhat limited in features. Whichever you choose to use, your project will stay compatible with both and you can switch from one to the other any time. See [Using GDExtension](https://limboai.readthedocs.io/en/stable/getting-started/gdextension.html).
+
+### Precompiled builds
+
+- For the most recent builds, navigate to **Actions** β [**All Builds**](https://github.com/limbonaut/limboai/actions/workflows/all_builds.yml), select a build from the list, and scroll down until you find the **Artifacts** section.
+- For release builds, check [**Releases**](https://github.com/limbonaut/limboai/releases).
+
+### Compiling from source
+
+- Download the Godot Engine source code and put this module source into the `modules/limboai` directory.
+- Consult the Godot Engine documentation for instructions on [how to build from source code](https://docs.godotengine.org/en/stable/contributing/development/compiling/index.html).
+- If you plan to export a game utilizing the LimboAI module, you'll also need to build export templates.
+- To execute unit tests, compile the engine with `tests=yes` and run it with `--test --tc="*[LimboAI]*"`.
+
+#### For GDExtension
+
+- You'll need SCons build tool and a C++ compiler. See also [Compiling](https://docs.godotengine.org/en/stable/contributing/development/compiling/index.html).
+- Run `scons target=editor` to build the plugin library for your current platform.
+ - SCons will automatically clone the godot-cpp/ repository if it doesn't already exist in the `limboai/godot-cpp` directory.
+ - By default, built targets are placed in the demo project: `demo/addons/limboai/bin/`
+- Check `scons -h` for other options and targets.
+
+## Using the plugin
+
+- Online Documentation: [stable](https://limboai.readthedocs.io/en/stable/index.html), [latest](https://limboai.readthedocs.io/en/latest/index.html)
+- [First steps](https://limboai.readthedocs.io/en/stable/index.html#first-steps)
+- [Introduction to Behavior Trees](https://limboai.readthedocs.io/en/stable/getting-started/introduction.html)
+- [Creating custom tasks in GDScript](https://limboai.readthedocs.io/en/stable/getting-started/custom-tasks.html)
+- [Sharing data using Blackboard](https://limboai.readthedocs.io/en/stable/getting-started/using-blackboard.html)
+- [Accessing nodes in the scene tree](https://limboai.readthedocs.io/en/stable/getting-started/accessing-nodes.html)
+- [State machines](https://limboai.readthedocs.io/en/stable/getting-started/hsm.html)
+- [Using GDExtension](https://limboai.readthedocs.io/en/stable/getting-started/gdextension.html)
+- [Using LimboAI with C#](https://limboai.readthedocs.io/en/stable/getting-started/c-sharp.html)
+- [Class reference](https://limboai.readthedocs.io/en/stable/getting-started/featured-classes.html)
+
+## Contributing
+
+Contributions are welcome! Please open issues for bug reports, feature requests, or code changes.
+For detailed guidelines on contributing to code or documentation, check out our [Contributing](https://limboai.readthedocs.io/en/latest/getting-started/contributing.html) page.
+
+If you have an idea for a behavior tree task or a feature that could be useful in a variety of projects, open an issue to discuss it.
+
+## Social
+
+Need help? We have a Discord server: https://discord.gg/N5MGC95GpP
+
+I write about LimboAI development on Mastodon: https://mastodon.gamedev.place/@limbo.
+
+## License
+
+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
+
+LimboAI logo and demo project art assets are licensed under the Creative Commons Attribution 4.0 International license that can be found at https://creativecommons.org/licenses/by/4.0/
diff --git a/addons/limboai/bin/libliblimboai.windows.editor.x86_64.a b/addons/limboai/bin/libliblimboai.windows.editor.x86_64.a
new file mode 100644
index 0000000..d2631b4
Binary files /dev/null and b/addons/limboai/bin/libliblimboai.windows.editor.x86_64.a differ
diff --git a/addons/limboai/bin/libliblimboai.windows.template_release.x86_64.a b/addons/limboai/bin/libliblimboai.windows.template_release.x86_64.a
new file mode 100644
index 0000000..b51ed53
Binary files /dev/null and b/addons/limboai/bin/libliblimboai.windows.template_release.x86_64.a differ
diff --git a/addons/limboai/bin/liblimboai.android.template_debug.arm32.so b/addons/limboai/bin/liblimboai.android.template_debug.arm32.so
new file mode 100644
index 0000000..6e22804
Binary files /dev/null and b/addons/limboai/bin/liblimboai.android.template_debug.arm32.so differ
diff --git a/addons/limboai/bin/liblimboai.android.template_debug.arm64.so b/addons/limboai/bin/liblimboai.android.template_debug.arm64.so
new file mode 100644
index 0000000..c5cceb2
Binary files /dev/null and b/addons/limboai/bin/liblimboai.android.template_debug.arm64.so differ
diff --git a/addons/limboai/bin/liblimboai.android.template_debug.x86_32.so b/addons/limboai/bin/liblimboai.android.template_debug.x86_32.so
new file mode 100644
index 0000000..6d8eab7
Binary files /dev/null and b/addons/limboai/bin/liblimboai.android.template_debug.x86_32.so differ
diff --git a/addons/limboai/bin/liblimboai.android.template_debug.x86_64.so b/addons/limboai/bin/liblimboai.android.template_debug.x86_64.so
new file mode 100644
index 0000000..ab0def7
Binary files /dev/null and b/addons/limboai/bin/liblimboai.android.template_debug.x86_64.so differ
diff --git a/addons/limboai/bin/liblimboai.android.template_release.arm32.so b/addons/limboai/bin/liblimboai.android.template_release.arm32.so
new file mode 100644
index 0000000..4db8355
Binary files /dev/null and b/addons/limboai/bin/liblimboai.android.template_release.arm32.so differ
diff --git a/addons/limboai/bin/liblimboai.android.template_release.arm64.so b/addons/limboai/bin/liblimboai.android.template_release.arm64.so
new file mode 100644
index 0000000..2b739dc
Binary files /dev/null and b/addons/limboai/bin/liblimboai.android.template_release.arm64.so differ
diff --git a/addons/limboai/bin/liblimboai.android.template_release.x86_32.so b/addons/limboai/bin/liblimboai.android.template_release.x86_32.so
new file mode 100644
index 0000000..12cf743
Binary files /dev/null and b/addons/limboai/bin/liblimboai.android.template_release.x86_32.so differ
diff --git a/addons/limboai/bin/liblimboai.android.template_release.x86_64.so b/addons/limboai/bin/liblimboai.android.template_release.x86_64.so
new file mode 100644
index 0000000..9a4291d
Binary files /dev/null and b/addons/limboai/bin/liblimboai.android.template_release.x86_64.so differ
diff --git a/addons/limboai/bin/liblimboai.ios.template_debug.arm64.dylib b/addons/limboai/bin/liblimboai.ios.template_debug.arm64.dylib
new file mode 100644
index 0000000..6cbbacd
Binary files /dev/null and b/addons/limboai/bin/liblimboai.ios.template_debug.arm64.dylib differ
diff --git a/addons/limboai/bin/liblimboai.ios.template_debug.universal.simulator.dylib b/addons/limboai/bin/liblimboai.ios.template_debug.universal.simulator.dylib
new file mode 100644
index 0000000..f0bd59d
Binary files /dev/null and b/addons/limboai/bin/liblimboai.ios.template_debug.universal.simulator.dylib differ
diff --git a/addons/limboai/bin/liblimboai.ios.template_release.arm64.dylib b/addons/limboai/bin/liblimboai.ios.template_release.arm64.dylib
new file mode 100644
index 0000000..8a1e4f8
Binary files /dev/null and b/addons/limboai/bin/liblimboai.ios.template_release.arm64.dylib differ
diff --git a/addons/limboai/bin/liblimboai.ios.template_release.universal.simulator.dylib b/addons/limboai/bin/liblimboai.ios.template_release.universal.simulator.dylib
new file mode 100644
index 0000000..92a4f68
Binary files /dev/null and b/addons/limboai/bin/liblimboai.ios.template_release.universal.simulator.dylib differ
diff --git a/addons/limboai/bin/liblimboai.linux.editor.x86_64.so b/addons/limboai/bin/liblimboai.linux.editor.x86_64.so
new file mode 100644
index 0000000..caa8dc5
Binary files /dev/null and b/addons/limboai/bin/liblimboai.linux.editor.x86_64.so differ
diff --git a/addons/limboai/bin/liblimboai.linux.template_release.x86_64.so b/addons/limboai/bin/liblimboai.linux.template_release.x86_64.so
new file mode 100644
index 0000000..ec6348f
Binary files /dev/null and b/addons/limboai/bin/liblimboai.linux.template_release.x86_64.so differ
diff --git a/addons/limboai/bin/liblimboai.macos.editor.framework/liblimboai.macos.editor b/addons/limboai/bin/liblimboai.macos.editor.framework/liblimboai.macos.editor
new file mode 100644
index 0000000..718c609
Binary files /dev/null and b/addons/limboai/bin/liblimboai.macos.editor.framework/liblimboai.macos.editor differ
diff --git a/addons/limboai/bin/liblimboai.macos.template_release.framework/liblimboai.macos.template_release b/addons/limboai/bin/liblimboai.macos.template_release.framework/liblimboai.macos.template_release
new file mode 100644
index 0000000..3dfa508
Binary files /dev/null and b/addons/limboai/bin/liblimboai.macos.template_release.framework/liblimboai.macos.template_release differ
diff --git a/addons/limboai/bin/liblimboai.web.template_debug.wasm32.wasm b/addons/limboai/bin/liblimboai.web.template_debug.wasm32.wasm
new file mode 100644
index 0000000..dd4fe80
Binary files /dev/null and b/addons/limboai/bin/liblimboai.web.template_debug.wasm32.wasm differ
diff --git a/addons/limboai/bin/liblimboai.web.template_release.wasm32.wasm b/addons/limboai/bin/liblimboai.web.template_release.wasm32.wasm
new file mode 100644
index 0000000..3f9986f
Binary files /dev/null and b/addons/limboai/bin/liblimboai.web.template_release.wasm32.wasm differ
diff --git a/addons/limboai/bin/liblimboai.windows.editor.x86_64.dll b/addons/limboai/bin/liblimboai.windows.editor.x86_64.dll
new file mode 100644
index 0000000..a4435cc
Binary files /dev/null and b/addons/limboai/bin/liblimboai.windows.editor.x86_64.dll differ
diff --git a/addons/limboai/bin/liblimboai.windows.template_release.x86_64.dll b/addons/limboai/bin/liblimboai.windows.template_release.x86_64.dll
new file mode 100644
index 0000000..242b0cc
Binary files /dev/null and b/addons/limboai/bin/liblimboai.windows.template_release.x86_64.dll differ
diff --git a/addons/limboai/bin/limboai.gdextension b/addons/limboai/bin/limboai.gdextension
new file mode 100644
index 0000000..50915a5
--- /dev/null
+++ b/addons/limboai/bin/limboai.gdextension
@@ -0,0 +1,100 @@
+[configuration]
+
+entry_symbol = "limboai_init"
+compatibility_minimum = "4.2"
+
+[libraries]
+
+macos.debug = "res://addons/limboai/bin/liblimboai.macos.editor.framework"
+macos.release = "res://addons/limboai/bin/liblimboai.macos.template_release.framework"
+windows.debug.x86_32 = "res://addons/limboai/bin/liblimboai.windows.editor.x86_32.dll"
+windows.release.x86_32 = "res://addons/limboai/bin/liblimboai.windows.template_release.x86_32.dll"
+windows.debug.x86_64 = "res://addons/limboai/bin/liblimboai.windows.editor.x86_64.dll"
+windows.release.x86_64 = "res://addons/limboai/bin/liblimboai.windows.template_release.x86_64.dll"
+linux.debug.x86_64 = "res://addons/limboai/bin/liblimboai.linux.editor.x86_64.so"
+linux.release.x86_64 = "res://addons/limboai/bin/liblimboai.linux.template_release.x86_64.so"
+linux.debug.arm64 = "res://addons/limboai/bin/liblimboai.linux.editor.arm64.so"
+linux.release.arm64 = "res://addons/limboai/bin/liblimboai.linux.template_release.arm64.so"
+linux.debug.rv64 = "res://addons/limboai/bin/liblimboai.linux.editor.rv64.so"
+linux.release.rv64 = "res://addons/limboai/bin/liblimboai.linux.template_release.rv64.so"
+android.debug.arm64 = "res://addons/limboai/bin/liblimboai.android.template_debug.arm64.so"
+android.release.arm64 = "res://addons/limboai/bin/liblimboai.android.template_release.arm64.so"
+android.debug.arm32 = "res://addons/limboai/bin/liblimboai.android.template_debug.arm32.so"
+android.release.arm32 = "res://addons/limboai/bin/liblimboai.android.template_release.arm32.so"
+android.debug.x86_64 = "res://addons/limboai/bin/liblimboai.android.template_debug.x86_64.so"
+android.release.x86_64 = "res://addons/limboai/bin/liblimboai.android.template_release.x86_64.so"
+android.debug.x86_32 = "res://addons/limboai/bin/liblimboai.android.template_debug.x86_32.so"
+android.release.x86_32 = "res://addons/limboai/bin/liblimboai.android.template_release.x86_32.so"
+ios.release.arm64 = "res://addons/limboai/bin/liblimboai.ios.template_release.arm64.dylib"
+ios.debug.arm64 = "res://addons/limboai/bin/liblimboai.ios.template_debug.arm64.dylib"
+ios.release.simulator = "res://addons/limboai/bin/liblimboai.ios.template_release.universal.dylib"
+ios.debug.simulator = "res://addons/limboai/bin/liblimboai.ios.template_debug.universal.dylib"
+web.debug.wasm32 = "res://addons/limboai/bin/liblimboai.web.template_debug.wasm32.wasm"
+web.release.wasm32 = "res://addons/limboai/bin/liblimboai.web.template_release.wasm32.wasm"
+
+[icons]
+
+BTAction = "res://addons/limboai/icons/BTAction.svg"
+BTAlwaysFail = "res://addons/limboai/icons/BTAlwaysFail.svg"
+BTAlwaysSucceed = "res://addons/limboai/icons/BTAlwaysSucceed.svg"
+BTAwaitAnimation = "res://addons/limboai/icons/BTAwaitAnimation.svg"
+BTCallMethod = "res://addons/limboai/icons/BTCallMethod.svg"
+BTCheckAgentProperty = "res://addons/limboai/icons/BTCheckAgentProperty.svg"
+BTCheckTrigger = "res://addons/limboai/icons/BTCheckTrigger.svg"
+BTCheckVar = "res://addons/limboai/icons/BTCheckVar.svg"
+BTComment = "res://addons/limboai/icons/BTComment.svg"
+BTCondition = "res://addons/limboai/icons/BTCondition.svg"
+BTConsolePrint = "res://addons/limboai/icons/BTConsolePrint.svg"
+BTCooldown = "res://addons/limboai/icons/BTCooldown.svg"
+BTDecorator = "res://addons/limboai/icons/BTDecorator.svg"
+BTDelay = "res://addons/limboai/icons/BTDelay.svg"
+BTDynamicSelector = "res://addons/limboai/icons/BTDynamicSelector.svg"
+BTDynamicSequence = "res://addons/limboai/icons/BTDynamicSequence.svg"
+BTEvaluateExpression = "res://addons/limboai/icons/BTEvaluateExpression.svg"
+BTFail = "res://addons/limboai/icons/BTFail.svg"
+BTForEach = "res://addons/limboai/icons/BTForEach.svg"
+BTInvert = "res://addons/limboai/icons/BTInvert.svg"
+BTNewScope = "res://addons/limboai/icons/BTNewScope.svg"
+BTParallel = "res://addons/limboai/icons/BTParallel.svg"
+BTPauseAnimation = "res://addons/limboai/icons/BTPauseAnimation.svg"
+BTPlayAnimation = "res://addons/limboai/icons/BTPlayAnimation.svg"
+BTPlayer = "res://addons/limboai/icons/BTPlayer.svg"
+BTProbability = "res://addons/limboai/icons/BTProbability.svg"
+BTProbabilitySelector = "res://addons/limboai/icons/BTProbabilitySelector.svg"
+BTRandomSelector = "res://addons/limboai/icons/BTRandomSelector.svg"
+BTRandomSequence = "res://addons/limboai/icons/BTRandomSequence.svg"
+BTRandomWait = "res://addons/limboai/icons/BTRandomWait.svg"
+BTRepeat = "res://addons/limboai/icons/BTRepeat.svg"
+BTRepeatUntilFailure = "res://addons/limboai/icons/BTRepeatUntilFailure.svg"
+BTRepeatUntilSuccess = "res://addons/limboai/icons/BTRepeatUntilSuccess.svg"
+BTRunLimit = "res://addons/limboai/icons/BTRunLimit.svg"
+BTSelector = "res://addons/limboai/icons/BTSelector.svg"
+BTSequence = "res://addons/limboai/icons/BTSequence.svg"
+BTSetAgentProperty = "res://addons/limboai/icons/BTSetAgentProperty.svg"
+BTSetVar = "res://addons/limboai/icons/BTSetVar.svg"
+BTState = "res://addons/limboai/icons/BTState.svg"
+BTStopAnimation = "res://addons/limboai/icons/BTStopAnimation.svg"
+BTSubtree = "res://addons/limboai/icons/BTSubtree.svg"
+BTTimeLimit = "res://addons/limboai/icons/BTTimeLimit.svg"
+BTWait = "res://addons/limboai/icons/BTWait.svg"
+BTWaitTicks = "res://addons/limboai/icons/BTWaitTicks.svg"
+BehaviorTree = "res://addons/limboai/icons/BehaviorTree.svg"
+BehaviorTreeView = "res://addons/limboai/icons/BehaviorTreeView.svg"
+BlackboardPlan = "res://addons/limboai/icons/BlackboardPlan.svg"
+LimboAI = "res://addons/limboai/icons/LimboAI.svg"
+LimboDeselectAll = "res://addons/limboai/icons/LimboDeselectAll.svg"
+LimboEditBlackboard = "res://addons/limboai/icons/LimboEditBlackboard.svg"
+LimboExtraBlackboard = "res://addons/limboai/icons/LimboExtraBlackboard.svg"
+LimboExtraClock = "res://addons/limboai/icons/LimboExtraClock.svg"
+LimboExtraVariable = "res://addons/limboai/icons/LimboExtraVariable.svg"
+LimboExtractSubtree = "res://addons/limboai/icons/LimboExtractSubtree.svg"
+LimboHSM = "res://addons/limboai/icons/LimboHSM.svg"
+LimboPercent = "res://addons/limboai/icons/LimboPercent.svg"
+LimboSelectAll = "res://addons/limboai/icons/LimboSelectAll.svg"
+LimboState = "res://addons/limboai/icons/LimboState.svg"
+LimboVarAdd = "res://addons/limboai/icons/LimboVarAdd.svg"
+LimboVarEmpty = "res://addons/limboai/icons/LimboVarEmpty.svg"
+LimboVarError = "res://addons/limboai/icons/LimboVarError.svg"
+LimboVarExists = "res://addons/limboai/icons/LimboVarExists.svg"
+LimboVarNotFound = "res://addons/limboai/icons/LimboVarNotFound.svg"
+LimboVarPrivate = "res://addons/limboai/icons/LimboVarPrivate.svg"
diff --git a/addons/limboai/icons/BTAction.svg b/addons/limboai/icons/BTAction.svg
new file mode 100644
index 0000000..997ebbc
--- /dev/null
+++ b/addons/limboai/icons/BTAction.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTAction.svg.import b/addons/limboai/icons/BTAction.svg.import
new file mode 100644
index 0000000..936f5b1
--- /dev/null
+++ b/addons/limboai/icons/BTAction.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://csifn6ib3bfag"
+path="res://.godot/imported/BTAction.svg-a43c04a25802778fc1e8d98b5915e67c.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTAction.svg"
+dest_files=["res://.godot/imported/BTAction.svg-a43c04a25802778fc1e8d98b5915e67c.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTAlwaysFail.svg b/addons/limboai/icons/BTAlwaysFail.svg
new file mode 100644
index 0000000..7be2920
--- /dev/null
+++ b/addons/limboai/icons/BTAlwaysFail.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTAlwaysFail.svg.import b/addons/limboai/icons/BTAlwaysFail.svg.import
new file mode 100644
index 0000000..e69460f
--- /dev/null
+++ b/addons/limboai/icons/BTAlwaysFail.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://drn04uxowwp8j"
+path="res://.godot/imported/BTAlwaysFail.svg-9a4e083bd8ff0d6d8240b50ae0d4cea0.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTAlwaysFail.svg"
+dest_files=["res://.godot/imported/BTAlwaysFail.svg-9a4e083bd8ff0d6d8240b50ae0d4cea0.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTAlwaysSucceed.svg b/addons/limboai/icons/BTAlwaysSucceed.svg
new file mode 100644
index 0000000..248882f
--- /dev/null
+++ b/addons/limboai/icons/BTAlwaysSucceed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTAlwaysSucceed.svg.import b/addons/limboai/icons/BTAlwaysSucceed.svg.import
new file mode 100644
index 0000000..3bdb9b0
--- /dev/null
+++ b/addons/limboai/icons/BTAlwaysSucceed.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bjj8rrfviour3"
+path="res://.godot/imported/BTAlwaysSucceed.svg-c8181e2fd85d1e2ad00a6c8e813e7a94.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTAlwaysSucceed.svg"
+dest_files=["res://.godot/imported/BTAlwaysSucceed.svg-c8181e2fd85d1e2ad00a6c8e813e7a94.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTAwaitAnimation.svg b/addons/limboai/icons/BTAwaitAnimation.svg
new file mode 100644
index 0000000..6bb4cd1
--- /dev/null
+++ b/addons/limboai/icons/BTAwaitAnimation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTAwaitAnimation.svg.import b/addons/limboai/icons/BTAwaitAnimation.svg.import
new file mode 100644
index 0000000..9af8912
--- /dev/null
+++ b/addons/limboai/icons/BTAwaitAnimation.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cl86rct18wlng"
+path="res://.godot/imported/BTAwaitAnimation.svg-d8d736b3e349e2f77119fde575996909.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTAwaitAnimation.svg"
+dest_files=["res://.godot/imported/BTAwaitAnimation.svg-d8d736b3e349e2f77119fde575996909.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTCallMethod.svg b/addons/limboai/icons/BTCallMethod.svg
new file mode 100644
index 0000000..8ed7e65
--- /dev/null
+++ b/addons/limboai/icons/BTCallMethod.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTCallMethod.svg.import b/addons/limboai/icons/BTCallMethod.svg.import
new file mode 100644
index 0000000..1c78694
--- /dev/null
+++ b/addons/limboai/icons/BTCallMethod.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dkm3ixamy3vh0"
+path="res://.godot/imported/BTCallMethod.svg-f41bac2a2119be3591af9424d2c32d9a.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTCallMethod.svg"
+dest_files=["res://.godot/imported/BTCallMethod.svg-f41bac2a2119be3591af9424d2c32d9a.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTCheckAgentProperty.svg b/addons/limboai/icons/BTCheckAgentProperty.svg
new file mode 100644
index 0000000..6c869c3
--- /dev/null
+++ b/addons/limboai/icons/BTCheckAgentProperty.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTCheckAgentProperty.svg.import b/addons/limboai/icons/BTCheckAgentProperty.svg.import
new file mode 100644
index 0000000..60433ac
--- /dev/null
+++ b/addons/limboai/icons/BTCheckAgentProperty.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://vl3g7c882dui"
+path="res://.godot/imported/BTCheckAgentProperty.svg-2ed4c1d109d23a5287ed6f1262e23f15.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTCheckAgentProperty.svg"
+dest_files=["res://.godot/imported/BTCheckAgentProperty.svg-2ed4c1d109d23a5287ed6f1262e23f15.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTCheckTrigger.svg b/addons/limboai/icons/BTCheckTrigger.svg
new file mode 100644
index 0000000..2a59673
--- /dev/null
+++ b/addons/limboai/icons/BTCheckTrigger.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTCheckTrigger.svg.import b/addons/limboai/icons/BTCheckTrigger.svg.import
new file mode 100644
index 0000000..6b7f101
--- /dev/null
+++ b/addons/limboai/icons/BTCheckTrigger.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cncibjaw3hb64"
+path="res://.godot/imported/BTCheckTrigger.svg-79349468c66ee41b0a126720f8ecda55.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTCheckTrigger.svg"
+dest_files=["res://.godot/imported/BTCheckTrigger.svg-79349468c66ee41b0a126720f8ecda55.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTCheckVar.svg b/addons/limboai/icons/BTCheckVar.svg
new file mode 100644
index 0000000..150a4f2
--- /dev/null
+++ b/addons/limboai/icons/BTCheckVar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTCheckVar.svg.import b/addons/limboai/icons/BTCheckVar.svg.import
new file mode 100644
index 0000000..be6a890
--- /dev/null
+++ b/addons/limboai/icons/BTCheckVar.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dogme2t8olgoi"
+path="res://.godot/imported/BTCheckVar.svg-7b3af543bb4450e9a6d56df48f06064e.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTCheckVar.svg"
+dest_files=["res://.godot/imported/BTCheckVar.svg-7b3af543bb4450e9a6d56df48f06064e.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTComment.svg b/addons/limboai/icons/BTComment.svg
new file mode 100644
index 0000000..66699d4
--- /dev/null
+++ b/addons/limboai/icons/BTComment.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTComment.svg.import b/addons/limboai/icons/BTComment.svg.import
new file mode 100644
index 0000000..f55d9ac
--- /dev/null
+++ b/addons/limboai/icons/BTComment.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://q8ybo6jn3qtu"
+path="res://.godot/imported/BTComment.svg-84a811fb1f7563bc02c1f584b4085d5c.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTComment.svg"
+dest_files=["res://.godot/imported/BTComment.svg-84a811fb1f7563bc02c1f584b4085d5c.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTCondition.svg b/addons/limboai/icons/BTCondition.svg
new file mode 100644
index 0000000..7c00015
--- /dev/null
+++ b/addons/limboai/icons/BTCondition.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTCondition.svg.import b/addons/limboai/icons/BTCondition.svg.import
new file mode 100644
index 0000000..c4e0f2b
--- /dev/null
+++ b/addons/limboai/icons/BTCondition.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ja68qegww6v1"
+path="res://.godot/imported/BTCondition.svg-546aa4361ccfe650098b5f6867299d1a.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTCondition.svg"
+dest_files=["res://.godot/imported/BTCondition.svg-546aa4361ccfe650098b5f6867299d1a.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTConsolePrint.svg b/addons/limboai/icons/BTConsolePrint.svg
new file mode 100644
index 0000000..cee42eb
--- /dev/null
+++ b/addons/limboai/icons/BTConsolePrint.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTConsolePrint.svg.import b/addons/limboai/icons/BTConsolePrint.svg.import
new file mode 100644
index 0000000..de62f8b
--- /dev/null
+++ b/addons/limboai/icons/BTConsolePrint.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://vd438ornqlag"
+path="res://.godot/imported/BTConsolePrint.svg-4190426bb73da16c143878c233af4bc3.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTConsolePrint.svg"
+dest_files=["res://.godot/imported/BTConsolePrint.svg-4190426bb73da16c143878c233af4bc3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTCooldown.svg b/addons/limboai/icons/BTCooldown.svg
new file mode 100644
index 0000000..2c6a237
--- /dev/null
+++ b/addons/limboai/icons/BTCooldown.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTCooldown.svg.import b/addons/limboai/icons/BTCooldown.svg.import
new file mode 100644
index 0000000..79f0cfb
--- /dev/null
+++ b/addons/limboai/icons/BTCooldown.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c1ctsvvi5pb4o"
+path="res://.godot/imported/BTCooldown.svg-b168adee5e8762abc08102408ea327d5.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTCooldown.svg"
+dest_files=["res://.godot/imported/BTCooldown.svg-b168adee5e8762abc08102408ea327d5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTDecorator.svg b/addons/limboai/icons/BTDecorator.svg
new file mode 100644
index 0000000..faac1ab
--- /dev/null
+++ b/addons/limboai/icons/BTDecorator.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTDecorator.svg.import b/addons/limboai/icons/BTDecorator.svg.import
new file mode 100644
index 0000000..c99a967
--- /dev/null
+++ b/addons/limboai/icons/BTDecorator.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://du7tqnydsy4dl"
+path="res://.godot/imported/BTDecorator.svg-dae9ebd6f4667ba4d2ac62518ef141d6.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTDecorator.svg"
+dest_files=["res://.godot/imported/BTDecorator.svg-dae9ebd6f4667ba4d2ac62518ef141d6.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTDelay.svg b/addons/limboai/icons/BTDelay.svg
new file mode 100644
index 0000000..2c6a237
--- /dev/null
+++ b/addons/limboai/icons/BTDelay.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTDelay.svg.import b/addons/limboai/icons/BTDelay.svg.import
new file mode 100644
index 0000000..826f0a0
--- /dev/null
+++ b/addons/limboai/icons/BTDelay.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c1pwxmpud32mm"
+path="res://.godot/imported/BTDelay.svg-1eb814224ebee27c668e10a73d85b845.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTDelay.svg"
+dest_files=["res://.godot/imported/BTDelay.svg-1eb814224ebee27c668e10a73d85b845.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTDynamicSelector.svg b/addons/limboai/icons/BTDynamicSelector.svg
new file mode 100644
index 0000000..b9c8f02
--- /dev/null
+++ b/addons/limboai/icons/BTDynamicSelector.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTDynamicSelector.svg.import b/addons/limboai/icons/BTDynamicSelector.svg.import
new file mode 100644
index 0000000..e36a81c
--- /dev/null
+++ b/addons/limboai/icons/BTDynamicSelector.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dl2e6h2n41774"
+path="res://.godot/imported/BTDynamicSelector.svg-d88a1aa9fb8d8826b74e69dad4c99f54.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTDynamicSelector.svg"
+dest_files=["res://.godot/imported/BTDynamicSelector.svg-d88a1aa9fb8d8826b74e69dad4c99f54.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTDynamicSequence.svg b/addons/limboai/icons/BTDynamicSequence.svg
new file mode 100644
index 0000000..86c8f54
--- /dev/null
+++ b/addons/limboai/icons/BTDynamicSequence.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTDynamicSequence.svg.import b/addons/limboai/icons/BTDynamicSequence.svg.import
new file mode 100644
index 0000000..f9fb440
--- /dev/null
+++ b/addons/limboai/icons/BTDynamicSequence.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c6tkjss41nlxn"
+path="res://.godot/imported/BTDynamicSequence.svg-d2b6a83c37a1553bc168a9837ae0cb1d.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTDynamicSequence.svg"
+dest_files=["res://.godot/imported/BTDynamicSequence.svg-d2b6a83c37a1553bc168a9837ae0cb1d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTEvaluateExpression.svg b/addons/limboai/icons/BTEvaluateExpression.svg
new file mode 100644
index 0000000..d1cf36f
--- /dev/null
+++ b/addons/limboai/icons/BTEvaluateExpression.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTEvaluateExpression.svg.import b/addons/limboai/icons/BTEvaluateExpression.svg.import
new file mode 100644
index 0000000..1b1a48d
--- /dev/null
+++ b/addons/limboai/icons/BTEvaluateExpression.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bfug5mtpo1orw"
+path="res://.godot/imported/BTEvaluateExpression.svg-d9edc0d3cf9dd54c6a34ffc8a23bf8e3.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTEvaluateExpression.svg"
+dest_files=["res://.godot/imported/BTEvaluateExpression.svg-d9edc0d3cf9dd54c6a34ffc8a23bf8e3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTFail.svg b/addons/limboai/icons/BTFail.svg
new file mode 100644
index 0000000..7be2920
--- /dev/null
+++ b/addons/limboai/icons/BTFail.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTFail.svg.import b/addons/limboai/icons/BTFail.svg.import
new file mode 100644
index 0000000..51c0940
--- /dev/null
+++ b/addons/limboai/icons/BTFail.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bxkdnsya4y3hr"
+path="res://.godot/imported/BTFail.svg-0440819265455ee47b2cf2ca8f1b8018.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTFail.svg"
+dest_files=["res://.godot/imported/BTFail.svg-0440819265455ee47b2cf2ca8f1b8018.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTForEach.svg b/addons/limboai/icons/BTForEach.svg
new file mode 100644
index 0000000..819c0ed
--- /dev/null
+++ b/addons/limboai/icons/BTForEach.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTForEach.svg.import b/addons/limboai/icons/BTForEach.svg.import
new file mode 100644
index 0000000..1d6bf2c
--- /dev/null
+++ b/addons/limboai/icons/BTForEach.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bh2tp63bmvyku"
+path="res://.godot/imported/BTForEach.svg-4ca6daee422cda100144e3414286df7f.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTForEach.svg"
+dest_files=["res://.godot/imported/BTForEach.svg-4ca6daee422cda100144e3414286df7f.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTInvert.svg b/addons/limboai/icons/BTInvert.svg
new file mode 100644
index 0000000..31be0d5
--- /dev/null
+++ b/addons/limboai/icons/BTInvert.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTInvert.svg.import b/addons/limboai/icons/BTInvert.svg.import
new file mode 100644
index 0000000..91a97a2
--- /dev/null
+++ b/addons/limboai/icons/BTInvert.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bf1qwuavp48o5"
+path="res://.godot/imported/BTInvert.svg-19687b5c798f968b9610763066baa2a0.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTInvert.svg"
+dest_files=["res://.godot/imported/BTInvert.svg-19687b5c798f968b9610763066baa2a0.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTNewScope.svg b/addons/limboai/icons/BTNewScope.svg
new file mode 100644
index 0000000..598d39b
--- /dev/null
+++ b/addons/limboai/icons/BTNewScope.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTNewScope.svg.import b/addons/limboai/icons/BTNewScope.svg.import
new file mode 100644
index 0000000..8875406
--- /dev/null
+++ b/addons/limboai/icons/BTNewScope.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dkblguri8go3t"
+path="res://.godot/imported/BTNewScope.svg-d536a90c30773badb76653d8c928cfe0.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTNewScope.svg"
+dest_files=["res://.godot/imported/BTNewScope.svg-d536a90c30773badb76653d8c928cfe0.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTParallel.svg b/addons/limboai/icons/BTParallel.svg
new file mode 100644
index 0000000..7ee727a
--- /dev/null
+++ b/addons/limboai/icons/BTParallel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTParallel.svg.import b/addons/limboai/icons/BTParallel.svg.import
new file mode 100644
index 0000000..ac64865
--- /dev/null
+++ b/addons/limboai/icons/BTParallel.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ddjgkxq6rbwu5"
+path="res://.godot/imported/BTParallel.svg-54126e7f374b26a890ddd82c580db45c.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTParallel.svg"
+dest_files=["res://.godot/imported/BTParallel.svg-54126e7f374b26a890ddd82c580db45c.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTPauseAnimation.svg b/addons/limboai/icons/BTPauseAnimation.svg
new file mode 100644
index 0000000..d0878cd
--- /dev/null
+++ b/addons/limboai/icons/BTPauseAnimation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTPauseAnimation.svg.import b/addons/limboai/icons/BTPauseAnimation.svg.import
new file mode 100644
index 0000000..88f20f4
--- /dev/null
+++ b/addons/limboai/icons/BTPauseAnimation.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c4lv2cus21ys0"
+path="res://.godot/imported/BTPauseAnimation.svg-e1bc0cf7bcd45a0faa047192242d174b.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTPauseAnimation.svg"
+dest_files=["res://.godot/imported/BTPauseAnimation.svg-e1bc0cf7bcd45a0faa047192242d174b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTPlayAnimation.svg b/addons/limboai/icons/BTPlayAnimation.svg
new file mode 100644
index 0000000..d387bf6
--- /dev/null
+++ b/addons/limboai/icons/BTPlayAnimation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTPlayAnimation.svg.import b/addons/limboai/icons/BTPlayAnimation.svg.import
new file mode 100644
index 0000000..c2138c3
--- /dev/null
+++ b/addons/limboai/icons/BTPlayAnimation.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://o4vi45kokhkm"
+path="res://.godot/imported/BTPlayAnimation.svg-8821f3b3413b9b328414add0e843468c.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTPlayAnimation.svg"
+dest_files=["res://.godot/imported/BTPlayAnimation.svg-8821f3b3413b9b328414add0e843468c.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTPlayer.svg b/addons/limboai/icons/BTPlayer.svg
new file mode 100644
index 0000000..7a874c7
--- /dev/null
+++ b/addons/limboai/icons/BTPlayer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTPlayer.svg.import b/addons/limboai/icons/BTPlayer.svg.import
new file mode 100644
index 0000000..6b695d1
--- /dev/null
+++ b/addons/limboai/icons/BTPlayer.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b6qnuqqrpv8k"
+path="res://.godot/imported/BTPlayer.svg-ed7adc3cf4a0f3daa1e17a1a77e9a3a2.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTPlayer.svg"
+dest_files=["res://.godot/imported/BTPlayer.svg-ed7adc3cf4a0f3daa1e17a1a77e9a3a2.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTProbability.svg b/addons/limboai/icons/BTProbability.svg
new file mode 100644
index 0000000..b1a90d9
--- /dev/null
+++ b/addons/limboai/icons/BTProbability.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTProbability.svg.import b/addons/limboai/icons/BTProbability.svg.import
new file mode 100644
index 0000000..a968465
--- /dev/null
+++ b/addons/limboai/icons/BTProbability.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://m0efsybbpsek"
+path="res://.godot/imported/BTProbability.svg-f691fbf51ca49bc268a17742b1e04985.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTProbability.svg"
+dest_files=["res://.godot/imported/BTProbability.svg-f691fbf51ca49bc268a17742b1e04985.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTProbabilitySelector.svg b/addons/limboai/icons/BTProbabilitySelector.svg
new file mode 100644
index 0000000..f9516a1
--- /dev/null
+++ b/addons/limboai/icons/BTProbabilitySelector.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTProbabilitySelector.svg.import b/addons/limboai/icons/BTProbabilitySelector.svg.import
new file mode 100644
index 0000000..dbc8001
--- /dev/null
+++ b/addons/limboai/icons/BTProbabilitySelector.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d10xv0ps7u44a"
+path="res://.godot/imported/BTProbabilitySelector.svg-30f59f4e802f72a701d9d31f605a64f2.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTProbabilitySelector.svg"
+dest_files=["res://.godot/imported/BTProbabilitySelector.svg-30f59f4e802f72a701d9d31f605a64f2.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTRandomSelector.svg b/addons/limboai/icons/BTRandomSelector.svg
new file mode 100644
index 0000000..6dd87d1
--- /dev/null
+++ b/addons/limboai/icons/BTRandomSelector.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTRandomSelector.svg.import b/addons/limboai/icons/BTRandomSelector.svg.import
new file mode 100644
index 0000000..1a9dc4e
--- /dev/null
+++ b/addons/limboai/icons/BTRandomSelector.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dsjtxqxmv7iv2"
+path="res://.godot/imported/BTRandomSelector.svg-4bae5a6e3e1affdd4952e8bff4c018ff.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTRandomSelector.svg"
+dest_files=["res://.godot/imported/BTRandomSelector.svg-4bae5a6e3e1affdd4952e8bff4c018ff.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTRandomSequence.svg b/addons/limboai/icons/BTRandomSequence.svg
new file mode 100644
index 0000000..ff21602
--- /dev/null
+++ b/addons/limboai/icons/BTRandomSequence.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTRandomSequence.svg.import b/addons/limboai/icons/BTRandomSequence.svg.import
new file mode 100644
index 0000000..da82ecb
--- /dev/null
+++ b/addons/limboai/icons/BTRandomSequence.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dk1wj7syve67c"
+path="res://.godot/imported/BTRandomSequence.svg-85ce4b080ec904d340a807de2669110d.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTRandomSequence.svg"
+dest_files=["res://.godot/imported/BTRandomSequence.svg-85ce4b080ec904d340a807de2669110d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTRandomWait.svg b/addons/limboai/icons/BTRandomWait.svg
new file mode 100644
index 0000000..8174e2a
--- /dev/null
+++ b/addons/limboai/icons/BTRandomWait.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTRandomWait.svg.import b/addons/limboai/icons/BTRandomWait.svg.import
new file mode 100644
index 0000000..7b0c485
--- /dev/null
+++ b/addons/limboai/icons/BTRandomWait.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://0d54chkcu8tl"
+path="res://.godot/imported/BTRandomWait.svg-14f03a0fb52c993ec1cdbb780d9dfea3.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTRandomWait.svg"
+dest_files=["res://.godot/imported/BTRandomWait.svg-14f03a0fb52c993ec1cdbb780d9dfea3.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTRepeat.svg b/addons/limboai/icons/BTRepeat.svg
new file mode 100644
index 0000000..d937bcf
--- /dev/null
+++ b/addons/limboai/icons/BTRepeat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTRepeat.svg.import b/addons/limboai/icons/BTRepeat.svg.import
new file mode 100644
index 0000000..4b7f7d5
--- /dev/null
+++ b/addons/limboai/icons/BTRepeat.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cufqqr4t7wynk"
+path="res://.godot/imported/BTRepeat.svg-ca1efcf8bdef890d4575f2bf66ba0a8d.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTRepeat.svg"
+dest_files=["res://.godot/imported/BTRepeat.svg-ca1efcf8bdef890d4575f2bf66ba0a8d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTRepeatUntilFailure.svg b/addons/limboai/icons/BTRepeatUntilFailure.svg
new file mode 100644
index 0000000..88b1261
--- /dev/null
+++ b/addons/limboai/icons/BTRepeatUntilFailure.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTRepeatUntilFailure.svg.import b/addons/limboai/icons/BTRepeatUntilFailure.svg.import
new file mode 100644
index 0000000..3261b7d
--- /dev/null
+++ b/addons/limboai/icons/BTRepeatUntilFailure.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://d2qnqeffikk74"
+path="res://.godot/imported/BTRepeatUntilFailure.svg-97ff99132cb6b229bb78050959a89118.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTRepeatUntilFailure.svg"
+dest_files=["res://.godot/imported/BTRepeatUntilFailure.svg-97ff99132cb6b229bb78050959a89118.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTRepeatUntilSuccess.svg b/addons/limboai/icons/BTRepeatUntilSuccess.svg
new file mode 100644
index 0000000..9087ce4
--- /dev/null
+++ b/addons/limboai/icons/BTRepeatUntilSuccess.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTRepeatUntilSuccess.svg.import b/addons/limboai/icons/BTRepeatUntilSuccess.svg.import
new file mode 100644
index 0000000..bfe9d0e
--- /dev/null
+++ b/addons/limboai/icons/BTRepeatUntilSuccess.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://1hecy64mwa4s"
+path="res://.godot/imported/BTRepeatUntilSuccess.svg-160e74b6885a57a745db349d6f7004a8.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTRepeatUntilSuccess.svg"
+dest_files=["res://.godot/imported/BTRepeatUntilSuccess.svg-160e74b6885a57a745db349d6f7004a8.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTRunLimit.svg b/addons/limboai/icons/BTRunLimit.svg
new file mode 100644
index 0000000..1ac7fa1
--- /dev/null
+++ b/addons/limboai/icons/BTRunLimit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTRunLimit.svg.import b/addons/limboai/icons/BTRunLimit.svg.import
new file mode 100644
index 0000000..0f14f39
--- /dev/null
+++ b/addons/limboai/icons/BTRunLimit.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bc8dnsep3dpio"
+path="res://.godot/imported/BTRunLimit.svg-eb80a597bf9102a626f8c0e9663703d1.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTRunLimit.svg"
+dest_files=["res://.godot/imported/BTRunLimit.svg-eb80a597bf9102a626f8c0e9663703d1.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTSelector.svg b/addons/limboai/icons/BTSelector.svg
new file mode 100644
index 0000000..d7cafe5
--- /dev/null
+++ b/addons/limboai/icons/BTSelector.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTSelector.svg.import b/addons/limboai/icons/BTSelector.svg.import
new file mode 100644
index 0000000..fe49e20
--- /dev/null
+++ b/addons/limboai/icons/BTSelector.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://brx2og56pgjdm"
+path="res://.godot/imported/BTSelector.svg-859c7746bc77c632d2a60052d2e96cf0.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTSelector.svg"
+dest_files=["res://.godot/imported/BTSelector.svg-859c7746bc77c632d2a60052d2e96cf0.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTSequence.svg b/addons/limboai/icons/BTSequence.svg
new file mode 100644
index 0000000..7eb8f6f
--- /dev/null
+++ b/addons/limboai/icons/BTSequence.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTSequence.svg.import b/addons/limboai/icons/BTSequence.svg.import
new file mode 100644
index 0000000..d06180c
--- /dev/null
+++ b/addons/limboai/icons/BTSequence.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b76g8k2lwsiql"
+path="res://.godot/imported/BTSequence.svg-3dfd257b3424273ac1ea2f8a48dab7b6.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTSequence.svg"
+dest_files=["res://.godot/imported/BTSequence.svg-3dfd257b3424273ac1ea2f8a48dab7b6.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTSetAgentProperty.svg b/addons/limboai/icons/BTSetAgentProperty.svg
new file mode 100644
index 0000000..c92a710
--- /dev/null
+++ b/addons/limboai/icons/BTSetAgentProperty.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTSetAgentProperty.svg.import b/addons/limboai/icons/BTSetAgentProperty.svg.import
new file mode 100644
index 0000000..aca90cc
--- /dev/null
+++ b/addons/limboai/icons/BTSetAgentProperty.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dejxmdjrlxw4p"
+path="res://.godot/imported/BTSetAgentProperty.svg-8183ecffb47d990ae67daaad34563dc5.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTSetAgentProperty.svg"
+dest_files=["res://.godot/imported/BTSetAgentProperty.svg-8183ecffb47d990ae67daaad34563dc5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTSetVar.svg b/addons/limboai/icons/BTSetVar.svg
new file mode 100644
index 0000000..09f6822
--- /dev/null
+++ b/addons/limboai/icons/BTSetVar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTSetVar.svg.import b/addons/limboai/icons/BTSetVar.svg.import
new file mode 100644
index 0000000..25bae43
--- /dev/null
+++ b/addons/limboai/icons/BTSetVar.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c7hpnuoq5ysre"
+path="res://.godot/imported/BTSetVar.svg-a8c4f135c2df6bc3f587cbd9f1fe2d95.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTSetVar.svg"
+dest_files=["res://.godot/imported/BTSetVar.svg-a8c4f135c2df6bc3f587cbd9f1fe2d95.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTState.svg b/addons/limboai/icons/BTState.svg
new file mode 100644
index 0000000..7a874c7
--- /dev/null
+++ b/addons/limboai/icons/BTState.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTState.svg.import b/addons/limboai/icons/BTState.svg.import
new file mode 100644
index 0000000..dc98758
--- /dev/null
+++ b/addons/limboai/icons/BTState.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://baruouu456oos"
+path="res://.godot/imported/BTState.svg-71220d904fcc42cc20dd0af8145f86a0.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTState.svg"
+dest_files=["res://.godot/imported/BTState.svg-71220d904fcc42cc20dd0af8145f86a0.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTStopAnimation.svg b/addons/limboai/icons/BTStopAnimation.svg
new file mode 100644
index 0000000..973b542
--- /dev/null
+++ b/addons/limboai/icons/BTStopAnimation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTStopAnimation.svg.import b/addons/limboai/icons/BTStopAnimation.svg.import
new file mode 100644
index 0000000..41f0ec7
--- /dev/null
+++ b/addons/limboai/icons/BTStopAnimation.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://by2uf64rd4d0j"
+path="res://.godot/imported/BTStopAnimation.svg-ea88498cd747a6218f7853f6be3ded34.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTStopAnimation.svg"
+dest_files=["res://.godot/imported/BTStopAnimation.svg-ea88498cd747a6218f7853f6be3ded34.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTSubtree.svg b/addons/limboai/icons/BTSubtree.svg
new file mode 100644
index 0000000..e95ffee
--- /dev/null
+++ b/addons/limboai/icons/BTSubtree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTSubtree.svg.import b/addons/limboai/icons/BTSubtree.svg.import
new file mode 100644
index 0000000..9fc91d8
--- /dev/null
+++ b/addons/limboai/icons/BTSubtree.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://nyw10tyoiuns"
+path="res://.godot/imported/BTSubtree.svg-aa8f2ece5e71aca9132a08c7af1c1ce5.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTSubtree.svg"
+dest_files=["res://.godot/imported/BTSubtree.svg-aa8f2ece5e71aca9132a08c7af1c1ce5.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTTimeLimit.svg b/addons/limboai/icons/BTTimeLimit.svg
new file mode 100644
index 0000000..2c6a237
--- /dev/null
+++ b/addons/limboai/icons/BTTimeLimit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTTimeLimit.svg.import b/addons/limboai/icons/BTTimeLimit.svg.import
new file mode 100644
index 0000000..12cf285
--- /dev/null
+++ b/addons/limboai/icons/BTTimeLimit.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cu3jkagvctvi3"
+path="res://.godot/imported/BTTimeLimit.svg-ea3ca26eeb5c2b59f3fdb6e806985f3b.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTTimeLimit.svg"
+dest_files=["res://.godot/imported/BTTimeLimit.svg-ea3ca26eeb5c2b59f3fdb6e806985f3b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTWait.svg b/addons/limboai/icons/BTWait.svg
new file mode 100644
index 0000000..8174e2a
--- /dev/null
+++ b/addons/limboai/icons/BTWait.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTWait.svg.import b/addons/limboai/icons/BTWait.svg.import
new file mode 100644
index 0000000..66cabb3
--- /dev/null
+++ b/addons/limboai/icons/BTWait.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c4dxqgds4k5mo"
+path="res://.godot/imported/BTWait.svg-2a5d27d0c617861f027b2e66516aa5bf.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTWait.svg"
+dest_files=["res://.godot/imported/BTWait.svg-2a5d27d0c617861f027b2e66516aa5bf.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BTWaitTicks.svg b/addons/limboai/icons/BTWaitTicks.svg
new file mode 100644
index 0000000..8174e2a
--- /dev/null
+++ b/addons/limboai/icons/BTWaitTicks.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BTWaitTicks.svg.import b/addons/limboai/icons/BTWaitTicks.svg.import
new file mode 100644
index 0000000..bbd31e3
--- /dev/null
+++ b/addons/limboai/icons/BTWaitTicks.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cj4wkocu2jc3"
+path="res://.godot/imported/BTWaitTicks.svg-85a005f86874f6811423163f3f5673b2.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BTWaitTicks.svg"
+dest_files=["res://.godot/imported/BTWaitTicks.svg-85a005f86874f6811423163f3f5673b2.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BehaviorTree.svg b/addons/limboai/icons/BehaviorTree.svg
new file mode 100644
index 0000000..e95ffee
--- /dev/null
+++ b/addons/limboai/icons/BehaviorTree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BehaviorTree.svg.import b/addons/limboai/icons/BehaviorTree.svg.import
new file mode 100644
index 0000000..491dd99
--- /dev/null
+++ b/addons/limboai/icons/BehaviorTree.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b4q36mvgvosow"
+path="res://.godot/imported/BehaviorTree.svg-9b40a8b5e1feb368d9f11b0fb1785cca.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BehaviorTree.svg"
+dest_files=["res://.godot/imported/BehaviorTree.svg-9b40a8b5e1feb368d9f11b0fb1785cca.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BehaviorTreeView.svg b/addons/limboai/icons/BehaviorTreeView.svg
new file mode 100644
index 0000000..8deff60
--- /dev/null
+++ b/addons/limboai/icons/BehaviorTreeView.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BehaviorTreeView.svg.import b/addons/limboai/icons/BehaviorTreeView.svg.import
new file mode 100644
index 0000000..e8fa962
--- /dev/null
+++ b/addons/limboai/icons/BehaviorTreeView.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cq0glhq4ee4uj"
+path="res://.godot/imported/BehaviorTreeView.svg-15f9bfa321ed4a264ed8404fd13b53fc.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BehaviorTreeView.svg"
+dest_files=["res://.godot/imported/BehaviorTreeView.svg-15f9bfa321ed4a264ed8404fd13b53fc.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/BlackboardPlan.svg b/addons/limboai/icons/BlackboardPlan.svg
new file mode 100644
index 0000000..958fba3
--- /dev/null
+++ b/addons/limboai/icons/BlackboardPlan.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/BlackboardPlan.svg.import b/addons/limboai/icons/BlackboardPlan.svg.import
new file mode 100644
index 0000000..1ec8e4d
--- /dev/null
+++ b/addons/limboai/icons/BlackboardPlan.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dqescemdcf0do"
+path="res://.godot/imported/BlackboardPlan.svg-9029b7aa87de8b935d9cad63480a6a16.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/BlackboardPlan.svg"
+dest_files=["res://.godot/imported/BlackboardPlan.svg-9029b7aa87de8b935d9cad63480a6a16.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboAI.svg b/addons/limboai/icons/LimboAI.svg
new file mode 100644
index 0000000..54b042a
--- /dev/null
+++ b/addons/limboai/icons/LimboAI.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboAI.svg.import b/addons/limboai/icons/LimboAI.svg.import
new file mode 100644
index 0000000..2891848
--- /dev/null
+++ b/addons/limboai/icons/LimboAI.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cfoo4u2hlrscn"
+path="res://.godot/imported/LimboAI.svg-06efe3b51f2fc280e33c37672e174b5e.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboAI.svg"
+dest_files=["res://.godot/imported/LimboAI.svg-06efe3b51f2fc280e33c37672e174b5e.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboDeselectAll.svg b/addons/limboai/icons/LimboDeselectAll.svg
new file mode 100644
index 0000000..2047080
--- /dev/null
+++ b/addons/limboai/icons/LimboDeselectAll.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboDeselectAll.svg.import b/addons/limboai/icons/LimboDeselectAll.svg.import
new file mode 100644
index 0000000..4867777
--- /dev/null
+++ b/addons/limboai/icons/LimboDeselectAll.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://darlh30k514tp"
+path="res://.godot/imported/LimboDeselectAll.svg-72ebb41c0238cae163a7bf3fc821e6ad.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboDeselectAll.svg"
+dest_files=["res://.godot/imported/LimboDeselectAll.svg-72ebb41c0238cae163a7bf3fc821e6ad.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboEditBlackboard.svg b/addons/limboai/icons/LimboEditBlackboard.svg
new file mode 100644
index 0000000..45ffb92
--- /dev/null
+++ b/addons/limboai/icons/LimboEditBlackboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboEditBlackboard.svg.import b/addons/limboai/icons/LimboEditBlackboard.svg.import
new file mode 100644
index 0000000..0a6e4bc
--- /dev/null
+++ b/addons/limboai/icons/LimboEditBlackboard.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://osq7kym6q22m"
+path="res://.godot/imported/LimboEditBlackboard.svg-eacd7cf985d654974a99a4009ffcc125.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboEditBlackboard.svg"
+dest_files=["res://.godot/imported/LimboEditBlackboard.svg-eacd7cf985d654974a99a4009ffcc125.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboExtraBlackboard.svg b/addons/limboai/icons/LimboExtraBlackboard.svg
new file mode 100644
index 0000000..09f6822
--- /dev/null
+++ b/addons/limboai/icons/LimboExtraBlackboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboExtraBlackboard.svg.import b/addons/limboai/icons/LimboExtraBlackboard.svg.import
new file mode 100644
index 0000000..8925540
--- /dev/null
+++ b/addons/limboai/icons/LimboExtraBlackboard.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bolwxy28idi8n"
+path="res://.godot/imported/LimboExtraBlackboard.svg-45ef3f1dea682b1da438186cfcc0f47b.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboExtraBlackboard.svg"
+dest_files=["res://.godot/imported/LimboExtraBlackboard.svg-45ef3f1dea682b1da438186cfcc0f47b.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboExtraClock.svg b/addons/limboai/icons/LimboExtraClock.svg
new file mode 100644
index 0000000..a3f536a
--- /dev/null
+++ b/addons/limboai/icons/LimboExtraClock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboExtraClock.svg.import b/addons/limboai/icons/LimboExtraClock.svg.import
new file mode 100644
index 0000000..f1f3b74
--- /dev/null
+++ b/addons/limboai/icons/LimboExtraClock.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bhut3tokd1621"
+path="res://.godot/imported/LimboExtraClock.svg-840321103249948265bce58e6fb69483.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboExtraClock.svg"
+dest_files=["res://.godot/imported/LimboExtraClock.svg-840321103249948265bce58e6fb69483.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboExtraVariable.svg b/addons/limboai/icons/LimboExtraVariable.svg
new file mode 100644
index 0000000..06780f0
--- /dev/null
+++ b/addons/limboai/icons/LimboExtraVariable.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboExtraVariable.svg.import b/addons/limboai/icons/LimboExtraVariable.svg.import
new file mode 100644
index 0000000..c35e79e
--- /dev/null
+++ b/addons/limboai/icons/LimboExtraVariable.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://c3xj2ji3knnkr"
+path="res://.godot/imported/LimboExtraVariable.svg-dc718672cf9e469886aa48452fdda7b0.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboExtraVariable.svg"
+dest_files=["res://.godot/imported/LimboExtraVariable.svg-dc718672cf9e469886aa48452fdda7b0.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboExtractSubtree.svg b/addons/limboai/icons/LimboExtractSubtree.svg
new file mode 100644
index 0000000..c3c83a2
--- /dev/null
+++ b/addons/limboai/icons/LimboExtractSubtree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboExtractSubtree.svg.import b/addons/limboai/icons/LimboExtractSubtree.svg.import
new file mode 100644
index 0000000..9019338
--- /dev/null
+++ b/addons/limboai/icons/LimboExtractSubtree.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bnbvo3g0ei4i3"
+path="res://.godot/imported/LimboExtractSubtree.svg-84e8d198d3be4b2b8d625d3621368079.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboExtractSubtree.svg"
+dest_files=["res://.godot/imported/LimboExtractSubtree.svg-84e8d198d3be4b2b8d625d3621368079.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboHSM.svg b/addons/limboai/icons/LimboHSM.svg
new file mode 100644
index 0000000..095cfd4
--- /dev/null
+++ b/addons/limboai/icons/LimboHSM.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboHSM.svg.import b/addons/limboai/icons/LimboHSM.svg.import
new file mode 100644
index 0000000..d2bb8bf
--- /dev/null
+++ b/addons/limboai/icons/LimboHSM.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://dhvo1gpde1wr7"
+path="res://.godot/imported/LimboHSM.svg-28cca67d246d589dd15402abd78a1ec2.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboHSM.svg"
+dest_files=["res://.godot/imported/LimboHSM.svg-28cca67d246d589dd15402abd78a1ec2.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboPercent.svg b/addons/limboai/icons/LimboPercent.svg
new file mode 100644
index 0000000..8f60917
--- /dev/null
+++ b/addons/limboai/icons/LimboPercent.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboPercent.svg.import b/addons/limboai/icons/LimboPercent.svg.import
new file mode 100644
index 0000000..b461ec2
--- /dev/null
+++ b/addons/limboai/icons/LimboPercent.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://ch7j58ffmyw1q"
+path="res://.godot/imported/LimboPercent.svg-00733fc19fb3bbe7f8396b1f07a89da0.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboPercent.svg"
+dest_files=["res://.godot/imported/LimboPercent.svg-00733fc19fb3bbe7f8396b1f07a89da0.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboSelectAll.svg b/addons/limboai/icons/LimboSelectAll.svg
new file mode 100644
index 0000000..fd3df37
--- /dev/null
+++ b/addons/limboai/icons/LimboSelectAll.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboSelectAll.svg.import b/addons/limboai/icons/LimboSelectAll.svg.import
new file mode 100644
index 0000000..f98d88f
--- /dev/null
+++ b/addons/limboai/icons/LimboSelectAll.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bi2fdmdrka5ni"
+path="res://.godot/imported/LimboSelectAll.svg-db7b91d0d0b530b8e41c9d3772e60fab.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboSelectAll.svg"
+dest_files=["res://.godot/imported/LimboSelectAll.svg-db7b91d0d0b530b8e41c9d3772e60fab.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboState.svg b/addons/limboai/icons/LimboState.svg
new file mode 100644
index 0000000..dd8e765
--- /dev/null
+++ b/addons/limboai/icons/LimboState.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboState.svg.import b/addons/limboai/icons/LimboState.svg.import
new file mode 100644
index 0000000..e15d444
--- /dev/null
+++ b/addons/limboai/icons/LimboState.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://web03dtqqdv2"
+path="res://.godot/imported/LimboState.svg-b1db06d5ed3101ee6256deae4330f6b7.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboState.svg"
+dest_files=["res://.godot/imported/LimboState.svg-b1db06d5ed3101ee6256deae4330f6b7.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboVarAdd.svg b/addons/limboai/icons/LimboVarAdd.svg
new file mode 100644
index 0000000..b2910a0
--- /dev/null
+++ b/addons/limboai/icons/LimboVarAdd.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboVarAdd.svg.import b/addons/limboai/icons/LimboVarAdd.svg.import
new file mode 100644
index 0000000..3964493
--- /dev/null
+++ b/addons/limboai/icons/LimboVarAdd.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://bnqt520rudfxk"
+path="res://.godot/imported/LimboVarAdd.svg-101bcdd036315254e4b61e13747c0788.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboVarAdd.svg"
+dest_files=["res://.godot/imported/LimboVarAdd.svg-101bcdd036315254e4b61e13747c0788.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboVarEmpty.svg b/addons/limboai/icons/LimboVarEmpty.svg
new file mode 100644
index 0000000..24f5088
--- /dev/null
+++ b/addons/limboai/icons/LimboVarEmpty.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboVarEmpty.svg.import b/addons/limboai/icons/LimboVarEmpty.svg.import
new file mode 100644
index 0000000..3a9934b
--- /dev/null
+++ b/addons/limboai/icons/LimboVarEmpty.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://b3wdl8jgith3i"
+path="res://.godot/imported/LimboVarEmpty.svg-3014256fb5cd566cab45b3327d98988d.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboVarEmpty.svg"
+dest_files=["res://.godot/imported/LimboVarEmpty.svg-3014256fb5cd566cab45b3327d98988d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboVarError.svg b/addons/limboai/icons/LimboVarError.svg
new file mode 100644
index 0000000..563d762
--- /dev/null
+++ b/addons/limboai/icons/LimboVarError.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboVarError.svg.import b/addons/limboai/icons/LimboVarError.svg.import
new file mode 100644
index 0000000..0dbdc0b
--- /dev/null
+++ b/addons/limboai/icons/LimboVarError.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://qnlrj2hvxp58"
+path="res://.godot/imported/LimboVarError.svg-d9f1ab3e5b2cbb6e0013b65ddb23c1cf.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboVarError.svg"
+dest_files=["res://.godot/imported/LimboVarError.svg-d9f1ab3e5b2cbb6e0013b65ddb23c1cf.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboVarExists.svg b/addons/limboai/icons/LimboVarExists.svg
new file mode 100644
index 0000000..3509c64
--- /dev/null
+++ b/addons/limboai/icons/LimboVarExists.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboVarExists.svg.import b/addons/limboai/icons/LimboVarExists.svg.import
new file mode 100644
index 0000000..c87481a
--- /dev/null
+++ b/addons/limboai/icons/LimboVarExists.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://v3llyfnghlbr"
+path="res://.godot/imported/LimboVarExists.svg-20d2e0b4a7a064b9c6d2cc44711570dd.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboVarExists.svg"
+dest_files=["res://.godot/imported/LimboVarExists.svg-20d2e0b4a7a064b9c6d2cc44711570dd.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboVarNotFound.svg b/addons/limboai/icons/LimboVarNotFound.svg
new file mode 100644
index 0000000..049f6cf
--- /dev/null
+++ b/addons/limboai/icons/LimboVarNotFound.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboVarNotFound.svg.import b/addons/limboai/icons/LimboVarNotFound.svg.import
new file mode 100644
index 0000000..4000a4d
--- /dev/null
+++ b/addons/limboai/icons/LimboVarNotFound.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://cc8wltkxchlpl"
+path="res://.godot/imported/LimboVarNotFound.svg-fce88dc2c01e17a54455124e43955f9d.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboVarNotFound.svg"
+dest_files=["res://.godot/imported/LimboVarNotFound.svg-fce88dc2c01e17a54455124e43955f9d.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/icons/LimboVarPrivate.svg b/addons/limboai/icons/LimboVarPrivate.svg
new file mode 100644
index 0000000..87b2c0f
--- /dev/null
+++ b/addons/limboai/icons/LimboVarPrivate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/limboai/icons/LimboVarPrivate.svg.import b/addons/limboai/icons/LimboVarPrivate.svg.import
new file mode 100644
index 0000000..f450e57
--- /dev/null
+++ b/addons/limboai/icons/LimboVarPrivate.svg.import
@@ -0,0 +1,38 @@
+[remap]
+
+importer="texture"
+type="CompressedTexture2D"
+uid="uid://de0674bsqwfl6"
+path="res://.godot/imported/LimboVarPrivate.svg-99b4229567f7f98cdabf892099c91da2.ctex"
+metadata={
+"has_editor_variant": true,
+"vram_texture": false
+}
+
+[deps]
+
+source_file="res://addons/limboai/icons/LimboVarPrivate.svg"
+dest_files=["res://.godot/imported/LimboVarPrivate.svg-99b4229567f7f98cdabf892099c91da2.ctex"]
+
+[params]
+
+compress/mode=0
+compress/high_quality=false
+compress/lossy_quality=0.7
+compress/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=1
+svg/scale=1.0
+editor/scale_with_editor_scale=true
+editor/convert_colors_with_editor_theme=true
diff --git a/addons/limboai/version.txt b/addons/limboai/version.txt
new file mode 100644
index 0000000..18fa8e7
--- /dev/null
+++ b/addons/limboai/version.txt
@@ -0,0 +1 @@
+v1.3.0
diff --git a/assets/characters/coco/coco.tres b/assets/characters/coco/coco.tres
index 7b67ff1..50b8132 100644
--- a/assets/characters/coco/coco.tres
+++ b/assets/characters/coco/coco.tres
@@ -1,13 +1,8 @@
-[gd_resource type="SpineSkeletonDataResource" load_steps=4 format=3 uid="uid://dn5wtcrr40ahd"]
-
-[ext_resource type="SpineAtlasResource" uid="uid://bc0c8osnp33q4" path="res://assets/characters/coco/coco.atlas" id="1_pvekc"]
-[ext_resource type="SpineSkeletonFileResource" uid="uid://cooseqw4fb232" path="res://assets/characters/coco/skeleton.skel" id="2_x7r6f"]
+[gd_resource type="SpineSkeletonDataResource" load_steps=2 format=3 uid="uid://dn5wtcrr40ahd"]
[sub_resource type="SpineAnimationMix" id="SpineAnimationMix_tddij"]
from = "animation"
to = "animation"
[resource]
-atlas_res = ExtResource("1_pvekc")
-skeleton_file_res = ExtResource("2_x7r6f")
animation_mixes = [SubResource("SpineAnimationMix_tddij")]
diff --git a/assets/characters/coco/coco.tscn b/assets/characters/coco/coco.tscn
index 27f993f..f3534ac 100644
--- a/assets/characters/coco/coco.tscn
+++ b/assets/characters/coco/coco.tscn
@@ -7,7 +7,7 @@
[ext_resource type="Script" path="res://src/spine_sprite.gd" id="5_migwh"]
[ext_resource type="Script" path="res://assets/characters/coco/states/idle.gd" id="6_0vw3v"]
-[sub_resource type="ViewportTexture" id="ViewportTexture_ciuee"]
+[sub_resource type="ViewportTexture" id="ViewportTexture_xbknf"]
viewport_path = NodePath("MeshInstance3D/SubViewport")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_fy03b"]
@@ -18,7 +18,7 @@ transparency = 1
shading_mode = 0
diffuse_mode = 3
specular_mode = 1
-albedo_texture = SubResource("ViewportTexture_ciuee")
+albedo_texture = SubResource("ViewportTexture_xbknf")
billboard_mode = 1
[sub_resource type="QuadMesh" id="QuadMesh_iwcmf"]
diff --git a/assets/characters/coco/coco_bandicoot.skel b/assets/characters/coco/coco_bandicoot.skel
index 2343320..caafc2d 100644
Binary files a/assets/characters/coco/coco_bandicoot.skel and b/assets/characters/coco/coco_bandicoot.skel differ
diff --git a/assets/characters/coco/npc_coco.tscn b/assets/characters/coco/npc_coco.tscn
index dfd9678..a644f81 100644
--- a/assets/characters/coco/npc_coco.tscn
+++ b/assets/characters/coco/npc_coco.tscn
@@ -4,7 +4,7 @@
[ext_resource type="SpineSkeletonDataResource" uid="uid://dn5wtcrr40ahd" path="res://assets/characters/coco/coco.tres" id="2_8ur8k"]
[ext_resource type="Script" path="res://src/spine_sprite.gd" id="3_m02kv"]
-[sub_resource type="ViewportTexture" id="ViewportTexture_1jniv"]
+[sub_resource type="ViewportTexture" id="ViewportTexture_8u2jr"]
viewport_path = NodePath("MeshInstance3D/SubViewport")
[sub_resource type="ShaderMaterial" id="ShaderMaterial_5xxpu"]
@@ -15,7 +15,7 @@ transparency = 1
shading_mode = 0
diffuse_mode = 3
specular_mode = 1
-albedo_texture = SubResource("ViewportTexture_1jniv")
+albedo_texture = SubResource("ViewportTexture_8u2jr")
billboard_mode = 1
[sub_resource type="QuadMesh" id="QuadMesh_iwcmf"]
@@ -48,10 +48,6 @@ size_2d_override_stretch = true
position = Vector2(512, 887)
scale = Vector2(0.5, 0.5)
skeleton_data_res = ExtResource("2_8ur8k")
-preview_skin = "default"
-preview_animation = "animation"
-preview_frame = false
-preview_time = 0.0
script = ExtResource("3_m02kv")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
diff --git a/assets/levels/maps/debug1.tscn b/assets/levels/maps/debug1.tscn
index 38d898a..bf2583a 100644
--- a/assets/levels/maps/debug1.tscn
+++ b/assets/levels/maps/debug1.tscn
@@ -71,14 +71,14 @@ data = PackedVector3Array(5, 0, 5, -5, 0, 5, 5, 0, -5, -5, 0, 5, -5, 0, -5, 5, 0
vertices = PackedVector3Array(1.56663, 0.279793, -3.25, 1.56663, 0.279793, -2.75, 2.31663, 0.279793, -2.5, 4.31663, 0.279793, -3.25, 2.31663, 0.279793, -1.5, 1.56663, 0.279793, 2.5, 8.31663, 0.279793, 2.5, 8.31663, 0.279793, -4.5, 1.56663, 0.279793, -1.25, 4.31663, 0.279793, -4.5, 0.81663, 0.279793, -2.5, -5.68337, 0.279793, -3.25, 0.81663, 0.279793, -1.5, -5.68337, 0.279793, 2.5)
polygons = [PackedInt32Array(1, 0, 2), PackedInt32Array(2, 0, 3), PackedInt32Array(4, 3, 5), PackedInt32Array(5, 3, 6), PackedInt32Array(6, 3, 7), PackedInt32Array(4, 2, 3), PackedInt32Array(5, 8, 4), PackedInt32Array(3, 9, 7), PackedInt32Array(1, 10, 0), PackedInt32Array(0, 10, 11), PackedInt32Array(8, 5, 12), PackedInt32Array(12, 5, 13), PackedInt32Array(12, 13, 11), PackedInt32Array(11, 10, 12)]
-[sub_resource type="ViewportTexture" id="ViewportTexture_3nfil"]
+[sub_resource type="ViewportTexture" id="ViewportTexture_lyeeo"]
viewport_path = NodePath("NavigationRegion3D/MeshInstance3D/SubViewport")
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mdr1l"]
transparency = 2
alpha_scissor_threshold = 0.5
alpha_antialiasing_mode = 0
-albedo_texture = SubResource("ViewportTexture_3nfil")
+albedo_texture = SubResource("ViewportTexture_lyeeo")
metallic_specular = 0.0
[sub_resource type="ShaderMaterial" id="ShaderMaterial_lrfyr"]
diff --git a/assets/levels/maps/debug3.tscn b/assets/levels/maps/debug4.tscn
similarity index 100%
rename from assets/levels/maps/debug3.tscn
rename to assets/levels/maps/debug4.tscn
diff --git a/assets/main.tscn b/assets/main.tscn
index 0db9fd6..2095240 100644
--- a/assets/main.tscn
+++ b/assets/main.tscn
@@ -13,6 +13,7 @@
[node name="Main" type="Node"]
script = ExtResource("1_l1pcn")
+test = 101
[node name="CharacterManager" type="Node" parent="."]
script = ExtResource("2_hvjva")
diff --git a/assets/spine/coco-walk/coco.spine b/assets/spine/coco-walk/coco.spine
index 22c8a91..9fa1979 100644
Binary files a/assets/spine/coco-walk/coco.spine and b/assets/spine/coco-walk/coco.spine differ
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..228640a
--- /dev/null
+++ b/demo/agents/01_agent_melee_simple.tscn
@@ -0,0 +1,34 @@
+[gd_scene load_steps=5 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"]
+
+[node name="AgentMeleeSimple" instance=ExtResource("1_l180o")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_bvbes")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_bvbes")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_bvbes")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_bvbes")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_bvbes")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_bvbes")
+
+[node name="Health" parent="." index="3"]
+max_health = 3.0
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
+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..5a5b780
--- /dev/null
+++ b/demo/agents/02_agent_charger.tscn
@@ -0,0 +1,37 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_n83hi")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_y7pic")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_y7pic")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_y7pic")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_y7pic")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_y7pic")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_y7pic")
+
+[node name="Hitbox" parent="Root" index="1"]
+damage = 2.0
+
+[node name="Health" parent="." index="3"]
+max_health = 8.0
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="4"]
+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..e3533c9
--- /dev/null
+++ b/demo/agents/03_agent_imp.tscn
@@ -0,0 +1,34 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_13xup")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_xd5s8")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_xd5s8")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_xd5s8")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_xd5s8")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_xd5s8")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_xd5s8")
+
+[node name="Health" parent="." index="3"]
+max_health = 4.0
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
+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..2a71d9f
--- /dev/null
+++ b/demo/agents/04_agent_skirmisher.tscn
@@ -0,0 +1,34 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_2ir76")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_w8tqw")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_w8tqw")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_w8tqw")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_w8tqw")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_w8tqw")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_w8tqw")
+
+[node name="Health" parent="." index="3"]
+max_health = 7.0
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="4"]
+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..04e4eb8
--- /dev/null
+++ b/demo/agents/05_agent_ranged.tscn
@@ -0,0 +1,34 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_oa4xm")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_37lvn")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_37lvn")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_37lvn")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_37lvn")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_37lvn")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_37lvn")
+
+[node name="Health" parent="." index="3"]
+max_health = 6.0
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="4"]
+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..242845b
--- /dev/null
+++ b/demo/agents/06_agent_melee_combo.tscn
@@ -0,0 +1,34 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_dny3b")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_4rqld")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_4rqld")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_4rqld")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_4rqld")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_4rqld")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_4rqld")
+
+[node name="Health" parent="." index="3"]
+max_health = 6.0
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="4"]
+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..57f9bfa
--- /dev/null
+++ b/demo/agents/07_agent_melee_nuanced.tscn
@@ -0,0 +1,34 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_afx5l")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_e51r0")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_e51r0")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_e51r0")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_e51r0")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_e51r0")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_e51r0")
+
+[node name="Health" parent="." index="3"]
+max_health = 6.0
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="4"]
+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..5bbd3cb
--- /dev/null
+++ b/demo/agents/08_agent_demon.tscn
@@ -0,0 +1,34 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_115kp")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_cb5f2")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_cb5f2")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_cb5f2")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_cb5f2")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_cb5f2")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_cb5f2")
+
+[node name="Health" parent="." index="3"]
+max_health = 8.0
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
+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..c8362d3
--- /dev/null
+++ b/demo/agents/09_agent_summoner.tscn
@@ -0,0 +1,34 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_neifu")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_fcti4")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_fcti4")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_fcti4")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_fcti4")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_fcti4")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_fcti4")
+
+[node name="Health" parent="." index="3"]
+max_health = 8.0
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
+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..84650b5
--- /dev/null
+++ b/demo/agents/agent_base.tscn
@@ -0,0 +1,4528 @@
+[gd_scene load_steps=36 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" 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" path="res://demo/agents/scripts/health.gd" id="4_qwtrf"]
+[ext_resource type="Script" path="res://demo/agents/scripts/hitbox.gd" id="5_taq6b"]
+[ext_resource type="Script" 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
+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"]
+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="."]
+metadata/_edit_lock_ = true
+
+[node name="Rig" type="Node2D" parent="Root"]
+position = Vector2(0, -76)
+
+[node name="Shadow" type="Sprite2D" parent="Root/Rig"]
+modulate = Color(1, 1, 1, 0.258824)
+position = Vector2(0, 76)
+texture = ExtResource("2_vr0jo")
+
+[node name="LegL" type="Sprite2D" parent="Root/Rig"]
+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"]
+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"]
+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"]
+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"]
+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"]
+visible = false
+texture = ExtResource("4_1c5xq")
+
+[node name="HandR" type="Sprite2D" parent="Root/Rig/Body"]
+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"]
+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"]
+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" 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"]
+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="."]
+position = Vector2(0, -68)
+metadata/_edit_lock_ = true
+
+[node name="Cloud" type="Sprite2D" parent="FX"]
+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"]
+position = Vector2(0, 52)
+emitting = false
+amount = 16
+process_material = SubResource("ParticleProcessMaterial_f5i1x")
+texture = ExtResource("4_mnb6v")
+lifetime = 0.7
+one_shot = true
+explosiveness = 0.7
+fixed_fps = 60
+
+[node name="Summoned" type="GPUParticles2D" parent="FX"]
+position = Vector2(0, 83)
+emitting = false
+amount = 16
+process_material = SubResource("ParticleProcessMaterial_gmal1")
+texture = ExtResource("4_mnb6v")
+lifetime = 1.4
+one_shot = true
+explosiveness = 0.5
+fixed_fps = 60
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+visible = false
+position = Vector2(-1, -7)
+rotation = 1.5708
+shape = SubResource("CircleShape2D_0c228")
+
+[node name="Health" type="Node" parent="."]
+script = ExtResource("4_qwtrf")
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+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.tscn b/demo/agents/fireball/fireball.tscn
new file mode 100644
index 0000000..160c015
--- /dev/null
+++ b/demo/agents/fireball/fireball.tscn
@@ -0,0 +1,169 @@
+[gd_scene load_steps=18 format=3 uid="uid://wdauoepicegb"]
+
+[ext_resource type="Script" 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" 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"]
+script = ExtResource("1_ituf4")
+
+[node name="FX" type="Node2D" parent="."]
+position = Vector2(0, -92)
+
+[node name="Trail" type="GPUParticles2D" parent="FX"]
+show_behind_parent = true
+amount = 6
+process_material = SubResource("ParticleProcessMaterial_gbya7")
+texture = ExtResource("5_dcbp6")
+lifetime = 0.4
+fixed_fps = 60
+
+[node name="Death" type="GPUParticles2D" parent="FX"]
+emitting = false
+amount = 6
+process_material = SubResource("ParticleProcessMaterial_gilhy")
+texture = ExtResource("5_dcbp6")
+lifetime = 0.7
+one_shot = true
+explosiveness = 0.7
+fixed_fps = 60
+local_coords = true
+
+[node name="Root" type="Node2D" parent="."]
+
+[node name="Shadow" type="Sprite2D" parent="Root"]
+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"]
+position = Vector2(0, -92)
+texture = ExtResource("3_1an0e")
+hframes = 3
+
+[node name="RemoteTransform2D" type="RemoteTransform2D" parent="Root/Fireball"]
+remote_path = NodePath("../../../FX")
+update_rotation = false
+update_scale = false
+
+[node name="Hitbox" type="Area2D" parent="."]
+collision_layer = 0
+collision_mask = 4
+script = ExtResource("4_rjhgc")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"]
+shape = SubResource("CircleShape2D_7uc1b")
+debug_color = Color(0.839216, 0.192157, 0.815686, 0.419608)
+
+[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
+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.tscn b/demo/agents/ninja_star/ninja_star.tscn
new file mode 100644
index 0000000..58aab69
--- /dev/null
+++ b/demo/agents/ninja_star/ninja_star.tscn
@@ -0,0 +1,80 @@
+[gd_scene load_steps=10 format=3 uid="uid://bj5n72nomeaci"]
+
+[ext_resource type="Script" 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" 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"]
+script = ExtResource("1_pja57")
+
+[node name="Root" type="Node2D" parent="."]
+
+[node name="Shadow" type="Sprite2D" parent="Root"]
+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"]
+position = Vector2(0, -93)
+texture = ExtResource("1_ptof7")
+
+[node name="RemoteTransform2D" type="RemoteTransform2D" parent="Root/NinjaStar"]
+remote_path = NodePath("../../../Death")
+update_rotation = false
+update_scale = false
+
+[node name="Hitbox" type="Area2D" parent="."]
+collision_layer = 0
+collision_mask = 4
+script = ExtResource("2_iem02")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox"]
+shape = SubResource("CircleShape2D_7uc1b")
+debug_color = Color(0.839216, 0.192157, 0.815686, 0.419608)
+
+[node name="Death" type="GPUParticles2D" parent="."]
+position = Vector2(0, -93)
+emitting = false
+amount = 1
+process_material = SubResource("ParticleProcessMaterial_gilhy")
+texture = ExtResource("5_t37aw")
+lifetime = 0.7
+one_shot = true
+explosiveness = 0.7
+fixed_fps = 60
+local_coords = true
+
+[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.tscn b/demo/agents/player/player.tscn
new file mode 100644
index 0000000..eb1c4ad
--- /dev/null
+++ b/demo/agents/player/player.tscn
@@ -0,0 +1,53 @@
+[gd_scene load_steps=8 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" path="res://demo/agents/player/player.gd" id="2_24nyi"]
+[ext_resource type="Script" path="res://demo/agents/player/states/idle_state.gd" id="3_ekb12"]
+[ext_resource type="Script" path="res://demo/agents/player/states/move_state.gd" id="4_paikn"]
+[ext_resource type="Script" path="res://demo/agents/player/states/attack_state.gd" id="5_mpgu6"]
+[ext_resource type="Script" 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" 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" index="1"]
+collision_mask = 8
+
+[node name="HitboxCollisionShape2D" parent="Root/Hitbox" index="0"]
+shape = SubResource("RectangleShape2D_8pofm")
+
+[node name="Hurtbox" parent="Root" index="2"]
+collision_layer = 4
+
+[node name="Health" parent="." index="3"]
+max_health = 30.0
+
+[node name="LimboHSM" type="LimboHSM" parent="." index="4"]
+
+[node name="IdleState" type="LimboState" parent="LimboHSM" index="0" 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" node_paths=PackedStringArray("animation_player")]
+script = ExtResource("4_paikn")
+animation_player = NodePath("../../AnimationPlayer")
+animation = &"walk"
+
+[node name="AttackState" type="LimboState" parent="LimboHSM" index="2" 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" 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/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/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/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/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/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/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/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/tutorial/tutorial_01_welcome.tscn b/demo/agents/tutorial/tutorial_01_welcome.tscn
new file mode 100644
index 0000000..d9114c2
--- /dev/null
+++ b/demo/agents/tutorial/tutorial_01_welcome.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_2vrmp")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_3h4dj")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_3h4dj")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_3h4dj")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_3h4dj")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_3h4dj")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_3h4dj")
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
+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..f14b0d5
--- /dev/null
+++ b/demo/agents/tutorial/tutorial_02_introduction.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_lia2k")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_4x2l4")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_4x2l4")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_4x2l4")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_4x2l4")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_4x2l4")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_4x2l4")
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
+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..3ae6493
--- /dev/null
+++ b/demo/agents/tutorial/tutorial_03_types.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_p8nwq")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_hnwhw")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_hnwhw")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_hnwhw")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_hnwhw")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_hnwhw")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_hnwhw")
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
+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..0a7202b
--- /dev/null
+++ b/demo/agents/tutorial/tutorial_04_sequence.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_oibr1")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_j52yc")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_j52yc")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_j52yc")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_j52yc")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_j52yc")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_j52yc")
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
+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..699ab50
--- /dev/null
+++ b/demo/agents/tutorial/tutorial_05_selector.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_62fs7")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_gdg2c")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_gdg2c")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_gdg2c")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_gdg2c")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_gdg2c")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_gdg2c")
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
+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..c053f21
--- /dev/null
+++ b/demo/agents/tutorial/tutorial_06_decorators.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_mbrnd")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_ttkri")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_ttkri")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_ttkri")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_ttkri")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_ttkri")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_ttkri")
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
+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..c386580
--- /dev/null
+++ b/demo/agents/tutorial/tutorial_07_more_decorators.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_k4qfc")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_q4r1n")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_q4r1n")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_q4r1n")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_q4r1n")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_q4r1n")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_q4r1n")
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
+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..0d2d8a7
--- /dev/null
+++ b/demo/agents/tutorial/tutorial_08_final_touch.tscn
@@ -0,0 +1,31 @@
+[gd_scene load_steps=5 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" instance=ExtResource("1_bjdsc")]
+
+[node name="LegL" parent="Root/Rig" index="1"]
+texture = ExtResource("2_onjfd")
+
+[node name="LegR" parent="Root/Rig" index="2"]
+texture = ExtResource("2_onjfd")
+
+[node name="Body" parent="Root/Rig" index="3"]
+texture = ExtResource("2_onjfd")
+
+[node name="Hat" parent="Root/Rig/Body" index="0"]
+texture = ExtResource("2_onjfd")
+
+[node name="HandL" parent="Root/Rig/Body" index="1"]
+texture = ExtResource("2_onjfd")
+
+[node name="HandR" parent="Root/Rig/Body" index="2"]
+texture = ExtResource("2_onjfd")
+
+[node name="BTPlayer" type="BTPlayer" parent="." index="5"]
+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/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/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/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/in_range.gd b/demo/ai/tasks/in_range.gd
new file mode 100644
index 0000000..2878595
--- /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 performace 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/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/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/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/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_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/trees/01_agent_melee_simple.tres b/demo/ai/trees/01_agent_melee_simple.tres
new file mode 100644
index 0000000..571b5c6
--- /dev/null
+++ b/demo/ai/trees/01_agent_melee_simple.tres
@@ -0,0 +1,88 @@
+[gd_resource type="BehaviorTree" load_steps=21 format=3 uid="uid://bpdm5jnegi38"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_2jpsu"]
+[ext_resource type="Script" path="res://demo/ai/tasks/pursue.gd" id="2_h5db5"]
+[ext_resource type="Script" 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"
+
+[sub_resource type="BBNode" id="BBNode_nrd4b"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"
+output_var = &"target"
+
+[sub_resource type="BTAction" id="BTAction_a4jqi"]
+script = ExtResource("2_h5db5")
+target_var = &"target"
+speed_var = &"speed"
+approach_distance = 100.0
+
+[sub_resource type="BTTimeLimit" id="BTTimeLimit_xek5v"]
+time_limit = 2.0
+children = [SubResource("BTAction_a4jqi")]
+
+[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")
+target_var = &"target"
+
+[sub_resource type="BTWait" id="BTWait_tadkc"]
+duration = 0.1
+
+[sub_resource type="BBNode" id="BBNode_s8evu"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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..c8234c7
--- /dev/null
+++ b/demo/ai/trees/02_agent_charger.tres
@@ -0,0 +1,120 @@
+[gd_resource type="BehaviorTree" load_steps=28 format=3 uid="uid://ylife72ym5et"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_657p6"]
+[ext_resource type="Script" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_t3udh"]
+[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="3_u2ra5"]
+[ext_resource type="Script" path="res://demo/ai/tasks/face_target.gd" id="4_xwjl7"]
+[ext_resource type="Script" 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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"
+output_var = &"target"
+
+[sub_resource type="BTAction" id="BTAction_pmvd0"]
+script = ExtResource("2_t3udh")
+target_var = &"target"
+flank_side = 0
+range_min = 500
+range_max = 600
+position_var = &"flank_pos"
+
+[sub_resource type="BBNode" id="BBNode_xh3wr"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"
+speed_var = &"speed"
+tolerance = 50.0
+avoid_var = &""
+
+[sub_resource type="BTTimeLimit" id="BTTimeLimit_is5ag"]
+time_limit = 3.0
+children = [SubResource("BTAction_87mi0")]
+
+[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")
+target_var = &"target"
+
+[sub_resource type="BBNode" id="BBNode_bfijg"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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..e32ac17
--- /dev/null
+++ b/demo/ai/trees/03_agent_imp.tres
@@ -0,0 +1,120 @@
+[gd_resource type="BehaviorTree" load_steps=30 format=3 uid="uid://c2bxoo68ywb27"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="1_cdtqu"]
+[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="2_31fsn"]
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="3_y1r1a"]
+[ext_resource type="Script" path="res://demo/ai/tasks/pursue.gd" id="4_jlgat"]
+[ext_resource type="Script" 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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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
+range_max = 500.0
+position_var = &"pos"
+
+[sub_resource type="BTAction" id="BTAction_5kivl"]
+script = ExtResource("2_31fsn")
+target_position_var = &"pos"
+speed_var = &"speed"
+tolerance = 50.0
+avoid_var = &""
+
+[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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"
+output_var = &"target"
+
+[sub_resource type="BTAction" id="BTAction_a4jqi"]
+script = ExtResource("4_jlgat")
+target_var = &"target"
+speed_var = &"speed"
+approach_distance = 100.0
+
+[sub_resource type="BTTimeLimit" id="BTTimeLimit_xek5v"]
+time_limit = 2.0
+children = [SubResource("BTAction_a4jqi")]
+
+[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")
+target_var = &"target"
+
+[sub_resource type="BTWait" id="BTWait_tadkc"]
+duration = 0.1
+
+[sub_resource type="BBNode" id="BBNode_s8evu"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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..9b962f7
--- /dev/null
+++ b/demo/ai/trees/04_agent_skirmisher.tres
@@ -0,0 +1,190 @@
+[gd_resource type="BehaviorTree" load_steps=44 format=3 uid="uid://qqmjvbeibatn"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_2883n"]
+[ext_resource type="Script" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_cjso2"]
+[ext_resource type="Script" path="res://demo/ai/tasks/pursue.gd" id="2_lpckh"]
+[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="3_treio"]
+[ext_resource type="Script" path="res://demo/ai/tasks/face_target.gd" id="4_57x51"]
+[ext_resource type="Script" path="res://demo/ai/tasks/in_range.gd" id="5_p5dih"]
+[ext_resource type="Script" 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"
+output_var = &"target"
+
+[sub_resource type="BBNode" id="BBNode_nrd4b"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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_min = 0.0
+distance_max = 300.0
+target_var = &"target"
+
+[sub_resource type="BBNode" id="BBNode_7c0g0"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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")
+target_var = &"target"
+speed_var = &"speed"
+approach_distance = 100.0
+
+[sub_resource type="BTTimeLimit" id="BTTimeLimit_lkphr"]
+time_limit = 1.0
+children = [SubResource("BTAction_jryg6")]
+
+[sub_resource type="BTAction" id="BTAction_kidxn"]
+script = ExtResource("4_57x51")
+target_var = &"target"
+
+[sub_resource type="BTWait" id="BTWait_tadkc"]
+duration = 0.2
+
+[sub_resource type="BBNode" id="BBNode_kcqly"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+duration = 2.0
+children = [SubResource("BTSequence_ww5v2")]
+
+[sub_resource type="BTCondition" id="BTCondition_fpufi"]
+script = ExtResource("5_p5dih")
+distance_min = 0.0
+distance_max = 300.0
+target_var = &"target"
+
+[sub_resource type="BBNode" id="BBNode_3iqcf"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"
+max_angle_deviation = 0.7
+
+[sub_resource type="BTTimeLimit" id="BTTimeLimit_cns1i"]
+time_limit = 1.5
+children = [SubResource("BTAction_4ye2y")]
+
+[sub_resource type="BTAlwaysSucceed" id="BTAlwaysSucceed_nw4ep"]
+children = [SubResource("BTTimeLimit_cns1i")]
+
+[sub_resource type="BBNode" id="BBNode_81x7t"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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")
+target_var = &"target"
+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"
+tolerance = 50.0
+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..b41517c
--- /dev/null
+++ b/demo/ai/trees/05_agent_ranged.tres
@@ -0,0 +1,182 @@
+[gd_resource type="BehaviorTree" load_steps=41 format=3 uid="uid://cqluon1y1hnn5"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_4xk1i"]
+[ext_resource type="Script" path="res://demo/ai/tasks/is_aligned_with_target.gd" id="2_a8qex"]
+[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="3_q4r2p"]
+[ext_resource type="Script" path="res://demo/ai/tasks/select_flanking_pos.gd" id="4_53hao"]
+[ext_resource type="Script" 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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"
+output_var = &"target"
+
+[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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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")
+target_var = &"target"
+flank_side = 1
+range_min = 400
+range_max = 1000
+position_var = &"pos"
+
+[sub_resource type="BTAction" id="BTAction_ycjun"]
+script = ExtResource("3_q4r2p")
+target_position_var = &"pos"
+speed_var = &"run_speed"
+tolerance = 50.0
+avoid_var = &"target"
+
+[sub_resource type="BTTimeLimit" id="BTTimeLimit_gadc6"]
+time_limit = 7.0
+children = [SubResource("BTAction_ycjun")]
+
+[sub_resource type="BTAction" id="BTAction_poqpu"]
+script = ExtResource("5_aexyq")
+target_var = &"target"
+
+[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"]
+duration = 7.0
+children = [SubResource("BTSequence_0gdqn")]
+
+[sub_resource type="BTProbability" id="BTProbability_6sydk"]
+run_chance = 0.3
+children = [SubResource("BTCooldown_2lneu")]
+
+[sub_resource type="BTAction" id="BTAction_kuuw2"]
+script = ExtResource("4_53hao")
+target_var = &"target"
+flank_side = 0
+range_min = 400
+range_max = 1000
+position_var = &"shoot_pos"
+
+[sub_resource type="BBNode" id="BBNode_kc64r"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"
+speed_var = &"speed"
+tolerance = 50.0
+avoid_var = &""
+
+[sub_resource type="BTTimeLimit" id="BTTimeLimit_24ath"]
+children = [SubResource("BTAction_66hsk")]
+
+[sub_resource type="BTAction" id="BTAction_enw2m"]
+script = ExtResource("5_aexyq")
+target_var = &"target"
+
+[sub_resource type="BTCondition" id="BTCondition_1fnyc"]
+script = ExtResource("2_a8qex")
+target_var = &"target"
+tolerance = 150.0
+
+[sub_resource type="BBNode" id="BBNode_s6vt4"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+saved_value = NodePath(".")
+resource_name = "."
+
+[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"]
+times = 3
+children = [SubResource("BTSequence_rgbq3")]
+
+[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..c8db52e
--- /dev/null
+++ b/demo/ai/trees/06_agent_melee_combo.tres
@@ -0,0 +1,163 @@
+[gd_resource type="BehaviorTree" load_steps=39 format=3 uid="uid://cpncl1db8j12f"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_sf4l8"]
+[ext_resource type="Script" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_5nwkp"]
+[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="3_3tom2"]
+[ext_resource type="Script" path="res://demo/ai/tasks/face_target.gd" id="4_hi228"]
+[ext_resource type="Script" 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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"
+output_var = &"target"
+
+[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")
+target_var = &"target"
+flank_side = 0
+range_min = 300
+range_max = 400
+position_var = &"pos"
+
+[sub_resource type="BBNode" id="BBNode_wpj6d"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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")
+target_position_var = &"pos"
+speed_var = &"speed"
+tolerance = 50.0
+avoid_var = &""
+
+[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")
+target_var = &"target"
+
+[sub_resource type="BBNode" id="BBNode_giv5l"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"
+duration = 0.1
+
+[sub_resource type="BTParallel" id="BTParallel_ec2e3"]
+num_successes_required = 2
+children = [SubResource("BTPlayAnimation_ppmxd"), SubResource("BTAction_u22bc")]
+
+[sub_resource type="BTWait" id="BTWait_c0lo0"]
+duration = 0.2
+
+[sub_resource type="BBNode" id="BBNode_3oljv"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"
+duration = 0.1
+
+[sub_resource type="BTParallel" id="BTParallel_thojy"]
+num_successes_required = 2
+children = [SubResource("BTPlayAnimation_q4uis"), SubResource("BTAction_yuxl3")]
+
+[sub_resource type="BTWait" id="BTWait_y3pmv"]
+duration = 0.2
+
+[sub_resource type="BBNode" id="BBNode_ot40l"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"
+duration = 0.1
+
+[sub_resource type="BTParallel" id="BTParallel_qmdfb"]
+num_successes_required = 2
+children = [SubResource("BTPlayAnimation_ye5pt"), SubResource("BTAction_rwp18")]
+
+[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..cc3bdb3
--- /dev/null
+++ b/demo/ai/trees/07_agent_melee_nuanced.tres
@@ -0,0 +1,219 @@
+[gd_resource type="BehaviorTree" load_steps=49 format=3 uid="uid://c2u6sljqkim0n"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_08fik"]
+[ext_resource type="Script" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_te3yo"]
+[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="3_svwk8"]
+[ext_resource type="Script" path="res://demo/ai/tasks/face_target.gd" id="4_mvsyw"]
+[ext_resource type="Script" 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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"
+output_var = &"target"
+
+[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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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")
+target_var = &"target"
+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"
+tolerance = 50.0
+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")
+target_var = &"target"
+
+[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"]
+duration = 6.0
+children = [SubResource("BTSequence_lhg7f")]
+metadata/_weight_ = 2.0
+
+[sub_resource type="BBNode" id="BBNode_wpj6d"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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")
+target_var = &"target"
+speed_var = &"speed"
+approach_distance = 100.0
+
+[sub_resource type="BTTimeLimit" id="BTTimeLimit_xek5v"]
+time_limit = 2.0
+children = [SubResource("BTAction_a4jqi")]
+
+[sub_resource type="BTAction" id="BTAction_kidxn"]
+script = ExtResource("4_mvsyw")
+target_var = &"target"
+
+[sub_resource type="BTWait" id="BTWait_tadkc"]
+duration = 0.1
+
+[sub_resource type="BBNode" id="BBNode_g8qww"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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")
+target_var = &"target"
+flank_side = 0
+range_min = 350
+range_max = 600
+position_var = &"pos"
+
+[sub_resource type="BBNode" id="BBNode_cx111"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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")
+target_position_var = &"pos"
+speed_var = &"speed"
+tolerance = 50.0
+avoid_var = &""
+
+[sub_resource type="BTTimeLimit" id="BTTimeLimit_tidwl"]
+time_limit = 3.0
+children = [SubResource("BTAction_6nx58")]
+
+[sub_resource type="BTAction" id="BTAction_8q20y"]
+script = ExtResource("4_mvsyw")
+target_var = &"target"
+
+[sub_resource type="BBNode" id="BBNode_s6vt4"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+saved_value = NodePath(".")
+resource_name = "."
+
+[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"]
+abort_on_failure = true
+children = [SubResource("BTCooldown_skw41"), SubResource("BTSequence_1xfnq"), SubResource("BTSequence_rgbq3")]
+
+[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..47369ce
--- /dev/null
+++ b/demo/ai/trees/08_agent_demon.tres
@@ -0,0 +1,200 @@
+[gd_resource type="BehaviorTree" load_steps=49 format=3 uid="uid://cpcnbi81jqge4"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_ce4la"]
+[ext_resource type="Script" path="res://demo/ai/tasks/in_range.gd" id="2_atyuj"]
+[ext_resource type="Script" path="res://demo/ai/tasks/face_target.gd" id="3_3mw7l"]
+[ext_resource type="Script" path="res://demo/ai/tasks/back_away.gd" id="4_6dr32"]
+[ext_resource type="Script" path="res://demo/ai/tasks/select_flanking_pos.gd" id="5_dho0d"]
+[ext_resource type="Script" 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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+trigger_on_failure = true
+children = [SubResource("BTSequence_5thv4")]
+
+[sub_resource type="BTAction" id="BTAction_ohfp7"]
+script = ExtResource("1_ce4la")
+group = &"player"
+output_var = &"target"
+
+[sub_resource type="BTCondition" id="BTCondition_7a5nv"]
+script = ExtResource("2_atyuj")
+distance_min = 0.0
+distance_max = 150.0
+target_var = &"target"
+
+[sub_resource type="BTAction" id="BTAction_ddvrs"]
+script = ExtResource("3_3mw7l")
+target_var = &"target"
+
+[sub_resource type="BBNode" id="BBNode_c4nfu"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+duration = 3.0
+children = [SubResource("BTPlayAnimation_yytkn")]
+
+[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_min = 0.0
+distance_max = 300.0
+target_var = &"target"
+
+[sub_resource type="BTAction" id="BTAction_wpt7j"]
+script = ExtResource("3_3mw7l")
+target_var = &"target"
+
+[sub_resource type="BBNode" id="BBNode_iv62h"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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")
+speed_var = &"speed"
+max_angle_deviation = 0.7
+
+[sub_resource type="BTTimeLimit" id="BTTimeLimit_wm5g2"]
+time_limit = 1.0
+children = [SubResource("BTAction_h2efl")]
+
+[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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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")
+target_var = &"target"
+flank_side = 0
+range_min = 300
+range_max = 700
+position_var = &"pos"
+
+[sub_resource type="BTAction" id="BTAction_vb5c3"]
+script = ExtResource("6_0pfsl")
+target_position_var = &"pos"
+speed_var = &"speed"
+tolerance = 50.0
+avoid_var = &""
+
+[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")
+target_var = &"target"
+
+[sub_resource type="BBNode" id="BBNode_lh25u"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+saved_value = NodePath(".")
+resource_name = "."
+
+[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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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..e5cfbe2
--- /dev/null
+++ b/demo/ai/trees/09_agent_summoner.tres
@@ -0,0 +1,155 @@
+[gd_resource type="BehaviorTree" load_steps=35 format=3 uid="uid://cpxk7jnqpwwlc"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="1_sgn0p"]
+[ext_resource type="Script" 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"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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"]
+type = 2
+saved_value = 6
+resource_name = "6"
+
+[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"]
+type = 1
+saved_value = false
+resource_name = "false"
+
+[sub_resource type="BTCheckVar" id="BTCheckVar_hc3o3"]
+variable = &"summon_cooldown"
+value = SubResource("BBVariant_hgde2")
+children = [SubResource("BTComment_ef6y0")]
+
+[sub_resource type="BBNode" id="BBNode_q8bei"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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")
+range_min = 300.0
+range_max = 500.0
+position_var = &"minion_pos"
+
+[sub_resource type="BBVariant" id="BBVariant_wfjwy"]
+type = 5
+value_source = 1
+variable = &"minion_pos"
+resource_name = "$minion_pos"
+
+[sub_resource type="BBNode" id="BBNode_v271m"]
+saved_value = NodePath(".")
+resource_name = "."
+
+[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"]
+duration = 6.0
+cooldown_state_var = &"summon_cooldown"
+children = [SubResource("BTCallMethod_4ath5")]
+
+[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_min = 300.0
+range_max = 700.0
+position_var = &"pos"
+
+[sub_resource type="BBNode" id="BBNode_w5fh2"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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")
+target_position_var = &"pos"
+speed_var = &"speed"
+tolerance = 50.0
+avoid_var = &""
+
+[sub_resource type="BTTimeLimit" id="BTTimeLimit_i05cm"]
+time_limit = 3.0
+children = [SubResource("BTAction_dfifw")]
+
+[sub_resource type="BBNode" id="BBNode_vinxt"]
+saved_value = NodePath("AnimationPlayer")
+resource_name = "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..84f1d04
--- /dev/null
+++ b/demo/ai/trees/tutorial/tutorial_01_welcome.tres
@@ -0,0 +1,29 @@
+[gd_resource type="BehaviorTree" load_steps=5 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..985582b
--- /dev/null
+++ b/demo/ai/trees/tutorial/tutorial_02_introduction.tres
@@ -0,0 +1,45 @@
+[gd_resource type="BehaviorTree" load_steps=9 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..d63776f
--- /dev/null
+++ b/demo/ai/trees/tutorial/tutorial_03_types.tres
@@ -0,0 +1,97 @@
+[gd_resource type="BehaviorTree" load_steps=24 format=3 uid="uid://cb0ybf24ahnc3"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="1_as4cg"]
+[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="2_dlpnp"]
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="3_uv18s"]
+[ext_resource type="Script" path="res://demo/ai/tasks/in_range.gd" id="4_k3g8t"]
+[ext_resource type="Script" 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")
+range_min = 300.0
+range_max = 500.0
+position_var = &"pos"
+
+[sub_resource type="BTAction" id="BTAction_tdkpj"]
+script = ExtResource("2_dlpnp")
+target_position_var = &"pos"
+speed_var = &"speed"
+tolerance = 50.0
+avoid_var = &""
+
+[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"
+output_var = &"target"
+
+[sub_resource type="BTCondition" id="BTCondition_n25o8"]
+script = ExtResource("4_k3g8t")
+distance_min = 0.0
+distance_max = 200.0
+target_var = &"target"
+
+[sub_resource type="BTAction" id="BTAction_1hfgr"]
+script = ExtResource("5_thvy5")
+target_var = &"target"
+
+[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..ea6b0a8
--- /dev/null
+++ b/demo/ai/trees/tutorial/tutorial_04_sequence.tres
@@ -0,0 +1,62 @@
+[gd_resource type="BehaviorTree" load_steps=15 format=3 uid="uid://dln8ywvtqedt7"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="1_gk66j"]
+[ext_resource type="Script" 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")
+range_min = 300.0
+range_max = 500.0
+position_var = &"pos"
+
+[sub_resource type="BTAction" id="BTAction_djl5v"]
+script = ExtResource("2_v5eou")
+target_position_var = &"pos"
+speed_var = &"speed"
+tolerance = 50.0
+avoid_var = &""
+
+[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..f9d85e3
--- /dev/null
+++ b/demo/ai/trees/tutorial/tutorial_05_selector.tres
@@ -0,0 +1,108 @@
+[gd_resource type="BehaviorTree" load_steps=26 format=3 uid="uid://bf4r652fv5kwi"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_3ed74"]
+[ext_resource type="Script" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="1_rvh1c"]
+[ext_resource type="Script" path="res://demo/ai/tasks/in_range.gd" id="2_jfsyt"]
+[ext_resource type="Script" path="res://demo/ai/tasks/pursue.gd" id="2_nnswb"]
+[ext_resource type="Script" 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_min = 0.0
+distance_max = 200.0
+target_var = &"target"
+
+[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
+position_var = &"pos"
+
+[sub_resource type="BTAction" id="BTAction_y1you"]
+script = ExtResource("2_t62a0")
+target_position_var = &"pos"
+speed_var = &"speed"
+tolerance = 50.0
+avoid_var = &""
+
+[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
+target_var = &"target"
+
+[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")
+target_var = &"target"
+speed_var = &"speed"
+approach_distance = 100.0
+
+[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"
+output_var = &"target"
+
+[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..42fe1e6
--- /dev/null
+++ b/demo/ai/trees/tutorial/tutorial_06_decorators.tres
@@ -0,0 +1,136 @@
+[gd_resource type="BehaviorTree" load_steps=34 format=3 uid="uid://beiki511huxb8"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_3xoj7"]
+[ext_resource type="Script" path="res://demo/ai/tasks/in_range.gd" id="2_08b67"]
+[ext_resource type="Script" path="res://demo/ai/tasks/face_target.gd" id="3_orhnl"]
+[ext_resource type="Script" path="res://demo/ai/tasks/select_random_nearby_pos.gd" id="4_oyght"]
+[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="5_5o1gy"]
+[ext_resource type="Script" 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"
+output_var = &"target"
+
+[sub_resource type="BTRunLimit" id="BTRunLimit_60b8b"]
+children = [SubResource("BTAction_2murg")]
+
+[sub_resource type="BTCondition" id="BTCondition_m15aa"]
+script = ExtResource("2_08b67")
+distance_min = 0.0
+distance_max = 200.0
+target_var = &"target"
+
+[sub_resource type="BTAction" id="BTAction_oc76s"]
+script = ExtResource("3_orhnl")
+target_var = &"target"
+
+[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_min = 0.0
+distance_max = 200.0
+target_var = &"target"
+
+[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
+position_var = &"pos"
+
+[sub_resource type="BTAction" id="BTAction_y1you"]
+script = ExtResource("5_5o1gy")
+target_position_var = &"pos"
+speed_var = &"speed"
+tolerance = 50.0
+avoid_var = &""
+
+[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
+target_var = &"target"
+
+[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")
+target_var = &"target"
+speed_var = &"speed"
+approach_distance = 100.0
+
+[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..d5b1a26
--- /dev/null
+++ b/demo/ai/trees/tutorial/tutorial_07_more_decorators.tres
@@ -0,0 +1,143 @@
+[gd_resource type="BehaviorTree" load_steps=36 format=3 uid="uid://tep50j4d6kgp"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_f605f"]
+[ext_resource type="Script" path="res://demo/ai/tasks/in_range.gd" id="2_mj1cj"]
+[ext_resource type="Script" path="res://demo/ai/tasks/face_target.gd" id="3_86p0r"]
+[ext_resource type="Script" path="res://demo/ai/tasks/back_away.gd" id="4_u0vk1"]
+[ext_resource type="Script" 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"
+output_var = &"target"
+
+[sub_resource type="BTRunLimit" id="BTRunLimit_60b8b"]
+children = [SubResource("BTAction_2murg")]
+
+[sub_resource type="BTCondition" id="BTCondition_m15aa"]
+script = ExtResource("2_mj1cj")
+distance_min = 0.0
+distance_max = 200.0
+target_var = &"target"
+
+[sub_resource type="BTAction" id="BTAction_oc76s"]
+script = ExtResource("3_86p0r")
+target_var = &"target"
+
+[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_min = 0.0
+distance_max = 200.0
+target_var = &"target"
+
+[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")
+speed_var = &"speed"
+max_angle_deviation = 0.7
+
+[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
+target_var = &"target"
+
+[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")
+target_var = &"target"
+speed_var = &"speed"
+approach_distance = 100.0
+
+[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..c2053a3
--- /dev/null
+++ b/demo/ai/trees/tutorial/tutorial_08_final_touch.tres
@@ -0,0 +1,204 @@
+[gd_resource type="BehaviorTree" load_steps=52 format=3 uid="uid://dp0cglcytwcj5"]
+
+[ext_resource type="Script" path="res://demo/ai/tasks/get_first_in_group.gd" id="1_o5ahw"]
+[ext_resource type="Script" path="res://demo/ai/tasks/select_flanking_pos.gd" id="2_er25a"]
+[ext_resource type="Script" path="res://demo/ai/tasks/arrive_pos.gd" id="3_ed1xo"]
+[ext_resource type="Script" path="res://demo/ai/tasks/face_target.gd" id="4_128ei"]
+[ext_resource type="Script" path="res://demo/ai/tasks/in_range.gd" id="5_er18b"]
+[ext_resource type="Script" path="res://demo/ai/tasks/back_away.gd" id="6_1urfq"]
+[ext_resource type="Script" 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"
+output_var = &"target"
+
+[sub_resource type="BTRunLimit" id="BTRunLimit_60b8b"]
+children = [SubResource("BTAction_2murg")]
+
+[sub_resource type="BTCondition" id="BTCondition_m15aa"]
+script = ExtResource("5_er18b")
+distance_min = 0.0
+distance_max = 200.0
+target_var = &"target"
+
+[sub_resource type="BTAction" id="BTAction_oc76s"]
+script = ExtResource("4_128ei")
+target_var = &"target"
+
+[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_min = 0.0
+distance_max = 200.0
+target_var = &"target"
+
+[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")
+speed_var = &"speed"
+max_angle_deviation = 0.7
+
+[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")
+target_var = &"target"
+flank_side = 0
+range_min = 400
+range_max = 500
+position_var = &"pos"
+
+[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")
+target_position_var = &"pos"
+speed_var = &"speed"
+tolerance = 50.0
+avoid_var = &""
+
+[sub_resource type="BTAction" id="BTAction_d5lkr"]
+script = ExtResource("4_128ei")
+target_var = &"target"
+
+[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
+target_var = &"target"
+
+[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")
+target_var = &"target"
+speed_var = &"speed"
+approach_distance = 100.0
+
+[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..de79d79
--- /dev/null
+++ b/demo/assets/agent_bobby.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..bfe08b6
--- /dev/null
+++ b/demo/assets/agent_charger.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..8128a64
--- /dev/null
+++ b/demo/assets/agent_combo.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..17b163f
--- /dev/null
+++ b/demo/assets/agent_demon.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..08994d3
--- /dev/null
+++ b/demo/assets/agent_imp.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..4d87dcc
--- /dev/null
+++ b/demo/assets/agent_junior_pieces.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..604cb7a
--- /dev/null
+++ b/demo/assets/agent_melee_nuanced.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..f25826b
--- /dev/null
+++ b/demo/assets/agent_melee_simple.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..d83f37d
--- /dev/null
+++ b/demo/assets/agent_ranged.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..b227fcc
--- /dev/null
+++ b/demo/assets/agent_skirmisher.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..8234f4a
--- /dev/null
+++ b/demo/assets/agent_summoner.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..cd4ea5e
--- /dev/null
+++ b/demo/assets/arrow_left.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..bdf534c
--- /dev/null
+++ b/demo/assets/arrow_right.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..8d75969
--- /dev/null
+++ b/demo/assets/dummy.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..d8d21aa
--- /dev/null
+++ b/demo/assets/env_clouds.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..2227594
--- /dev/null
+++ b/demo/assets/env_gong.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..87610b1
--- /dev/null
+++ b/demo/assets/env_ground.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..616c11c
--- /dev/null
+++ b/demo/assets/env_plants.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..3ed17be
--- /dev/null
+++ b/demo/assets/env_rocks.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..554b787
--- /dev/null
+++ b/demo/assets/fireball.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..5b19f13
--- /dev/null
+++ b/demo/assets/fonts/junction_bold.otf.import
@@ -0,0 +1,34 @@
+[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
+hinting=1
+subpixel_positioning=1
+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..4deeba7
--- /dev/null
+++ b/demo/assets/fonts/knewave_regular.ttf.import
@@ -0,0 +1,34 @@
+[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
+hinting=1
+subpixel_positioning=1
+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..684838b
--- /dev/null
+++ b/demo/assets/fx.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..a707489
--- /dev/null
+++ b/demo/assets/hp_bar.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..9f6e24b
--- /dev/null
+++ b/demo/assets/hp_over.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..f3b6d9a
--- /dev/null
+++ b/demo/assets/hp_under.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..201efda
--- /dev/null
+++ b/demo/assets/icon.svg.import
@@ -0,0 +1,37 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..e0d85bf
--- /dev/null
+++ b/demo/assets/logo.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..5ec9cc1
--- /dev/null
+++ b/demo/assets/shadow.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..2701e6c
--- /dev/null
+++ b/demo/assets/smoke.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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..1f4aa94
--- /dev/null
+++ b/demo/assets/weapon_ninja_star.png.import
@@ -0,0 +1,34 @@
+[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/hdr_compression=1
+compress/normal_map=0
+compress/channel_pack=0
+mipmaps/generate=false
+mipmaps/limit=-1
+roughness/mode=0
+roughness/src_normal=""
+process/fix_alpha_border=true
+process/premult_alpha=false
+process/normal_map_invert_y=false
+process/hdr_as_srgb=false
+process/hdr_clamp_exposure=false
+process/size_limit=0
+detect_3d/compress_to=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.tscn b/demo/props/dummy.tscn
new file mode 100644
index 0000000..7f39444
--- /dev/null
+++ b/demo/props/dummy.tscn
@@ -0,0 +1,405 @@
+[gd_scene load_steps=11 format=3 uid="uid://c5fhe3tulhlco"]
+
+[ext_resource type="Script" 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" path="res://demo/agents/scripts/hurtbox.gd" id="4_pkfnd"]
+[ext_resource type="Script" 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" groups=["player"]]
+script = ExtResource("1_kqftw")
+
+[node name="Root" type="Node2D" parent="."]
+metadata/_edit_lock_ = true
+
+[node name="Rig" type="Node2D" parent="Root"]
+
+[node name="Shadow" type="Sprite2D" parent="Root/Rig"]
+modulate = Color(1, 1, 1, 0.290196)
+texture = ExtResource("2_535g7")
+
+[node name="Stick" type="Sprite2D" parent="Root/Rig"]
+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"]
+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="."]
+libraries = {
+"": SubResource("AnimationLibrary_blnjx")
+}
+autoplay = "idle"
+next/hurt = &"idle"
+blend_times = [&"idle", &"hurt", 0.05, &"hurt", &"idle", 0.3]
+
+[node name="Hurtbox" type="Area2D" parent="." node_paths=PackedStringArray("health")]
+collision_layer = 4
+collision_mask = 0
+script = ExtResource("4_pkfnd")
+health = NodePath("../Health")
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="Hurtbox"]
+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="."]
+script = ExtResource("5_8qcls")
+max_health = 1e+07
+
+[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.tscn b/demo/props/gong.tscn
new file mode 100644
index 0000000..e65295c
--- /dev/null
+++ b/demo/props/gong.tscn
@@ -0,0 +1,930 @@
+[gd_scene load_steps=12 format=3 uid="uid://bpd1wmw2f7bvg"]
+
+[ext_resource type="Script" 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" path="res://demo/agents/scripts/hurtbox.gd" id="5_xeb5y"]
+[ext_resource type="Script" 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"]
+script = ExtResource("1_77c1i")
+metadata/_edit_horizontal_guides_ = [111.0]
+
+[node name="Root" type="Node2D" parent="."]
+metadata/_edit_lock_ = true
+
+[node name="Shadow" type="Sprite2D" parent="Root"]
+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"]
+texture = ExtResource("1_kbnv6")
+offset = Vector2(0, -110)
+
+[node name="FX" type="Node2D" parent="."]
+metadata/_edit_lock_ = true
+
+[node name="WaveL1" type="Sprite2D" parent="FX"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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="."]
+libraries = {
+"": SubResource("AnimationLibrary_332s2")
+}
+
+[node name="GongSFX" type="AudioStreamPlayer" parent="."]
+
+[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
+position = Vector2(0, -14.395)
+rotation = 1.5708
+shape = SubResource("CapsuleShape2D_nixvt")
+
+[node name="Hurtbox" type="Area2D" parent="." node_paths=PackedStringArray("health")]
+collision_layer = 8
+collision_mask = 0
+script = ExtResource("5_xeb5y")
+health = NodePath("../Health")
+
+[node name="CollisionShape2D2" type="CollisionShape2D" parent="Hurtbox"]
+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="."]
+script = ExtResource("6_6a3q1")
+max_health = 1e+11
+
+[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..3c5c906
--- /dev/null
+++ b/demo/scenes/base/arena.tscn
@@ -0,0 +1,5142 @@
+[gd_scene load_steps=8 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"]
+y_sort_enabled = true
+metadata/_edit_vertical_guides_ = [962.0]
+metadata/_edit_horizontal_guides_ = [541.0]
+
+[node name="Environment" type="Node2D" parent="."]
+top_level = true
+z_index = -1
+metadata/_edit_lock_ = true
+
+[node name="Sky" type="ColorRect" parent="Environment"]
+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"]
+modulate = Color(1, 1, 1, 0.792157)
+position = Vector2(-1998, -1508)
+metadata/_edit_lock_ = true
+
+[node name="Cloud1" type="Sprite2D" parent="Environment/Clouds"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+root_node = NodePath("../..")
+libraries = {
+"": SubResource("AnimationLibrary_an3cu")
+}
+autoplay = "float"
+
+[node name="Ground" type="Node2D" parent="Environment"]
+metadata/_edit_lock_ = true
+
+[node name="Rocks" type="Sprite2D" parent="Environment/Ground"]
+position = Vector2(986, 1264)
+texture = ExtResource("1_145kx")
+
+[node name="Floor" type="Sprite2D" parent="Environment/Ground"]
+position = Vector2(938, 568)
+texture = ExtResource("1_vifjc")
+
+[node name="Limits" type="StaticBody2D" parent="Environment"]
+metadata/_edit_lock_ = true
+
+[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="Environment/Limits"]
+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="."]
+y_sort_enabled = true
+metadata/_edit_lock_ = true
+
+[node name="Shrooms" type="Node2D" parent="Props"]
+y_sort_enabled = true
+metadata/_edit_lock_ = true
+
+[node name="ShroomFat1" type="Sprite2D" parent="Props/Shrooms"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+y_sort_enabled = true
+metadata/_edit_lock_ = true
+
+[node name="Grass1" type="Sprite2D" parent="Props/Grass"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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"]
+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..331faa6
--- /dev/null
+++ b/demo/scenes/base/clouds.tscn
@@ -0,0 +1,256 @@
+[gd_scene load_steps=2 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"]
+modulate = Color(1, 1, 1, 0.792157)
+position = Vector2(-1998, -1508)
+metadata/_edit_lock_ = true
+
+[node name="Cloud1" type="Sprite2D" parent="."]
+position = Vector2(764, 358)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(12, 7, 455, 168)
+
+[node name="Cloud13" type="Sprite2D" parent="."]
+position = Vector2(4005, 2983)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(12, 7, 455, 168)
+
+[node name="Cloud5" type="Sprite2D" parent="."]
+position = Vector2(-152, 2723)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(12, 7, 455, 168)
+
+[node name="Cloud6" type="Sprite2D" parent="."]
+position = Vector2(3293, 936)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(12, 7, 455, 168)
+
+[node name="Cloud2" type="Sprite2D" parent="."]
+position = Vector2(85, 1505)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(10, 189, 644, 165)
+
+[node name="Cloud16" type="Sprite2D" parent="."]
+position = Vector2(3434, 3542)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(10, 189, 644, 165)
+
+[node name="Cloud7" type="Sprite2D" parent="."]
+position = Vector2(1380, 3802)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(10, 189, 644, 165)
+
+[node name="Cloud3" type="Sprite2D" parent="."]
+position = Vector2(503, 1222)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(507, 7, 193, 88)
+
+[node name="Cloud14" type="Sprite2D" parent="."]
+position = Vector2(4174, 3309)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(507, 7, 193, 88)
+
+[node name="Cloud15" type="Sprite2D" parent="."]
+position = Vector2(4695, 2800)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(507, 7, 193, 88)
+
+[node name="Cloud8" type="Sprite2D" parent="."]
+position = Vector2(152, 3383)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(507, 7, 193, 88)
+
+[node name="Cloud4" type="Sprite2D" parent="."]
+position = Vector2(164, 1669)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(501, 99, 210, 92)
+
+[node name="Cloud9" type="Sprite2D" parent="."]
+position = Vector2(328, 3474)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(501, 99, 210, 92)
+
+[node name="Cloud10" type="Sprite2D" parent="."]
+position = Vector2(933, 515)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(501, 99, 210, 92)
+
+[node name="Cloud12" type="Sprite2D" parent="."]
+position = Vector2(4570, 1222)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(501, 99, 210, 92)
+
+[node name="Cloud11" type="Sprite2D" parent="."]
+position = Vector2(3784, 345)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(501, 99, 210, 92)
+
+[node name="Cloud17" type="Sprite2D" parent="."]
+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="."]
+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="."]
+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="."]
+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="."]
+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="."]
+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="."]
+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="."]
+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="."]
+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="."]
+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="."]
+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="."]
+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="."]
+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="."]
+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="."]
+position = Vector2(3472, 3106)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(10, 189, 644, 165)
+
+[node name="Cloud32" type="Sprite2D" parent="."]
+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="."]
+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="."]
+position = Vector2(3863, 1375)
+texture = ExtResource("1_eigiy")
+region_enabled = true
+region_rect = Rect2(12, 7, 455, 168)
+
+[node name="Cloud35" type="Sprite2D" parent="."]
+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="."]
+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="."]
+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="."]
+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="."]
+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/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/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.tscn b/demo/scenes/game.tscn
new file mode 100644
index 0000000..25a1f35
--- /dev/null
+++ b/demo/scenes/game.tscn
@@ -0,0 +1,196 @@
+[gd_scene load_steps=15 format=3 uid="uid://clyhgbpfpmtw7"]
+
+[ext_resource type="Script" 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" 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"]
+y_sort_enabled = true
+script = ExtResource("1_qw71e")
+
+[node name="UI Layer" type="CanvasLayer" parent="."]
+
+[node name="Control" type="Control" parent="UI Layer"]
+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"]
+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"]
+layout_mode = 2
+theme_override_constants/separation = 4
+
+[node name="ToggleFullscreen" type="Button" parent="UI Layer/Control/Toolbar/HBoxContainer"]
+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"]
+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_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_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"]
+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"]
+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"]
+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="." instance=ExtResource("9_k3uu1")]
+metadata/_edit_lock_ = true
+
+[node name="Gong" parent="." instance=ExtResource("10_tftjb")]
+position = Vector2(923, -21)
+
+[node name="Player" parent="." instance=ExtResource("11_bndob")]
+position = Vector2(843, 455)
+
+[node name="Camera2D" type="Camera2D" parent="Player"]
+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="."]
+
+[node name="SpawnPosition1" type="Marker2D" parent="SpawnPoints"]
+position = Vector2(512, -180)
+
+[node name="SpawnPosition2" type="Marker2D" parent="SpawnPoints"]
+position = Vector2(1421, -150)
+
+[node name="SpawnPosition3" type="Marker2D" parent="SpawnPoints"]
+position = Vector2(1512, 300)
+
+[node name="SpawnPosition4" type="Marker2D" parent="SpawnPoints"]
+position = Vector2(2264, 345)
+
+[node name="SpawnPosition5" type="Marker2D" parent="SpawnPoints"]
+position = Vector2(1655, 789)
+
+[node name="SpawnPosition6" type="Marker2D" parent="SpawnPoints"]
+position = Vector2(823, 826)
+
+[node name="SpawnPosition7" type="Marker2D" parent="SpawnPoints"]
+position = Vector2(67, 648)
+
+[node name="SpawnPosition8" type="Marker2D" parent="SpawnPoints"]
+position = Vector2(-399, 434)
+
+[node name="SpawnPosition9" type="Marker2D" parent="SpawnPoints"]
+position = Vector2(629, 417)
+
+[node name="SpawnPosition10" type="Marker2D" parent="SpawnPoints"]
+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.tscn b/demo/scenes/showcase.tscn
new file mode 100644
index 0000000..4c23f0f
--- /dev/null
+++ b/demo/scenes/showcase.tscn
@@ -0,0 +1,288 @@
+[gd_scene load_steps=16 format=3 uid="uid://b3ae14mc2ty3y"]
+
+[ext_resource type="Script" 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" 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" 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"]
+y_sort_enabled = true
+script = ExtResource("1_l12ql")
+
+[node name="UI Layer" type="CanvasLayer" parent="."]
+
+[node name="Control" type="Control" parent="UI Layer"]
+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"]
+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"]
+layout_mode = 2
+theme_override_constants/separation = 4
+
+[node name="ToggleFullscreen" type="Button" parent="UI Layer/Control/Toolbar/HBoxContainer"]
+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"]
+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_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_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_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"]
+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"]
+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"]
+layout_mode = 2
+theme_override_constants/separation = 4
+
+[node name="Previous" type="Button" parent="UI Layer/Control/BehaviorInspector/VBoxContainer/HBoxContainer"]
+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_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_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_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"]
+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"]
+layout_mode = 2
+
+[node name="Logo" type="TextureRect" parent="UI Layer/Control/PanelContainer/Control"]
+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"]
+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"]
+layout_mode = 2
+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"]
+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_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"]
+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"]
+layout_mode = 2
+theme_override_constants/separation = 0
+
+[node name="Description" type="RichTextLabel" parent="UI Layer/Control/PanelContainer/MarginContainer/VBoxContainer"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(0, 140)
+layout_mode = 2
+size_flags_vertical = 3
+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
+theme_override_font_sizes/normal_font_size = 20
+theme_override_font_sizes/bold_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_name_in_owner = true
+position = Vector2i(0, 60)
+size = Vector2i(1024, 708)
+visible = true
+
+[node name="CodeEdit" type="CodeEdit" parent="UI Layer/Control/CodePopup"]
+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 = 1020.0
+offset_bottom = 704.0
+grow_horizontal = 2
+grow_vertical = 2
+gutters_draw_line_numbers = true
+script = ExtResource("9_txke7")
+
+[node name="Camera2D" type="Camera2D" parent="."]
+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="." instance=ExtResource("7_42nq6")]
+metadata/_edit_lock_ = true
+
+[node name="Dummy" parent="." 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"]
diff --git a/export_presets.cfg b/export_presets.cfg
index 8c1341b..699d61f 100644
--- a/export_presets.cfg
+++ b/export_presets.cfg
@@ -2,8 +2,8 @@
name="Web"
platform="Web"
-runnable=true
-advanced_options=true
+runnable=false
+advanced_options=false
dedicated_server=false
custom_features=""
export_filter="all_resources"
diff --git a/src/spine_sprite.gd b/src/spine_sprite.gd
index 18b5ec2..25b9c69 100644
--- a/src/spine_sprite.gd
+++ b/src/spine_sprite.gd
@@ -5,7 +5,7 @@ extends SpineSprite
func _ready() -> void:
var a = get_animation_state()
if a:
- a.set_animation("animation", true, 0)
+ a.set_animation("idle", true, 0)
a.set_time_scale(time_scale)
func _process(delta: float) -> void: