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 @@ +

+ LimboAI logo +

+ +# LimboAI - Behavior Trees & State Machines for Godot 4 + +[![πŸ”— All builds](https://github.com/limbonaut/limboai/actions/workflows/all_builds.yml/badge.svg)](https://github.com/limbonaut/limboai/actions/workflows/all_builds.yml) +[![πŸ”Ž Unit Tests](https://github.com/limbonaut/limboai/actions/workflows/test_builds.yml/badge.svg)](https://github.com/limbonaut/limboai/actions/workflows/test_builds.yml) +[![Documentation Status](https://readthedocs.org/projects/limboai/badge/?version=latest)](https://limboai.readthedocs.io/en/latest/?badge=latest) +[![GitHub License](https://img.shields.io/github/license/limbonaut/limboai)](https://github.com/limbonaut/limboai/blob/master/LICENSE.md) +[![Discord](https://img.shields.io/discord/1185664967379267774?logo=discord&link=https%3A%2F%2Fdiscord.gg%2FN5MGC95GpP)](https://discord.gg/N5MGC95GpP) +[![Mastodon Follow](https://img.shields.io/mastodon/follow/109346796150895359?domain=https%3A%2F%2Fmastodon.gamedev.place)](https://mastodon.gamedev.place/@limbo) + +>**πŸ›ˆ Supported Godot Engine:** **4.3** (v1.2.0+) | **4.2** (v1.1.x releases) + +**LimboAI** is an open-source C++ plugin for **Godot Engine 4** providing a combination of +**Behavior Trees** and **State Machines**, which can be used together to create complex AI behaviors. +It comes with a behavior tree editor, built-in documentation, visual debugger, extensive demo project with a tutorial, and more! +While it is implemented in C++, it fully supports GDScript for [creating your own tasks](https://limboai.readthedocs.io/en/stable/getting-started/custom-tasks.html) and [states](https://limboai.readthedocs.io/en/stable/getting-started/hsm.html). + +If you enjoy using LimboAI, please **consider supporting** my efforts with a donation on Ko-fi 😊 Your contribution will help me continue developing and improving it. + +[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/Y8Y2TCNH0) + +![Textured screenshot](doc/images/behavior-tree-editor-debugger.png) + +Behavior Trees are powerful hierarchical structures used to model and control the behavior of agents in a game (e.g., characters, enemies). They are designed to make it easier to create rich and highly modular behaviors for your games. To learn more about behavior trees, check out [Introduction to Behavior Trees](https://limboai.readthedocs.io/en/stable/getting-started/introduction.html) and our demo project, which includes a tutorial. + +## Demonstration + +![Charger from Demo](doc/images/demo_charger.gif) + +>**πŸ›ˆ Demo project** lives in the `demo` folder and is available separately in [**Releases**](https://github.com/limbonaut/limboai/releases). +> Run `demo/scenes/showcase.tscn` to get started. +> It also includes a tutorial that introduces behavior trees through illustrative examples. + +### Videos + +> **πŸ›ˆ** YouTube videos produced by various creators + + + + + + +## 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: