From 2b41f84b054f4c1dc52f91a7d283907702516de9 Mon Sep 17 00:00:00 2001 From: Tony Bark Date: Sun, 24 Dec 2023 20:39:57 -0500 Subject: [PATCH] Lots of stuff I forgot to commit because Holidays - D&D dice engine (see README) - Markdown support - Phantom camera --- LICENSE | 2 +- README.md | 29 +- addons/markdownlabel/.gitignore | 17 + addons/markdownlabel/README.md | 250 ++++ addons/markdownlabel/assets/screenshot.png | Bin 0 -> 180021 bytes addons/markdownlabel/example.gd | 5 + addons/markdownlabel/example.tscn | 77 ++ .../markdownlabel/header_formats/h1_format.gd | 32 + .../markdownlabel/header_formats/h2_format.gd | 32 + .../markdownlabel/header_formats/h3_format.gd | 32 + .../markdownlabel/header_formats/h4_format.gd | 32 + .../markdownlabel/header_formats/h5_format.gd | 32 + .../markdownlabel/header_formats/h6_format.gd | 32 + addons/markdownlabel/icon.svg | 36 + addons/markdownlabel/markdownlabel.gd | 599 ++++++++++ addons/markdownlabel/plugin.cfg | 7 + addons/markdownlabel/plugin.gd | 11 + addons/phantom_camera/examples/credits.txt | 7 + .../example_scenes/2D/2DExampleScene.tscn | 756 ++++++++++++ .../2D/2DFollowFramedExampleScene.tscn | 762 +++++++++++++ .../2D/2DFollowGroupExampleScene.tscn | 775 +++++++++++++ .../2D/2DFollowPathExampleScene.tscn | 778 +++++++++++++ .../2D/2DTweeningExampleScene.tscn | 909 +++++++++++++++ .../example_scenes/3D/3DExampleScene.tscn | 378 ++++++ .../3D/3DFollowFramedExampleScene.tscn | 172 +++ .../3D/3DFollowGluedExampleScene.tscn | 222 ++++ .../3D/3DFollowGroupExampleScene.tscn | 186 +++ .../3D/3DFollowPathExampleScene.tscn | 239 ++++ .../3D/3DFollowSimpleExampleScene.tscn | 170 +++ .../3D/3DFollowThirdPersonExampleScene.tscn | 216 ++++ .../3D/3DLookAtExampleScene.tscn | 202 ++++ .../3D/3DTweeningExampleScene.tscn | 270 +++++ .../examples/models/3DPrototypeCubeDark.tscn | 15 + .../resources/tween/FixedCameraTween.tres | 9 + .../tween/InventoryPhantomCamera2DTween.tres | 9 + .../tween/ItemFocusPhantomCamera2DTween.tres | 9 + .../tween/PlayerPhantomCamera2DTween.tres | 9 + .../tween/PlayerPhantomCamera3DTween.tres | 9 + .../examples/scripts/2D/2D_trigger_area.gd | 16 + .../scripts/2D/PlayerCharacterBody2D.gd | 170 +++ .../examples/scripts/3D/3D_trigger_area.gd | 26 + .../phantom_camera/examples/scripts/3D/NPC.gd | 66 ++ .../examples/scripts/3D/path_follow.gd | 18 + .../examples/scripts/3D/player_controller.gd | 81 ++ .../3D/player_controller_third_person.gd | 83 ++ .../textures/2D/PhantomCamera2DSprite.png | Bin 0 -> 3107 bytes .../2D/PhantomCamera2DSprite.png.import | 34 + .../textures/2D/inventory_container.png | Bin 0 -> 68739 bytes .../2D/inventory_container.png.import | 34 + .../textures/2D/level_spritesheet.png | Bin 0 -> 10314 bytes .../textures/2D/level_spritesheet.png.import | 34 + .../examples/textures/2D/sign_prompt.png | Bin 0 -> 175934 bytes .../textures/2D/sign_prompt.png.import | 34 + .../textures/3D/CheckerPatternDark.png | Bin 0 -> 2861 bytes .../textures/3D/CheckerPatternDark.png.import | 35 + .../examples/ui/UIInventory.tscn | 38 + addons/phantom_camera/examples/ui/UISign.tscn | 84 ++ addons/phantom_camera/fonts/Nunito-Black.ttf | Bin 0 -> 131568 bytes .../fonts/Nunito-Black.ttf.import | 33 + .../phantom_camera/fonts/Nunito-Regular.ttf | Bin 0 -> 131736 bytes .../fonts/Nunito-Regular.ttf.import | 33 + .../framed_viewfinder/deadzone_style_box.tres | 14 + .../framed_viewfinder_panel.tscn | 436 +++++++ addons/phantom_camera/gizmos/CustomGizmo.gd | 93 ++ .../gizmos/phantom_camera_gizmo_plugin_3D.gd | 11 + addons/phantom_camera/icons/Chevron.svg | 3 + .../phantom_camera/icons/Chevron.svg.import | 37 + .../icons/PhantomCameraGizmoIcon.svg | 4 + .../icons/PhantomCameraGizmoIcon.svg.import | 37 + .../icons/PhantomCameraGizmoIcon2D.svg | 4 + .../icons/PhantomCameraGizmoIcon2D.svg.import | 38 + .../icons/PhantomCameraGizmoIcon3D.svg | 4 + .../icons/PhantomCameraGizmoIcon3D.svg.import | 38 + .../icons/PhantomCameraHostIcon.svg | 3 + .../icons/PhantomCameraHostIcon.svg.import | 37 + .../icons/PhantomCameraIcon.svg | 4 + .../icons/PhantomCameraIcon.svg.import | 37 + .../icons/PhantomCameraIcon2D.svg | 4 + .../icons/PhantomCameraIcon2D.svg.import | 37 + .../icons/PhantomCameraIcon3D.svg | 4 + .../icons/PhantomCameraIcon3D.svg.import | 37 + addons/phantom_camera/icons/Pin.svg | 3 + addons/phantom_camera/icons/Pin.svg.import | 37 + .../phantom_camera/icons/features/Follow.svg | 9 + .../icons/features/Follow.svg.import | 37 + .../phantom_camera/icons/features/Look-At.svg | 9 + .../icons/features/Look-At.svg.import | 37 + .../icons/features/Priority.svg | 19 + .../icons/features/Priority.svg.import | 37 + .../phantom_camera/icons/features/Tween.svg | 19 + .../icons/features/Tween.svg.import | 37 + addons/phantom_camera/icons/features/Zoom.svg | 9 + .../icons/features/Zoom.svg.import | 37 + .../icons/misc/PriorityOverride.svg | 14 + .../icons/misc/PriorityOverride.svg.import | 37 + .../icons/viewfinder/Camera2DIcon.svg | 3 + .../icons/viewfinder/Camera2DIcon.svg.import | 37 + .../icons/viewfinder/Camera3DIcon.svg | 3 + .../icons/viewfinder/Camera3DIcon.svg.import | 37 + .../icons/viewfinder/SceneTypesIcon.svg | 4 + .../viewfinder/SceneTypesIcon.svg.import | 37 + .../phantom_camera_inspector_plugin.gd | 46 + addons/phantom_camera/plugin.cfg | 7 + addons/phantom_camera/plugin.gd | 54 + addons/phantom_camera/scripts/group_names.gd | 5 + .../phantom_camera/phantom_camera_2D.gd | 477 ++++++++ .../phantom_camera/phantom_camera_3D.gd | 1014 +++++++++++++++++ .../phantom_camera_constants.gd | 87 ++ .../phantom_camera_properties.gd | 488 ++++++++ .../phantom_camera_host.gd | 366 ++++++ .../scripts/resources/camera_3D_resource.gd | 14 + .../scripts/resources/tween_resource.gd | 13 + .../scripts/viewfinder/viewfinder.gd | 439 +++++++ addons/sound_manager/LICENSE | 21 + addons/sound_manager/SoundManager.cs | 178 +++ .../abstract_audio_player_pool.gd | 84 ++ addons/sound_manager/music.gd | 133 +++ addons/sound_manager/plugin.cfg | 7 + addons/sound_manager/plugin.gd | 10 + addons/sound_manager/sound_effects.gd | 7 + addons/sound_manager/sound_manager.gd | 154 +++ project.godot | 4 + scenes/main2d.tscn | 30 +- scenes/main3d.tscn | 2 +- scripts/Dicebag.gd | 63 + 125 files changed, 13170 insertions(+), 23 deletions(-) create mode 100644 addons/markdownlabel/.gitignore create mode 100644 addons/markdownlabel/README.md create mode 100644 addons/markdownlabel/assets/screenshot.png create mode 100644 addons/markdownlabel/example.gd create mode 100644 addons/markdownlabel/example.tscn create mode 100644 addons/markdownlabel/header_formats/h1_format.gd create mode 100644 addons/markdownlabel/header_formats/h2_format.gd create mode 100644 addons/markdownlabel/header_formats/h3_format.gd create mode 100644 addons/markdownlabel/header_formats/h4_format.gd create mode 100644 addons/markdownlabel/header_formats/h5_format.gd create mode 100644 addons/markdownlabel/header_formats/h6_format.gd create mode 100644 addons/markdownlabel/icon.svg create mode 100644 addons/markdownlabel/markdownlabel.gd create mode 100644 addons/markdownlabel/plugin.cfg create mode 100644 addons/markdownlabel/plugin.gd create mode 100644 addons/phantom_camera/examples/credits.txt create mode 100644 addons/phantom_camera/examples/example_scenes/2D/2DExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/2D/2DFollowFramedExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/2D/2DFollowGroupExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/2D/2DFollowPathExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/2D/2DTweeningExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D/3DExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D/3DFollowFramedExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D/3DFollowGluedExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D/3DFollowGroupExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D/3DFollowPathExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D/3DFollowSimpleExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D/3DFollowThirdPersonExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D/3DLookAtExampleScene.tscn create mode 100644 addons/phantom_camera/examples/example_scenes/3D/3DTweeningExampleScene.tscn create mode 100644 addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn create mode 100644 addons/phantom_camera/examples/resources/tween/FixedCameraTween.tres create mode 100644 addons/phantom_camera/examples/resources/tween/InventoryPhantomCamera2DTween.tres create mode 100644 addons/phantom_camera/examples/resources/tween/ItemFocusPhantomCamera2DTween.tres create mode 100644 addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera2DTween.tres create mode 100644 addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera3DTween.tres create mode 100644 addons/phantom_camera/examples/scripts/2D/2D_trigger_area.gd create mode 100644 addons/phantom_camera/examples/scripts/2D/PlayerCharacterBody2D.gd create mode 100644 addons/phantom_camera/examples/scripts/3D/3D_trigger_area.gd create mode 100644 addons/phantom_camera/examples/scripts/3D/NPC.gd create mode 100644 addons/phantom_camera/examples/scripts/3D/path_follow.gd create mode 100644 addons/phantom_camera/examples/scripts/3D/player_controller.gd create mode 100644 addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd create mode 100644 addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png create mode 100644 addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png.import create mode 100644 addons/phantom_camera/examples/textures/2D/inventory_container.png create mode 100644 addons/phantom_camera/examples/textures/2D/inventory_container.png.import create mode 100644 addons/phantom_camera/examples/textures/2D/level_spritesheet.png create mode 100644 addons/phantom_camera/examples/textures/2D/level_spritesheet.png.import create mode 100644 addons/phantom_camera/examples/textures/2D/sign_prompt.png create mode 100644 addons/phantom_camera/examples/textures/2D/sign_prompt.png.import create mode 100644 addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png create mode 100644 addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png.import create mode 100644 addons/phantom_camera/examples/ui/UIInventory.tscn create mode 100644 addons/phantom_camera/examples/ui/UISign.tscn create mode 100644 addons/phantom_camera/fonts/Nunito-Black.ttf create mode 100644 addons/phantom_camera/fonts/Nunito-Black.ttf.import create mode 100644 addons/phantom_camera/fonts/Nunito-Regular.ttf create mode 100644 addons/phantom_camera/fonts/Nunito-Regular.ttf.import create mode 100644 addons/phantom_camera/framed_viewfinder/deadzone_style_box.tres create mode 100644 addons/phantom_camera/framed_viewfinder/framed_viewfinder_panel.tscn create mode 100644 addons/phantom_camera/gizmos/CustomGizmo.gd create mode 100644 addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3D.gd create mode 100644 addons/phantom_camera/icons/Chevron.svg create mode 100644 addons/phantom_camera/icons/Chevron.svg.import create mode 100644 addons/phantom_camera/icons/PhantomCameraGizmoIcon.svg create mode 100644 addons/phantom_camera/icons/PhantomCameraGizmoIcon.svg.import create mode 100644 addons/phantom_camera/icons/PhantomCameraGizmoIcon2D.svg create mode 100644 addons/phantom_camera/icons/PhantomCameraGizmoIcon2D.svg.import create mode 100644 addons/phantom_camera/icons/PhantomCameraGizmoIcon3D.svg create mode 100644 addons/phantom_camera/icons/PhantomCameraGizmoIcon3D.svg.import create mode 100644 addons/phantom_camera/icons/PhantomCameraHostIcon.svg create mode 100644 addons/phantom_camera/icons/PhantomCameraHostIcon.svg.import create mode 100644 addons/phantom_camera/icons/PhantomCameraIcon.svg create mode 100644 addons/phantom_camera/icons/PhantomCameraIcon.svg.import create mode 100644 addons/phantom_camera/icons/PhantomCameraIcon2D.svg create mode 100644 addons/phantom_camera/icons/PhantomCameraIcon2D.svg.import create mode 100644 addons/phantom_camera/icons/PhantomCameraIcon3D.svg create mode 100644 addons/phantom_camera/icons/PhantomCameraIcon3D.svg.import create mode 100644 addons/phantom_camera/icons/Pin.svg create mode 100644 addons/phantom_camera/icons/Pin.svg.import create mode 100644 addons/phantom_camera/icons/features/Follow.svg create mode 100644 addons/phantom_camera/icons/features/Follow.svg.import create mode 100644 addons/phantom_camera/icons/features/Look-At.svg create mode 100644 addons/phantom_camera/icons/features/Look-At.svg.import create mode 100644 addons/phantom_camera/icons/features/Priority.svg create mode 100644 addons/phantom_camera/icons/features/Priority.svg.import create mode 100644 addons/phantom_camera/icons/features/Tween.svg create mode 100644 addons/phantom_camera/icons/features/Tween.svg.import create mode 100644 addons/phantom_camera/icons/features/Zoom.svg create mode 100644 addons/phantom_camera/icons/features/Zoom.svg.import create mode 100644 addons/phantom_camera/icons/misc/PriorityOverride.svg create mode 100644 addons/phantom_camera/icons/misc/PriorityOverride.svg.import create mode 100644 addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg create mode 100644 addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg.import create mode 100644 addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg create mode 100644 addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg.import create mode 100644 addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg create mode 100644 addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg.import create mode 100644 addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd create mode 100644 addons/phantom_camera/plugin.cfg create mode 100644 addons/phantom_camera/plugin.gd create mode 100644 addons/phantom_camera/scripts/group_names.gd create mode 100644 addons/phantom_camera/scripts/phantom_camera/phantom_camera_2D.gd create mode 100644 addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd create mode 100644 addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd create mode 100644 addons/phantom_camera/scripts/phantom_camera/phantom_camera_properties.gd create mode 100644 addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd create mode 100644 addons/phantom_camera/scripts/resources/camera_3D_resource.gd create mode 100644 addons/phantom_camera/scripts/resources/tween_resource.gd create mode 100644 addons/phantom_camera/scripts/viewfinder/viewfinder.gd create mode 100644 addons/sound_manager/LICENSE create mode 100644 addons/sound_manager/SoundManager.cs create mode 100644 addons/sound_manager/abstract_audio_player_pool.gd create mode 100644 addons/sound_manager/music.gd create mode 100644 addons/sound_manager/plugin.cfg create mode 100644 addons/sound_manager/plugin.gd create mode 100644 addons/sound_manager/sound_effects.gd create mode 100644 addons/sound_manager/sound_manager.gd create mode 100644 scripts/Dicebag.gd diff --git a/LICENSE b/LICENSE index af37886..4d37832 100644 --- a/LICENSE +++ b/LICENSE @@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read -. +. \ No newline at end of file diff --git a/README.md b/README.md index 29948b2..77241a0 100644 --- a/README.md +++ b/README.md @@ -9,25 +9,28 @@ CityLimits is an open source reimagining of SimCity Classic based on Godot. In the long run, I plan on adding on gameplay mechanics used in later iterations. Like it's cousin, everything learned in the making of CityLimits will go towards the building and customization that I've been itching to create. -## Getting Started +## Features -### Prerequisites +While CityLimits plans to stick close to the classic SimCity formula as much as possible, I do plan to add in features introduced in later installments, as well as my own touches. -- Godot Engine 4.x +### Dice Mechanics -### Controls +One of these unique touches and biggest difference is how random events are tackled. Instead of trying to dig through the Micropolis code, I'm going to streamline the process by using a simple D&D dice engine. So if you think the game rolled you a 1, it probably did. It's just easier to comprehend, like the desktop metaphor. + + +## Controls | Key | Command | | --- | --- | -| W A S D | Move camera | -| F | Camera to center | -| Middle mouse button | Hold to rotate camera | -| Left mouse button | Place building | -| DEL | Remove building | -| Right mouse button | Rotate building | -| Q E | Toggle between buildings | -| F1 | Save | -| F2 | Load | +| ``W`` ``A`` ``S`` ``D`` | Move camera | +| ``F`` | Camera to center | +| ``Middle mouse button`` | Hold to rotate camera | +| ``Left mouse button`` | Place building | +| ``DEL`` | Remove building | +| ``Right mouse button`` | Rotate building | +| ``Q`` ``E`` | Toggle between buildings | +| ``F1`` | Save | +| ``F2`` | Load | ## Authors diff --git a/addons/markdownlabel/.gitignore b/addons/markdownlabel/.gitignore new file mode 100644 index 0000000..4b3e0d5 --- /dev/null +++ b/addons/markdownlabel/.gitignore @@ -0,0 +1,17 @@ +# Godot 4+ specific ignores +.godot/ + +# Godot-specific ignores +.import/ +export.cfg +export_presets.cfg +*.import +project.godot + +# Imported translations (automatically generated from CSV files) +*.translation + +# Mono-specific ignores +.mono/ +data_*/ +mono_crash.*.json \ No newline at end of file diff --git a/addons/markdownlabel/README.md b/addons/markdownlabel/README.md new file mode 100644 index 0000000..b68508e --- /dev/null +++ b/addons/markdownlabel/README.md @@ -0,0 +1,250 @@ +# MarkdownLabel + +A custom [Godot](https://godotengine.org/) node that extends [RichTextLabel](https://docs.godotengine.org/en/stable/classes/class_richtextlabel.html) to use Markdown instead of BBCode. + +### Contents + +- [Disclaimer](#disclaimer) +- [Installation](#installation) +- [Usage](#usage) + - [Basic syntax](#basic-syntax) + - [Code](#code) + - [Headers](#headers) + - [Links](#links) + - [Images](#images) + - [Lists](#lists) + - [Tables](#tables) + - [Escaping characters](#escaping-characters) +- [Limitations](#limitations) + - [Unsupported syntax elements](#unsupported-syntax-elements) + - [Performance](#performance) +- [Acknowledgements](#acknowledgements) + +## Disclaimer + +**This is a work in progress**. I created this for my own use and figured out someone else might as well have some use for it. Obviously using BBCode will be better performance-wise since it's natively integrated in Godot. But using Markdown is much easier to write and read, so it can save development time in many cases. + +I coded this quickly and without previous knowledge of how to parse Markdown properly, so there might be some inefficiencies and bugs. Please report any unexpected behavior. + +I might convert this to C++ code at some point, to improve performance. + +### Intended use case + +This node is very useful for static text that you want to display in your application. It's not recommended to use this for text which is dynamically modified at run time. + +My initial use case that lead me to do this was to directly include text from files in my game, such as credits and patch notes, in a format that is easier to mantain for me. This has the added benefit of being able to use the same Markdown files that are displayed in a github repository, instead of having to make two versions of the same text in two different formats. + +## Installation + +1. Download the `addons` folder of this repository. +2. Place it in your project's root folder. +3. Go to `Project > Project Settings... > Plugins` and enable the MarkdownLabel plugin. +4. Reload the project. + +## Usage + +Simply add a MarkdownLabel to the scene and write its `markdown_text` field in Markdown format. + +In the RichTextLabel properties: +- **`bbcode_enabled` property must be enabled**. +- Do not touch the `text` property, since it's internally used by MarkdownLabel to properly format its text. +- You can use the rest of its properties as normal. + +You can still use BBCode tags that don't have a Markdown equivalent, such as `[color=green]underlined text[/color]`, allowing you to have the full functionality of RichTextLabel with the simplicity and readibility of Markdown. + +![An example of the node being used to display this Markdown file](addons/markdownlabel/assets/screenshot.png "An example of the node being used to display this Markdown file") +*An example of the node being used to display this Markdown file.* + +### Basic syntax + +The basic Markdown syntax works in the standard way: + +``` +Markdown text ................ -> BBCode equivalent +-------------------------------||------------------ +**Bold** or __bold__ ......... -> [b]Bold[/b] or [b]bold[/b] +*Italics* or _italics_ ....... -> [i]Italics[/i] or [i]italics[/i] +***Nested*** *__emphasis__* .. -> [b][i]Nested[/i][b] [i][b]emphasis[/b][/i] +~~Strike-through~~ ........... -> [s]Strike-through[/s] +``` + +### Code + +You can display code in-line by surrounding text with any number of backticks (\`), and you can display code in multiple lines (also called a fenced code block) by placing a line containing just three or more backticks (\`\`\`) or tildes (\~\~\~) above and below your code block. + +Examples: +``` +Markdown text ................. -> BBCode equivalent +--------------------------------||------------------ +The following is `in-line code` -> The following is [code]in-line code[/code] +This is also ``in-line code`` -> The following is [code]in-line code[/code] + +~~~ .......... -> [code] +This is a .......... -> This is a +multiline codeblock .......... -> multiline codeblock +~~~ .......... -> [/code] + +``` + +**Important**: note that in-line code and code blocks won't do anything with Godot's default font, since it doesn't have a monospace variant. As described in [Godot's BBCode reference](https://docs.godotengine.org/en/stable/tutorials/ui/bbcode_in_richtextlabel.html#reference): "The monospaced (`[code]`) tag only works if a custom font is set up in the RichTextLabel node's theme overrides. Otherwise, monospaced text will use the regular font". + +### Headers + +MarkdownLabel supports headers, although RichTextLabel doesn't. By default, a line defined as a header will have its font size scaled by a pre-defined amount. + +To define a line as a header, begin it with any number of consecutive hash symbols (#) and follow it with the title of your header. The number of hash symbols defines the level of the header. The maximum supported level is six.. + +Example: +``` +Markdown text: +## This is a second-level header + +BBCode equivalent: +[font_size=27]This is a second-level header[/font_size] +``` +where the `27` in `[font_size=27]` comes from multiplying the set `h2.font_size` (`1.714` by default) by the current `normal_font_size` (`16` by default). + +You can optionally set custom sizes and formatting (bold, italics, and underline) for each header level individually. To do so: + +- In the inspector, open the "Header formats" category, click on the resource associated with the desired header level, and customize the properties there. +- In script, access those properties through the `h1`, `h2`, etc. properties. Example: `$YourMarkdownLabel.h3.is_italic = true` will set all level-3 headers within `$YourMarkdownLabel` to be displayed as italics. + +Of course, you can also use basic formatting within the headers (e.g. `### Header with **bold** and *italic* words`). + +### Links + +Links follow the standard Markdown syntax of `[text to display](example.com)`. Additionally, you can add tooltips to your links with `[text to display](example.com "Some tooltip")`. + +"Autolinks" are also supported with their standard syntax: ``, and `` for mail autolinks. + +Keep in mind that, in Godot, **links do nothing by default**. MarkdownLabel treats them the say way (may be changed in the future). See the [RichTextLabel reference](https://docs.godotengine.org/en/stable/tutorials/ui/bbcode_in_richtextlabel.html#doc-bbcode-in-richtextlabel-handling-url-tag-clicks) for more info. + +``` +Markdown text .............................. -> BBCode equivalent +---------------------------------------------||------------------ +[this is a link](example.com) .............. -> [url=example.com]this is a link[/url] +[this is a link](example.com "Example page") -> [hint=Example url][url=example.com]this is a link[/url][/hint] + .............................. -> [url]example.com[/url] + ......................... -> [url=mailto:mail@example.com]mail@example.com[/url] +``` + +### Images + +Images use the same syntax as links but preceded by an exclamation mark (!): + +``` +Markdown text .............................................. -> BBCode equivalent +-------------------------------------------------------------||------------------ +![This is an image](res://some/path.png) ................... -> [img]res://some/path.png[/img] +![This is an image](res://some/path.png "This is a tooltip") -> [hint=This is a tooltip][img]res://some/path.png[/img][/hint] +``` +However, Godot's BBCode doesn't support alt text for images, so what you put inside the square brackets doesn't affect the end result. You can use it for your own clarity, though. + +For advanced usage (setting width, height, and other options), use the BBCode `[img]` tag instead, as described in [Godot's BBCode reference](https://docs.godotengine.org/en/stable/tutorials/ui/bbcode_in_richtextlabel.html#reference). + +### Lists + +Unordered list elements begin with a dash (-), asterisk (*), or plus sign (+) followed by a space. + +Ordered list elements begin with a number from 1 to 9 followed by a single dot and a space. + +To begin a list, you must write the first element without indentation and, in the case of ordered lists, the first element must begin with the number 1. + +From there, you add elements in consecutive lines (do not leave blank lines between elements), and you can open nested lists by indenting new elements any number of spaces or tabs. + +Examples: + +Markdown text: +``` +1. First element of an unordered list +2. Second element + 1. Nested element +1. Third element. The number at the beginning doesn't need to match the actual order. It's only relevant for the first element. + - You can also nest unordered lists inside ordered lists, and viceversa + 1. This is a nested list inside another nested list. +``` +BBCode equivalent: +``` +[ol]First element of an unordered list +Second element +[ol]Nested element[/ol] +Third element. The number at the beginning doesn't need to match the actual order. It's only relevant for the first element. +[ul]You can also nest unordered lists inside ordered lists, and viceversa +[ol]This is a nested list inside another nested list.[/ol] +[/ul][/ol] +``` + +### Tables + +Tables are constructed by separating columns with pipes (`|`). + +Example: + +Markdown text: +```` +| cell1 | cell2 | +| cell3 | cell4 | +```` + +BBCode equivalent: +```` +[table=2] +[cell]cell1[/cell][cell]cell2[/cell] +[cell]cell3[/cell][cell]cell4[/cell] +[/table] +```` + +Note that [delimiter rows](https://github.github.com/gfm/#delimiter-row) are optional and will be ignored, since Godot's BBCode doesn't support cell alignment. + +Example: +```` +| cell1 | cell2 | +| ----: | :---- | +| cell3 | cell4 | +```` +The above Markdown table will produce the same BBCode output as the previous example. + +For advanced usage (setting ratio, border, background, etc.), use the BBCode `[table]` tag instead, as described in [Godot's BBCode reference](https://docs.godotengine.org/en/stable/tutorials/ui/bbcode_in_richtextlabel.html#reference). + +### Escaping characters + +You can escape characters using a backlash if you don't want them to form a Markdown syntax element. You can escape backlashes if you don't want them to escape the following character. You can't escape characters inside in-line or fenced code, since the string will be displayed as-is. You also don't need to escape characters inside a link or image url. + +Examples: +``` +Markdown text ............................ -> BBCode equivalent +-------------------------------------------||------------------ +These \**outer asterisks*\* are escaped .. -> These *[i]outer asterisks[/i]* are escaped +This \\*asterisk* is not escaped ......... -> \[i]This asterisk[/i] is not escaped +`This \\*asterisk* is inside in-line code` -> [code]This \\*asterisk* is inside in-line code[/code] +[Link](url_with_backlashes.net) .......... -> [url=url_with_backlashes.net]Link[/url] +``` + +Note: to escape an ordered list, you must escape the dot that follows the number, e.g. `1\. Not a list`. + +Keep in mind that, if you are writing text inside a script, you will have to "double escape" backlashes, since you are writing in a string. Some other characters, such as double-quotes, also need in-script escaping: + +- In-script: `\\*`, `\\\"` +- In-editor: `\*`, `\"` +- Result: `*`, `"` + +## Limitations + +Keep in mind that this is not supposed to be a full Markdown implementation, it just provides a Markdown interface to Godot's BBCode support and, as such, is limited by it. + +If encountering any unreported bug or unexpected bahaviour, please ensure that your Markdown is written as clean as possible, following best practices (I wrote this primarily taking [Commonmark](https://commonmark.org/) and [Github-flavoured Markdown](https://github.github.com/gfm/) as reference, but it has its own peculiarities due to the use of Godot's BBCode). + +### Unsupported syntax elements + +The following Markdown syntax elements are not supported because Godot's BBCode does not support them: +- Quotes +- Horizontal rules +- Reference links + +### Performance + +This node basically parses the whole text, converting it from Markdown to BBCode at runtime, so it may produce performance issues with some extreme usages, such as very large and heavily-formatted texts or updating a heavily-formatted text very frequently. That already can happen with BBCode, though, so in that case, you are probably better off [using RichTextLabel's functions](https://docs.godotengine.org/en/stable/tutorials/ui/bbcode_in_richtextlabel.html#using-push-tag-and-pop-functions-instead-of-bbcode) instead of writing the formatting directly in-text. + +### Acknowledgements + +The syntax and implementation of MarkdownLabel is largely based on [Github-flavored Markdown](https://github.github.com/gfm/) and [CommonMark](https://commonmark.org/), with its own quirks to accomodate it within [Godot's RichTextLabel BBCode](https://docs.godotengine.org/en/stable/tutorials/ui/bbcode_in_richtextlabel.html). diff --git a/addons/markdownlabel/assets/screenshot.png b/addons/markdownlabel/assets/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fcbb753646a0f526908f6090bf8b6b8540c79562 GIT binary patch literal 180021 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 z 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 literal 0 HcmV?d00001 diff --git a/addons/markdownlabel/example.gd b/addons/markdownlabel/example.gd new file mode 100644 index 0000000..5c1e50a --- /dev/null +++ b/addons/markdownlabel/example.gd @@ -0,0 +1,5 @@ +extends Control + + +func _ready() -> void: + $MarkdownLabel.display_file("res://addons/markdownlabel/README.md") diff --git a/addons/markdownlabel/example.tscn b/addons/markdownlabel/example.tscn new file mode 100644 index 0000000..59ddb32 --- /dev/null +++ b/addons/markdownlabel/example.tscn @@ -0,0 +1,77 @@ +[gd_scene load_steps=15 format=3 uid="uid://bka0d50qmnb8y"] + +[ext_resource type="Script" path="res://addons/markdownlabel/example.gd" id="1_7b8dd"] +[ext_resource type="Script" path="res://addons/markdownlabel/markdownlabel.gd" id="2_opcio"] +[ext_resource type="Script" path="res://addons/markdownlabel/header_formats/h1_format.gd" id="3_kbjha"] +[ext_resource type="Script" path="res://addons/markdownlabel/header_formats/h2_format.gd" id="4_tqhuu"] +[ext_resource type="Script" path="res://addons/markdownlabel/header_formats/h3_format.gd" id="5_us0p7"] +[ext_resource type="Script" path="res://addons/markdownlabel/header_formats/h4_format.gd" id="6_8ublj"] +[ext_resource type="Script" path="res://addons/markdownlabel/header_formats/h5_format.gd" id="7_42de6"] +[ext_resource type="Script" path="res://addons/markdownlabel/header_formats/h6_format.gd" id="8_y8fds"] + +[sub_resource type="Resource" id="Resource_r7ev3"] +script = ExtResource("3_kbjha") +font_size = 2.285 +is_bold = false +is_italic = false +is_underlined = false + +[sub_resource type="Resource" id="Resource_qh6ic"] +script = ExtResource("4_tqhuu") +font_size = 1.714 +is_bold = false +is_italic = false +is_underlined = false + +[sub_resource type="Resource" id="Resource_qx73p"] +script = ExtResource("5_us0p7") +font_size = 1.428 +is_bold = false +is_italic = false +is_underlined = false + +[sub_resource type="Resource" id="Resource_yx0wh"] +script = ExtResource("6_8ublj") +font_size = 1.142 +is_bold = false +is_italic = false +is_underlined = false + +[sub_resource type="Resource" id="Resource_1ovcl"] +script = ExtResource("7_42de6") +font_size = 1.0 +is_bold = false +is_italic = false +is_underlined = false + +[sub_resource type="Resource" id="Resource_fj0e0"] +script = ExtResource("8_y8fds") +font_size = 0.857 +is_bold = false +is_italic = false +is_underlined = false + +[node name="Example" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_7b8dd") + +[node name="MarkdownLabel" type="RichTextLabel" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +bbcode_enabled = true +script = ExtResource("2_opcio") +h1 = SubResource("Resource_r7ev3") +h2 = SubResource("Resource_qh6ic") +h3 = SubResource("Resource_qx73p") +h4 = SubResource("Resource_yx0wh") +h5 = SubResource("Resource_1ovcl") +h6 = SubResource("Resource_fj0e0") diff --git a/addons/markdownlabel/header_formats/h1_format.gd b/addons/markdownlabel/header_formats/h1_format.gd new file mode 100644 index 0000000..ce71271 --- /dev/null +++ b/addons/markdownlabel/header_formats/h1_format.gd @@ -0,0 +1,32 @@ +class_name H1Format +extends Resource + +## Relative font size of this header level (will be multiplied by [code]normal_font_size[/code]) +@export var font_size: float = 2.285 : set = _set_font_size +## Whether this header level is drawn as bold or not +@export var is_bold := false : set = _set_is_bold +## Whether this header level is drawn as italics or not +@export var is_italic := false : set = _set_is_italic +## Whether this header level is underlined or not +@export var is_underlined := false : set = _set_is_underlined + +signal _updated + +func _init() -> void: + resource_local_to_scene = true + +func _set_font_size(new_font_size: float) -> void: + font_size = new_font_size + _updated.emit() + +func _set_is_bold(new_is_bold: bool) -> void: + is_bold = new_is_bold + _updated.emit() + +func _set_is_italic(new_is_italic: bool) -> void: + is_italic = new_is_italic + _updated.emit() + +func _set_is_underlined(new_is_underlined: bool) -> void: + is_underlined = new_is_underlined + _updated.emit() diff --git a/addons/markdownlabel/header_formats/h2_format.gd b/addons/markdownlabel/header_formats/h2_format.gd new file mode 100644 index 0000000..eb18a80 --- /dev/null +++ b/addons/markdownlabel/header_formats/h2_format.gd @@ -0,0 +1,32 @@ +class_name H2Format +extends Resource + +## Relative font size of this header level (will be multiplied by [code]normal_font_size[/code]) +@export var font_size: float = 1.714 : set = _set_font_size +## Whether this header level is drawn as bold or not +@export var is_bold := false : set = _set_is_bold +## Whether this header level is drawn as italics or not +@export var is_italic := false : set = _set_is_italic +## Whether this header level is underlined or not +@export var is_underlined := false : set = _set_is_underlined + +signal _updated + +func _init() -> void: + resource_local_to_scene = true + +func _set_font_size(new_font_size: float) -> void: + font_size = new_font_size + _updated.emit() + +func _set_is_bold(new_is_bold: bool) -> void: + is_bold = new_is_bold + _updated.emit() + +func _set_is_italic(new_is_italic: bool) -> void: + is_italic = new_is_italic + _updated.emit() + +func _set_is_underlined(new_is_underlined: bool) -> void: + is_underlined = new_is_underlined + _updated.emit() diff --git a/addons/markdownlabel/header_formats/h3_format.gd b/addons/markdownlabel/header_formats/h3_format.gd new file mode 100644 index 0000000..21a2f79 --- /dev/null +++ b/addons/markdownlabel/header_formats/h3_format.gd @@ -0,0 +1,32 @@ +class_name H3Format +extends Resource + +## Relative font size of this header level (will be multiplied by [code]normal_font_size[/code]) +@export var font_size: float = 1.428 : set = _set_font_size +## Whether this header level is drawn as bold or not +@export var is_bold := false : set = _set_is_bold +## Whether this header level is drawn as italics or not +@export var is_italic := false : set = _set_is_italic +## Whether this header level is underlined or not +@export var is_underlined := false : set = _set_is_underlined + +signal _updated + +func _init() -> void: + resource_local_to_scene = true + +func _set_font_size(new_font_size: float) -> void: + font_size = new_font_size + _updated.emit() + +func _set_is_bold(new_is_bold: bool) -> void: + is_bold = new_is_bold + _updated.emit() + +func _set_is_italic(new_is_italic: bool) -> void: + is_italic = new_is_italic + _updated.emit() + +func _set_is_underlined(new_is_underlined: bool) -> void: + is_underlined = new_is_underlined + _updated.emit() diff --git a/addons/markdownlabel/header_formats/h4_format.gd b/addons/markdownlabel/header_formats/h4_format.gd new file mode 100644 index 0000000..87d04e1 --- /dev/null +++ b/addons/markdownlabel/header_formats/h4_format.gd @@ -0,0 +1,32 @@ +class_name H4Format +extends Resource + +## Relative font size of this header level (will be multiplied by [code]normal_font_size[/code]) +@export var font_size: float = 1.142 : set = _set_font_size +## Whether this header level is drawn as bold or not +@export var is_bold := false : set = _set_is_bold +## Whether this header level is drawn as italics or not +@export var is_italic := false : set = _set_is_italic +## Whether this header level is underlined or not +@export var is_underlined := false : set = _set_is_underlined + +signal _updated + +func _init() -> void: + resource_local_to_scene = true + +func _set_font_size(new_font_size: float) -> void: + font_size = new_font_size + _updated.emit() + +func _set_is_bold(new_is_bold: bool) -> void: + is_bold = new_is_bold + _updated.emit() + +func _set_is_italic(new_is_italic: bool) -> void: + is_italic = new_is_italic + _updated.emit() + +func _set_is_underlined(new_is_underlined: bool) -> void: + is_underlined = new_is_underlined + _updated.emit() diff --git a/addons/markdownlabel/header_formats/h5_format.gd b/addons/markdownlabel/header_formats/h5_format.gd new file mode 100644 index 0000000..02ffac3 --- /dev/null +++ b/addons/markdownlabel/header_formats/h5_format.gd @@ -0,0 +1,32 @@ +class_name H5Format +extends Resource + +## Relative font size of this header level (will be multiplied by [code]normal_font_size[/code]) +@export var font_size: float = 1 : set = _set_font_size +## Whether this header level is drawn as bold or not +@export var is_bold := false : set = _set_is_bold +## Whether this header level is drawn as italics or not +@export var is_italic := false : set = _set_is_italic +## Whether this header level is underlined or not +@export var is_underlined := false : set = _set_is_underlined + +signal _updated + +func _init() -> void: + resource_local_to_scene = true + +func _set_font_size(new_font_size: float) -> void: + font_size = new_font_size + _updated.emit() + +func _set_is_bold(new_is_bold: bool) -> void: + is_bold = new_is_bold + _updated.emit() + +func _set_is_italic(new_is_italic: bool) -> void: + is_italic = new_is_italic + _updated.emit() + +func _set_is_underlined(new_is_underlined: bool) -> void: + is_underlined = new_is_underlined + _updated.emit() diff --git a/addons/markdownlabel/header_formats/h6_format.gd b/addons/markdownlabel/header_formats/h6_format.gd new file mode 100644 index 0000000..8c86da4 --- /dev/null +++ b/addons/markdownlabel/header_formats/h6_format.gd @@ -0,0 +1,32 @@ +class_name H6Format +extends Resource + +## Relative font size of this header level (will be multiplied by [code]normal_font_size[/code]) +@export var font_size: float = 0.857 : set = _set_font_size +## Whether this header level is drawn as bold or not +@export var is_bold := false : set = _set_is_bold +## Whether this header level is drawn as italics or not +@export var is_italic := false : set = _set_is_italic +## Whether this header level is underlined or not +@export var is_underlined := false : set = _set_is_underlined + +signal _updated + +func _init() -> void: + resource_local_to_scene = true + +func _set_font_size(new_font_size: float) -> void: + font_size = new_font_size + _updated.emit() + +func _set_is_bold(new_is_bold: bool) -> void: + is_bold = new_is_bold + _updated.emit() + +func _set_is_italic(new_is_italic: bool) -> void: + is_italic = new_is_italic + _updated.emit() + +func _set_is_underlined(new_is_underlined: bool) -> void: + is_underlined = new_is_underlined + _updated.emit() diff --git a/addons/markdownlabel/icon.svg b/addons/markdownlabel/icon.svg new file mode 100644 index 0000000..4276055 --- /dev/null +++ b/addons/markdownlabel/icon.svg @@ -0,0 +1,36 @@ + + diff --git a/addons/markdownlabel/markdownlabel.gd b/addons/markdownlabel/markdownlabel.gd new file mode 100644 index 0000000..ca88cfa --- /dev/null +++ b/addons/markdownlabel/markdownlabel.gd @@ -0,0 +1,599 @@ +@tool +class_name MarkdownLabel +extends RichTextLabel +## A control for displaying Markdown-style text. +## +## A custom node that extends [RichTextLabel] to use Markdown instead of BBCode. +## [br][br] +## [b][u]Usage:[/u][/b] +## Simply add a MarkdownLabel to the scene and write its [member markdown_text] field in Markdown format. +## [br][br] +## On its [RichTextLabel] properties: [member RichTextLabel.bbcode_enabled] property must be enabled. Do not touch the [member RichTextLabel.text] property, since it's used by MarkdownLabel to properly format its text. You can use the rest of its properties as normal. +## [br][br] +## You can still use BBCode tags that don't have a Markdown equivalent, such as `[u]underlined text[/u]`, allowing you to have the full functionality of RichTextLabel with the simplicity and readibility of Markdown. +## [br][br] +## Check out the full guide in the Github repo readme file (linked below). If encountering any unreported bug or unexpected bahaviour, please ensure that your Markdown is written as clean as possible, following best practices. +## +## @tutorial(Github repository): https://github.com/daenvil/MarkdownLabel + +const _ESCAPE_PLACEHOLDER := ";$\uFFFD:%s$;" +const _ESCAPEABLE_CHARACTERS := "\\*_~`[]()\"<>#-+.!" +const _ESCAPEABLE_CHARACTERS_REGEX := "[\\\\\\*\\_\\~`\\[\\]\\(\\)\\\"\\<\\>#\\-\\+\\.\\!]" + +# Public: +## The text to be displayed in Markdown format. +@export_multiline var markdown_text: String : set = _set_markdown_text + +@export_group("Header formats") +## Formatting options for level-1 headers +@export var h1 := H1Format.new() : set = _set_h1_format +## Formatting options for level-2 headers +@export var h2 := H2Format.new() : set = _set_h2_format +## Formatting options for level-3 headers +@export var h3 := H3Format.new() : set = _set_h3_format +## Formatting options for level-4 headers +@export var h4 := H4Format.new() : set = _set_h4_format +## Formatting options for level-5 headers +@export var h5 := H5Format.new() : set = _set_h5_format +## Formatting options for level-6 headers +@export var h6 := H6Format.new() : set = _set_h6_format + +# Private: +var _converted_text: String +var _indent_level: int +var _escaped_characters_map := {} +var _within_table := false +var _table_row := -1 +var _line_break := true +var _debug_mode := false + +# Built-in methods: +func _init(markdown_text: String = "") -> void: + bbcode_enabled = true + self.markdown_text = markdown_text + +func _ready() -> void: + h1.connect("_updated",_update) + h1.connect("changed",_update) + h2.connect("_updated",_update) + h2.connect("changed",_update) + h3.connect("_updated",_update) + h3.connect("changed",_update) + h4.connect("_updated",_update) + h4.connect("changed",_update) + h5.connect("_updated",_update) + h5.connect("changed",_update) + h6.connect("_updated",_update) + h6.connect("changed",_update) + if Engine.is_editor_hint(): + bbcode_enabled = true + #else: + #pass + +# Should hide properties in the editor, not working for some reason: +#func _validate_property(property: Dictionary): +# print(property.name) +# if property.name in ["bbcode_enabled", "text"]: +# property.usage = PROPERTY_USAGE_NO_EDITOR + +# Public methods: +## Reads the specified file and displays it as markdown. +func display_file(file_path: String): + markdown_text = FileAccess.get_file_as_string(file_path) + +#Private methods: +func _update() -> void: + text = _convert_markdown(markdown_text) + queue_redraw() + +func _set_markdown_text(new_text: String): + markdown_text = new_text + _update() + +func _set_h1_format(new_format: H1Format): + h1 = new_format + _update() + +func _set_h2_format(new_format: H2Format): + h2 = new_format + _update() + +func _set_h3_format(new_format: H3Format): + h3 = new_format + _update() + +func _set_h4_format(new_format: H4Format): + h4 = new_format + _update() + +func _set_h5_format(new_format: H5Format): + h5 = new_format + _update() + +func _set_h6_format(new_format: H6Format): + h6 = new_format + _update() + +func _convert_markdown(source_text = "") -> String: + if not bbcode_enabled: + push_warning("WARNING: MarkdownLabel node will not format Markdown syntax if it doesn't have 'bbcode_enabled=true'") + return source_text + _converted_text = "" + var regex = RegEx.new() + + var lines = source_text.split("\n") + _indent_level = -1 + var indent_spaces := [] + var indent_types := [] + var iline := 0 + var within_backtick_block := false + var within_tilde_block := false + var within_code_block := false + var current_code_block_char_count: int + _within_table = false + _table_row = -1 + _line_break = true + + for line in lines: + line = line.trim_suffix("\r") + _debug("Parsing line: '%s'"%line) + within_code_block = within_tilde_block or within_backtick_block + if iline > 0 and _line_break: + _converted_text += "\n" + _line_break = true + iline+=1 + if not within_tilde_block and _denotes_fenced_code_block(line,"`"): + if within_backtick_block: + if line.strip_edges().length() >= current_code_block_char_count: + _converted_text = _converted_text.trim_suffix("\n") + _converted_text += "[/code]" + within_backtick_block = false + _debug("... closing backtick block") + continue + else: + _converted_text += "[code]" + within_backtick_block = true + current_code_block_char_count = line.strip_edges().length() + _debug("... opening backtick block") + continue + elif not within_backtick_block and _denotes_fenced_code_block(line,"~"): + if within_tilde_block: + if line.strip_edges().length() >= current_code_block_char_count: + _converted_text = _converted_text.trim_suffix("\n") + _converted_text += "[/code]" + within_tilde_block = false + _debug("... closing tilde block") + continue + else: + _converted_text += "[code]" + within_tilde_block = true + current_code_block_char_count = line.strip_edges().length() + _debug("... opening tilde block") + continue + if within_code_block: #ignore any formatting inside code block + _converted_text += _escape_bbcode(line) + continue + + var _processed_line = line + + # Escape characters: + regex.compile("\\\\"+_ESCAPEABLE_CHARACTERS_REGEX) + while true: + var result := regex.search(_processed_line) + if not result: + break + var _start := result.get_start() + var _escaped_char := result.get_string()[1] + if not _escaped_char in _escaped_characters_map: + _escaped_characters_map[_escaped_char] = _escaped_characters_map.size() + _processed_line = _processed_line.erase(_start,2).insert(_start,_ESCAPE_PLACEHOLDER % _escaped_characters_map[_escaped_char]) + + # Tables: + _processed_line = _process_table_syntax(_processed_line) + + # Lists: + _processed_line = _process_list_syntax(_processed_line,indent_spaces,indent_types) + + # In-line code + regex.compile("(`+)(.+?)\\1") + while true: + var result = regex.search(_processed_line) + if result: + var _start = result.get_start() + var _end = result.get_end() + var unescaped_content := _reset_escaped_chars(result.get_string(2),true) + unescaped_content = _escape_bbcode(unescaped_content) + unescaped_content = _escape_chars(unescaped_content) + _processed_line = _processed_line.erase(_start,_end-_start).insert(_start,"[code]%s[/code]"%unescaped_content) + _debug("... in-line code: "+unescaped_content) + else: + break + + # Images + var img_pattern := "\\!\\[(.*?)\\]\\((.*?)\\)" + while true: + regex.compile(img_pattern) + var result = regex.search(_processed_line) + var found_proper_match := false + if result: + var _start = result.get_start() + var _end = result.get_end() + regex.compile("\\[(.*?)\\]") + var texts = regex.search_all(result.get_string()) + for _text in texts: + if result.get_string()[_text.get_end()] != "(": + continue + found_proper_match = true + # Check if link has a title: + regex.compile("\\\"(.*?)\\\"") + var title_result = regex.search(result.get_string(2)) + var title: String + var url := result.get_string(2) + if title_result: + title = title_result.get_string(1) + url = url.rstrip(" ").trim_suffix(title_result.get_string()).rstrip(" ") + url = _escape_chars(url) + _processed_line = _processed_line.erase(_start,_end-_start).insert(_start,"[img]%s[/img]" % url) + if title_result and title: + _processed_line = _processed_line.insert(_start+12+url.length()+_text.get_string(1).length(),"[/hint]").insert(_start,"[hint=%s]"%title) + _debug("... hyperlink: "+result.get_string()) + break + if not found_proper_match: + break + + # Links + var link_pattern := "\\[(.*?)\\]\\((.*?)\\)" + while true: + regex.compile(link_pattern) + var result = regex.search(_processed_line) + var found_proper_match := false + if result: + var _start = result.get_start() + var _end = result.get_end() + regex.compile("\\[(.*?)\\]") + var texts = regex.search_all(result.get_string()) + for _text in texts: + if result.get_string()[_text.get_end()] != "(": + continue + found_proper_match = true + # Check if link has a title: + regex.compile("\\\"(.*?)\\\"") + var title_result = regex.search(result.get_string(2)) + var title: String + var url := result.get_string(2) + if title_result: + title = title_result.get_string(1) + url = url.rstrip(" ").trim_suffix(title_result.get_string()).rstrip(" ") + url = _escape_chars(url) + _processed_line = _processed_line.erase(_start+_text.get_start(),_end-_start-_text.get_start()).insert(_start+_text.get_start(),"[url=%s]%s[/url]" % [url,_text.get_string(1)]) + if title_result and title: + _processed_line = _processed_line.insert(_start+_text.get_start()+12+url.length()+_text.get_string(1).length(),"[/hint]").insert(_start+_text.get_start(),"[hint=%s]"%title) + _debug("... hyperlink: "+result.get_string()) + break + if not found_proper_match: + break + + while true: + regex.compile("\\<(.*?)\\>") + var result = regex.search(_processed_line) + if result: + var _start = result.get_start() + var _end = result.get_end() + var url = result.get_string(1) + regex.compile("^\\s*?([^\\s]+\\@[^\\s]+\\.[^\\s]+)\\s*?$") + var mail = regex.search(result.get_string(1)) + if mail: + url = mail.get_string(1) + url = _escape_chars(url) + if mail: + _processed_line = _processed_line.erase(_start,_end-_start).insert(_start,"[url=mailto:%s]%s[/url]"%[url,url]) + _debug("... mail link: "+result.get_string()) + else: + _processed_line = _processed_line.erase(_start,_end-_start).insert(_start,"[url]%s[/url]"%url) + _debug("... explicit link: "+result.get_string()) + + else: + break + + # Bold text + regex.compile("(\\*\\*|\\_\\_)(.+?)\\1") + while true: + var result = regex.search(_processed_line) + if not result: + break + var _start = result.get_start() + var _end = result.get_end() + _processed_line = _processed_line.erase(_start,2).insert(_start,"[b]") + _processed_line = _processed_line.erase(_end-1,2).insert(_end-1,"[/b]") + _debug("... bold text: "+result.get_string(2)) + + # Italic text + while true: + regex.compile("(\\*|_)(.+?)\\1") + var result = regex.search(_processed_line) + if not result: + break + var _start = result.get_start() + var _end = result.get_end() + # Sanitize nested bold+italics (Godot-specific, b and i tags must not be intertwined): + var result_string := result.get_string(2) + var open_b := false + var close_b := false + if result_string.begins_with("[b]") and result_string.find("[/b]")==-1: + open_b = true + elif result_string.ends_with("[/b]") and result_string.find("[b]")==-1: + close_b = true + if open_b: + _processed_line = _processed_line.erase(_start,4).insert(_start,"[b][i]") + _processed_line = _processed_line.erase(_end-2,1).insert(_end-2,"[/i]") + elif close_b: + _processed_line = _processed_line.erase(_start,1).insert(_start,"[i]") + _processed_line = _processed_line.erase(_end-3,5).insert(_end-3,"[/i][/b]") + else: + _processed_line = _processed_line.erase(_start,1).insert(_start,"[i]") + _processed_line = _processed_line.erase(_end+1,1).insert(_end+1,"[/i]") + + _debug("... italic text: "+result.get_string(2)) + + # Strike-through text + regex.compile("(\\~\\~)(.+?)\\1") + while true: + var result = regex.search(_processed_line) + if result: + #_debug(result.get_string()) + var _start = result.get_start() + _processed_line = _processed_line.erase(_start,2).insert(_start,"[s]") + var _end = result.get_end() + _processed_line = _processed_line.erase(_end-1,2).insert(_end-1,"[/s]") + _debug("... strike-through text: "+result.get_string(2)) + else: + break + + # Headers + regex.compile("^#+\\s*[^\\s].*") + while true: + var result = regex.search(_processed_line) + if result: + var n := 0 + for _char in result.get_string(): + if _char!="#" or n==6: + break + n+=1 + var n_spaces := 0 + for _char in result.get_string().substr(n): + if _char!=" ": + break + n_spaces+=1 + var header_format: Resource = _get_header_format(n) + var n_digits := str(header_format.font_size).length() + var _start := result.get_start() + var opening_tags := _get_header_tags(header_format) + _processed_line = _processed_line.erase(_start,n+n_spaces).insert(_start,opening_tags) + var _end := result.get_end() + _processed_line = _processed_line.insert(_end-(n+n_spaces)+opening_tags.length(),_get_header_tags(header_format,true)) + _debug("... header level %d"%n) + else: + break + + # Re-insert escaped characters: + _processed_line = _reset_escaped_chars(_processed_line) + + _converted_text += _processed_line + # end for line loop + # Close any remaining open list: + _debug("... end of text, closing all opened lists") + for i in range(_indent_level,-1,-1): + _converted_text += "[/%s]"%indent_types[i] + # Close any remaining open tables: + _debug("... end of text, closing all opened tables") + if _within_table: + _converted_text += "\n[/table]" + + _debug("** ORIGINAL:") + _debug(source_text) + _debug(_converted_text) + return _converted_text + + +func _process_list_syntax(line: String, indent_spaces: Array, indent_types: Array) -> String: + var processed_line := "" + if line.length() == 0 and _indent_level >= 0: + for i in range(_indent_level,-1,-1): + _converted_text += "[/%s]" % indent_types[_indent_level] + _indent_level-=1 + indent_spaces.pop_back() + indent_types.pop_back() + _converted_text += "\n" + _debug("... empty line, closing all list tags") + return "" + if _indent_level == -1: + if line.length() > 2 and line[0] in "-*+" and line[1]==" ": + _indent_level = 0 + indent_spaces.append(0) + indent_types.append("ul") + _converted_text += "[ul]" + processed_line = line.substr(2) + _debug("... opening unordered list at level 0") + elif line.length() > 3 and line[0] == "1" and line[1]=="." and line[2]==" ": + _indent_level = 0 + indent_spaces.append(0) + indent_types.append("ol") + _converted_text += "[ol]" + processed_line = line.substr(3) + _debug("... opening ordered list at level 0") + else: + processed_line = line + return processed_line + var n_s := 0 + for _char in line: + if _char == " " or _char == "\t": + n_s += 1 + continue + elif _char in "-*+": + if line.length() > n_s+2 and line[n_s+1] == " ": + if n_s == indent_spaces[_indent_level]: + processed_line = line.substr(n_s+2) + _debug("... adding list element at level %d"%_indent_level) + break + elif n_s > indent_spaces[_indent_level]: + _indent_level += 1 + indent_spaces.append(n_s) + indent_types.append("ul") + _converted_text += "[ul]" + processed_line = line.substr(n_s+2) + _debug("... opening list at level %d and adding element"%_indent_level) + break + else: + for i in range(_indent_level,-1,-1): + if n_s < indent_spaces[i]: + _converted_text += "[/%s]"%indent_types[_indent_level] + _indent_level -= 1 + indent_spaces.pop_back() + indent_types.pop_back() + else: + break + _converted_text += "\n" + processed_line = line.substr(n_s+2) + _debug("...closing lists down to level %d and adding element"%_indent_level) + break + elif _char in "123456789": + if line.length() > n_s+3 and line[n_s+1] == "." and line[n_s+2] == " ": + if n_s == indent_spaces[_indent_level]: + processed_line = line.substr(n_s+3) + _debug("... adding list element at level %d"%_indent_level) + break + elif n_s > indent_spaces[_indent_level]: + _indent_level += 1 + indent_spaces.append(n_s) + indent_types.append("ol") + _converted_text += "[ol]" + processed_line = line.substr(n_s+3) + _debug("... opening list at level %d and adding element"%_indent_level) + break + else: + for i in range(_indent_level,-1,-1): + if n_s < indent_spaces[i]: + _converted_text += "[/%s]"%indent_types[_indent_level] + _indent_level -= 1 + indent_spaces.pop_back() + indent_types.pop_back() + else: + break + _converted_text += "\n" + processed_line = line.substr(n_s+3) + _debug("...closing lists down to level %d and adding element"%_indent_level) + break + #end for _char loop + if processed_line.is_empty(): + for i in range(_indent_level,-1,-1): + _converted_text += "[/%s]"%indent_types[i] + _indent_level -= 1 + indent_spaces.pop_back() + indent_types.pop_back() + _converted_text += "\n" + processed_line = line + _debug("... regular line, closing all opened lists") + return processed_line + +func _escape_bbcode(source: String) -> String: + return source.replacen("[",_ESCAPE_PLACEHOLDER).replacen("]","[rb]").replacen(_ESCAPE_PLACEHOLDER,"[lb]") + +func _escape_chars(_text: String) -> String: + var escaped_text = _text + for _char in _ESCAPEABLE_CHARACTERS: + if not _char in _escaped_characters_map: + _escaped_characters_map[_char] = _escaped_characters_map.size() + escaped_text = escaped_text.replacen(_char,_ESCAPE_PLACEHOLDER % _escaped_characters_map[_char]) + return escaped_text + +func _reset_escaped_chars(_text: String,code:=false) -> String: + var unescaped_text := _text + for _char in _ESCAPEABLE_CHARACTERS: + if not _char in _escaped_characters_map: + continue + unescaped_text = unescaped_text.replacen(_ESCAPE_PLACEHOLDER%_escaped_characters_map[_char],"\\"+_char if code else _char) + return unescaped_text + +func _debug(string: String): + if not _debug_mode: + return + print(string) + +func _denotes_fenced_code_block(line: String, character: String) -> bool: + var stripped_line := line.strip_edges() + var count := stripped_line.count(character) + if count >= 3 and count==stripped_line.length(): + return true + else: + return false + +func _process_table_syntax(line: String) -> String: + if line.count("|") < 2: + if _within_table: + _debug ("... end of table") + _within_table = false + return "\n[/table]\n"+line + else: + return line + _debug("... table row: "+line) + _table_row += 1 + var split_line := line.trim_prefix("|").trim_suffix("|").split("|") + var processed_line := "" + if not _within_table: + processed_line += "[table=%d]\n" % split_line.size() + _within_table = true + elif _table_row == 1: + # Handle delimiter row + var is_delimiter := true + for cell in split_line: + var stripped_cell := cell.strip_edges() + if stripped_cell.count("-")+stripped_cell.count(":") != stripped_cell.length(): + is_delimiter = false + break + if is_delimiter: + _line_break = false + return "" + for cell in split_line: + processed_line += "[cell]%s[/cell]" % cell.strip_edges() + return processed_line + +func _get_header_format(level: int) -> Resource: + match level: + 1: + return h1 + 2: + return h2 + 3: + return h3 + 4: + return h4 + 5: + return h5 + 6: + return h6 + push_warning("Invalid header level: "+str(level)) + return null + +func _get_header_tags(header_format: Resource, closing := false) -> String: + if not header_format: + return "" + var tags: String = "" + if closing: + if header_format.is_underlined: + tags += "[/u]" + if header_format.is_italic: + tags += "[/i]" + if header_format.is_bold: + tags += "[/b]" + if header_format.font_size: + tags += "[/font_size]" + else: + if header_format.font_size: + tags += "[font_size=%d]" % int(header_format.font_size * self.get_theme_font_size("normal_font_size")) + if header_format.is_bold: + tags += "[b]" + if header_format.is_italic: + tags += "[i]" + if header_format.is_underlined: + tags += "[u]" + return tags diff --git a/addons/markdownlabel/plugin.cfg b/addons/markdownlabel/plugin.cfg new file mode 100644 index 0000000..77a744c --- /dev/null +++ b/addons/markdownlabel/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="MarkdownLabel" +description="A custom node that extends RichTextLabel to use Markdown instead of BBCode." +author="Daenvil" +version="0.9.0" +script="plugin.gd" diff --git a/addons/markdownlabel/plugin.gd b/addons/markdownlabel/plugin.gd new file mode 100644 index 0000000..9889a03 --- /dev/null +++ b/addons/markdownlabel/plugin.gd @@ -0,0 +1,11 @@ +@tool +extends EditorPlugin + +func _enter_tree(): + # Initialization of the plugin goes here. + # Add the new type with a name, a parent type, a script and an icon. + add_custom_type("MarkdownLabel", "RichTextLabel", preload("markdownlabel.gd"), preload("icon.svg")) + + +func _exit_tree(): + remove_custom_type("MarkdownLabel") diff --git a/addons/phantom_camera/examples/credits.txt b/addons/phantom_camera/examples/credits.txt new file mode 100644 index 0000000..d5e949a --- /dev/null +++ b/addons/phantom_camera/examples/credits.txt @@ -0,0 +1,7 @@ +##################### +EXAMPLE ASSET CREDITS +##################### + +# level_spritesheet +https://opengameart.org/content/a-platformer-in-the-forest +https://opengameart.org/users/buch diff --git a/addons/phantom_camera/examples/example_scenes/2D/2DExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2DExampleScene.tscn new file mode 100644 index 0000000..599dbab --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/2D/2DExampleScene.tscn @@ -0,0 +1,756 @@ +[gd_scene load_steps=17 format=3 uid="uid://drvexsp2t0nfy"] + +[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_1utlo"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_eayfa"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2D.gd" id="2_mgsut"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/PlayerCharacterBody2D.gd" id="4_jnuod"] +[ext_resource type="Texture2D" uid="uid://cwep0on2tthn7" path="res://addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png" id="6_e46ea"] +[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera2DTween.tres" id="6_gqov5"] +[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/UISign.tscn" id="6_kqt1v"] +[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/UIInventory.tscn" id="7_fdx1s"] +[ext_resource type="Resource" uid="uid://cecrnq0wnkexh" path="res://addons/phantom_camera/examples/resources/tween/ItemFocusPhantomCamera2DTween.tres" id="10_0txyn"] +[ext_resource type="Resource" uid="uid://cllveybboaqk5" path="res://addons/phantom_camera/examples/resources/tween/InventoryPhantomCamera2DTween.tres" id="11_xakux"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="12_k4p0h"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +texture = ExtResource("1_1utlo") +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_1/angular_velocity = 0.0 +1:0/0 = 0 +1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:0/0/physics_layer_0/angular_velocity = 0.0 +1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +1:0/0/physics_layer_1/angular_velocity = 0.0 +2:0/0 = 0 +2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:0/0/physics_layer_0/angular_velocity = 0.0 +2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:0/0/physics_layer_1/angular_velocity = 0.0 +3:0/0 = 0 +3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:0/0/physics_layer_0/angular_velocity = 0.0 +3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:0/0/physics_layer_1/angular_velocity = 0.0 +4:0/0 = 0 +4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:0/0/physics_layer_0/angular_velocity = 0.0 +4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:0/0/physics_layer_1/angular_velocity = 0.0 +5:0/0 = 0 +5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:0/0/physics_layer_0/angular_velocity = 0.0 +5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:0/0/physics_layer_1/angular_velocity = 0.0 +6:0/0 = 0 +6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +6:0/0/physics_layer_0/angular_velocity = 0.0 +6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +6:0/0/physics_layer_1/angular_velocity = 0.0 +7:0/0 = 0 +7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:0/0/physics_layer_0/angular_velocity = 0.0 +7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:0/0/physics_layer_1/angular_velocity = 0.0 +0:1/0 = 0 +0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:1/0/physics_layer_0/angular_velocity = 0.0 +0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +0:1/0/physics_layer_1/angular_velocity = 0.0 +1:1/0 = 0 +1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:1/0/physics_layer_0/angular_velocity = 0.0 +1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +1:1/0/physics_layer_1/angular_velocity = 0.0 +2:1/0 = 0 +2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:1/0/physics_layer_0/angular_velocity = 0.0 +2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:1/0/physics_layer_1/angular_velocity = 0.0 +3:1/0 = 0 +3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:1/0/physics_layer_0/angular_velocity = 0.0 +3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:1/0/physics_layer_1/angular_velocity = 0.0 +4:1/0 = 0 +4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:1/0/physics_layer_0/angular_velocity = 0.0 +4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:1/0/physics_layer_1/angular_velocity = 0.0 +5:1/0 = 0 +5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:1/0/physics_layer_0/angular_velocity = 0.0 +5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:1/0/physics_layer_1/angular_velocity = 0.0 +7:1/0 = 0 +7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:1/0/physics_layer_0/angular_velocity = 0.0 +7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:1/0/physics_layer_1/angular_velocity = 0.0 +2:2/0 = 0 +2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:2/0/physics_layer_0/angular_velocity = 0.0 +2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:2/0/physics_layer_1/angular_velocity = 0.0 +3:2/0 = 0 +3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:2/0/physics_layer_0/angular_velocity = 0.0 +3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:2/0/physics_layer_1/angular_velocity = 0.0 +4:2/0 = 0 +4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:2/0/physics_layer_0/angular_velocity = 0.0 +4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:2/0/physics_layer_1/angular_velocity = 0.0 +7:2/0 = 0 +7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:2/0/physics_layer_0/angular_velocity = 0.0 +7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:2/0/physics_layer_1/angular_velocity = 0.0 +3:3/0 = 0 +3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:3/0/physics_layer_0/angular_velocity = 0.0 +3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:3/0/physics_layer_1/angular_velocity = 0.0 +4:3/0 = 0 +4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:3/0/physics_layer_0/angular_velocity = 0.0 +4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:3/0/physics_layer_1/angular_velocity = 0.0 +5:3/0 = 0 +5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:3/0/physics_layer_0/angular_velocity = 0.0 +5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:3/0/physics_layer_1/angular_velocity = 0.0 +7:3/0 = 0 +7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:3/0/physics_layer_0/angular_velocity = 0.0 +7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:3/0/physics_layer_1/angular_velocity = 0.0 +3:4/0 = 0 +3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:4/0/physics_layer_0/angular_velocity = 0.0 +3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:4/0/physics_layer_1/angular_velocity = 0.0 +4:4/0 = 0 +4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:4/0/physics_layer_0/angular_velocity = 0.0 +4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:4/0/physics_layer_1/angular_velocity = 0.0 +5:4/0 = 0 +5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:4/0/physics_layer_0/angular_velocity = 0.0 +5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:4/0/physics_layer_1/angular_velocity = 0.0 +7:4/0 = 0 +7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:4/0/physics_layer_0/angular_velocity = 0.0 +7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:4/0/physics_layer_1/angular_velocity = 0.0 +3:5/0 = 0 +3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:5/0/physics_layer_0/angular_velocity = 0.0 +3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:5/0/physics_layer_1/angular_velocity = 0.0 +4:5/0 = 0 +4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:5/0/physics_layer_0/angular_velocity = 0.0 +4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:5/0/physics_layer_1/angular_velocity = 0.0 +7:5/0 = 0 +7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:5/0/physics_layer_0/angular_velocity = 0.0 +7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:5/0/physics_layer_1/angular_velocity = 0.0 +3:6/0 = 0 +3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:6/0/physics_layer_0/angular_velocity = 0.0 +3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:6/0/physics_layer_1/angular_velocity = 0.0 +4:6/0 = 0 +4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:6/0/physics_layer_0/angular_velocity = 0.0 +4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:6/0/physics_layer_1/angular_velocity = 0.0 +7:6/0 = 0 +7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:6/0/physics_layer_0/angular_velocity = 0.0 +7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:6/0/physics_layer_1/angular_velocity = 0.0 +2:7/0 = 0 +2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:7/0/physics_layer_0/angular_velocity = 0.0 +2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:7/0/physics_layer_1/angular_velocity = 0.0 +3:7/0 = 0 +3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:7/0/physics_layer_0/angular_velocity = 0.0 +3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:7/0/physics_layer_1/angular_velocity = 0.0 +4:7/0 = 0 +4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:7/0/physics_layer_0/angular_velocity = 0.0 +4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:7/0/physics_layer_1/angular_velocity = 0.0 +5:7/0 = 0 +5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:7/0/physics_layer_0/angular_velocity = 0.0 +5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:7/0/physics_layer_1/angular_velocity = 0.0 +8:0/0 = 0 +8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:0/0/physics_layer_0/angular_velocity = 0.0 +8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:0/0/physics_layer_1/angular_velocity = 0.0 +9:0/0 = 0 +9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:0/0/physics_layer_0/angular_velocity = 0.0 +9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:0/0/physics_layer_1/angular_velocity = 0.0 +10:0/0 = 0 +10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:0/0/physics_layer_0/angular_velocity = 0.0 +10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:0/0/physics_layer_1/angular_velocity = 0.0 +11:0/0 = 0 +11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:0/0/physics_layer_0/angular_velocity = 0.0 +11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:0/0/physics_layer_1/angular_velocity = 0.0 +12:0/0 = 0 +12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:0/0/physics_layer_0/angular_velocity = 0.0 +12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:0/0/physics_layer_1/angular_velocity = 0.0 +13:0/0 = 0 +13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:0/0/physics_layer_0/angular_velocity = 0.0 +13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:0/0/physics_layer_1/angular_velocity = 0.0 +14:0/0 = 0 +14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:0/0/physics_layer_0/angular_velocity = 0.0 +14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:0/0/physics_layer_1/angular_velocity = 0.0 +14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) +14:0/0/custom_data_0 = &"Sign" +15:0/0 = 0 +15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:0/0/physics_layer_0/angular_velocity = 0.0 +15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:0/0/physics_layer_1/angular_velocity = 0.0 +16:0/0 = 0 +16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:0/0/physics_layer_0/angular_velocity = 0.0 +16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:0/0/physics_layer_1/angular_velocity = 0.0 +8:1/0 = 0 +8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:1/0/physics_layer_0/angular_velocity = 0.0 +8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:1/0/physics_layer_1/angular_velocity = 0.0 +9:1/0 = 0 +9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:1/0/physics_layer_0/angular_velocity = 0.0 +9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:1/0/physics_layer_1/angular_velocity = 0.0 +10:1/0 = 0 +10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:1/0/physics_layer_0/angular_velocity = 0.0 +10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:1/0/physics_layer_1/angular_velocity = 0.0 +11:1/0 = 0 +11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:1/0/physics_layer_0/angular_velocity = 0.0 +11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:1/0/physics_layer_1/angular_velocity = 0.0 +12:1/0 = 0 +12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:1/0/physics_layer_0/angular_velocity = 0.0 +12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:1/0/physics_layer_1/angular_velocity = 0.0 +13:1/0 = 0 +13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:1/0/physics_layer_0/angular_velocity = 0.0 +13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:1/0/physics_layer_1/angular_velocity = 0.0 +14:1/0 = 0 +14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:1/0/physics_layer_0/angular_velocity = 0.0 +14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:1/0/physics_layer_1/angular_velocity = 0.0 +15:1/0 = 0 +15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:1/0/physics_layer_0/angular_velocity = 0.0 +15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:1/0/physics_layer_1/angular_velocity = 0.0 +16:1/0 = 0 +16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:1/0/physics_layer_0/angular_velocity = 0.0 +16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:1/0/physics_layer_1/angular_velocity = 0.0 +8:2/0 = 0 +8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:2/0/physics_layer_0/angular_velocity = 0.0 +8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:2/0/physics_layer_1/angular_velocity = 0.0 +9:2/0 = 0 +9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:2/0/physics_layer_0/angular_velocity = 0.0 +9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:2/0/physics_layer_1/angular_velocity = 0.0 +10:2/0 = 0 +10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:2/0/physics_layer_0/angular_velocity = 0.0 +10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:2/0/physics_layer_1/angular_velocity = 0.0 +11:2/0 = 0 +11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:2/0/physics_layer_0/angular_velocity = 0.0 +11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:2/0/physics_layer_1/angular_velocity = 0.0 +12:2/0 = 0 +12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:2/0/physics_layer_0/angular_velocity = 0.0 +12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:2/0/physics_layer_1/angular_velocity = 0.0 +13:2/0 = 0 +13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:2/0/physics_layer_0/angular_velocity = 0.0 +13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:2/0/physics_layer_1/angular_velocity = 0.0 +14:2/0 = 0 +14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:2/0/physics_layer_0/angular_velocity = 0.0 +14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:2/0/physics_layer_1/angular_velocity = 0.0 +15:2/0 = 0 +15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:2/0/physics_layer_0/angular_velocity = 0.0 +15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:2/0/physics_layer_1/angular_velocity = 0.0 +16:2/0 = 0 +16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:2/0/physics_layer_0/angular_velocity = 0.0 +16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:2/0/physics_layer_1/angular_velocity = 0.0 +8:3/0 = 0 +8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:3/0/physics_layer_0/angular_velocity = 0.0 +8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:3/0/physics_layer_1/angular_velocity = 0.0 +9:3/0 = 0 +9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:3/0/physics_layer_0/angular_velocity = 0.0 +9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:3/0/physics_layer_1/angular_velocity = 0.0 +10:3/0 = 0 +10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:3/0/physics_layer_0/angular_velocity = 0.0 +10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:3/0/physics_layer_1/angular_velocity = 0.0 +11:3/0 = 0 +11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:3/0/physics_layer_0/angular_velocity = 0.0 +11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:3/0/physics_layer_1/angular_velocity = 0.0 +12:3/0 = 0 +12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:3/0/physics_layer_0/angular_velocity = 0.0 +12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:3/0/physics_layer_1/angular_velocity = 0.0 +13:3/0 = 0 +13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:3/0/physics_layer_0/angular_velocity = 0.0 +13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:3/0/physics_layer_1/angular_velocity = 0.0 +14:3/0 = 0 +14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:3/0/physics_layer_0/angular_velocity = 0.0 +14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:3/0/physics_layer_1/angular_velocity = 0.0 +15:3/0 = 0 +15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:3/0/physics_layer_0/angular_velocity = 0.0 +15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:3/0/physics_layer_1/angular_velocity = 0.0 +16:3/0 = 0 +16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:3/0/physics_layer_0/angular_velocity = 0.0 +16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:3/0/physics_layer_1/angular_velocity = 0.0 +8:4/0 = 0 +8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:4/0/physics_layer_0/angular_velocity = 0.0 +8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:4/0/physics_layer_1/angular_velocity = 0.0 +9:4/0 = 0 +9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:4/0/physics_layer_0/angular_velocity = 0.0 +9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:4/0/physics_layer_1/angular_velocity = 0.0 +10:4/0 = 0 +10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:4/0/physics_layer_0/angular_velocity = 0.0 +10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:4/0/physics_layer_1/angular_velocity = 0.0 +11:4/0 = 0 +11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:4/0/physics_layer_0/angular_velocity = 0.0 +11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) +11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:4/0/physics_layer_1/angular_velocity = 0.0 +12:4/0 = 0 +12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:4/0/physics_layer_0/angular_velocity = 0.0 +12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:4/0/physics_layer_1/angular_velocity = 0.0 +13:4/0 = 0 +13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:4/0/physics_layer_0/angular_velocity = 0.0 +13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) +13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:4/0/physics_layer_1/angular_velocity = 0.0 +14:4/0 = 0 +14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:4/0/physics_layer_0/angular_velocity = 0.0 +14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:4/0/physics_layer_1/angular_velocity = 0.0 +14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) +14:4/0/custom_data_0 = &"Inventory" +15:4/0 = 0 +15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:4/0/physics_layer_0/angular_velocity = 0.0 +15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:4/0/physics_layer_1/angular_velocity = 0.0 +16:4/0 = 0 +16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:4/0/physics_layer_0/angular_velocity = 0.0 +16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:4/0/physics_layer_1/angular_velocity = 0.0 +8:5/0 = 0 +8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:5/0/physics_layer_0/angular_velocity = 0.0 +8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:5/0/physics_layer_1/angular_velocity = 0.0 +9:5/0 = 0 +9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:5/0/physics_layer_0/angular_velocity = 0.0 +9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:5/0/physics_layer_1/angular_velocity = 0.0 +10:5/0 = 0 +10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:5/0/physics_layer_0/angular_velocity = 0.0 +10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:5/0/physics_layer_1/angular_velocity = 0.0 +11:5/0 = 0 +11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:5/0/physics_layer_0/angular_velocity = 0.0 +11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:5/0/physics_layer_1/angular_velocity = 0.0 +12:5/0 = 0 +12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:5/0/physics_layer_0/angular_velocity = 0.0 +12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:5/0/physics_layer_1/angular_velocity = 0.0 +13:5/0 = 0 +13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:5/0/physics_layer_0/angular_velocity = 0.0 +13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:5/0/physics_layer_1/angular_velocity = 0.0 +14:5/0 = 0 +14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:5/0/physics_layer_0/angular_velocity = 0.0 +14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:5/0/physics_layer_1/angular_velocity = 0.0 +15:5/0 = 0 +15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:5/0/physics_layer_0/angular_velocity = 0.0 +15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:5/0/physics_layer_1/angular_velocity = 0.0 +16:5/0 = 0 +16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:5/0/physics_layer_0/angular_velocity = 0.0 +16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:5/0/physics_layer_1/angular_velocity = 0.0 +8:6/0 = 0 +8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:6/0/physics_layer_0/angular_velocity = 0.0 +8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:6/0/physics_layer_1/angular_velocity = 0.0 +9:6/0 = 0 +9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:6/0/physics_layer_0/angular_velocity = 0.0 +9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:6/0/physics_layer_1/angular_velocity = 0.0 +10:6/0 = 0 +10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:6/0/physics_layer_0/angular_velocity = 0.0 +10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:6/0/physics_layer_1/angular_velocity = 0.0 +11:6/0 = 0 +11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:6/0/physics_layer_0/angular_velocity = 0.0 +11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) +11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:6/0/physics_layer_1/angular_velocity = 0.0 +12:6/0 = 0 +12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:6/0/physics_layer_0/angular_velocity = 0.0 +12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:6/0/physics_layer_1/angular_velocity = 0.0 +13:6/0 = 0 +13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:6/0/physics_layer_0/angular_velocity = 0.0 +13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) +13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:6/0/physics_layer_1/angular_velocity = 0.0 +14:6/0 = 0 +14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:6/0/physics_layer_0/angular_velocity = 0.0 +14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:6/0/physics_layer_1/angular_velocity = 0.0 +15:6/0 = 0 +15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:6/0/physics_layer_0/angular_velocity = 0.0 +15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:6/0/physics_layer_1/angular_velocity = 0.0 +16:6/0 = 0 +16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:6/0/physics_layer_0/angular_velocity = 0.0 +16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:6/0/physics_layer_1/angular_velocity = 0.0 + +[sub_resource type="TileSet" id="TileSet_kf7eg"] +physics_layer_0/collision_layer = 1 +physics_layer_1/collision_layer = 2 +physics_layer_1/collision_mask = 2 +custom_data_layer_0/name = "Type" +custom_data_layer_0/type = 21 +sources/0 = SubResource("TileSetAtlasSource_easgx") + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5hryl"] +bg_color = Color(0.85098, 0.894118, 0.937255, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.113725, 0.113725, 0.113725, 1) +corner_radius_top_left = 7 +corner_radius_top_right = 7 +corner_radius_bottom_right = 7 +corner_radius_bottom_left = 7 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_xj4ar"] +size = Vector2(64, 57) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_18i13"] +size = Vector2(42, 57) + +[node name="ExampleScene2D" type="Node2D"] + +[node name="Background" type="CanvasLayer" parent="."] +layer = -3 + +[node name="ColorRect" type="ColorRect" parent="Background"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -311.0 +offset_top = -173.0 +offset_right = 981.0 +offset_bottom = 548.0 +grow_horizontal = 2 +grow_vertical = 2 +auto_translate = false +localize_numeral_system = false +color = Color(0.137255, 0.14902, 0.196078, 1) + +[node name="TileMap" type="TileMap" parent="."] +z_index = -1 +scale = Vector2(3, 3) +tile_set = SubResource("TileSet_kf7eg") +format = 2 +layer_0/name = "Background" +layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) +layer_1/name = "Terrain" +layer_1/enabled = true +layer_1/modulate = Color(1, 1, 1, 1) +layer_1/y_sort_enabled = false +layer_1/y_sort_origin = 0 +layer_1/z_index = 1 +layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6) + +[node name="UI" type="CanvasLayer" parent="."] + +[node name="UIInventory" parent="UI" instance=ExtResource("7_fdx1s")] +unique_name_in_owner = true +visible = false + +[node name="UISign" parent="UI" instance=ExtResource("6_kqt1v")] +unique_name_in_owner = true +visible = false + +[node name="Camera2D" type="Camera2D" parent="."] +position = Vector2(243, -148) +zoom = Vector2(1.5, 1.5) + +[node name="PhantomCameraHost" type="Node" parent="Camera2D"] +script = ExtResource("1_eayfa") + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera2D" type="Node2D" parent="Player"] +unique_name_in_owner = true +position = Vector2(243, -148) +script = ExtResource("2_mgsut") +priority_override = null +priority = 5 +zoom = Vector2(1.5, 1.5) +follow_mode = 2 +follow_target = NodePath("../CharacterBody2D") +follow_parameters/target_offset = Vector2(0, -120) +follow_parameters/damping = true +follow_parameters/damping_value = 5.0 +tween_parameters = ExtResource("6_gqov5") +tween_on_load = false +inactive_update_mode = 0 + +[node name="CharacterBody2D" type="CharacterBody2D" parent="Player"] +position = Vector2(243, -28) +script = ExtResource("4_jnuod") + +[node name="DarkOverlay" type="ColorRect" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +visible = false +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -1000.0 +offset_top = -1000.0 +offset_right = 1000.0 +offset_bottom = 1000.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.615686) + +[node name="InteractionPrompt" type="Panel" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +visible = false +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -16.0 +offset_top = -66.0 +offset_right = 16.0 +offset_bottom = -34.0 +grow_horizontal = 2 +grow_vertical = 0 +size_flags_vertical = 0 +theme_override_styles/panel = SubResource("StyleBoxFlat_5hryl") + +[node name="Label" type="Label" parent="Player/CharacterBody2D/InteractionPrompt"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -3.0 +offset_bottom = 5.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_fonts/font = ExtResource("12_k4p0h") +theme_override_font_sizes/font_size = 26 +text = "F" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="PlayerSprite" type="Sprite2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +scale = Vector2(0.5, 0.5) +texture = ExtResource("6_e46ea") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player/CharacterBody2D"] +position = Vector2(0, -0.5) +shape = SubResource("RectangleShape2D_xj4ar") + +[node name="PlayerArea2D" type="Area2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +collision_layer = 2 +collision_mask = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player/CharacterBody2D/PlayerArea2D"] +position = Vector2(0, -0.5) +shape = SubResource("RectangleShape2D_18i13") + +[node name="ItemFocusPhantomCamera2D" type="Node2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +position = Vector2(0, -122) +script = ExtResource("2_mgsut") +priority_override = null +priority = 0 +zoom = Vector2(2, 2) +follow_mode = 0 +tween_parameters = ExtResource("10_0txyn") +tween_on_load = true +inactive_update_mode = 0 + +[node name="InventoryPhantomCamera2D" type="Node2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +position = Vector2(-183, -5) +script = ExtResource("2_mgsut") +priority_override = null +priority = 0 +zoom = Vector2(2.5, 2.5) +follow_mode = 0 +tween_parameters = ExtResource("11_xakux") +tween_on_load = true +inactive_update_mode = 0 + +[node name="Label" type="Label" parent="Player"] +offset_left = 167.0 +offset_top = -145.0 +offset_right = 332.0 +offset_bottom = -81.0 +theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1) +theme_override_fonts/font = ExtResource("12_k4p0h") +text = "[WASD] to move +[Space] to jump" diff --git a/addons/phantom_camera/examples/example_scenes/2D/2DFollowFramedExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2DFollowFramedExampleScene.tscn new file mode 100644 index 0000000..4fe7042 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/2D/2DFollowFramedExampleScene.tscn @@ -0,0 +1,762 @@ +[gd_scene load_steps=17 format=3 uid="uid://bxtsl6qlpq1ar"] + +[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_27o77"] +[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/UIInventory.tscn" id="2_1tbys"] +[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/UISign.tscn" id="3_1kfnp"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_mylkx"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2D.gd" id="5_lwx5e"] +[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera2DTween.tres" id="6_tu4q2"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/PlayerCharacterBody2D.gd" id="7_lgoyn"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="8_bo8m7"] +[ext_resource type="Texture2D" uid="uid://cwep0on2tthn7" path="res://addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png" id="9_lv4it"] +[ext_resource type="Resource" uid="uid://cecrnq0wnkexh" path="res://addons/phantom_camera/examples/resources/tween/ItemFocusPhantomCamera2DTween.tres" id="10_uli1l"] +[ext_resource type="Resource" uid="uid://cllveybboaqk5" path="res://addons/phantom_camera/examples/resources/tween/InventoryPhantomCamera2DTween.tres" id="11_rg2e5"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +texture = ExtResource("1_27o77") +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_1/angular_velocity = 0.0 +1:0/0 = 0 +1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:0/0/physics_layer_0/angular_velocity = 0.0 +1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +1:0/0/physics_layer_1/angular_velocity = 0.0 +2:0/0 = 0 +2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:0/0/physics_layer_0/angular_velocity = 0.0 +2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:0/0/physics_layer_1/angular_velocity = 0.0 +3:0/0 = 0 +3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:0/0/physics_layer_0/angular_velocity = 0.0 +3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:0/0/physics_layer_1/angular_velocity = 0.0 +4:0/0 = 0 +4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:0/0/physics_layer_0/angular_velocity = 0.0 +4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:0/0/physics_layer_1/angular_velocity = 0.0 +5:0/0 = 0 +5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:0/0/physics_layer_0/angular_velocity = 0.0 +5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:0/0/physics_layer_1/angular_velocity = 0.0 +6:0/0 = 0 +6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +6:0/0/physics_layer_0/angular_velocity = 0.0 +6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +6:0/0/physics_layer_1/angular_velocity = 0.0 +7:0/0 = 0 +7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:0/0/physics_layer_0/angular_velocity = 0.0 +7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:0/0/physics_layer_1/angular_velocity = 0.0 +0:1/0 = 0 +0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:1/0/physics_layer_0/angular_velocity = 0.0 +0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +0:1/0/physics_layer_1/angular_velocity = 0.0 +1:1/0 = 0 +1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:1/0/physics_layer_0/angular_velocity = 0.0 +1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +1:1/0/physics_layer_1/angular_velocity = 0.0 +2:1/0 = 0 +2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:1/0/physics_layer_0/angular_velocity = 0.0 +2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:1/0/physics_layer_1/angular_velocity = 0.0 +3:1/0 = 0 +3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:1/0/physics_layer_0/angular_velocity = 0.0 +3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:1/0/physics_layer_1/angular_velocity = 0.0 +4:1/0 = 0 +4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:1/0/physics_layer_0/angular_velocity = 0.0 +4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:1/0/physics_layer_1/angular_velocity = 0.0 +5:1/0 = 0 +5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:1/0/physics_layer_0/angular_velocity = 0.0 +5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:1/0/physics_layer_1/angular_velocity = 0.0 +7:1/0 = 0 +7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:1/0/physics_layer_0/angular_velocity = 0.0 +7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:1/0/physics_layer_1/angular_velocity = 0.0 +2:2/0 = 0 +2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:2/0/physics_layer_0/angular_velocity = 0.0 +2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:2/0/physics_layer_1/angular_velocity = 0.0 +3:2/0 = 0 +3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:2/0/physics_layer_0/angular_velocity = 0.0 +3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:2/0/physics_layer_1/angular_velocity = 0.0 +4:2/0 = 0 +4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:2/0/physics_layer_0/angular_velocity = 0.0 +4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:2/0/physics_layer_1/angular_velocity = 0.0 +7:2/0 = 0 +7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:2/0/physics_layer_0/angular_velocity = 0.0 +7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:2/0/physics_layer_1/angular_velocity = 0.0 +3:3/0 = 0 +3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:3/0/physics_layer_0/angular_velocity = 0.0 +3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:3/0/physics_layer_1/angular_velocity = 0.0 +4:3/0 = 0 +4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:3/0/physics_layer_0/angular_velocity = 0.0 +4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:3/0/physics_layer_1/angular_velocity = 0.0 +5:3/0 = 0 +5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:3/0/physics_layer_0/angular_velocity = 0.0 +5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:3/0/physics_layer_1/angular_velocity = 0.0 +7:3/0 = 0 +7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:3/0/physics_layer_0/angular_velocity = 0.0 +7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:3/0/physics_layer_1/angular_velocity = 0.0 +3:4/0 = 0 +3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:4/0/physics_layer_0/angular_velocity = 0.0 +3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:4/0/physics_layer_1/angular_velocity = 0.0 +4:4/0 = 0 +4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:4/0/physics_layer_0/angular_velocity = 0.0 +4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:4/0/physics_layer_1/angular_velocity = 0.0 +5:4/0 = 0 +5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:4/0/physics_layer_0/angular_velocity = 0.0 +5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:4/0/physics_layer_1/angular_velocity = 0.0 +7:4/0 = 0 +7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:4/0/physics_layer_0/angular_velocity = 0.0 +7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:4/0/physics_layer_1/angular_velocity = 0.0 +3:5/0 = 0 +3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:5/0/physics_layer_0/angular_velocity = 0.0 +3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:5/0/physics_layer_1/angular_velocity = 0.0 +4:5/0 = 0 +4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:5/0/physics_layer_0/angular_velocity = 0.0 +4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:5/0/physics_layer_1/angular_velocity = 0.0 +7:5/0 = 0 +7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:5/0/physics_layer_0/angular_velocity = 0.0 +7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:5/0/physics_layer_1/angular_velocity = 0.0 +3:6/0 = 0 +3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:6/0/physics_layer_0/angular_velocity = 0.0 +3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:6/0/physics_layer_1/angular_velocity = 0.0 +4:6/0 = 0 +4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:6/0/physics_layer_0/angular_velocity = 0.0 +4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:6/0/physics_layer_1/angular_velocity = 0.0 +7:6/0 = 0 +7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:6/0/physics_layer_0/angular_velocity = 0.0 +7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:6/0/physics_layer_1/angular_velocity = 0.0 +2:7/0 = 0 +2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:7/0/physics_layer_0/angular_velocity = 0.0 +2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:7/0/physics_layer_1/angular_velocity = 0.0 +3:7/0 = 0 +3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:7/0/physics_layer_0/angular_velocity = 0.0 +3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:7/0/physics_layer_1/angular_velocity = 0.0 +4:7/0 = 0 +4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:7/0/physics_layer_0/angular_velocity = 0.0 +4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:7/0/physics_layer_1/angular_velocity = 0.0 +5:7/0 = 0 +5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:7/0/physics_layer_0/angular_velocity = 0.0 +5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:7/0/physics_layer_1/angular_velocity = 0.0 +8:0/0 = 0 +8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:0/0/physics_layer_0/angular_velocity = 0.0 +8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:0/0/physics_layer_1/angular_velocity = 0.0 +9:0/0 = 0 +9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:0/0/physics_layer_0/angular_velocity = 0.0 +9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:0/0/physics_layer_1/angular_velocity = 0.0 +10:0/0 = 0 +10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:0/0/physics_layer_0/angular_velocity = 0.0 +10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:0/0/physics_layer_1/angular_velocity = 0.0 +11:0/0 = 0 +11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:0/0/physics_layer_0/angular_velocity = 0.0 +11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:0/0/physics_layer_1/angular_velocity = 0.0 +12:0/0 = 0 +12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:0/0/physics_layer_0/angular_velocity = 0.0 +12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:0/0/physics_layer_1/angular_velocity = 0.0 +13:0/0 = 0 +13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:0/0/physics_layer_0/angular_velocity = 0.0 +13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:0/0/physics_layer_1/angular_velocity = 0.0 +14:0/0 = 0 +14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:0/0/physics_layer_0/angular_velocity = 0.0 +14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:0/0/physics_layer_1/angular_velocity = 0.0 +14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) +14:0/0/custom_data_0 = &"Sign" +15:0/0 = 0 +15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:0/0/physics_layer_0/angular_velocity = 0.0 +15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:0/0/physics_layer_1/angular_velocity = 0.0 +16:0/0 = 0 +16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:0/0/physics_layer_0/angular_velocity = 0.0 +16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:0/0/physics_layer_1/angular_velocity = 0.0 +8:1/0 = 0 +8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:1/0/physics_layer_0/angular_velocity = 0.0 +8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:1/0/physics_layer_1/angular_velocity = 0.0 +9:1/0 = 0 +9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:1/0/physics_layer_0/angular_velocity = 0.0 +9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:1/0/physics_layer_1/angular_velocity = 0.0 +10:1/0 = 0 +10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:1/0/physics_layer_0/angular_velocity = 0.0 +10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:1/0/physics_layer_1/angular_velocity = 0.0 +11:1/0 = 0 +11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:1/0/physics_layer_0/angular_velocity = 0.0 +11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:1/0/physics_layer_1/angular_velocity = 0.0 +12:1/0 = 0 +12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:1/0/physics_layer_0/angular_velocity = 0.0 +12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:1/0/physics_layer_1/angular_velocity = 0.0 +13:1/0 = 0 +13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:1/0/physics_layer_0/angular_velocity = 0.0 +13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:1/0/physics_layer_1/angular_velocity = 0.0 +14:1/0 = 0 +14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:1/0/physics_layer_0/angular_velocity = 0.0 +14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:1/0/physics_layer_1/angular_velocity = 0.0 +15:1/0 = 0 +15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:1/0/physics_layer_0/angular_velocity = 0.0 +15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:1/0/physics_layer_1/angular_velocity = 0.0 +16:1/0 = 0 +16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:1/0/physics_layer_0/angular_velocity = 0.0 +16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:1/0/physics_layer_1/angular_velocity = 0.0 +8:2/0 = 0 +8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:2/0/physics_layer_0/angular_velocity = 0.0 +8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:2/0/physics_layer_1/angular_velocity = 0.0 +9:2/0 = 0 +9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:2/0/physics_layer_0/angular_velocity = 0.0 +9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:2/0/physics_layer_1/angular_velocity = 0.0 +10:2/0 = 0 +10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:2/0/physics_layer_0/angular_velocity = 0.0 +10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:2/0/physics_layer_1/angular_velocity = 0.0 +11:2/0 = 0 +11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:2/0/physics_layer_0/angular_velocity = 0.0 +11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:2/0/physics_layer_1/angular_velocity = 0.0 +12:2/0 = 0 +12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:2/0/physics_layer_0/angular_velocity = 0.0 +12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:2/0/physics_layer_1/angular_velocity = 0.0 +13:2/0 = 0 +13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:2/0/physics_layer_0/angular_velocity = 0.0 +13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:2/0/physics_layer_1/angular_velocity = 0.0 +14:2/0 = 0 +14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:2/0/physics_layer_0/angular_velocity = 0.0 +14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:2/0/physics_layer_1/angular_velocity = 0.0 +15:2/0 = 0 +15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:2/0/physics_layer_0/angular_velocity = 0.0 +15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:2/0/physics_layer_1/angular_velocity = 0.0 +16:2/0 = 0 +16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:2/0/physics_layer_0/angular_velocity = 0.0 +16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:2/0/physics_layer_1/angular_velocity = 0.0 +8:3/0 = 0 +8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:3/0/physics_layer_0/angular_velocity = 0.0 +8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:3/0/physics_layer_1/angular_velocity = 0.0 +9:3/0 = 0 +9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:3/0/physics_layer_0/angular_velocity = 0.0 +9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:3/0/physics_layer_1/angular_velocity = 0.0 +10:3/0 = 0 +10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:3/0/physics_layer_0/angular_velocity = 0.0 +10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:3/0/physics_layer_1/angular_velocity = 0.0 +11:3/0 = 0 +11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:3/0/physics_layer_0/angular_velocity = 0.0 +11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:3/0/physics_layer_1/angular_velocity = 0.0 +12:3/0 = 0 +12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:3/0/physics_layer_0/angular_velocity = 0.0 +12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:3/0/physics_layer_1/angular_velocity = 0.0 +13:3/0 = 0 +13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:3/0/physics_layer_0/angular_velocity = 0.0 +13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:3/0/physics_layer_1/angular_velocity = 0.0 +14:3/0 = 0 +14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:3/0/physics_layer_0/angular_velocity = 0.0 +14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:3/0/physics_layer_1/angular_velocity = 0.0 +15:3/0 = 0 +15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:3/0/physics_layer_0/angular_velocity = 0.0 +15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:3/0/physics_layer_1/angular_velocity = 0.0 +16:3/0 = 0 +16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:3/0/physics_layer_0/angular_velocity = 0.0 +16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:3/0/physics_layer_1/angular_velocity = 0.0 +8:4/0 = 0 +8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:4/0/physics_layer_0/angular_velocity = 0.0 +8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:4/0/physics_layer_1/angular_velocity = 0.0 +9:4/0 = 0 +9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:4/0/physics_layer_0/angular_velocity = 0.0 +9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:4/0/physics_layer_1/angular_velocity = 0.0 +10:4/0 = 0 +10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:4/0/physics_layer_0/angular_velocity = 0.0 +10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:4/0/physics_layer_1/angular_velocity = 0.0 +11:4/0 = 0 +11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:4/0/physics_layer_0/angular_velocity = 0.0 +11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) +11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:4/0/physics_layer_1/angular_velocity = 0.0 +12:4/0 = 0 +12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:4/0/physics_layer_0/angular_velocity = 0.0 +12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:4/0/physics_layer_1/angular_velocity = 0.0 +13:4/0 = 0 +13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:4/0/physics_layer_0/angular_velocity = 0.0 +13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) +13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:4/0/physics_layer_1/angular_velocity = 0.0 +14:4/0 = 0 +14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:4/0/physics_layer_0/angular_velocity = 0.0 +14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:4/0/physics_layer_1/angular_velocity = 0.0 +14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) +14:4/0/custom_data_0 = &"Inventory" +15:4/0 = 0 +15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:4/0/physics_layer_0/angular_velocity = 0.0 +15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:4/0/physics_layer_1/angular_velocity = 0.0 +16:4/0 = 0 +16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:4/0/physics_layer_0/angular_velocity = 0.0 +16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:4/0/physics_layer_1/angular_velocity = 0.0 +8:5/0 = 0 +8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:5/0/physics_layer_0/angular_velocity = 0.0 +8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:5/0/physics_layer_1/angular_velocity = 0.0 +9:5/0 = 0 +9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:5/0/physics_layer_0/angular_velocity = 0.0 +9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:5/0/physics_layer_1/angular_velocity = 0.0 +10:5/0 = 0 +10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:5/0/physics_layer_0/angular_velocity = 0.0 +10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:5/0/physics_layer_1/angular_velocity = 0.0 +11:5/0 = 0 +11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:5/0/physics_layer_0/angular_velocity = 0.0 +11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:5/0/physics_layer_1/angular_velocity = 0.0 +12:5/0 = 0 +12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:5/0/physics_layer_0/angular_velocity = 0.0 +12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:5/0/physics_layer_1/angular_velocity = 0.0 +13:5/0 = 0 +13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:5/0/physics_layer_0/angular_velocity = 0.0 +13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:5/0/physics_layer_1/angular_velocity = 0.0 +14:5/0 = 0 +14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:5/0/physics_layer_0/angular_velocity = 0.0 +14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:5/0/physics_layer_1/angular_velocity = 0.0 +15:5/0 = 0 +15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:5/0/physics_layer_0/angular_velocity = 0.0 +15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:5/0/physics_layer_1/angular_velocity = 0.0 +16:5/0 = 0 +16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:5/0/physics_layer_0/angular_velocity = 0.0 +16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:5/0/physics_layer_1/angular_velocity = 0.0 +8:6/0 = 0 +8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:6/0/physics_layer_0/angular_velocity = 0.0 +8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:6/0/physics_layer_1/angular_velocity = 0.0 +9:6/0 = 0 +9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:6/0/physics_layer_0/angular_velocity = 0.0 +9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:6/0/physics_layer_1/angular_velocity = 0.0 +10:6/0 = 0 +10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:6/0/physics_layer_0/angular_velocity = 0.0 +10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:6/0/physics_layer_1/angular_velocity = 0.0 +11:6/0 = 0 +11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:6/0/physics_layer_0/angular_velocity = 0.0 +11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) +11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:6/0/physics_layer_1/angular_velocity = 0.0 +12:6/0 = 0 +12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:6/0/physics_layer_0/angular_velocity = 0.0 +12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:6/0/physics_layer_1/angular_velocity = 0.0 +13:6/0 = 0 +13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:6/0/physics_layer_0/angular_velocity = 0.0 +13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) +13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:6/0/physics_layer_1/angular_velocity = 0.0 +14:6/0 = 0 +14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:6/0/physics_layer_0/angular_velocity = 0.0 +14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:6/0/physics_layer_1/angular_velocity = 0.0 +15:6/0 = 0 +15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:6/0/physics_layer_0/angular_velocity = 0.0 +15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:6/0/physics_layer_1/angular_velocity = 0.0 +16:6/0 = 0 +16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:6/0/physics_layer_0/angular_velocity = 0.0 +16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:6/0/physics_layer_1/angular_velocity = 0.0 + +[sub_resource type="TileSet" id="TileSet_kf7eg"] +physics_layer_0/collision_layer = 1 +physics_layer_1/collision_layer = 2 +physics_layer_1/collision_mask = 2 +custom_data_layer_0/name = "Type" +custom_data_layer_0/type = 21 +sources/0 = SubResource("TileSetAtlasSource_easgx") + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5hryl"] +bg_color = Color(0.85098, 0.894118, 0.937255, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.113725, 0.113725, 0.113725, 1) +corner_radius_top_left = 7 +corner_radius_top_right = 7 +corner_radius_bottom_right = 7 +corner_radius_bottom_left = 7 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_xj4ar"] +size = Vector2(64, 57) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_18i13"] +size = Vector2(42, 57) + +[node name="ExampleScene2D" type="Node2D"] + +[node name="Background" type="CanvasLayer" parent="."] +layer = -3 + +[node name="ColorRect" type="ColorRect" parent="Background"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -345.0 +offset_top = -143.0 +offset_right = 947.0 +offset_bottom = 578.0 +grow_horizontal = 2 +grow_vertical = 2 +auto_translate = false +localize_numeral_system = false +color = Color(0.137255, 0.14902, 0.196078, 1) + +[node name="TileMap" type="TileMap" parent="."] +z_index = -1 +scale = Vector2(3, 3) +tile_set = SubResource("TileSet_kf7eg") +format = 2 +layer_0/name = "Background" +layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) +layer_1/name = "Terrain" +layer_1/enabled = true +layer_1/modulate = Color(1, 1, 1, 1) +layer_1/y_sort_enabled = false +layer_1/y_sort_origin = 0 +layer_1/z_index = 1 +layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6) + +[node name="UI" type="CanvasLayer" parent="."] + +[node name="UIInventory" parent="UI" instance=ExtResource("2_1tbys")] +unique_name_in_owner = true +visible = false + +[node name="UISign" parent="UI" instance=ExtResource("3_1kfnp")] +unique_name_in_owner = true +visible = false + +[node name="Camera2D" type="Camera2D" parent="."] +position = Vector2(674, -132) +zoom = Vector2(2, 2) + +[node name="PhantomCameraHost" type="Node" parent="Camera2D"] +script = ExtResource("4_mylkx") + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera2D" type="Node2D" parent="Player"] +unique_name_in_owner = true +position = Vector2(674, -132) +script = ExtResource("5_lwx5e") +priority_override = null +priority = 5 +zoom = Vector2(2, 2) +follow_mode = 5 +follow_target = NodePath("../CharacterBody2D") +follow_parameters/target_offset = Vector2(0, 0) +follow_parameters/damping = true +follow_parameters/damping_value = 20.0 +follow_parameters/dead_zone_horizontal = 0.362 +follow_parameters/dead_zone_vertical = 1.0 +follow_parameters/viewfinder_in_play = true +tween_parameters = ExtResource("6_tu4q2") +tween_on_load = false +inactive_update_mode = 0 + +[node name="CharacterBody2D" type="CharacterBody2D" parent="Player"] +position = Vector2(674, -132) +script = ExtResource("7_lgoyn") +metadata/_edit_group_ = true + +[node name="DarkOverlay" type="ColorRect" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +visible = false +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -1000.0 +offset_top = -1000.0 +offset_right = 1000.0 +offset_bottom = 1000.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.615686) + +[node name="InteractionPrompt" type="Panel" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +visible = false +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -16.0 +offset_top = -66.0 +offset_right = 16.0 +offset_bottom = -34.0 +grow_horizontal = 2 +grow_vertical = 0 +size_flags_vertical = 0 +theme_override_styles/panel = SubResource("StyleBoxFlat_5hryl") + +[node name="Label" type="Label" parent="Player/CharacterBody2D/InteractionPrompt"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -3.0 +offset_bottom = 5.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_fonts/font = ExtResource("8_bo8m7") +theme_override_font_sizes/font_size = 26 +text = "F" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="PlayerSprite" type="Sprite2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +scale = Vector2(0.5, 0.5) +texture = ExtResource("9_lv4it") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player/CharacterBody2D"] +position = Vector2(0, -0.5) +shape = SubResource("RectangleShape2D_xj4ar") + +[node name="PlayerArea2D" type="Area2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +collision_layer = 2 +collision_mask = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player/CharacterBody2D/PlayerArea2D"] +position = Vector2(0, -0.5) +shape = SubResource("RectangleShape2D_18i13") + +[node name="ItemFocusPhantomCamera2D" type="Node2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +position = Vector2(100, -135) +script = ExtResource("5_lwx5e") +priority_override = null +priority = 0 +zoom = Vector2(2, 2) +follow_mode = 0 +tween_parameters = ExtResource("10_uli1l") +tween_on_load = true +inactive_update_mode = 0 +metadata/_edit_lock_ = true + +[node name="InventoryPhantomCamera2D" type="Node2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +position = Vector2(-183, -5) +script = ExtResource("5_lwx5e") +priority_override = null +priority = 0 +zoom = Vector2(2.5, 2.5) +follow_mode = 0 +tween_parameters = ExtResource("11_rg2e5") +tween_on_load = true +inactive_update_mode = 0 +metadata/_edit_lock_ = true + +[node name="Label" type="Label" parent="Player"] +offset_left = 167.0 +offset_top = -145.0 +offset_right = 332.0 +offset_bottom = -81.0 +theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1) +theme_override_fonts/font = ExtResource("8_bo8m7") +text = "[WASD] to move +[Space] to jump" diff --git a/addons/phantom_camera/examples/example_scenes/2D/2DFollowGroupExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2DFollowGroupExampleScene.tscn new file mode 100644 index 0000000..f08c288 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/2D/2DFollowGroupExampleScene.tscn @@ -0,0 +1,775 @@ +[gd_scene load_steps=17 format=3 uid="uid://brrncnp26lrco"] + +[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_5kqbp"] +[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/UIInventory.tscn" id="2_xmntp"] +[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/UISign.tscn" id="3_8dojy"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_2efwt"] +[ext_resource type="Texture2D" uid="uid://cwep0on2tthn7" path="res://addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png" id="5_0v2cd"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2D.gd" id="6_diuy4"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/PlayerCharacterBody2D.gd" id="7_0pk2o"] +[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera2DTween.tres" id="8_cx6vg"] +[ext_resource type="Resource" uid="uid://cecrnq0wnkexh" path="res://addons/phantom_camera/examples/resources/tween/ItemFocusPhantomCamera2DTween.tres" id="10_ar2rk"] +[ext_resource type="Resource" uid="uid://cllveybboaqk5" path="res://addons/phantom_camera/examples/resources/tween/InventoryPhantomCamera2DTween.tres" id="11_5hu46"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="12_uvcwb"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +texture = ExtResource("1_5kqbp") +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_1/angular_velocity = 0.0 +1:0/0 = 0 +1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:0/0/physics_layer_0/angular_velocity = 0.0 +1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +1:0/0/physics_layer_1/angular_velocity = 0.0 +2:0/0 = 0 +2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:0/0/physics_layer_0/angular_velocity = 0.0 +2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:0/0/physics_layer_1/angular_velocity = 0.0 +3:0/0 = 0 +3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:0/0/physics_layer_0/angular_velocity = 0.0 +3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:0/0/physics_layer_1/angular_velocity = 0.0 +4:0/0 = 0 +4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:0/0/physics_layer_0/angular_velocity = 0.0 +4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:0/0/physics_layer_1/angular_velocity = 0.0 +5:0/0 = 0 +5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:0/0/physics_layer_0/angular_velocity = 0.0 +5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:0/0/physics_layer_1/angular_velocity = 0.0 +6:0/0 = 0 +6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +6:0/0/physics_layer_0/angular_velocity = 0.0 +6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +6:0/0/physics_layer_1/angular_velocity = 0.0 +7:0/0 = 0 +7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:0/0/physics_layer_0/angular_velocity = 0.0 +7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:0/0/physics_layer_1/angular_velocity = 0.0 +0:1/0 = 0 +0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:1/0/physics_layer_0/angular_velocity = 0.0 +0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +0:1/0/physics_layer_1/angular_velocity = 0.0 +1:1/0 = 0 +1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:1/0/physics_layer_0/angular_velocity = 0.0 +1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +1:1/0/physics_layer_1/angular_velocity = 0.0 +2:1/0 = 0 +2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:1/0/physics_layer_0/angular_velocity = 0.0 +2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:1/0/physics_layer_1/angular_velocity = 0.0 +3:1/0 = 0 +3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:1/0/physics_layer_0/angular_velocity = 0.0 +3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:1/0/physics_layer_1/angular_velocity = 0.0 +4:1/0 = 0 +4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:1/0/physics_layer_0/angular_velocity = 0.0 +4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:1/0/physics_layer_1/angular_velocity = 0.0 +5:1/0 = 0 +5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:1/0/physics_layer_0/angular_velocity = 0.0 +5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:1/0/physics_layer_1/angular_velocity = 0.0 +7:1/0 = 0 +7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:1/0/physics_layer_0/angular_velocity = 0.0 +7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:1/0/physics_layer_1/angular_velocity = 0.0 +2:2/0 = 0 +2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:2/0/physics_layer_0/angular_velocity = 0.0 +2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:2/0/physics_layer_1/angular_velocity = 0.0 +3:2/0 = 0 +3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:2/0/physics_layer_0/angular_velocity = 0.0 +3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:2/0/physics_layer_1/angular_velocity = 0.0 +4:2/0 = 0 +4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:2/0/physics_layer_0/angular_velocity = 0.0 +4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:2/0/physics_layer_1/angular_velocity = 0.0 +7:2/0 = 0 +7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:2/0/physics_layer_0/angular_velocity = 0.0 +7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:2/0/physics_layer_1/angular_velocity = 0.0 +3:3/0 = 0 +3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:3/0/physics_layer_0/angular_velocity = 0.0 +3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:3/0/physics_layer_1/angular_velocity = 0.0 +4:3/0 = 0 +4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:3/0/physics_layer_0/angular_velocity = 0.0 +4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:3/0/physics_layer_1/angular_velocity = 0.0 +5:3/0 = 0 +5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:3/0/physics_layer_0/angular_velocity = 0.0 +5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:3/0/physics_layer_1/angular_velocity = 0.0 +7:3/0 = 0 +7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:3/0/physics_layer_0/angular_velocity = 0.0 +7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:3/0/physics_layer_1/angular_velocity = 0.0 +3:4/0 = 0 +3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:4/0/physics_layer_0/angular_velocity = 0.0 +3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:4/0/physics_layer_1/angular_velocity = 0.0 +4:4/0 = 0 +4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:4/0/physics_layer_0/angular_velocity = 0.0 +4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:4/0/physics_layer_1/angular_velocity = 0.0 +5:4/0 = 0 +5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:4/0/physics_layer_0/angular_velocity = 0.0 +5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:4/0/physics_layer_1/angular_velocity = 0.0 +7:4/0 = 0 +7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:4/0/physics_layer_0/angular_velocity = 0.0 +7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:4/0/physics_layer_1/angular_velocity = 0.0 +3:5/0 = 0 +3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:5/0/physics_layer_0/angular_velocity = 0.0 +3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:5/0/physics_layer_1/angular_velocity = 0.0 +4:5/0 = 0 +4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:5/0/physics_layer_0/angular_velocity = 0.0 +4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:5/0/physics_layer_1/angular_velocity = 0.0 +7:5/0 = 0 +7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:5/0/physics_layer_0/angular_velocity = 0.0 +7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:5/0/physics_layer_1/angular_velocity = 0.0 +3:6/0 = 0 +3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:6/0/physics_layer_0/angular_velocity = 0.0 +3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:6/0/physics_layer_1/angular_velocity = 0.0 +4:6/0 = 0 +4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:6/0/physics_layer_0/angular_velocity = 0.0 +4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:6/0/physics_layer_1/angular_velocity = 0.0 +7:6/0 = 0 +7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:6/0/physics_layer_0/angular_velocity = 0.0 +7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:6/0/physics_layer_1/angular_velocity = 0.0 +2:7/0 = 0 +2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:7/0/physics_layer_0/angular_velocity = 0.0 +2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:7/0/physics_layer_1/angular_velocity = 0.0 +3:7/0 = 0 +3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:7/0/physics_layer_0/angular_velocity = 0.0 +3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:7/0/physics_layer_1/angular_velocity = 0.0 +4:7/0 = 0 +4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:7/0/physics_layer_0/angular_velocity = 0.0 +4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:7/0/physics_layer_1/angular_velocity = 0.0 +5:7/0 = 0 +5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:7/0/physics_layer_0/angular_velocity = 0.0 +5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:7/0/physics_layer_1/angular_velocity = 0.0 +8:0/0 = 0 +8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:0/0/physics_layer_0/angular_velocity = 0.0 +8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:0/0/physics_layer_1/angular_velocity = 0.0 +9:0/0 = 0 +9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:0/0/physics_layer_0/angular_velocity = 0.0 +9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:0/0/physics_layer_1/angular_velocity = 0.0 +10:0/0 = 0 +10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:0/0/physics_layer_0/angular_velocity = 0.0 +10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:0/0/physics_layer_1/angular_velocity = 0.0 +11:0/0 = 0 +11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:0/0/physics_layer_0/angular_velocity = 0.0 +11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:0/0/physics_layer_1/angular_velocity = 0.0 +12:0/0 = 0 +12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:0/0/physics_layer_0/angular_velocity = 0.0 +12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:0/0/physics_layer_1/angular_velocity = 0.0 +13:0/0 = 0 +13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:0/0/physics_layer_0/angular_velocity = 0.0 +13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:0/0/physics_layer_1/angular_velocity = 0.0 +14:0/0 = 0 +14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:0/0/physics_layer_0/angular_velocity = 0.0 +14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:0/0/physics_layer_1/angular_velocity = 0.0 +14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) +14:0/0/custom_data_0 = &"Sign" +15:0/0 = 0 +15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:0/0/physics_layer_0/angular_velocity = 0.0 +15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:0/0/physics_layer_1/angular_velocity = 0.0 +16:0/0 = 0 +16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:0/0/physics_layer_0/angular_velocity = 0.0 +16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:0/0/physics_layer_1/angular_velocity = 0.0 +8:1/0 = 0 +8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:1/0/physics_layer_0/angular_velocity = 0.0 +8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:1/0/physics_layer_1/angular_velocity = 0.0 +9:1/0 = 0 +9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:1/0/physics_layer_0/angular_velocity = 0.0 +9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:1/0/physics_layer_1/angular_velocity = 0.0 +10:1/0 = 0 +10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:1/0/physics_layer_0/angular_velocity = 0.0 +10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:1/0/physics_layer_1/angular_velocity = 0.0 +11:1/0 = 0 +11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:1/0/physics_layer_0/angular_velocity = 0.0 +11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:1/0/physics_layer_1/angular_velocity = 0.0 +12:1/0 = 0 +12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:1/0/physics_layer_0/angular_velocity = 0.0 +12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:1/0/physics_layer_1/angular_velocity = 0.0 +13:1/0 = 0 +13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:1/0/physics_layer_0/angular_velocity = 0.0 +13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:1/0/physics_layer_1/angular_velocity = 0.0 +14:1/0 = 0 +14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:1/0/physics_layer_0/angular_velocity = 0.0 +14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:1/0/physics_layer_1/angular_velocity = 0.0 +15:1/0 = 0 +15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:1/0/physics_layer_0/angular_velocity = 0.0 +15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:1/0/physics_layer_1/angular_velocity = 0.0 +16:1/0 = 0 +16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:1/0/physics_layer_0/angular_velocity = 0.0 +16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:1/0/physics_layer_1/angular_velocity = 0.0 +8:2/0 = 0 +8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:2/0/physics_layer_0/angular_velocity = 0.0 +8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:2/0/physics_layer_1/angular_velocity = 0.0 +9:2/0 = 0 +9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:2/0/physics_layer_0/angular_velocity = 0.0 +9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:2/0/physics_layer_1/angular_velocity = 0.0 +10:2/0 = 0 +10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:2/0/physics_layer_0/angular_velocity = 0.0 +10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:2/0/physics_layer_1/angular_velocity = 0.0 +11:2/0 = 0 +11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:2/0/physics_layer_0/angular_velocity = 0.0 +11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:2/0/physics_layer_1/angular_velocity = 0.0 +12:2/0 = 0 +12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:2/0/physics_layer_0/angular_velocity = 0.0 +12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:2/0/physics_layer_1/angular_velocity = 0.0 +13:2/0 = 0 +13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:2/0/physics_layer_0/angular_velocity = 0.0 +13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:2/0/physics_layer_1/angular_velocity = 0.0 +14:2/0 = 0 +14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:2/0/physics_layer_0/angular_velocity = 0.0 +14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:2/0/physics_layer_1/angular_velocity = 0.0 +15:2/0 = 0 +15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:2/0/physics_layer_0/angular_velocity = 0.0 +15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:2/0/physics_layer_1/angular_velocity = 0.0 +16:2/0 = 0 +16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:2/0/physics_layer_0/angular_velocity = 0.0 +16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:2/0/physics_layer_1/angular_velocity = 0.0 +8:3/0 = 0 +8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:3/0/physics_layer_0/angular_velocity = 0.0 +8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:3/0/physics_layer_1/angular_velocity = 0.0 +9:3/0 = 0 +9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:3/0/physics_layer_0/angular_velocity = 0.0 +9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:3/0/physics_layer_1/angular_velocity = 0.0 +10:3/0 = 0 +10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:3/0/physics_layer_0/angular_velocity = 0.0 +10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:3/0/physics_layer_1/angular_velocity = 0.0 +11:3/0 = 0 +11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:3/0/physics_layer_0/angular_velocity = 0.0 +11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:3/0/physics_layer_1/angular_velocity = 0.0 +12:3/0 = 0 +12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:3/0/physics_layer_0/angular_velocity = 0.0 +12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:3/0/physics_layer_1/angular_velocity = 0.0 +13:3/0 = 0 +13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:3/0/physics_layer_0/angular_velocity = 0.0 +13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:3/0/physics_layer_1/angular_velocity = 0.0 +14:3/0 = 0 +14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:3/0/physics_layer_0/angular_velocity = 0.0 +14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:3/0/physics_layer_1/angular_velocity = 0.0 +15:3/0 = 0 +15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:3/0/physics_layer_0/angular_velocity = 0.0 +15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:3/0/physics_layer_1/angular_velocity = 0.0 +16:3/0 = 0 +16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:3/0/physics_layer_0/angular_velocity = 0.0 +16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:3/0/physics_layer_1/angular_velocity = 0.0 +8:4/0 = 0 +8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:4/0/physics_layer_0/angular_velocity = 0.0 +8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:4/0/physics_layer_1/angular_velocity = 0.0 +9:4/0 = 0 +9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:4/0/physics_layer_0/angular_velocity = 0.0 +9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:4/0/physics_layer_1/angular_velocity = 0.0 +10:4/0 = 0 +10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:4/0/physics_layer_0/angular_velocity = 0.0 +10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:4/0/physics_layer_1/angular_velocity = 0.0 +11:4/0 = 0 +11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:4/0/physics_layer_0/angular_velocity = 0.0 +11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) +11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:4/0/physics_layer_1/angular_velocity = 0.0 +12:4/0 = 0 +12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:4/0/physics_layer_0/angular_velocity = 0.0 +12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:4/0/physics_layer_1/angular_velocity = 0.0 +13:4/0 = 0 +13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:4/0/physics_layer_0/angular_velocity = 0.0 +13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) +13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:4/0/physics_layer_1/angular_velocity = 0.0 +14:4/0 = 0 +14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:4/0/physics_layer_0/angular_velocity = 0.0 +14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:4/0/physics_layer_1/angular_velocity = 0.0 +14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) +14:4/0/custom_data_0 = &"Inventory" +15:4/0 = 0 +15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:4/0/physics_layer_0/angular_velocity = 0.0 +15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:4/0/physics_layer_1/angular_velocity = 0.0 +16:4/0 = 0 +16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:4/0/physics_layer_0/angular_velocity = 0.0 +16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:4/0/physics_layer_1/angular_velocity = 0.0 +8:5/0 = 0 +8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:5/0/physics_layer_0/angular_velocity = 0.0 +8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:5/0/physics_layer_1/angular_velocity = 0.0 +9:5/0 = 0 +9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:5/0/physics_layer_0/angular_velocity = 0.0 +9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:5/0/physics_layer_1/angular_velocity = 0.0 +10:5/0 = 0 +10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:5/0/physics_layer_0/angular_velocity = 0.0 +10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:5/0/physics_layer_1/angular_velocity = 0.0 +11:5/0 = 0 +11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:5/0/physics_layer_0/angular_velocity = 0.0 +11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:5/0/physics_layer_1/angular_velocity = 0.0 +12:5/0 = 0 +12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:5/0/physics_layer_0/angular_velocity = 0.0 +12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:5/0/physics_layer_1/angular_velocity = 0.0 +13:5/0 = 0 +13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:5/0/physics_layer_0/angular_velocity = 0.0 +13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:5/0/physics_layer_1/angular_velocity = 0.0 +14:5/0 = 0 +14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:5/0/physics_layer_0/angular_velocity = 0.0 +14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:5/0/physics_layer_1/angular_velocity = 0.0 +15:5/0 = 0 +15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:5/0/physics_layer_0/angular_velocity = 0.0 +15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:5/0/physics_layer_1/angular_velocity = 0.0 +16:5/0 = 0 +16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:5/0/physics_layer_0/angular_velocity = 0.0 +16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:5/0/physics_layer_1/angular_velocity = 0.0 +8:6/0 = 0 +8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:6/0/physics_layer_0/angular_velocity = 0.0 +8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:6/0/physics_layer_1/angular_velocity = 0.0 +9:6/0 = 0 +9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:6/0/physics_layer_0/angular_velocity = 0.0 +9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:6/0/physics_layer_1/angular_velocity = 0.0 +10:6/0 = 0 +10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:6/0/physics_layer_0/angular_velocity = 0.0 +10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:6/0/physics_layer_1/angular_velocity = 0.0 +11:6/0 = 0 +11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:6/0/physics_layer_0/angular_velocity = 0.0 +11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) +11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:6/0/physics_layer_1/angular_velocity = 0.0 +12:6/0 = 0 +12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:6/0/physics_layer_0/angular_velocity = 0.0 +12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:6/0/physics_layer_1/angular_velocity = 0.0 +13:6/0 = 0 +13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:6/0/physics_layer_0/angular_velocity = 0.0 +13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) +13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:6/0/physics_layer_1/angular_velocity = 0.0 +14:6/0 = 0 +14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:6/0/physics_layer_0/angular_velocity = 0.0 +14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:6/0/physics_layer_1/angular_velocity = 0.0 +15:6/0 = 0 +15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:6/0/physics_layer_0/angular_velocity = 0.0 +15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:6/0/physics_layer_1/angular_velocity = 0.0 +16:6/0 = 0 +16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:6/0/physics_layer_0/angular_velocity = 0.0 +16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:6/0/physics_layer_1/angular_velocity = 0.0 + +[sub_resource type="TileSet" id="TileSet_kf7eg"] +physics_layer_0/collision_layer = 1 +physics_layer_1/collision_layer = 2 +physics_layer_1/collision_mask = 2 +custom_data_layer_0/name = "Type" +custom_data_layer_0/type = 21 +sources/0 = SubResource("TileSetAtlasSource_easgx") + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5hryl"] +bg_color = Color(0.85098, 0.894118, 0.937255, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.113725, 0.113725, 0.113725, 1) +corner_radius_top_left = 7 +corner_radius_top_right = 7 +corner_radius_bottom_right = 7 +corner_radius_bottom_left = 7 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_xj4ar"] +size = Vector2(64, 57) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_18i13"] +size = Vector2(42, 57) + +[node name="ExampleScene2D" type="Node2D"] + +[node name="Background" type="CanvasLayer" parent="."] +layer = -3 + +[node name="ColorRect" type="ColorRect" parent="Background"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -311.0 +offset_top = -173.0 +offset_right = 981.0 +offset_bottom = 548.0 +grow_horizontal = 2 +grow_vertical = 2 +auto_translate = false +localize_numeral_system = false +color = Color(0.137255, 0.14902, 0.196078, 1) + +[node name="TileMap" type="TileMap" parent="."] +z_index = -1 +scale = Vector2(3, 3) +tile_set = SubResource("TileSet_kf7eg") +format = 2 +layer_0/name = "Background" +layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) +layer_1/name = "Terrain" +layer_1/enabled = true +layer_1/modulate = Color(1, 1, 1, 1) +layer_1/y_sort_enabled = false +layer_1/y_sort_origin = 0 +layer_1/z_index = 1 +layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -196596, 917504, 0, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, -65511, 917504, 4, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -65498, 851968, 5, -131034, 851968, 5, -196570, 851968, 5, -327642, 851968, 4, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -262106, 851968, 5, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 786432, 5, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 524326, 851968, 6, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5) + +[node name="UI" type="CanvasLayer" parent="."] + +[node name="UIInventory" parent="UI" instance=ExtResource("2_xmntp")] +unique_name_in_owner = true +visible = false + +[node name="UISign" parent="UI" instance=ExtResource("3_8dojy")] +unique_name_in_owner = true +visible = false + +[node name="Camera2D" type="Camera2D" parent="."] +position = Vector2(325, -222) +zoom = Vector2(1.32483, 1.32483) + +[node name="PhantomCameraHost" type="Node" parent="Camera2D"] +script = ExtResource("4_2efwt") + +[node name="Label" type="Label" parent="."] +offset_left = 167.0 +offset_top = -133.0 +offset_right = 332.0 +offset_bottom = -69.0 +theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1) +theme_override_fonts/font = ExtResource("12_uvcwb") +text = "[WASD] to move +[Space] to jump" + +[node name="GroupNPCSprite" type="Sprite2D" parent="."] +unique_name_in_owner = true +position = Vector2(107, -316) +scale = Vector2(0.5, 0.5) +texture = ExtResource("5_0v2cd") + +[node name="Player" type="Node" parent="."] + +[node name="GroupPhantomCamera2D" type="Node2D" parent="Player"] +unique_name_in_owner = true +position = Vector2(325, -222) +script = ExtResource("6_diuy4") +priority_override = null +priority = 6 +zoom = Vector2(1.32483, 1.32483) +follow_mode = 3 +follow_group = Array[NodePath]([NodePath("../CharacterBody2D"), NodePath("../../GroupNPCSprite")]) +follow_parameters/auto_zoom = true +follow_parameters/min_zoom = 0.7 +follow_parameters/max_zoom = 3.0 +follow_parameters/zoom_margin = Vector4(100, 200, 200, 50) +follow_parameters/target_offset = Vector2(0, 0) +follow_parameters/damping = true +follow_parameters/damping_value = 8.0 +tween_parameters = ExtResource("8_cx6vg") +tween_on_load = false +inactive_update_mode = 0 + +[node name="CharacterBody2D" type="CharacterBody2D" parent="Player"] +position = Vector2(243, -28) +script = ExtResource("7_0pk2o") + +[node name="DarkOverlay" type="ColorRect" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +visible = false +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -1000.0 +offset_top = -1000.0 +offset_right = 1000.0 +offset_bottom = 1000.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.615686) + +[node name="InteractionPrompt" type="Panel" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +visible = false +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -16.0 +offset_top = -66.0 +offset_right = 16.0 +offset_bottom = -34.0 +grow_horizontal = 2 +grow_vertical = 0 +size_flags_vertical = 0 +theme_override_styles/panel = SubResource("StyleBoxFlat_5hryl") + +[node name="Label" type="Label" parent="Player/CharacterBody2D/InteractionPrompt"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -3.0 +offset_bottom = 5.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_fonts/font = ExtResource("12_uvcwb") +theme_override_font_sizes/font_size = 26 +text = "F" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="PlayerSprite" type="Sprite2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +scale = Vector2(0.5, 0.5) +texture = ExtResource("5_0v2cd") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player/CharacterBody2D"] +position = Vector2(0, -0.5) +shape = SubResource("RectangleShape2D_xj4ar") + +[node name="PlayerArea2D" type="Area2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +collision_layer = 2 +collision_mask = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player/CharacterBody2D/PlayerArea2D"] +position = Vector2(0, -0.5) +shape = SubResource("RectangleShape2D_18i13") + +[node name="ItemFocusPhantomCamera2D" type="Node2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +position = Vector2(0, -122) +script = ExtResource("6_diuy4") +priority_override = null +priority = 0 +zoom = Vector2(2, 2) +follow_mode = 0 +tween_parameters = ExtResource("10_ar2rk") +tween_on_load = true +inactive_update_mode = 0 + +[node name="InventoryPhantomCamera2D" type="Node2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +position = Vector2(-183, -5) +script = ExtResource("6_diuy4") +priority_override = null +priority = 0 +zoom = Vector2(2.5, 2.5) +follow_mode = 0 +tween_parameters = ExtResource("11_5hu46") +tween_on_load = true +inactive_update_mode = 0 + +[node name="StaysInViewLabel" type="Label" parent="Player"] +offset_left = 49.0 +offset_top = -379.0 +offset_right = 151.0 +offset_bottom = -353.0 +theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1) +theme_override_fonts/font = ExtResource("12_uvcwb") +text = "Stays in view" diff --git a/addons/phantom_camera/examples/example_scenes/2D/2DFollowPathExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2DFollowPathExampleScene.tscn new file mode 100644 index 0000000..085a5bc --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/2D/2DFollowPathExampleScene.tscn @@ -0,0 +1,778 @@ +[gd_scene load_steps=18 format=3 uid="uid://psbaaxnedqmq"] + +[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_17ngo"] +[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/UIInventory.tscn" id="2_whpvu"] +[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/UISign.tscn" id="3_rbo5b"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_yddet"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2D.gd" id="5_x25dj"] +[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera2DTween.tres" id="6_4vtmp"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/PlayerCharacterBody2D.gd" id="7_ipd3c"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="8_6pcaf"] +[ext_resource type="Texture2D" uid="uid://cwep0on2tthn7" path="res://addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png" id="9_cspd2"] +[ext_resource type="Resource" uid="uid://cecrnq0wnkexh" path="res://addons/phantom_camera/examples/resources/tween/ItemFocusPhantomCamera2DTween.tres" id="10_mh1yw"] +[ext_resource type="Resource" uid="uid://cllveybboaqk5" path="res://addons/phantom_camera/examples/resources/tween/InventoryPhantomCamera2DTween.tres" id="11_apay3"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +texture = ExtResource("1_17ngo") +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_1/angular_velocity = 0.0 +1:0/0 = 0 +1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:0/0/physics_layer_0/angular_velocity = 0.0 +1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +1:0/0/physics_layer_1/angular_velocity = 0.0 +2:0/0 = 0 +2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:0/0/physics_layer_0/angular_velocity = 0.0 +2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:0/0/physics_layer_1/angular_velocity = 0.0 +3:0/0 = 0 +3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:0/0/physics_layer_0/angular_velocity = 0.0 +3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:0/0/physics_layer_1/angular_velocity = 0.0 +4:0/0 = 0 +4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:0/0/physics_layer_0/angular_velocity = 0.0 +4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:0/0/physics_layer_1/angular_velocity = 0.0 +5:0/0 = 0 +5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:0/0/physics_layer_0/angular_velocity = 0.0 +5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:0/0/physics_layer_1/angular_velocity = 0.0 +6:0/0 = 0 +6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +6:0/0/physics_layer_0/angular_velocity = 0.0 +6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +6:0/0/physics_layer_1/angular_velocity = 0.0 +7:0/0 = 0 +7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:0/0/physics_layer_0/angular_velocity = 0.0 +7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:0/0/physics_layer_1/angular_velocity = 0.0 +0:1/0 = 0 +0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:1/0/physics_layer_0/angular_velocity = 0.0 +0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +0:1/0/physics_layer_1/angular_velocity = 0.0 +1:1/0 = 0 +1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:1/0/physics_layer_0/angular_velocity = 0.0 +1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +1:1/0/physics_layer_1/angular_velocity = 0.0 +2:1/0 = 0 +2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:1/0/physics_layer_0/angular_velocity = 0.0 +2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:1/0/physics_layer_1/angular_velocity = 0.0 +3:1/0 = 0 +3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:1/0/physics_layer_0/angular_velocity = 0.0 +3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:1/0/physics_layer_1/angular_velocity = 0.0 +4:1/0 = 0 +4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:1/0/physics_layer_0/angular_velocity = 0.0 +4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:1/0/physics_layer_1/angular_velocity = 0.0 +5:1/0 = 0 +5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:1/0/physics_layer_0/angular_velocity = 0.0 +5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:1/0/physics_layer_1/angular_velocity = 0.0 +7:1/0 = 0 +7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:1/0/physics_layer_0/angular_velocity = 0.0 +7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:1/0/physics_layer_1/angular_velocity = 0.0 +2:2/0 = 0 +2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:2/0/physics_layer_0/angular_velocity = 0.0 +2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:2/0/physics_layer_1/angular_velocity = 0.0 +3:2/0 = 0 +3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:2/0/physics_layer_0/angular_velocity = 0.0 +3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:2/0/physics_layer_1/angular_velocity = 0.0 +4:2/0 = 0 +4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:2/0/physics_layer_0/angular_velocity = 0.0 +4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:2/0/physics_layer_1/angular_velocity = 0.0 +7:2/0 = 0 +7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:2/0/physics_layer_0/angular_velocity = 0.0 +7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:2/0/physics_layer_1/angular_velocity = 0.0 +3:3/0 = 0 +3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:3/0/physics_layer_0/angular_velocity = 0.0 +3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:3/0/physics_layer_1/angular_velocity = 0.0 +4:3/0 = 0 +4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:3/0/physics_layer_0/angular_velocity = 0.0 +4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:3/0/physics_layer_1/angular_velocity = 0.0 +5:3/0 = 0 +5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:3/0/physics_layer_0/angular_velocity = 0.0 +5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:3/0/physics_layer_1/angular_velocity = 0.0 +7:3/0 = 0 +7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:3/0/physics_layer_0/angular_velocity = 0.0 +7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:3/0/physics_layer_1/angular_velocity = 0.0 +3:4/0 = 0 +3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:4/0/physics_layer_0/angular_velocity = 0.0 +3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:4/0/physics_layer_1/angular_velocity = 0.0 +4:4/0 = 0 +4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:4/0/physics_layer_0/angular_velocity = 0.0 +4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:4/0/physics_layer_1/angular_velocity = 0.0 +5:4/0 = 0 +5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:4/0/physics_layer_0/angular_velocity = 0.0 +5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:4/0/physics_layer_1/angular_velocity = 0.0 +7:4/0 = 0 +7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:4/0/physics_layer_0/angular_velocity = 0.0 +7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:4/0/physics_layer_1/angular_velocity = 0.0 +3:5/0 = 0 +3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:5/0/physics_layer_0/angular_velocity = 0.0 +3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:5/0/physics_layer_1/angular_velocity = 0.0 +4:5/0 = 0 +4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:5/0/physics_layer_0/angular_velocity = 0.0 +4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:5/0/physics_layer_1/angular_velocity = 0.0 +7:5/0 = 0 +7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:5/0/physics_layer_0/angular_velocity = 0.0 +7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:5/0/physics_layer_1/angular_velocity = 0.0 +3:6/0 = 0 +3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:6/0/physics_layer_0/angular_velocity = 0.0 +3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:6/0/physics_layer_1/angular_velocity = 0.0 +4:6/0 = 0 +4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:6/0/physics_layer_0/angular_velocity = 0.0 +4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:6/0/physics_layer_1/angular_velocity = 0.0 +7:6/0 = 0 +7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:6/0/physics_layer_0/angular_velocity = 0.0 +7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:6/0/physics_layer_1/angular_velocity = 0.0 +2:7/0 = 0 +2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:7/0/physics_layer_0/angular_velocity = 0.0 +2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:7/0/physics_layer_1/angular_velocity = 0.0 +3:7/0 = 0 +3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:7/0/physics_layer_0/angular_velocity = 0.0 +3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:7/0/physics_layer_1/angular_velocity = 0.0 +4:7/0 = 0 +4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:7/0/physics_layer_0/angular_velocity = 0.0 +4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:7/0/physics_layer_1/angular_velocity = 0.0 +5:7/0 = 0 +5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:7/0/physics_layer_0/angular_velocity = 0.0 +5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:7/0/physics_layer_1/angular_velocity = 0.0 +8:0/0 = 0 +8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:0/0/physics_layer_0/angular_velocity = 0.0 +8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:0/0/physics_layer_1/angular_velocity = 0.0 +9:0/0 = 0 +9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:0/0/physics_layer_0/angular_velocity = 0.0 +9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:0/0/physics_layer_1/angular_velocity = 0.0 +10:0/0 = 0 +10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:0/0/physics_layer_0/angular_velocity = 0.0 +10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:0/0/physics_layer_1/angular_velocity = 0.0 +11:0/0 = 0 +11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:0/0/physics_layer_0/angular_velocity = 0.0 +11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:0/0/physics_layer_1/angular_velocity = 0.0 +12:0/0 = 0 +12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:0/0/physics_layer_0/angular_velocity = 0.0 +12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:0/0/physics_layer_1/angular_velocity = 0.0 +13:0/0 = 0 +13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:0/0/physics_layer_0/angular_velocity = 0.0 +13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:0/0/physics_layer_1/angular_velocity = 0.0 +14:0/0 = 0 +14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:0/0/physics_layer_0/angular_velocity = 0.0 +14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:0/0/physics_layer_1/angular_velocity = 0.0 +14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) +14:0/0/custom_data_0 = &"Sign" +15:0/0 = 0 +15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:0/0/physics_layer_0/angular_velocity = 0.0 +15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:0/0/physics_layer_1/angular_velocity = 0.0 +16:0/0 = 0 +16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:0/0/physics_layer_0/angular_velocity = 0.0 +16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:0/0/physics_layer_1/angular_velocity = 0.0 +8:1/0 = 0 +8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:1/0/physics_layer_0/angular_velocity = 0.0 +8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:1/0/physics_layer_1/angular_velocity = 0.0 +9:1/0 = 0 +9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:1/0/physics_layer_0/angular_velocity = 0.0 +9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:1/0/physics_layer_1/angular_velocity = 0.0 +10:1/0 = 0 +10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:1/0/physics_layer_0/angular_velocity = 0.0 +10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:1/0/physics_layer_1/angular_velocity = 0.0 +11:1/0 = 0 +11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:1/0/physics_layer_0/angular_velocity = 0.0 +11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:1/0/physics_layer_1/angular_velocity = 0.0 +12:1/0 = 0 +12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:1/0/physics_layer_0/angular_velocity = 0.0 +12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:1/0/physics_layer_1/angular_velocity = 0.0 +13:1/0 = 0 +13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:1/0/physics_layer_0/angular_velocity = 0.0 +13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:1/0/physics_layer_1/angular_velocity = 0.0 +14:1/0 = 0 +14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:1/0/physics_layer_0/angular_velocity = 0.0 +14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:1/0/physics_layer_1/angular_velocity = 0.0 +15:1/0 = 0 +15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:1/0/physics_layer_0/angular_velocity = 0.0 +15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:1/0/physics_layer_1/angular_velocity = 0.0 +16:1/0 = 0 +16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:1/0/physics_layer_0/angular_velocity = 0.0 +16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:1/0/physics_layer_1/angular_velocity = 0.0 +8:2/0 = 0 +8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:2/0/physics_layer_0/angular_velocity = 0.0 +8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:2/0/physics_layer_1/angular_velocity = 0.0 +9:2/0 = 0 +9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:2/0/physics_layer_0/angular_velocity = 0.0 +9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:2/0/physics_layer_1/angular_velocity = 0.0 +10:2/0 = 0 +10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:2/0/physics_layer_0/angular_velocity = 0.0 +10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:2/0/physics_layer_1/angular_velocity = 0.0 +11:2/0 = 0 +11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:2/0/physics_layer_0/angular_velocity = 0.0 +11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:2/0/physics_layer_1/angular_velocity = 0.0 +12:2/0 = 0 +12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:2/0/physics_layer_0/angular_velocity = 0.0 +12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:2/0/physics_layer_1/angular_velocity = 0.0 +13:2/0 = 0 +13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:2/0/physics_layer_0/angular_velocity = 0.0 +13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:2/0/physics_layer_1/angular_velocity = 0.0 +14:2/0 = 0 +14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:2/0/physics_layer_0/angular_velocity = 0.0 +14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:2/0/physics_layer_1/angular_velocity = 0.0 +15:2/0 = 0 +15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:2/0/physics_layer_0/angular_velocity = 0.0 +15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:2/0/physics_layer_1/angular_velocity = 0.0 +16:2/0 = 0 +16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:2/0/physics_layer_0/angular_velocity = 0.0 +16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:2/0/physics_layer_1/angular_velocity = 0.0 +8:3/0 = 0 +8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:3/0/physics_layer_0/angular_velocity = 0.0 +8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:3/0/physics_layer_1/angular_velocity = 0.0 +9:3/0 = 0 +9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:3/0/physics_layer_0/angular_velocity = 0.0 +9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:3/0/physics_layer_1/angular_velocity = 0.0 +10:3/0 = 0 +10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:3/0/physics_layer_0/angular_velocity = 0.0 +10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:3/0/physics_layer_1/angular_velocity = 0.0 +11:3/0 = 0 +11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:3/0/physics_layer_0/angular_velocity = 0.0 +11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:3/0/physics_layer_1/angular_velocity = 0.0 +12:3/0 = 0 +12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:3/0/physics_layer_0/angular_velocity = 0.0 +12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:3/0/physics_layer_1/angular_velocity = 0.0 +13:3/0 = 0 +13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:3/0/physics_layer_0/angular_velocity = 0.0 +13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:3/0/physics_layer_1/angular_velocity = 0.0 +14:3/0 = 0 +14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:3/0/physics_layer_0/angular_velocity = 0.0 +14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:3/0/physics_layer_1/angular_velocity = 0.0 +15:3/0 = 0 +15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:3/0/physics_layer_0/angular_velocity = 0.0 +15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:3/0/physics_layer_1/angular_velocity = 0.0 +16:3/0 = 0 +16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:3/0/physics_layer_0/angular_velocity = 0.0 +16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:3/0/physics_layer_1/angular_velocity = 0.0 +8:4/0 = 0 +8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:4/0/physics_layer_0/angular_velocity = 0.0 +8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:4/0/physics_layer_1/angular_velocity = 0.0 +9:4/0 = 0 +9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:4/0/physics_layer_0/angular_velocity = 0.0 +9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:4/0/physics_layer_1/angular_velocity = 0.0 +10:4/0 = 0 +10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:4/0/physics_layer_0/angular_velocity = 0.0 +10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:4/0/physics_layer_1/angular_velocity = 0.0 +11:4/0 = 0 +11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:4/0/physics_layer_0/angular_velocity = 0.0 +11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) +11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:4/0/physics_layer_1/angular_velocity = 0.0 +12:4/0 = 0 +12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:4/0/physics_layer_0/angular_velocity = 0.0 +12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:4/0/physics_layer_1/angular_velocity = 0.0 +13:4/0 = 0 +13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:4/0/physics_layer_0/angular_velocity = 0.0 +13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) +13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:4/0/physics_layer_1/angular_velocity = 0.0 +14:4/0 = 0 +14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:4/0/physics_layer_0/angular_velocity = 0.0 +14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:4/0/physics_layer_1/angular_velocity = 0.0 +14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) +14:4/0/custom_data_0 = &"Inventory" +15:4/0 = 0 +15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:4/0/physics_layer_0/angular_velocity = 0.0 +15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:4/0/physics_layer_1/angular_velocity = 0.0 +16:4/0 = 0 +16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:4/0/physics_layer_0/angular_velocity = 0.0 +16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:4/0/physics_layer_1/angular_velocity = 0.0 +8:5/0 = 0 +8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:5/0/physics_layer_0/angular_velocity = 0.0 +8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:5/0/physics_layer_1/angular_velocity = 0.0 +9:5/0 = 0 +9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:5/0/physics_layer_0/angular_velocity = 0.0 +9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:5/0/physics_layer_1/angular_velocity = 0.0 +10:5/0 = 0 +10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:5/0/physics_layer_0/angular_velocity = 0.0 +10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:5/0/physics_layer_1/angular_velocity = 0.0 +11:5/0 = 0 +11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:5/0/physics_layer_0/angular_velocity = 0.0 +11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:5/0/physics_layer_1/angular_velocity = 0.0 +12:5/0 = 0 +12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:5/0/physics_layer_0/angular_velocity = 0.0 +12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:5/0/physics_layer_1/angular_velocity = 0.0 +13:5/0 = 0 +13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:5/0/physics_layer_0/angular_velocity = 0.0 +13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:5/0/physics_layer_1/angular_velocity = 0.0 +14:5/0 = 0 +14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:5/0/physics_layer_0/angular_velocity = 0.0 +14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:5/0/physics_layer_1/angular_velocity = 0.0 +15:5/0 = 0 +15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:5/0/physics_layer_0/angular_velocity = 0.0 +15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:5/0/physics_layer_1/angular_velocity = 0.0 +16:5/0 = 0 +16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:5/0/physics_layer_0/angular_velocity = 0.0 +16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:5/0/physics_layer_1/angular_velocity = 0.0 +8:6/0 = 0 +8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:6/0/physics_layer_0/angular_velocity = 0.0 +8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:6/0/physics_layer_1/angular_velocity = 0.0 +9:6/0 = 0 +9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:6/0/physics_layer_0/angular_velocity = 0.0 +9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:6/0/physics_layer_1/angular_velocity = 0.0 +10:6/0 = 0 +10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:6/0/physics_layer_0/angular_velocity = 0.0 +10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:6/0/physics_layer_1/angular_velocity = 0.0 +11:6/0 = 0 +11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:6/0/physics_layer_0/angular_velocity = 0.0 +11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) +11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:6/0/physics_layer_1/angular_velocity = 0.0 +12:6/0 = 0 +12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:6/0/physics_layer_0/angular_velocity = 0.0 +12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:6/0/physics_layer_1/angular_velocity = 0.0 +13:6/0 = 0 +13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:6/0/physics_layer_0/angular_velocity = 0.0 +13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) +13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:6/0/physics_layer_1/angular_velocity = 0.0 +14:6/0 = 0 +14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:6/0/physics_layer_0/angular_velocity = 0.0 +14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:6/0/physics_layer_1/angular_velocity = 0.0 +15:6/0 = 0 +15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:6/0/physics_layer_0/angular_velocity = 0.0 +15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:6/0/physics_layer_1/angular_velocity = 0.0 +16:6/0 = 0 +16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:6/0/physics_layer_0/angular_velocity = 0.0 +16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:6/0/physics_layer_1/angular_velocity = 0.0 + +[sub_resource type="TileSet" id="TileSet_kf7eg"] +physics_layer_0/collision_layer = 1 +physics_layer_1/collision_layer = 2 +physics_layer_1/collision_mask = 2 +custom_data_layer_0/name = "Type" +custom_data_layer_0/type = 21 +sources/0 = SubResource("TileSetAtlasSource_easgx") + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5hryl"] +bg_color = Color(0.85098, 0.894118, 0.937255, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.113725, 0.113725, 0.113725, 1) +corner_radius_top_left = 7 +corner_radius_top_right = 7 +corner_radius_bottom_right = 7 +corner_radius_bottom_left = 7 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_xj4ar"] +size = Vector2(64, 57) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_18i13"] +size = Vector2(42, 57) + +[sub_resource type="Curve2D" id="Curve2D_usrhf"] +_data = { +"points": PackedVector2Array(-96.4111, 42.3785, 0, 0, 222, 0, 0, 0, 0, 0, 1550, 0) +} +point_count = 2 + +[node name="ExampleScene2D" type="Node2D"] + +[node name="Background" type="CanvasLayer" parent="."] +layer = -3 + +[node name="ColorRect" type="ColorRect" parent="Background"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -311.0 +offset_top = -173.0 +offset_right = 981.0 +offset_bottom = 548.0 +grow_horizontal = 2 +grow_vertical = 2 +auto_translate = false +localize_numeral_system = false +color = Color(0.137255, 0.14902, 0.196078, 1) + +[node name="TileMap" type="TileMap" parent="."] +z_index = -1 +scale = Vector2(3, 3) +tile_set = SubResource("TileSet_kf7eg") +format = 2 +layer_0/name = "Background" +layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) +layer_1/name = "Terrain" +layer_1/enabled = true +layer_1/modulate = Color(1, 1, 1, 1) +layer_1/y_sort_enabled = false +layer_1/y_sort_origin = 0 +layer_1/z_index = 1 +layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 524305, 720896, 6, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 524306, 786432, 6, 524307, 786432, 6, 524308, 786432, 6, 524309, 786432, 6, 524310, 786432, 6, 524311, 786432, 6, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 524317, 851968, 6, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 524312, 786432, 6, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 524313, 786432, 6, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 524314, 786432, 6, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 524315, 786432, 6, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, 524316, 786432, 6, -196593, 1048576, 6, -65509, 720896, 3, -65510, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, 524282, 786432, 5, 524283, 786432, 5, 524284, 786432, 5, 524285, 786432, 5, 524281, 720896, 5, 524286, 851968, 5, 589817, 720896, 6, 589818, 786432, 6, 589819, 786432, 6, 589820, 786432, 6, 589821, 786432, 6, 589822, 851968, 6, -196569, 720896, 4, -131033, 720896, 5, -65497, 720896, 5, 39, 720896, 5, 65575, 720896, 5, 131111, 720896, 5, 196647, 720896, 5, 262183, 720896, 5, 327719, 720896, 5, 393255, 720896, 5, 458791, 720896, 5, 524327, 720896, 5, 589863, 720896, 5, 655399, 720896, 6, -262104, 917504, 6, -196568, 786432, 4, -131032, 786432, 5, -65496, 655360, 6, 40, 786432, 5, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 786432, 5, 327720, 786432, 5, 393256, 786432, 5, 458792, 786432, 5, 524328, 655360, 6, 589864, 786432, 5, 655400, 786432, 6, -262103, 983040, 5, -196567, 786432, 4, -131031, 786432, 5, -65495, 786432, 5, 41, 589824, 6, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, 393257, 786432, 5, 458793, 786432, 5, 524329, 786432, 5, 589865, 786432, 5, 655401, 786432, 6, -262102, 720896, 3, -196566, 786432, 4, -131030, 786432, 5, -65494, 786432, 5, 42, 786432, 5, 65578, 786432, 5, 131114, 786432, 5, 196650, 786432, 5, 262186, 655360, 6, 327722, 786432, 5, 393258, 786432, 5, 458794, 786432, 5, 524330, 786432, 5, 589866, 786432, 5, 655402, 786432, 6, -262101, 1048576, 6, -196565, 786432, 4, -131029, 786432, 5, -65493, 786432, 5, 43, 786432, 5, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 786432, 5, 393259, 655360, 6, 458795, 655360, 6, 524331, 786432, 5, 589867, 786432, 5, 655403, 786432, 6, -262100, 720896, 3, -196564, 786432, 4, -131028, 786432, 5, -65492, 786432, 5, 44, 786432, 5, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, 393260, 786432, 5, 458796, 786432, 5, 524332, 786432, 5, 589868, 786432, 5, 655404, 786432, 6, -262099, 983040, 6, -196563, 786432, 4, -131027, 786432, 5, -65491, 786432, 5, 45, 589824, 6, 65581, 655360, 6, 131117, 655360, 6, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, 393261, 786432, 5, 458797, 786432, 5, 524333, 786432, 5, 589869, 655360, 6, 655405, 786432, 6, -196562, 786432, 4, -131026, 786432, 5, -65490, 786432, 5, 46, 786432, 5, 65582, 786432, 5, 131118, 786432, 5, 196654, 786432, 5, 262190, 786432, 5, 327726, 786432, 5, 393262, 786432, 5, 458798, 786432, 5, 524334, 786432, 5, 589870, 786432, 5, 655406, 786432, 6, -196561, 851968, 4, -131025, 851968, 5, -65489, 851968, 5, 47, 851968, 5, 65583, 851968, 5, 131119, 851968, 5, 196655, 851968, 5, 262191, 851968, 5, 327727, 851968, 5, 393263, 851968, 5, 458799, 851968, 5, 524335, 851968, 5, 589871, 851968, 5, 655407, 851968, 6, -131042, 720896, 4, -65506, 720896, 5, 30, 720896, 5, 65566, 720896, 5, 131102, 720896, 5, 196638, 720896, 5, 262174, 720896, 5, 327710, 720896, 5, 393246, 720896, 5, 458782, 720896, 5, 524318, 720896, 5, -196577, 917504, 6, -131041, 786432, 4, -65505, 786432, 5, 31, 655360, 6, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 786432, 5, 458783, 786432, 5, 524319, 786432, 5, -196576, 983040, 5, -131040, 786432, 4, -65504, 786432, 5, 32, 786432, 5, 65568, 589824, 6, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 524320, 786432, 5, -196575, 720896, 3, -131039, 786432, 4, -65503, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 786432, 5, 196641, 786432, 5, 262177, 786432, 5, 327713, 655360, 6, 393249, 786432, 5, 458785, 786432, 5, 524321, 786432, 5, -196574, 1048576, 6, -131038, 786432, 4, -65502, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 786432, 5, 327714, 786432, 5, 393250, 786432, 5, 458786, 655360, 6, 524322, 655360, 6, -196573, 720896, 3, -131037, 786432, 4, -65501, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 524323, 786432, 5, -196572, 983040, 6, -131036, 786432, 4, -65500, 786432, 5, 36, 786432, 5, 65572, 589824, 6, 131108, 655360, 6, 196644, 655360, 6, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 786432, 5, 524324, 786432, 5, -131035, 786432, 4, -65499, 786432, 5, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 786432, 5, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524325, 786432, 5, -131034, 851968, 4, -65498, 851968, 5, 38, 851968, 5, 65574, 851968, 5, 131110, 851968, 5, 196646, 851968, 5, 262182, 851968, 5, 327718, 851968, 5, 393254, 851968, 5, 458790, 851968, 5, 524326, 851968, 5, 589854, 720896, 5, 655390, 720896, 5, 720926, 720896, 6, 589855, 655360, 6, 655391, 786432, 5, 720927, 786432, 6, 589856, 786432, 5, 655392, 786432, 5, 720928, 786432, 6, 589857, 786432, 5, 655393, 786432, 5, 720929, 786432, 6, 589858, 786432, 5, 655394, 786432, 5, 720930, 786432, 6, 589859, 786432, 5, 655395, 786432, 5, 720931, 786432, 6, 589860, 786432, 5, 655396, 655360, 6, 720932, 786432, 6, 589861, 786432, 5, 655397, 786432, 5, 720933, 786432, 6, 589862, 851968, 5, 655398, 851968, 5, 720934, 851968, 6, -458704, 720896, 4, -393168, 720896, 5, -327632, 720896, 5, -262096, 720896, 5, -196560, 720896, 5, -131024, 720896, 5, -65488, 720896, 5, 48, 720896, 5, 65584, 720896, 5, 131120, 720896, 5, 196656, 720896, 5, 262192, 720896, 5, 327728, 720896, 5, 393264, 720896, 6, -524239, 917504, 6, -458703, 786432, 4, -393167, 786432, 5, -327631, 655360, 6, -262095, 786432, 5, -196559, 786432, 5, -131023, 786432, 5, -65487, 786432, 5, 49, 786432, 5, 65585, 786432, 5, 131121, 786432, 5, 196657, 786432, 5, 262193, 655360, 6, 327729, 786432, 5, 393265, 786432, 6, -524238, 983040, 5, -458702, 786432, 4, -393166, 786432, 5, -327630, 786432, 5, -262094, 589824, 6, -196558, 786432, 5, -131022, 786432, 5, -65486, 786432, 5, 50, 786432, 5, 65586, 786432, 5, 131122, 786432, 5, 196658, 786432, 5, 262194, 786432, 5, 327730, 786432, 5, 393266, 786432, 6, -524237, 720896, 3, -458701, 786432, 4, -393165, 786432, 5, -327629, 786432, 5, -262093, 786432, 5, -196557, 786432, 5, -131021, 786432, 5, -65485, 786432, 5, 51, 655360, 6, 65587, 786432, 5, 131123, 786432, 5, 196659, 786432, 5, 262195, 786432, 5, 327731, 786432, 5, 393267, 786432, 6, -524236, 1048576, 6, -458700, 786432, 4, -393164, 786432, 5, -327628, 786432, 5, -262092, 786432, 5, -196556, 786432, 5, -131020, 786432, 5, -65484, 786432, 5, 52, 786432, 5, 65588, 786432, 5, 131124, 655360, 6, 196660, 655360, 6, 262196, 786432, 5, 327732, 786432, 5, 393268, 786432, 6, -524235, 720896, 3, -458699, 786432, 4, -393163, 786432, 5, -327627, 786432, 5, -262091, 786432, 5, -196555, 786432, 5, -131019, 786432, 5, -65483, 786432, 5, 53, 786432, 5, 65589, 786432, 5, 131125, 786432, 5, 196661, 786432, 5, 262197, 786432, 5, 327733, 786432, 5, 393269, 786432, 6, -524234, 983040, 6, -458698, 786432, 4, -393162, 786432, 5, -327626, 786432, 5, -262090, 589824, 6, -196554, 655360, 6, -131018, 655360, 6, -65482, 786432, 5, 54, 786432, 5, 65590, 786432, 5, 131126, 786432, 5, 196662, 786432, 5, 262198, 786432, 5, 327734, 655360, 6, 393270, 786432, 6, -458697, 786432, 4, -393161, 786432, 5, -327625, 786432, 5, -262089, 786432, 5, -196553, 786432, 5, -131017, 786432, 5, -65481, 786432, 5, 55, 786432, 5, 65591, 786432, 5, 131127, 786432, 5, 196663, 786432, 5, 262199, 786432, 5, 327735, 786432, 5, 393271, 786432, 6, -458696, 851968, 4, -393160, 851968, 5, -327624, 851968, 5, -262088, 851968, 5, -196552, 851968, 5, -131016, 851968, 5, -65480, 851968, 5, 56, 851968, 5, 65592, 851968, 5, 131128, 851968, 5, 196664, 851968, 5, 262200, 851968, 5, 327736, 851968, 5, 393272, 851968, 6) + +[node name="UI" type="CanvasLayer" parent="."] + +[node name="UIInventory" parent="UI" instance=ExtResource("2_whpvu")] +unique_name_in_owner = true +visible = false + +[node name="UISign" parent="UI" instance=ExtResource("3_rbo5b")] +unique_name_in_owner = true +visible = false + +[node name="Camera2D" type="Camera2D" parent="."] +position = Vector2(374, -216) +zoom = Vector2(1.5, 1.5) + +[node name="PhantomCameraHost" type="Node" parent="Camera2D"] +script = ExtResource("4_yddet") + +[node name="Label" type="Label" parent="."] +offset_left = 167.0 +offset_top = -133.0 +offset_right = 332.0 +offset_bottom = -69.0 +theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1) +theme_override_fonts/font = ExtResource("8_6pcaf") +text = "[WASD] to move +[Space] to jump" + +[node name="Player" type="Node" parent="."] + +[node name="CharacterBody2D" type="CharacterBody2D" parent="Player"] +position = Vector2(221, -28) +script = ExtResource("7_ipd3c") +metadata/_edit_group_ = true + +[node name="DarkOverlay" type="ColorRect" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +visible = false +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -1000.0 +offset_top = -1000.0 +offset_right = 1000.0 +offset_bottom = 1000.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.615686) + +[node name="InteractionPrompt" type="Panel" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +visible = false +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -16.0 +offset_top = -66.0 +offset_right = 16.0 +offset_bottom = -34.0 +grow_horizontal = 2 +grow_vertical = 0 +size_flags_vertical = 0 +theme_override_styles/panel = SubResource("StyleBoxFlat_5hryl") + +[node name="Label" type="Label" parent="Player/CharacterBody2D/InteractionPrompt"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -3.0 +offset_bottom = 5.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_fonts/font = ExtResource("8_6pcaf") +theme_override_font_sizes/font_size = 26 +text = "F" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="PlayerSprite" type="Sprite2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +scale = Vector2(0.5, 0.5) +texture = ExtResource("9_cspd2") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player/CharacterBody2D"] +position = Vector2(0, -0.5) +shape = SubResource("RectangleShape2D_xj4ar") + +[node name="PlayerArea2D" type="Area2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +collision_layer = 2 +collision_mask = 2 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player/CharacterBody2D/PlayerArea2D"] +position = Vector2(0, -0.5) +shape = SubResource("RectangleShape2D_18i13") + +[node name="ItemFocusPhantomCamera2D" type="Node2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +position = Vector2(0, -122) +script = ExtResource("5_x25dj") +priority_override = null +priority = 0 +zoom = Vector2(2, 2) +follow_mode = 0 +tween_parameters = ExtResource("10_mh1yw") +tween_on_load = true +inactive_update_mode = 0 + +[node name="InventoryPhantomCamera2D" type="Node2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +position = Vector2(-183, -5) +script = ExtResource("5_x25dj") +priority_override = null +priority = 0 +zoom = Vector2(2.5, 2.5) +follow_mode = 0 +tween_parameters = ExtResource("11_apay3") +tween_on_load = true +inactive_update_mode = 0 + +[node name="Label" type="Label" parent="Player"] +visible = false +offset_left = 167.0 +offset_top = -145.0 +offset_right = 332.0 +offset_bottom = -81.0 +theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1) +theme_override_fonts/font = ExtResource("8_6pcaf") +text = "[WASD] to move +[Space] to jump" + +[node name="PlayerPhantomCamera2D" type="Node2D" parent="."] +unique_name_in_owner = true +position = Vector2(374, -216) +script = ExtResource("5_x25dj") +priority_override = null +priority = 5 +zoom = Vector2(1.5, 1.5) +follow_mode = 4 +follow_target = NodePath("../Player/CharacterBody2D") +follow_path = NodePath("../Path2D") +follow_parameters/damping = true +follow_parameters/damping_value = 5.0 +tween_parameters = ExtResource("6_4vtmp") +tween_on_load = false +inactive_update_mode = 0 + +[node name="Path2D" type="Path2D" parent="."] +position = Vector2(152, -216) +curve = SubResource("Curve2D_usrhf") diff --git a/addons/phantom_camera/examples/example_scenes/2D/2DTweeningExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/2D/2DTweeningExampleScene.tscn new file mode 100644 index 0000000..f63b3e2 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/2D/2DTweeningExampleScene.tscn @@ -0,0 +1,909 @@ +[gd_scene load_steps=23 format=3 uid="uid://cpyb3ucwcqj8l"] + +[ext_resource type="Texture2D" uid="uid://c77npili4pel4" path="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" id="1_oo2bo"] +[ext_resource type="PackedScene" uid="uid://dg7rhrymsrrrm" path="res://addons/phantom_camera/examples/ui/UIInventory.tscn" id="2_as4e6"] +[ext_resource type="PackedScene" uid="uid://iq5xd1ob1res" path="res://addons/phantom_camera/examples/ui/UISign.tscn" id="3_6yi7w"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="4_bb7en"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2D.gd" id="5_kikl5"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="6_8u8cj"] +[ext_resource type="Resource" uid="uid://euybd2w0bax" path="res://addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera2DTween.tres" id="6_gu0o0"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/PlayerCharacterBody2D.gd" id="6_oxdpf"] +[ext_resource type="Texture2D" uid="uid://cwep0on2tthn7" path="res://addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png" id="8_ok3b7"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/2D/2D_trigger_area.gd" id="9_184pu"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="11_myq47"] + +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_easgx"] +texture = ExtResource("1_oo2bo") +0:0/0 = 0 +0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_0/angular_velocity = 0.0 +0:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +0:0/0/physics_layer_1/angular_velocity = 0.0 +1:0/0 = 0 +1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:0/0/physics_layer_0/angular_velocity = 0.0 +1:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +1:0/0/physics_layer_1/angular_velocity = 0.0 +2:0/0 = 0 +2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:0/0/physics_layer_0/angular_velocity = 0.0 +2:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:0/0/physics_layer_1/angular_velocity = 0.0 +3:0/0 = 0 +3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:0/0/physics_layer_0/angular_velocity = 0.0 +3:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:0/0/physics_layer_1/angular_velocity = 0.0 +4:0/0 = 0 +4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:0/0/physics_layer_0/angular_velocity = 0.0 +4:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:0/0/physics_layer_1/angular_velocity = 0.0 +5:0/0 = 0 +5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:0/0/physics_layer_0/angular_velocity = 0.0 +5:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:0/0/physics_layer_1/angular_velocity = 0.0 +6:0/0 = 0 +6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +6:0/0/physics_layer_0/angular_velocity = 0.0 +6:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +6:0/0/physics_layer_1/angular_velocity = 0.0 +7:0/0 = 0 +7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:0/0/physics_layer_0/angular_velocity = 0.0 +7:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:0/0/physics_layer_1/angular_velocity = 0.0 +0:1/0 = 0 +0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +0:1/0/physics_layer_0/angular_velocity = 0.0 +0:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +0:1/0/physics_layer_1/angular_velocity = 0.0 +1:1/0 = 0 +1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +1:1/0/physics_layer_0/angular_velocity = 0.0 +1:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +1:1/0/physics_layer_1/angular_velocity = 0.0 +2:1/0 = 0 +2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:1/0/physics_layer_0/angular_velocity = 0.0 +2:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:1/0/physics_layer_1/angular_velocity = 0.0 +3:1/0 = 0 +3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:1/0/physics_layer_0/angular_velocity = 0.0 +3:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:1/0/physics_layer_1/angular_velocity = 0.0 +4:1/0 = 0 +4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:1/0/physics_layer_0/angular_velocity = 0.0 +4:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:1/0/physics_layer_1/angular_velocity = 0.0 +5:1/0 = 0 +5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:1/0/physics_layer_0/angular_velocity = 0.0 +5:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:1/0/physics_layer_1/angular_velocity = 0.0 +7:1/0 = 0 +7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:1/0/physics_layer_0/angular_velocity = 0.0 +7:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:1/0/physics_layer_1/angular_velocity = 0.0 +2:2/0 = 0 +2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:2/0/physics_layer_0/angular_velocity = 0.0 +2:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:2/0/physics_layer_1/angular_velocity = 0.0 +3:2/0 = 0 +3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:2/0/physics_layer_0/angular_velocity = 0.0 +3:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:2/0/physics_layer_1/angular_velocity = 0.0 +4:2/0 = 0 +4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:2/0/physics_layer_0/angular_velocity = 0.0 +4:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:2/0/physics_layer_1/angular_velocity = 0.0 +7:2/0 = 0 +7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:2/0/physics_layer_0/angular_velocity = 0.0 +7:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:2/0/physics_layer_1/angular_velocity = 0.0 +3:3/0 = 0 +3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:3/0/physics_layer_0/angular_velocity = 0.0 +3:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:3/0/physics_layer_1/angular_velocity = 0.0 +4:3/0 = 0 +4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:3/0/physics_layer_0/angular_velocity = 0.0 +4:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:3/0/physics_layer_1/angular_velocity = 0.0 +7:3/0 = 0 +7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:3/0/physics_layer_0/angular_velocity = 0.0 +7:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +7:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:3/0/physics_layer_1/angular_velocity = 0.0 +3:4/0 = 0 +3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:4/0/physics_layer_0/angular_velocity = 0.0 +3:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:4/0/physics_layer_1/angular_velocity = 0.0 +4:4/0 = 0 +4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:4/0/physics_layer_0/angular_velocity = 0.0 +4:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:4/0/physics_layer_1/angular_velocity = 0.0 +5:4/0 = 0 +5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:4/0/physics_layer_0/angular_velocity = 0.0 +5:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:4/0/physics_layer_1/angular_velocity = 0.0 +7:4/0 = 0 +7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:4/0/physics_layer_0/angular_velocity = 0.0 +7:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:4/0/physics_layer_1/angular_velocity = 0.0 +3:5/0 = 0 +3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:5/0/physics_layer_0/angular_velocity = 0.0 +3:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:5/0/physics_layer_1/angular_velocity = 0.0 +4:5/0 = 0 +4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:5/0/physics_layer_0/angular_velocity = 0.0 +4:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:5/0/physics_layer_1/angular_velocity = 0.0 +7:5/0 = 0 +7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:5/0/physics_layer_0/angular_velocity = 0.0 +7:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:5/0/physics_layer_1/angular_velocity = 0.0 +3:6/0 = 0 +3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:6/0/physics_layer_0/angular_velocity = 0.0 +3:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:6/0/physics_layer_1/angular_velocity = 0.0 +4:6/0 = 0 +4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:6/0/physics_layer_0/angular_velocity = 0.0 +4:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:6/0/physics_layer_1/angular_velocity = 0.0 +7:6/0 = 0 +7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +7:6/0/physics_layer_0/angular_velocity = 0.0 +7:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +7:6/0/physics_layer_1/angular_velocity = 0.0 +2:7/0 = 0 +2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +2:7/0/physics_layer_0/angular_velocity = 0.0 +2:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +2:7/0/physics_layer_1/angular_velocity = 0.0 +3:7/0 = 0 +3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +3:7/0/physics_layer_0/angular_velocity = 0.0 +3:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +3:7/0/physics_layer_1/angular_velocity = 0.0 +4:7/0 = 0 +4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +4:7/0/physics_layer_0/angular_velocity = 0.0 +4:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +4:7/0/physics_layer_1/angular_velocity = 0.0 +5:7/0 = 0 +5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:7/0/physics_layer_0/angular_velocity = 0.0 +5:7/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:7/0/physics_layer_1/angular_velocity = 0.0 +8:0/0 = 0 +8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:0/0/physics_layer_0/angular_velocity = 0.0 +8:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:0/0/physics_layer_1/angular_velocity = 0.0 +9:0/0 = 0 +9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:0/0/physics_layer_0/angular_velocity = 0.0 +9:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:0/0/physics_layer_1/angular_velocity = 0.0 +10:0/0 = 0 +10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:0/0/physics_layer_0/angular_velocity = 0.0 +10:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:0/0/physics_layer_1/angular_velocity = 0.0 +11:0/0 = 0 +11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:0/0/physics_layer_0/angular_velocity = 0.0 +11:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:0/0/physics_layer_1/angular_velocity = 0.0 +12:0/0 = 0 +12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:0/0/physics_layer_0/angular_velocity = 0.0 +12:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:0/0/physics_layer_1/angular_velocity = 0.0 +13:0/0 = 0 +13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:0/0/physics_layer_0/angular_velocity = 0.0 +13:0/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:0/0/physics_layer_1/angular_velocity = 0.0 +14:0/0 = 0 +14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:0/0/physics_layer_0/angular_velocity = 0.0 +14:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:0/0/physics_layer_1/angular_velocity = 0.0 +14:0/0/physics_layer_1/polygon_0/points = PackedVector2Array(8, -8, 8, 8, -8, 8) +14:0/0/custom_data_0 = &"Sign" +15:0/0 = 0 +15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:0/0/physics_layer_0/angular_velocity = 0.0 +15:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:0/0/physics_layer_1/angular_velocity = 0.0 +16:0/0 = 0 +16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:0/0/physics_layer_0/angular_velocity = 0.0 +16:0/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:0/0/physics_layer_1/angular_velocity = 0.0 +8:1/0 = 0 +8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:1/0/physics_layer_0/angular_velocity = 0.0 +8:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:1/0/physics_layer_1/angular_velocity = 0.0 +9:1/0 = 0 +9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:1/0/physics_layer_0/angular_velocity = 0.0 +9:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:1/0/physics_layer_1/angular_velocity = 0.0 +10:1/0 = 0 +10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:1/0/physics_layer_0/angular_velocity = 0.0 +10:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:1/0/physics_layer_1/angular_velocity = 0.0 +11:1/0 = 0 +11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:1/0/physics_layer_0/angular_velocity = 0.0 +11:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:1/0/physics_layer_1/angular_velocity = 0.0 +12:1/0 = 0 +12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:1/0/physics_layer_0/angular_velocity = 0.0 +12:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:1/0/physics_layer_1/angular_velocity = 0.0 +13:1/0 = 0 +13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:1/0/physics_layer_0/angular_velocity = 0.0 +13:1/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:1/0/physics_layer_1/angular_velocity = 0.0 +14:1/0 = 0 +14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:1/0/physics_layer_0/angular_velocity = 0.0 +14:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:1/0/physics_layer_1/angular_velocity = 0.0 +15:1/0 = 0 +15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:1/0/physics_layer_0/angular_velocity = 0.0 +15:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:1/0/physics_layer_1/angular_velocity = 0.0 +16:1/0 = 0 +16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:1/0/physics_layer_0/angular_velocity = 0.0 +16:1/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:1/0/physics_layer_1/angular_velocity = 0.0 +8:2/0 = 0 +8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:2/0/physics_layer_0/angular_velocity = 0.0 +8:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:2/0/physics_layer_1/angular_velocity = 0.0 +9:2/0 = 0 +9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:2/0/physics_layer_0/angular_velocity = 0.0 +9:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:2/0/physics_layer_1/angular_velocity = 0.0 +10:2/0 = 0 +10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:2/0/physics_layer_0/angular_velocity = 0.0 +10:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:2/0/physics_layer_1/angular_velocity = 0.0 +11:2/0 = 0 +11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:2/0/physics_layer_0/angular_velocity = 0.0 +11:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:2/0/physics_layer_1/angular_velocity = 0.0 +12:2/0 = 0 +12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:2/0/physics_layer_0/angular_velocity = 0.0 +12:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:2/0/physics_layer_1/angular_velocity = 0.0 +13:2/0 = 0 +13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:2/0/physics_layer_0/angular_velocity = 0.0 +13:2/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:2/0/physics_layer_1/angular_velocity = 0.0 +14:2/0 = 0 +14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:2/0/physics_layer_0/angular_velocity = 0.0 +14:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:2/0/physics_layer_1/angular_velocity = 0.0 +15:2/0 = 0 +15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:2/0/physics_layer_0/angular_velocity = 0.0 +15:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:2/0/physics_layer_1/angular_velocity = 0.0 +16:2/0 = 0 +16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:2/0/physics_layer_0/angular_velocity = 0.0 +16:2/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:2/0/physics_layer_1/angular_velocity = 0.0 +8:3/0 = 0 +8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:3/0/physics_layer_0/angular_velocity = 0.0 +8:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +8:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:3/0/physics_layer_1/angular_velocity = 0.0 +9:3/0 = 0 +9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:3/0/physics_layer_0/angular_velocity = 0.0 +9:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +9:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:3/0/physics_layer_1/angular_velocity = 0.0 +10:3/0 = 0 +10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:3/0/physics_layer_0/angular_velocity = 0.0 +10:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +10:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:3/0/physics_layer_1/angular_velocity = 0.0 +11:3/0 = 0 +11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:3/0/physics_layer_0/angular_velocity = 0.0 +11:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:3/0/physics_layer_1/angular_velocity = 0.0 +12:3/0 = 0 +12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:3/0/physics_layer_0/angular_velocity = 0.0 +12:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:3/0/physics_layer_1/angular_velocity = 0.0 +13:3/0 = 0 +13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:3/0/physics_layer_0/angular_velocity = 0.0 +13:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:3/0/physics_layer_1/angular_velocity = 0.0 +14:3/0 = 0 +14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:3/0/physics_layer_0/angular_velocity = 0.0 +14:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:3/0/physics_layer_1/angular_velocity = 0.0 +15:3/0 = 0 +15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:3/0/physics_layer_0/angular_velocity = 0.0 +15:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:3/0/physics_layer_1/angular_velocity = 0.0 +16:3/0 = 0 +16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:3/0/physics_layer_0/angular_velocity = 0.0 +16:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:3/0/physics_layer_1/angular_velocity = 0.0 +8:4/0 = 0 +8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:4/0/physics_layer_0/angular_velocity = 0.0 +8:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:4/0/physics_layer_1/angular_velocity = 0.0 +9:4/0 = 0 +9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:4/0/physics_layer_0/angular_velocity = 0.0 +9:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:4/0/physics_layer_1/angular_velocity = 0.0 +10:4/0 = 0 +10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:4/0/physics_layer_0/angular_velocity = 0.0 +10:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:4/0/physics_layer_1/angular_velocity = 0.0 +11:4/0 = 0 +11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:4/0/physics_layer_0/angular_velocity = 0.0 +11:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-7, 2.5, -5, -2, -2.5, -5, 2, -7, 8, -8, 8, 8, -8, 8) +11:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:4/0/physics_layer_1/angular_velocity = 0.0 +12:4/0 = 0 +12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:4/0/physics_layer_0/angular_velocity = 0.0 +12:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:4/0/physics_layer_1/angular_velocity = 0.0 +13:4/0 = 0 +13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:4/0/physics_layer_0/angular_velocity = 0.0 +13:4/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 0, -6, 4, -1.5, 6.5, 1.5, 8, 8, -8, 8) +13:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:4/0/physics_layer_1/angular_velocity = 0.0 +14:4/0 = 0 +14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:4/0/physics_layer_0/angular_velocity = 0.0 +14:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:4/0/physics_layer_1/angular_velocity = 0.0 +14:4/0/physics_layer_1/polygon_0/points = PackedVector2Array(-8, -8, -8, 8, 8, 8, 8, -8) +14:4/0/custom_data_0 = &"Inventory" +15:4/0 = 0 +15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:4/0/physics_layer_0/angular_velocity = 0.0 +15:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:4/0/physics_layer_1/angular_velocity = 0.0 +16:4/0 = 0 +16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:4/0/physics_layer_0/angular_velocity = 0.0 +16:4/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:4/0/physics_layer_1/angular_velocity = 0.0 +8:5/0 = 0 +8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:5/0/physics_layer_0/angular_velocity = 0.0 +8:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:5/0/physics_layer_1/angular_velocity = 0.0 +9:5/0 = 0 +9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:5/0/physics_layer_0/angular_velocity = 0.0 +9:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:5/0/physics_layer_1/angular_velocity = 0.0 +10:5/0 = 0 +10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:5/0/physics_layer_0/angular_velocity = 0.0 +10:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:5/0/physics_layer_1/angular_velocity = 0.0 +11:5/0 = 0 +11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:5/0/physics_layer_0/angular_velocity = 0.0 +11:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +11:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:5/0/physics_layer_1/angular_velocity = 0.0 +12:5/0 = 0 +12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:5/0/physics_layer_0/angular_velocity = 0.0 +12:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:5/0/physics_layer_1/angular_velocity = 0.0 +13:5/0 = 0 +13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:5/0/physics_layer_0/angular_velocity = 0.0 +13:5/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +13:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:5/0/physics_layer_1/angular_velocity = 0.0 +14:5/0 = 0 +14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:5/0/physics_layer_0/angular_velocity = 0.0 +14:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:5/0/physics_layer_1/angular_velocity = 0.0 +15:5/0 = 0 +15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:5/0/physics_layer_0/angular_velocity = 0.0 +15:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:5/0/physics_layer_1/angular_velocity = 0.0 +16:5/0 = 0 +16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:5/0/physics_layer_0/angular_velocity = 0.0 +16:5/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:5/0/physics_layer_1/angular_velocity = 0.0 +8:6/0 = 0 +8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +8:6/0/physics_layer_0/angular_velocity = 0.0 +8:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +8:6/0/physics_layer_1/angular_velocity = 0.0 +9:6/0 = 0 +9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +9:6/0/physics_layer_0/angular_velocity = 0.0 +9:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +9:6/0/physics_layer_1/angular_velocity = 0.0 +10:6/0 = 0 +10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +10:6/0/physics_layer_0/angular_velocity = 0.0 +10:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +10:6/0/physics_layer_1/angular_velocity = 0.0 +11:6/0 = 0 +11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +11:6/0/physics_layer_0/angular_velocity = 0.0 +11:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, 1, 6.5, -3, 3, -6.5, -1.5) +11:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +11:6/0/physics_layer_1/angular_velocity = 0.0 +12:6/0 = 0 +12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +12:6/0/physics_layer_0/angular_velocity = 0.0 +12:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 8, 8, -8, 8) +12:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +12:6/0/physics_layer_1/angular_velocity = 0.0 +13:6/0 = 0 +13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +13:6/0/physics_layer_0/angular_velocity = 0.0 +13:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-8, -8, 8, -8, 6, -0.5, 3, 3.5, -1.5, 6.5, -8, 8) +13:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +13:6/0/physics_layer_1/angular_velocity = 0.0 +14:6/0 = 0 +14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +14:6/0/physics_layer_0/angular_velocity = 0.0 +14:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +14:6/0/physics_layer_1/angular_velocity = 0.0 +15:6/0 = 0 +15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +15:6/0/physics_layer_0/angular_velocity = 0.0 +15:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +15:6/0/physics_layer_1/angular_velocity = 0.0 +16:6/0 = 0 +16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0) +16:6/0/physics_layer_0/angular_velocity = 0.0 +16:6/0/physics_layer_1/linear_velocity = Vector2(0, 0) +16:6/0/physics_layer_1/angular_velocity = 0.0 +5:3/0 = 0 +5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0) +5:3/0/physics_layer_0/angular_velocity = 0.0 +5:3/0/physics_layer_1/linear_velocity = Vector2(0, 0) +5:3/0/physics_layer_1/angular_velocity = 0.0 + +[sub_resource type="TileSet" id="TileSet_kf7eg"] +physics_layer_0/collision_layer = 1 +physics_layer_1/collision_layer = 2 +physics_layer_1/collision_mask = 2 +custom_data_layer_0/name = "Type" +custom_data_layer_0/type = 21 +sources/0 = SubResource("TileSetAtlasSource_easgx") + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_5hryl"] +bg_color = Color(0.85098, 0.894118, 0.937255, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.113725, 0.113725, 0.113725, 1) +corner_radius_top_left = 7 +corner_radius_top_right = 7 +corner_radius_bottom_right = 7 +corner_radius_bottom_left = 7 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_xj4ar"] +size = Vector2(64, 57) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_18i13"] +size = Vector2(42, 57) + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_tgk1y"] +size = Vector2(140, 160) + +[sub_resource type="Resource" id="Resource_ujs6q"] +script = ExtResource("6_8u8cj") +duration = 0.6 +transition = 1 +ease = 2 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_clm0y"] +size = Vector2(104, 160) + +[sub_resource type="Resource" id="Resource_7xgkv"] +script = ExtResource("6_8u8cj") +duration = 0.3 +transition = 8 +ease = 2 + +[sub_resource type="RectangleShape2D" id="RectangleShape2D_uka0w"] +size = Vector2(560, 160) + +[sub_resource type="Resource" id="Resource_tse25"] +script = ExtResource("6_8u8cj") +duration = 1.0 +transition = 10 +ease = 2 + +[node name="ExampleScene2D" type="Node2D"] + +[node name="Background" type="CanvasLayer" parent="."] +layer = -3 + +[node name="ColorRect" type="ColorRect" parent="Background"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -311.0 +offset_top = -173.0 +offset_right = 981.0 +offset_bottom = 548.0 +grow_horizontal = 2 +grow_vertical = 2 +auto_translate = false +localize_numeral_system = false +color = Color(0.137255, 0.14902, 0.196078, 1) + +[node name="TileMap" type="TileMap" parent="."] +z_index = -1 +scale = Vector2(3, 3) +tile_set = SubResource("TileSet_kf7eg") +format = 2 +layer_0/name = "Background" +layer_0/tile_data = PackedInt32Array(-393216, 655360, 2, -327680, 655360, 3, -262144, 655360, 3, -196608, 655360, 3, -131072, 655360, 3, -65536, 655360, 3, -393215, 720896, 2, -327679, 720896, 1, -262143, 720896, 1, -196607, 720896, 1, -131071, 720896, 1, -65535, 720896, 1, -393214, 786432, 2, -327678, 786432, 3, -262142, 786432, 3, -196606, 786432, 3, -131070, 786432, 3, -65534, 786432, 3) +layer_1/name = "Terrain" +layer_1/enabled = true +layer_1/modulate = Color(1, 1, 1, 1) +layer_1/y_sort_enabled = false +layer_1/y_sort_origin = 0 +layer_1/z_index = 1 +layer_1/tile_data = PackedInt32Array(1, 720896, 0, 2, 720896, 0, 3, 720896, 0, 4, 720896, 0, 5, 720896, 0, 6, 720896, 0, 7, 720896, 0, 8, 720896, 0, 9, 786432, 0, 65545, 786432, 1, 131081, 786432, 1, 196617, 786432, 1, 262153, 786432, 1, 327689, 786432, 1, 393225, 786432, 1, 65537, 720896, 1, 131073, 720896, 1, 196609, 720896, 1, 262145, 458752, 1, 327681, 720896, 1, 393217, 720896, 1, 65538, 720896, 1, 131074, 720896, 1, 196610, 720896, 1, 262146, 720896, 1, 327682, 720896, 1, 393218, 720896, 1, 65539, 720896, 1, 131075, 720896, 1, 196611, 720896, 1, 262147, 720896, 1, 327683, 720896, 1, 393219, 720896, 1, 65540, 458752, 1, 131076, 720896, 1, 196612, 720896, 1, 262148, 720896, 1, 327684, 720896, 1, 393220, 720896, 1, 65541, 720896, 1, 131077, 720896, 1, 196613, 720896, 1, 262149, 458752, 1, 327685, 720896, 1, 393221, 720896, 1, 65542, 720896, 1, 131078, 720896, 1, 196614, 720896, 1, 262150, 720896, 1, 327686, 720896, 1, 393222, 720896, 1, 65543, 720896, 1, 131079, 720896, 1, 196615, 720896, 1, 262151, 720896, 1, 327687, 720896, 1, 393223, 458752, 1, 65544, 720896, 1, 131080, 720896, 1, 196616, 458752, 1, 262152, 720896, 1, 327688, 720896, 1, 393224, 720896, 1, 65546, 524288, 5, 65547, 524288, 5, 65548, 524288, 5, 65549, 524288, 5, 131082, 524288, 6, 131083, 524288, 6, 131084, 524288, 6, 131085, 524288, 6, 196618, 720896, 1, 262154, 720896, 1, 196619, 720896, 1, 262155, 720896, 1, 196620, 720896, 1, 262156, 720896, 1, 196621, 720896, 1, 262157, 720896, 1, 65550, 524288, 5, 65551, 524288, 5, 65552, 524288, 5, 131086, 524288, 6, 131087, 524288, 6, 131088, 524288, 6, 196622, 720896, 1, 196623, 720896, 1, 262159, 720896, 1, 262160, 720896, 1, 196624, 720896, 1, 262158, 720896, 1, 17, 720896, 4, 65553, 720896, 5, 131089, 720896, 5, 196625, 720896, 5, 262161, 720896, 5, 18, 786432, 4, 19, 786432, 4, 20, 786432, 4, 21, 786432, 4, 22, 786432, 4, 23, 786432, 4, 65554, 786432, 5, 131090, 786432, 5, 196626, 786432, 5, 262162, 786432, 5, 65555, 786432, 5, 131091, 589824, 6, 196627, 786432, 5, 262163, 786432, 5, 65556, 786432, 5, 131092, 786432, 5, 196628, 786432, 5, 262164, 786432, 5, 65557, 786432, 5, 131093, 786432, 5, 196629, 786432, 5, 262165, 786432, 5, 65558, 786432, 5, 131094, 786432, 5, 196630, 786432, 5, 262166, 655360, 6, 65559, 786432, 5, 131095, 786432, 5, 196631, 786432, 5, 262167, 786432, 5, 327697, 720896, 5, 393233, 720896, 5, 327698, 589824, 6, 393234, 786432, 5, 327699, 786432, 5, 393235, 786432, 5, 327700, 786432, 5, 393236, 786432, 5, 327701, 786432, 5, 393237, 786432, 5, 327702, 786432, 5, 393238, 786432, 5, 327703, 786432, 5, 393239, 786432, 5, -131062, 720896, 4, -131061, 786432, 4, -131060, 786432, 4, -65526, 720896, 6, -65525, 786432, 6, -65524, 786432, 6, -131056, 851968, 4, -65520, 851968, 6, -131059, 786432, 4, -131058, 786432, 4, -131057, 786432, 4, -65523, 786432, 6, -65522, 786432, 6, -65521, 786432, 6, -65536, 917504, 2, -65535, 983040, 2, -65534, 1048576, 2, -65533, 917504, 2, -65532, 983040, 2, -65531, 1048576, 2, -65530, 917504, 2, -65529, 983040, 2, -65528, 1048576, 2, 65535, 655360, 0, 131071, 655360, 1, 196607, 655360, 1, 262143, 655360, 1, 327679, 655360, 1, 393215, 655360, 1, 458751, 655360, 1, 524287, 655360, 1, 589823, 655360, 1, 0, 720896, 0, 65536, 720896, 1, 131072, 720896, 1, 196608, 720896, 1, 262144, 720896, 1, 327680, 720896, 1, 393216, 720896, 1, 458752, 720896, 1, 524288, 720896, 1, 524289, 720896, 1, 524290, 720896, 1, 524291, 720896, 1, 524292, 720896, 1, 524293, 720896, 1, 524294, 720896, 1, 524295, 720896, 1, 524296, 720896, 1, 524297, 786432, 1, 458761, 786432, 1, 458760, 720896, 1, 458759, 720896, 1, 458758, 458752, 1, 458757, 720896, 1, 458756, 720896, 1, 458755, 720896, 1, 458754, 720896, 1, 458753, 720896, 1, -262145, 851968, 4, -196609, 851968, 5, -131073, 851968, 5, -65537, 851968, 5, -1, 851968, 6, -262146, 786432, 4, -262147, 786432, 4, -196610, 589824, 6, -196611, 786432, 5, -6, 786432, 5, -5, 786432, 5, -4, 786432, 5, -3, 786432, 5, -2, 786432, 5, -65538, 786432, 5, -131074, 786432, 5, -131075, 786432, 5, -65539, 655360, 6, 65534, 851968, 5, 131070, 851968, 5, 196606, 851968, 5, 262142, 851968, 5, 327678, 851968, 5, 393214, 851968, 5, 458750, 851968, 5, 65533, 786432, 5, 65532, 786432, 5, 65531, 786432, 5, 65530, 786432, 5, 65529, 720896, 5, 131066, 786432, 5, 196602, 786432, 5, 262138, 786432, 5, 262139, 786432, 5, 327675, 786432, 5, 131068, 786432, 5, 131069, 786432, 5, 196605, 786432, 5, 262141, 786432, 5, 327677, 786432, 5, 393213, 786432, 5, 458749, 786432, 5, 393212, 786432, 5, 393211, 786432, 5, 458748, 786432, 5, 327676, 655360, 6, 262140, 786432, 5, 196604, 786432, 5, 131067, 786432, 5, 196603, 589824, 6, 458747, 786432, 5, 458746, 786432, 5, 393210, 786432, 5, 327674, 786432, 5, -7, 720896, 5, 131065, 720896, 5, 196601, 720896, 5, 262137, 720896, 5, 327673, 720896, 5, 393209, 720896, 5, 458745, 720896, 5, -327684, 720896, 3, -196594, 720896, 3, -196597, 720896, 3, -65518, 720896, 3, -65516, 720896, 3, -327686, 1048576, 5, -327685, 720896, 3, -196595, 917504, 6, -65514, 983040, 6, -327683, 983040, 5, -65513, 1048576, 5, -262151, 720896, 4, -196615, 720896, 5, -131079, 720896, 5, -65543, 720896, 5, -262150, 786432, 4, -196614, 655360, 6, -131078, 786432, 5, -65542, 786432, 5, -262149, 786432, 4, -196613, 786432, 5, -131077, 786432, 5, -65541, 786432, 5, -262148, 786432, 4, -196612, 786432, 5, -131076, 786432, 5, -65540, 786432, 5, 458769, 720896, 5, 458775, 786432, 5, 458774, 786432, 5, 458773, 786432, 5, 458772, 786432, 5, 458771, 786432, 5, 458770, 786432, 5, 327690, 720896, 1, 393226, 720896, 1, 458762, 720896, 1, 524298, 720896, 1, 327691, 720896, 1, 393227, 720896, 1, 458763, 720896, 1, 524299, 720896, 1, 327692, 720896, 1, 393228, 720896, 1, 458764, 720896, 1, 524300, 720896, 1, 327693, 720896, 1, 393229, 720896, 1, 458765, 720896, 1, 524301, 720896, 1, 327694, 720896, 1, 393230, 720896, 1, 458766, 720896, 1, 524302, 720896, 1, 327695, 720896, 1, 393231, 720896, 1, 458767, 720896, 1, 524303, 720896, 1, 327696, 720896, 1, 393232, 720896, 1, 458768, 720896, 1, 524304, 720896, 1, 29, 851968, 4, 65565, 851968, 5, 131101, 851968, 5, 196637, 851968, 5, 262173, 851968, 5, 327709, 851968, 5, 393245, 851968, 5, 458781, 851968, 5, 24, 786432, 4, 25, 786432, 4, 26, 786432, 4, 27, 786432, 4, 28, 786432, 4, 65560, 786432, 5, 65561, 786432, 5, 65562, 786432, 5, 65563, 786432, 5, 65564, 786432, 5, 131100, 786432, 5, 196636, 589824, 6, 131099, 786432, 5, 131098, 786432, 5, 131097, 786432, 5, 131096, 786432, 5, 196632, 786432, 5, 262168, 786432, 5, 327704, 786432, 5, 393240, 786432, 5, 458776, 786432, 5, 196633, 786432, 5, 262169, 786432, 5, 327705, 786432, 5, 393241, 786432, 5, 458777, 786432, 5, 196634, 786432, 5, 262170, 786432, 5, 327706, 786432, 5, 393242, 655360, 6, 458778, 786432, 5, 196635, 786432, 5, 262171, 786432, 5, 327707, 786432, 5, 393243, 786432, 5, 458779, 786432, 5, 262172, 786432, 5, 327708, 786432, 5, 393244, 786432, 5, 458780, 786432, 5, -196593, 1048576, 6, -393182, 1048576, 6, -393185, 917504, 6, -393180, 983040, 6, -393184, 983040, 5, -65509, 720896, 3, -65510, 720896, 3, -393181, 720896, 3, -393183, 720896, 3, -65517, 720896, 3, -65515, 720896, 3, -327650, 720896, 4, -262114, 720896, 5, -196578, 720896, 5, -131042, 720896, 5, -65506, 720896, 5, -327649, 786432, 4, -327648, 786432, 4, -327647, 786432, 4, -327646, 786432, 4, -327645, 786432, 4, -327644, 786432, 4, -327643, 786432, 4, -65499, 786432, 5, -131035, 786432, 5, -196571, 786432, 5, -262107, 655360, 6, -262108, 786432, 5, -262109, 786432, 5, -262110, 786432, 5, -262111, 786432, 5, -262112, 786432, 5, -262113, 786432, 5, -196577, 655360, 6, -131041, 786432, 5, -65505, 786432, 5, -65500, 655360, 6, -131036, 589824, 6, -196572, 786432, 5, -196573, 786432, 5, -196574, 786432, 5, -196575, 786432, 5, -196576, 786432, 5, -131040, 589824, 6, -65504, 786432, 5, -65501, 786432, 5, -131037, 786432, 5, -131038, 786432, 5, -131039, 786432, 5, -65503, 786432, 5, -65502, 786432, 5, 524318, 720896, 6, 458782, 720896, 5, 393246, 720896, 5, 327710, 720896, 5, 262174, 720896, 5, 196638, 720896, 5, 131102, 720896, 5, 65566, 720896, 5, 30, 720896, 5, 524319, 786432, 6, 524320, 786432, 6, 524321, 786432, 6, 524322, 786432, 6, 524323, 786432, 6, 524324, 786432, 6, 524325, 786432, 6, 31, 786432, 5, 65567, 786432, 5, 131103, 786432, 5, 196639, 786432, 5, 262175, 786432, 5, 327711, 786432, 5, 393247, 655360, 6, 458783, 786432, 5, 32, 786432, 5, 65568, 786432, 5, 131104, 786432, 5, 196640, 786432, 5, 262176, 786432, 5, 327712, 786432, 5, 393248, 786432, 5, 458784, 786432, 5, 33, 786432, 5, 65569, 786432, 5, 131105, 655360, 6, 196641, 786432, 5, 262177, 786432, 5, 327713, 786432, 5, 393249, 786432, 5, 458785, 786432, 5, 34, 786432, 5, 65570, 786432, 5, 131106, 786432, 5, 196642, 786432, 5, 262178, 655360, 6, 327714, 655360, 6, 393250, 786432, 5, 458786, 786432, 5, 35, 786432, 5, 65571, 786432, 5, 131107, 786432, 5, 196643, 786432, 5, 262179, 786432, 5, 327715, 786432, 5, 393251, 786432, 5, 458787, 786432, 5, 36, 655360, 6, 65572, 786432, 5, 131108, 786432, 5, 196644, 786432, 5, 262180, 786432, 5, 327716, 786432, 5, 393252, 786432, 5, 458788, 655360, 6, 37, 786432, 5, 65573, 786432, 5, 131109, 786432, 5, 196645, 786432, 5, 262181, 655360, 6, 327717, 786432, 5, 393253, 786432, 5, 458789, 786432, 5, 524281, 720896, 5, 524285, 786432, 5, 524284, 786432, 5, 524283, 786432, 5, 524282, 786432, 5, 589818, 786432, 5, 589819, 786432, 5, 589820, 786432, 5, 655356, 786432, 5, 655357, 786432, 5, 589821, 786432, 5, 655355, 786432, 5, 655354, 786432, 5, 720890, 786432, 5, 720891, 786432, 5, 720892, 786432, 5, 720893, 786432, 5, 720894, 851968, 5, 786429, 786432, 5, 786428, 786432, 5, 786427, 786432, 5, 786426, 786432, 5, 851962, 786432, 5, 917498, 786432, 5, 917499, 786432, 5, 851964, 786432, 5, 851965, 786432, 5, 917501, 786432, 5, 917500, 786432, 5, 851963, 786432, 5, 589817, 720896, 5, 655353, 720896, 5, 720889, 720896, 5, 786425, 720896, 5, 851961, 720896, 5, 917497, 720896, 5, 524286, 851968, 5, 589822, 851968, 5, 655358, 851968, 5, 786430, 851968, 5, 851966, 851968, 5, 917502, 851968, 5, 589824, 720896, 1, 655360, 720896, 1, 720896, 720896, 1, 786432, 720896, 1, 851968, 720896, 1, 589825, 720896, 1, 655361, 720896, 1, 720897, 720896, 1, 786433, 720896, 1, 851969, 720896, 1, 589826, 720896, 1, 655362, 720896, 1, 720898, 720896, 1, 786434, 720896, 1, 851970, 720896, 1, 589827, 720896, 1, 655363, 720896, 1, 720899, 720896, 1, 786435, 720896, 1, 851971, 720896, 1, 589828, 720896, 1, 655364, 720896, 1, 720900, 720896, 1, 786436, 720896, 1, 851972, 720896, 1, 589829, 720896, 1, 655365, 720896, 1, 720901, 720896, 1, 786437, 720896, 1, 851973, 720896, 1, 589830, 720896, 1, 655366, 720896, 1, 720902, 720896, 1, 786438, 720896, 1, 851974, 720896, 1, 589831, 720896, 1, 655367, 720896, 1, 720903, 720896, 1, 786439, 720896, 1, 851975, 720896, 1, 589832, 720896, 1, 655368, 720896, 1, 720904, 720896, 1, 786440, 720896, 1, 851976, 720896, 1, 589833, 786432, 1, 655369, 786432, 1, 720905, 786432, 1, 786441, 786432, 1, 851977, 786432, 1, 655359, 655360, 1, 720895, 655360, 1, 786431, 655360, 1, 851967, 655360, 1, 917503, 655360, 1, 589834, 720896, 1, 655370, 720896, 1, 720906, 720896, 1, 786442, 720896, 1, 851978, 720896, 1, 589835, 720896, 1, 655371, 720896, 1, 720907, 720896, 1, 786443, 720896, 1, 851979, 720896, 1, 589836, 720896, 1, 655372, 720896, 1, 720908, 720896, 1, 786444, 720896, 1, 851980, 720896, 1, 589837, 720896, 1, 655373, 720896, 1, 720909, 720896, 1, 786445, 720896, 1, 851981, 720896, 1, 589838, 720896, 1, 655374, 720896, 1, 720910, 720896, 1, 786446, 720896, 1, 851982, 720896, 1, 589839, 720896, 1, 655375, 720896, 1, 720911, 720896, 1, 786447, 720896, 1, 851983, 720896, 1, 589840, 720896, 1, 655376, 720896, 1, 720912, 720896, 1, 786448, 720896, 1, 851984, 720896, 1, 851985, 720896, 6, 851986, 786432, 6, 851987, 786432, 6, 851988, 786432, 6, 851989, 786432, 6, 851990, 786432, 6, 851991, 786432, 6, 851992, 786432, 6, 851993, 786432, 6, 851994, 786432, 6, 851995, 786432, 6, 851996, 786432, 6, 851997, 851968, 6, 524306, 786432, 5, 589842, 786432, 5, 655378, 786432, 5, 720914, 786432, 5, 786450, 786432, 5, 524307, 786432, 5, 589843, 786432, 5, 655379, 786432, 5, 720915, 786432, 5, 786451, 786432, 5, 524308, 786432, 5, 589844, 786432, 5, 655380, 786432, 5, 720916, 786432, 5, 786452, 786432, 5, 524309, 786432, 5, 589845, 786432, 5, 655381, 786432, 5, 720917, 786432, 5, 786453, 786432, 5, 524310, 786432, 5, 589846, 786432, 5, 655382, 786432, 5, 720918, 786432, 5, 786454, 786432, 5, 524311, 786432, 5, 589847, 786432, 5, 655383, 786432, 5, 720919, 786432, 5, 786455, 786432, 5, 524312, 786432, 5, 589848, 786432, 5, 655384, 786432, 5, 720920, 786432, 5, 786456, 786432, 5, 524313, 786432, 5, 589849, 786432, 5, 655385, 786432, 5, 720921, 786432, 5, 786457, 786432, 5, 524314, 786432, 5, 589850, 786432, 5, 655386, 786432, 5, 720922, 786432, 5, 786458, 786432, 5, 524315, 786432, 5, 589851, 786432, 5, 655387, 786432, 5, 720923, 786432, 5, 786459, 786432, 5, 524316, 786432, 5, 589852, 786432, 5, 655388, 786432, 5, 720924, 786432, 5, 786460, 786432, 5, 524305, 720896, 5, 589841, 720896, 5, 655377, 720896, 5, 720913, 720896, 5, 786449, 720896, 5, 524317, 851968, 5, 589853, 851968, 5, 655389, 851968, 5, 720925, 851968, 5, 786461, 851968, 5, -262106, 786432, 5, -196570, 786432, 5, -131034, 786432, 5, -65498, 786432, 5, 38, 786432, 5, 65574, 786432, 5, 131110, 655360, 6, 196646, 786432, 5, 262182, 786432, 5, 327718, 786432, 5, 393254, 786432, 5, 458790, 786432, 5, -262105, 786432, 5, -196569, 786432, 5, -131033, 786432, 5, -65497, 786432, 5, 39, 786432, 5, 65575, 786432, 5, 131111, 786432, 5, 196647, 786432, 5, 262183, 786432, 5, 327719, 786432, 5, 393255, 655360, 6, 458791, 786432, 5, -262104, 786432, 5, -196568, 786432, 5, -131032, 786432, 5, -65496, 786432, 5, 40, 655360, 6, 65576, 786432, 5, 131112, 786432, 5, 196648, 786432, 5, 262184, 655360, 6, 327720, 786432, 5, 393256, 786432, 5, 458792, 786432, 5, -262103, 786432, 5, -196567, 655360, 6, -131031, 786432, 5, -65495, 786432, 5, 41, 786432, 5, 65577, 786432, 5, 131113, 786432, 5, 196649, 786432, 5, 262185, 786432, 5, 327721, 786432, 5, 393257, 786432, 5, 458793, 786432, 5, -262102, 786432, 5, -196566, 786432, 5, -131030, 786432, 5, -65494, 786432, 5, 42, 786432, 5, 65578, 786432, 5, 131114, 655360, 6, 196650, 786432, 5, 262186, 786432, 5, 327722, 786432, 5, 393258, 786432, 5, 458794, 655360, 6, 524326, 786432, 6, 524327, 786432, 6, 524328, 786432, 6, 524329, 786432, 6, 524330, 786432, 6, -327642, 786432, 4, -327641, 786432, 4, -327640, 786432, 4, -327639, 786432, 4, -327638, 786432, 4, -327632, 851968, 4, -262096, 851968, 5, -196560, 851968, 5, -131024, 851968, 5, -65488, 851968, 5, 48, 851968, 5, 65584, 851968, 5, 131120, 851968, 5, 196656, 851968, 5, 262192, 851968, 5, 327728, 851968, 5, 393264, 851968, 5, 458800, 851968, 5, 524336, 851968, 6, -327637, 786432, 4, -327636, 786432, 4, -327635, 786432, 4, -327634, 786432, 4, -327633, 786432, 4, -262101, 786432, 5, -196565, 786432, 5, -131029, 655360, 6, -65493, 786432, 5, 43, 786432, 5, 65579, 786432, 5, 131115, 786432, 5, 196651, 786432, 5, 262187, 786432, 5, 327723, 655360, 6, 393259, 786432, 5, 458795, 786432, 5, -262100, 786432, 5, -196564, 786432, 5, -131028, 786432, 5, -65492, 786432, 5, 44, 655360, 6, 65580, 786432, 5, 131116, 786432, 5, 196652, 786432, 5, 262188, 786432, 5, 327724, 786432, 5, 393260, 786432, 5, 458796, 786432, 5, -262099, 786432, 5, -196563, 786432, 5, -131027, 786432, 5, -65491, 786432, 5, 45, 786432, 5, 65581, 655360, 6, 131117, 786432, 5, 196653, 786432, 5, 262189, 786432, 5, 327725, 786432, 5, 393261, 786432, 5, 458797, 786432, 5, -262098, 655360, 6, -196562, 786432, 5, -131026, 786432, 5, -65490, 786432, 5, 46, 786432, 5, 65582, 786432, 5, 131118, 786432, 5, 196654, 655360, 6, 262190, 786432, 5, 327726, 786432, 5, 393262, 786432, 5, 458798, 655360, 6, -262097, 786432, 5, -196561, 786432, 5, -131025, 786432, 5, -65489, 786432, 5, 47, 786432, 5, 65583, 786432, 5, 131119, 786432, 5, 196655, 786432, 5, 262191, 786432, 5, 327727, 786432, 5, 393263, 786432, 5, 458799, 786432, 5, 524331, 786432, 6, 524332, 786432, 6, 524333, 786432, 6, 524334, 786432, 6, 524335, 786432, 6) + +[node name="UI" type="CanvasLayer" parent="."] + +[node name="UIInventory" parent="UI" instance=ExtResource("2_as4e6")] +unique_name_in_owner = true +visible = false + +[node name="UISign" parent="UI" instance=ExtResource("3_6yi7w")] +unique_name_in_owner = true +visible = false + +[node name="Camera2D" type="Camera2D" parent="."] +position = Vector2(243, -148) + +[node name="PhantomCameraHost" type="Node" parent="Camera2D"] +script = ExtResource("4_bb7en") + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera2D" type="Node2D" parent="Player"] +unique_name_in_owner = true +position = Vector2(243, -148) +script = ExtResource("5_kikl5") +priority_override = null +priority = 5 +zoom = Vector2(1, 1) +follow_mode = 2 +follow_target = NodePath("../CharacterBody2D") +follow_parameters/target_offset = Vector2(0, -120) +follow_parameters/damping = true +follow_parameters/damping_value = 10.0 +tween_parameters = ExtResource("6_gu0o0") +tween_on_load = false +inactive_update_mode = 0 + +[node name="CharacterBody2D" type="CharacterBody2D" parent="Player"] +position = Vector2(243, -28) +script = ExtResource("6_oxdpf") + +[node name="DarkOverlay" type="ColorRect" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +visible = false +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -1000.0 +offset_top = -1000.0 +offset_right = 1000.0 +offset_bottom = 1000.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 0.615686) + +[node name="InteractionPrompt" type="Panel" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +visible = false +anchors_preset = 7 +anchor_left = 0.5 +anchor_top = 1.0 +anchor_right = 0.5 +anchor_bottom = 1.0 +offset_left = -16.0 +offset_top = -66.0 +offset_right = 16.0 +offset_bottom = -34.0 +grow_horizontal = 2 +grow_vertical = 0 +size_flags_vertical = 0 +theme_override_styles/panel = SubResource("StyleBoxFlat_5hryl") + +[node name="Label" type="Label" parent="Player/CharacterBody2D/InteractionPrompt"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -3.0 +offset_bottom = 5.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_fonts/font = ExtResource("11_myq47") +theme_override_font_sizes/font_size = 26 +text = "F" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="PlayerSprite" type="Sprite2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +scale = Vector2(0.5, 0.5) +texture = ExtResource("8_ok3b7") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player/CharacterBody2D"] +position = Vector2(0, -0.5) +shape = SubResource("RectangleShape2D_xj4ar") + +[node name="PlayerArea2D" type="Area2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true + +[node name="CollisionShape2D" type="CollisionShape2D" parent="Player/CharacterBody2D/PlayerArea2D"] +position = Vector2(0, -0.5) +shape = SubResource("RectangleShape2D_18i13") + +[node name="ItemFocusPhantomCamera2D" type="Node2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +position = Vector2(0, -122) +script = ExtResource("5_kikl5") +priority_override = null +priority = 0 +zoom = Vector2(1, 1) +follow_mode = 0 +tween_parameters = null +tween_on_load = true +inactive_update_mode = 0 + +[node name="InventoryPhantomCamera2D" type="Node2D" parent="Player/CharacterBody2D"] +unique_name_in_owner = true +position = Vector2(-183, -5) +script = ExtResource("5_kikl5") +priority_override = null +priority = 0 +zoom = Vector2(1, 1) +follow_mode = 0 +tween_parameters = null +tween_on_load = true +inactive_update_mode = 0 + +[node name="Label" type="Label" parent="Player"] +offset_left = 167.0 +offset_top = -132.0 +offset_right = 332.0 +offset_bottom = -68.0 +theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1) +theme_override_fonts/font = ExtResource("11_myq47") +text = "[WASD] to move +[Space] to jump" + +[node name="WideArea" type="Area2D" parent="." node_paths=PackedStringArray("area_pcam")] +position = Vector2(393, -40) +script = ExtResource("9_184pu") +area_pcam = NodePath("PhantomCamera2D") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="WideArea"] +position = Vector2(0, -40) +shape = SubResource("RectangleShape2D_tgk1y") + +[node name="ColorRect" type="ColorRect" parent="WideArea"] +offset_left = -70.0 +offset_top = -120.0 +offset_right = 70.0 +offset_bottom = 40.0 +size_flags_horizontal = 0 +size_flags_vertical = 0 +color = Color(0.556863, 0.447059, 0.545098, 0.698039) + +[node name="Label" type="Label" parent="WideArea"] +offset_left = -77.0 +offset_top = -250.0 +offset_right = 76.0 +offset_bottom = -120.0 +theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1) +theme_override_fonts/font = ExtResource("11_myq47") +text = "Transition Type: +Sine + +Duration: +0.6s" +horizontal_alignment = 1 + +[node name="PhantomCamera2D" type="Node2D" parent="WideArea"] +position = Vector2(4, -100) +script = ExtResource("5_kikl5") +priority_override = null +priority = 0 +zoom = Vector2(0.8, 0.8) +follow_mode = 0 +tween_parameters = SubResource("Resource_ujs6q") +tween_on_load = true +inactive_update_mode = 0 + +[node name="UpperZoomArea" type="Area2D" parent="." node_paths=PackedStringArray("area_pcam")] +position = Vector2(649, -135) +script = ExtResource("9_184pu") +area_pcam = NodePath("PhantomCamera2D") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="UpperZoomArea"] +position = Vector2(0, -40) +shape = SubResource("RectangleShape2D_clm0y") + +[node name="ColorRect" type="ColorRect" parent="UpperZoomArea"] +offset_left = -52.0 +offset_top = -120.0 +offset_right = 52.0 +offset_bottom = 40.0 +size_flags_horizontal = 0 +size_flags_vertical = 0 +color = Color(0.556863, 0.447059, 0.545098, 0.698039) + +[node name="Label" type="Label" parent="UpperZoomArea"] +offset_left = -74.0 +offset_top = -251.0 +offset_right = 79.0 +offset_bottom = -121.0 +theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1) +theme_override_fonts/font = ExtResource("11_myq47") +text = "Transition Type: +Circ + +Duration: +0.3s" +horizontal_alignment = 1 + +[node name="PhantomCamera2D" type="Node2D" parent="UpperZoomArea"] +position = Vector2(2, -83) +script = ExtResource("5_kikl5") +priority_override = null +priority = 0 +zoom = Vector2(2, 2) +follow_mode = 0 +tween_parameters = SubResource("Resource_7xgkv") +tween_on_load = true +inactive_update_mode = 0 + +[node name="ForwardArea" type="Area2D" parent="." node_paths=PackedStringArray("area_pcam")] +position = Vector2(1136, -38) +script = ExtResource("9_184pu") +area_pcam = NodePath("PhantomCamera2D") + +[node name="CollisionShape2D" type="CollisionShape2D" parent="ForwardArea"] +position = Vector2(0, -42) +shape = SubResource("RectangleShape2D_uka0w") + +[node name="ColorRect" type="ColorRect" parent="ForwardArea"] +offset_left = -280.0 +offset_top = -122.0 +offset_right = 280.0 +offset_bottom = 38.0 +size_flags_horizontal = 0 +size_flags_vertical = 0 +color = Color(0.556863, 0.447059, 0.545098, 0.698039) + +[node name="Label" type="Label" parent="ForwardArea"] +offset_left = -76.0 +offset_top = -252.0 +offset_right = 77.0 +offset_bottom = -122.0 +theme_override_colors/font_color = Color(0.294118, 1, 0.631373, 1) +theme_override_fonts/font = ExtResource("11_myq47") +text = "Transition Type: +Back + +Duration: +1.2s" +horizontal_alignment = 1 + +[node name="PhantomCamera2D" type="Node2D" parent="ForwardArea"] +position = Vector2(344, -46) +script = ExtResource("5_kikl5") +priority_override = null +priority = 0 +zoom = Vector2(0.9, 0.9) +follow_mode = 0 +tween_parameters = SubResource("Resource_tse25") +tween_on_load = true +inactive_update_mode = 0 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3DExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3DExampleScene.tscn new file mode 100644 index 0000000..69b8f96 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3DExampleScene.tscn @@ -0,0 +1,378 @@ +[gd_scene load_steps=35 format=3 uid="uid://ci12ytew5vwty"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_ry0dd"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/NPC.gd" id="2_2n1da"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="2_e7gxt"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd" id="2_y3dy8"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn" id="3_f5qrw"] +[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera3DTween.tres" id="4_a27nb"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/3D_trigger_area.gd" id="4_moad5"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="5_c85ys"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="6_ebm1o"] +[ext_resource type="Resource" uid="uid://c1v786g5agaw5" path="res://addons/phantom_camera/examples/resources/tween/FixedCameraTween.tres" id="8_c0sgt"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_g0eml"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_flw6w"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_dy1i7"] + +[sub_resource type="Resource" id="Resource_su0l1"] +script = ExtResource("6_ebm1o") +duration = 1.2 +transition = 3 +ease = 2 + +[sub_resource type="BoxMesh" id="BoxMesh_7tjw4"] +size = Vector3(2, 0.5, 4) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_hpllm"] +transparency = 1 +albedo_color = Color(0.988235, 0.478431, 0.905882, 0.0901961) + +[sub_resource type="BoxShape3D" id="BoxShape3D_65o6h"] +size = Vector3(2, 0.5, 4) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_tpc7d"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_v5iy7"] +albedo_color = Color(0.988235, 0.478431, 0.905882, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_wcrbb"] +size = Vector3(6.8, 0.1, 5.4) + +[sub_resource type="BoxShape3D" id="BoxShape3D_ctyr8"] +size = Vector3(7.4, 0.1, 3.6) + +[sub_resource type="BoxShape3D" id="BoxShape3D_ua072"] +size = Vector3(6.8, 0.1, 3.6) + +[sub_resource type="BoxMesh" id="BoxMesh_ugc3s"] +size = Vector3(1, 1, 2) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_68thd"] +albedo_color = Color(0.34902, 0.862745, 0.854902, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_wphly"] +size = Vector3(1, 0.5, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_gyp5s"] +size = Vector3(20, 40, 30) + +[sub_resource type="BoxShape3D" id="BoxShape3D_lfaqs"] +size = Vector3(20, 40, 30) + +[sub_resource type="BoxMesh" id="BoxMesh_n70lt"] +size = Vector3(14, 40, 6) + +[sub_resource type="BoxShape3D" id="BoxShape3D_jxmqm"] +size = Vector3(14, 40, 6) + +[sub_resource type="BoxMesh" id="BoxMesh_x0tgm"] +size = Vector3(8, 40, 1) + +[sub_resource type="BoxShape3D" id="BoxShape3D_t67ef"] +size = Vector3(50, 40, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_rmslh"] +size = Vector3(0.5, 6, 13.5) + +[sub_resource type="BoxMesh" id="BoxMesh_242ij"] +size = Vector3(2, 3, 3) + +[sub_resource type="BoxMesh" id="BoxMesh_niuda"] +size = Vector3(8, 6, 0.5) + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.997417, 0.0220127, -0.0662648, 0, 0.948973, 0.315232, 0.0698191, -0.314467, 0.946641, -4.132, 2, 9.011) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +script = ExtResource("1_ry0dd") + +[node name="PlayerGroup" type="Node" parent="."] + +[node name="MovementInstructionsLabel" type="Label3D" parent="PlayerGroup"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -2.50422, -0.455369, 6.62486) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("2_e7gxt") +font_size = 48 + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="PlayerGroup"] +unique_name_in_owner = true +transform = Transform3D(0.997417, 0.0220127, -0.0662648, 0, 0.948973, 0.315232, 0.0698191, -0.314467, 0.946641, -4.132, 2, 9.011) +script = ExtResource("2_y3dy8") +priority_override = false +priority = 3 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D") +follow_parameters/target_offset = Vector3(0.5, 1.5, 2) +follow_parameters/damping = true +follow_parameters/damping_value = 10.0 +look_at_mode = 0 +tween_parameters = ExtResource("4_a27nb") +tween_on_load = false +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="PlayerCharacterBody3D" type="CharacterBody3D" parent="PlayerGroup"] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.632, 0.5, 7.011) +script = ExtResource("5_c85ys") +SPEED = 3.5 +metadata/_edit_group_ = true + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="PlayerGroup/PlayerCharacterBody3D"] +mesh = SubResource("CapsuleMesh_g0eml") +surface_material_override/0 = SubResource("StandardMaterial3D_flw6w") + +[node name="PlayerArea3D" type="Area3D" parent="PlayerGroup/PlayerCharacterBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerGroup/PlayerCharacterBody3D/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_dy1i7") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="PlayerGroup/PlayerCharacterBody3D"] +shape = SubResource("CapsuleShape3D_dy1i7") + +[node name="NPCGroup" type="Node" parent="."] + +[node name="NPCPhantomCamera3D" type="Node3D" parent="NPCGroup"] +unique_name_in_owner = true +transform = Transform3D(0.616596, -0.109786, 0.779587, -2.23517e-08, 0.990229, 0.13945, -0.78728, -0.0859841, 0.610571, -2.98802, 1.50739, 1.19719) +script = ExtResource("2_y3dy8") +priority_override = false +priority = 0 +follow_mode = 0 +look_at_mode = 0 +tween_parameters = SubResource("Resource_su0l1") +tween_on_load = true +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="NPCDescriptionLabel" type="Label3D" parent="NPCGroup"] +transform = Transform3D(1, 0, 0, 0, 0.866026, 0.5, 0, -0.5, 0.866025, -3.04693, 0.367287, 0.953757) +text = "Input Example" +font = ExtResource("2_e7gxt") + +[node name="NPCDialogueExampleLabel" type="Label3D" parent="NPCGroup"] +unique_name_in_owner = true +transform = Transform3D(1, 4.54671e-10, 1.65487e-10, 4.25644e-10, 0.939693, 0.34202, 0, -0.34202, 0.939693, -4.46738, 1.58641, -0.253679) +modulate = Color(1, 0.603922, 0.254902, 1) +text = "Press [ F ] to change camera" +font = ExtResource("2_e7gxt") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="NPCGroup"] +transform = Transform3D(0.819152, 4.83851e-10, -0.573576, -3.92481e-09, 1, -6.3473e-09, 0.573576, 7.45058e-09, 0.819152, -3.46138, -0.4, 0.875321) +mesh = SubResource("BoxMesh_7tjw4") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_hpllm") +metadata/_edit_group_ = true + +[node name="NPCInteractionArea3D" type="Area3D" parent="NPCGroup/NPCInteractionZoneMesh"] +unique_name_in_owner = true +transform = Transform3D(1, -2.68591e-26, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +monitorable = false + +[node name="NPCInterationCollisionShape3D" type="CollisionShape3D" parent="NPCGroup/NPCInteractionZoneMesh/NPCInteractionArea3D"] +shape = SubResource("BoxShape3D_65o6h") + +[node name="NPC" type="StaticBody3D" parent="NPCGroup"] +transform = Transform3D(1, 4.83851e-10, 0, 4.25644e-10, 1, -7.45058e-09, 0, 7.45058e-09, 1, -4.56338, 0.5, -0.272679) +script = ExtResource("2_2n1da") + +[node name="PlayerCollisionShape3D2" type="CollisionShape3D" parent="NPCGroup/NPC"] +transform = Transform3D(1, -2.68591e-26, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +shape = SubResource("CapsuleShape3D_tpc7d") + +[node name="NPCMesh" type="MeshInstance3D" parent="NPCGroup/NPC"] +transform = Transform3D(1, -2.68591e-26, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +mesh = SubResource("CapsuleMesh_g0eml") +skeleton = NodePath("../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_v5iy7") + +[node name="MoveToLocation" type="Node3D" parent="NPCGroup"] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.70084, 0.5, 0.962891) + +[node name="FixedCameraTriggerZone" type="Node" parent="."] + +[node name="FixedCameraLabel" type="Label3D" parent="FixedCameraTriggerZone"] +unique_name_in_owner = true +transform = Transform3D(0.939693, 0.280167, -0.196175, 1.49012e-08, 0.573577, 0.819152, 0.34202, -0.769751, 0.538986, -0.538716, -0.247626, 3.13456) +text = "Fixed Camera +Example" +font = ExtResource("2_e7gxt") + +[node name="NorthRoomPhantomCamera3D" type="Node3D" parent="FixedCameraTriggerZone"] +transform = Transform3D(0.38357, -0.555836, 0.737507, -0.105898, 0.766851, 0.633027, -0.917417, -0.320912, 0.235279, 6.89638, 4.73986, 0.115512) +script = ExtResource("2_y3dy8") +priority_override = false +priority = 0 +follow_mode = 0 +look_at_mode = 0 +tween_parameters = ExtResource("8_c0sgt") +tween_on_load = true +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="NorthRoomTrigger" type="Area3D" parent="FixedCameraTriggerZone" node_paths=PackedStringArray("area_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, -0.45, -0.9) +priority = 5 +script = ExtResource("4_moad5") +area_pcam = NodePath("../NorthRoomPhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FixedCameraTriggerZone/NorthRoomTrigger"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 0, -0.4) +shape = SubResource("BoxShape3D_wcrbb") + +[node name="EntryRoomPhantomCamera3D" type="Node3D" parent="FixedCameraTriggerZone"] +transform = Transform3D(0.258818, -0.482963, 0.836515, 1.3027e-15, 0.866025, 0.499999, -0.965924, -0.129409, 0.224143, 6.69741, 4.73364, 4.02374) +script = ExtResource("2_y3dy8") +priority_override = false +priority = 0 +follow_mode = 0 +look_at_mode = 0 +tween_parameters = ExtResource("8_c0sgt") +tween_on_load = true +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="EntryRoomTrigger" type="Area3D" parent="FixedCameraTriggerZone" node_paths=PackedStringArray("area_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.00003, -0.454982, 3.00572) +priority = 5 +script = ExtResource("4_moad5") +area_pcam = NodePath("../EntryRoomPhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FixedCameraTriggerZone/EntryRoomTrigger"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.3, 0, 0.2) +shape = SubResource("BoxShape3D_ctyr8") + +[node name="SouthRoomPhantomCamera3D" type="Node3D" parent="FixedCameraTriggerZone"] +transform = Transform3D(-0.766043, -0.492403, 0.413175, 0, 0.642787, 0.766043, -0.642786, 0.586825, -0.492403, 6.89741, 4.73364, 5.62374) +script = ExtResource("2_y3dy8") +priority_override = false +priority = 0 +follow_mode = 0 +look_at_mode = 0 +tween_parameters = ExtResource("8_c0sgt") +tween_on_load = true +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="SouthRoomTrigger" type="Area3D" parent="FixedCameraTriggerZone" node_paths=PackedStringArray("area_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3, -0.45, 6.7) +priority = 5 +script = ExtResource("4_moad5") +area_pcam = NodePath("../SouthRoomPhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FixedCameraTriggerZone/SouthRoomTrigger"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.6, 0, 0.1) +shape = SubResource("BoxShape3D_ua072") + +[node name="CSGMesh3D" type="CSGMesh3D" parent="FixedCameraTriggerZone"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.14238, 1.82571, 2.88655) +mesh = SubResource("BoxMesh_ugc3s") +material = SubResource("StandardMaterial3D_68thd") + +[node name="CSGMesh3D2" type="CSGMesh3D" parent="FixedCameraTriggerZone/CSGMesh3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00192642, -0.0120339, 0.00494432) +operation = 2 +mesh = SubResource("BoxMesh_wphly") +material = SubResource("StandardMaterial3D_68thd") + +[node name="Environment" type="Node" parent="."] + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Environment" type="Node3D" parent="Environment"] + +[node name="Floor" parent="Environment/Environment" instance=ExtResource("3_f5qrw")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="West Wall" type="StaticBody3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16, 0.5, 0) +metadata/_edit_group_ = true +metadata/_edit_lock_ = true + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="Environment/Environment/West Wall"] +mesh = SubResource("BoxMesh_gyp5s") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/West Wall"] +shape = SubResource("BoxShape3D_lfaqs") + +[node name="East Wall" type="StaticBody3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 16.999, 0.502, 0) +metadata/_edit_group_ = true +metadata/_edit_lock_ = true + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="Environment/Environment/East Wall"] +mesh = SubResource("BoxMesh_gyp5s") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/East Wall"] +shape = SubResource("BoxShape3D_lfaqs") + +[node name="North Wall" type="StaticBody3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, -6.90828) +metadata/_edit_group_ = true +metadata/_edit_lock_ = true + +[node name="MeshInstance3D2" type="MeshInstance3D" parent="Environment/Environment/North Wall"] +mesh = SubResource("BoxMesh_n70lt") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/North Wall"] +shape = SubResource("BoxShape3D_jxmqm") + +[node name="South Wall" type="StaticBody3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.25, 0.5, 9.087) +metadata/_edit_group_ = true + +[node name="MeshInstance3D3" type="MeshInstance3D" parent="Environment/Environment/South Wall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, 0) +mesh = SubResource("BoxMesh_x0tgm") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Environment/Environment/South Wall"] +shape = SubResource("BoxShape3D_t67ef") + +[node name="FixedCamOuterWall" type="CSGMesh3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.5, 2) +use_collision = true +mesh = SubResource("BoxMesh_rmslh") + +[node name="FixedCamOuterDoorway" type="CSGMesh3D" parent="Environment/Environment/FixedCamOuterWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.5, 1) +operation = 2 +mesh = SubResource("BoxMesh_242ij") + +[node name="FixedCamNorthWall" type="CSGMesh3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 2.5, 1) +use_collision = true +mesh = SubResource("BoxMesh_niuda") + +[node name="FixedCamNorthDoorway" type="CSGMesh3D" parent="Environment/Environment/FixedCamNorthWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.5, 0) +operation = 2 +mesh = SubResource("BoxMesh_242ij") + +[node name="FixedCamSouthWall" type="CSGMesh3D" parent="Environment/Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 2.5, 5.1) +use_collision = true +mesh = SubResource("BoxMesh_niuda") + +[node name="FixedCamSouthDoorway" type="CSGMesh3D" parent="Environment/Environment/FixedCamSouthWall"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.50541, 1.19209e-07) +operation = 2 +mesh = SubResource("BoxMesh_242ij") diff --git a/addons/phantom_camera/examples/example_scenes/3D/3DFollowFramedExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3DFollowFramedExampleScene.tscn new file mode 100644 index 0000000..f4ff93d --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3DFollowFramedExampleScene.tscn @@ -0,0 +1,172 @@ +[gd_scene load_steps=11 format=3 uid="uid://c4llb3gsbfv1a"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_7824u"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd" id="2_g1bv4"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="3_6xt4f"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn" id="4_t4fso"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png" id="5_c0upu"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_pda7a"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u74j7"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_xgjm7"] +radius = 0.05 +height = 0.1 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3xplc"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("5_c0upu") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.99995, 0, 0, 0, 0.79324, 0.608671, 0, -0.608675, 0.793235, -16.4602, 2.94168, 7.33457) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +script = ExtResource("1_7824u") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player"] +unique_name_in_owner = true +transform = Transform3D(0.99995, 0, 0, 0, 0.79324, 0.608671, 0, -0.608675, 0.793235, -16.4602, 2.94168, 7.33457) +script = ExtResource("2_g1bv4") +priority_override = false +priority = 0 +follow_mode = 5 +follow_target = NodePath("../PlayerCharacterBody3D") +follow_parameters/distance = 4.0 +follow_parameters/target_offset = Vector3(0, 0, 0) +follow_parameters/damping = false +follow_parameters/dead_zone_horizontal = 0.294 +follow_parameters/dead_zone_vertical = 0.201 +follow_parameters/viewfinder_in_play = true +look_at_mode = 0 +tween_parameters = null +tween_on_load = false +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="PlayerCharacterBody3D" type="CharacterBody3D" parent="Player"] +unique_name_in_owner = true +transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -16.4602, 0.507, 4.16163) +script = ExtResource("3_6xt4f") +metadata/_edit_group_ = true + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="Player/PlayerCharacterBody3D"] +mesh = SubResource("CapsuleMesh_pda7a") +surface_material_override/0 = SubResource("StandardMaterial3D_u74j7") + +[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="Player/PlayerCharacterBody3D"] +visible = false +mesh = SubResource("CapsuleMesh_xgjm7") +surface_material_override/0 = SubResource("StandardMaterial3D_u74j7") + +[node name="PlayerArea3D" type="Area3D" parent="Player/PlayerCharacterBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_3xplc") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D"] +shape = SubResource("CapsuleShape3D_3xplc") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("4_t4fso")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.6511, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.8332, -0.540694, -3.39517) +use_collision = true +radius = 1.53269 +height = 2.5036 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.936, -1.50101, 1.22863) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.81402, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.6875, -1.69814, 3.36997) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.14955, -0.599204, -1.04651) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.0848, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.44645, -0.497663, 4.44352) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.1764, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.1256, -0.241718, 7.14677) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.94346, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.30382, 0.138478, -1.89037) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.90576, 0.0440434, 8.36617) +use_collision = true +size = Vector3(4.57784, 1.08809, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D/3DFollowGluedExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3DFollowGluedExampleScene.tscn new file mode 100644 index 0000000..43991eb --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3DFollowGluedExampleScene.tscn @@ -0,0 +1,222 @@ +[gd_scene load_steps=13 format=3 uid="uid://dw2yflu7up2rr"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_pmeux"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd" id="2_q1ygp"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="3_tk586"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn" id="4_8qqha"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png" id="5_wr3bq"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_pda7a"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u74j7"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3xplc"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w3olp"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cw102"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("5_wr3bq") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Node3D" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999954, 0, 0, 0, 0.638683, 0.769345, 0, -0.769298, 0.638723, -11.2101, 6.38964, 6.74731) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +script = ExtResource("1_pmeux") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player"] +unique_name_in_owner = true +transform = Transform3D(0.999954, 0, 0, 0, 0.638683, 0.769345, 0, -0.769298, 0.638723, -11.2101, 6.38964, 6.74731) +script = ExtResource("2_q1ygp") +priority_override = false +priority = 5 +follow_mode = 1 +follow_target = NodePath("../PlayerCharacterBody3D") +follow_parameters/damping = true +follow_parameters/damping_value = 5.0 +look_at_mode = 0 +tween_parameters = null +tween_on_load = false +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="PlayerCharacterBody3D" type="CharacterBody3D" parent="Player"] +unique_name_in_owner = true +transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -11.2101, 6.38964, 6.74731) +script = ExtResource("3_tk586") +enable_gravity = false +metadata/_edit_group_ = true + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="Player/PlayerCharacterBody3D"] +visible = false +mesh = SubResource("CapsuleMesh_pda7a") +surface_material_override/0 = SubResource("StandardMaterial3D_u74j7") + +[node name="PlayerArea3D" type="Area3D" parent="Player/PlayerCharacterBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_3xplc") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D"] +shape = SubResource("CapsuleShape3D_3xplc") + +[node name="PlayerCharacterBody3D2" type="CharacterBody3D" parent="Player"] +unique_name_in_owner = true +transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -12.0829, 0.5, 1.40206) +metadata/_edit_group_ = true + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="Player/PlayerCharacterBody3D2"] +mesh = SubResource("CapsuleMesh_pda7a") +surface_material_override/0 = SubResource("StandardMaterial3D_u74j7") + +[node name="PlayerArea3D" type="Area3D" parent="Player/PlayerCharacterBody3D2"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_3xplc") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2"] +shape = SubResource("CapsuleShape3D_3xplc") + +[node name="NPCs" type="Node" parent="."] + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.6059, 0.519002, -1.52506) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_w3olp") + +[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.0461, 0.519, 4.06618) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_cw102") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("4_8qqha")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.6511, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.9141, 0.31181, -5.46661) +use_collision = true +radius = 2.77591 +height = 1.62362 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.6099, 0.31181, 6.6322) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.75028, 0.201103, 2.71259) +use_collision = true +radius = 1.41311 +height = 1.40221 +sides = 32 + +[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.61885, 0.201101, 11.6804) +use_collision = true +radius = 2.21673 +height = 7.88261 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.81402, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.95333, -1.69814, -6.51262) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.4682, -0.599204, 8.81048) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.0848, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.2356, -1.90735e-06, 0.346393) +use_collision = true +inner_radius = 1.3 +outer_radius = 2.0 +sides = 32 +ring_sides = 18 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.90455, -1.90735e-06, 7.89765) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.1764, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.31901, 0.335247, 8.22829) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.94346, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.7985, 0.138478, 5.20734) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18.1236, 1.78638, -1.60318) +use_collision = true +size = Vector3(4.57784, 4.57276, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D/3DFollowGroupExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3DFollowGroupExampleScene.tscn new file mode 100644 index 0000000..24855c7 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3DFollowGroupExampleScene.tscn @@ -0,0 +1,186 @@ +[gd_scene load_steps=13 format=3 uid="uid://dbfiy6svpcqap"] + +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn" id="1_r00ve"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd" id="2_pi7mp"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png" id="3_a5igg"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="3_wr1tj"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="4_hehj7"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_pda7a"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u74j7"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3xplc"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w3olp"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cw102"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("3_a5igg") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Node3D" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -12.326, 2.60717, 5.26374) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +script = ExtResource("3_wr1tj") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player"] +unique_name_in_owner = true +transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -12.326, 2.60717, 5.26374) +script = ExtResource("2_pi7mp") +priority_override = false +priority = 5 +follow_mode = 3 +follow_group = Array[NodePath]([NodePath("../PlayerCharacterBody3D2"), NodePath("../../NPCs/PlayerMeshInstance3D"), NodePath("../../NPCs/PlayerMeshInstance3D2")]) +follow_parameters/auto_distance = true +follow_parameters/min_distance = 2.0 +follow_parameters/max_distance = 15.0 +follow_parameters/auto_distance_divisor = 20.0 +follow_parameters/target_offset = Vector3(0, 0, 0) +follow_parameters/damping = true +follow_parameters/damping_value = 5.0 +look_at_mode = 0 +tween_parameters = null +tween_on_load = false +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="PlayerCharacterBody3D2" type="CharacterBody3D" parent="Player"] +unique_name_in_owner = true +transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -12.0829, 0.5, 1.40206) +script = ExtResource("4_hehj7") +metadata/_edit_group_ = true + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="Player/PlayerCharacterBody3D2"] +mesh = SubResource("CapsuleMesh_pda7a") +surface_material_override/0 = SubResource("StandardMaterial3D_u74j7") + +[node name="PlayerArea3D" type="Area3D" parent="Player/PlayerCharacterBody3D2"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_3xplc") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2"] +shape = SubResource("CapsuleShape3D_3xplc") + +[node name="NPCs" type="Node" parent="."] + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.6059, 0.519002, 0.128472) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_w3olp") + +[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.0461, 0.519, 0.249913) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_cw102") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("1_r00ve")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Wall" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.6511, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.9141, 0.31181, -5.46661) +use_collision = true +radius = 2.77591 +height = 1.62362 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.6099, 0.31181, 6.6322) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.81402, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.95333, -1.69814, -6.51262) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.4682, -0.599204, 8.81048) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.0848, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.90455, -1.90735e-06, 7.89765) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.1764, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.31901, 0.335247, 8.22829) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.94346, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.7985, 0.138478, 5.20734) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18.1236, 1.78638, -1.60318) +use_collision = true +size = Vector3(4.57784, 4.57276, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D/3DFollowPathExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3DFollowPathExampleScene.tscn new file mode 100644 index 0000000..471b1c3 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3DFollowPathExampleScene.tscn @@ -0,0 +1,239 @@ +[gd_scene load_steps=23 format=3 uid="uid://dxx7ngi0emt8h"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_lm5n8"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="2_tsk60"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd" id="3_bd7x3"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_hbjve"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn" id="4_dfdlo"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/path_follow.gd" id="5_vdqkm"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="6_obo83"] + +[sub_resource type="Resource" id="Resource_m07s2"] +script = ExtResource("3_hbjve") +duration = 0.6 +transition = 1 +ease = 2 + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_vr5ym"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mjpjo"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_ca4wa"] + +[sub_resource type="Resource" id="Resource_rw4bl"] +script = ExtResource("3_hbjve") +duration = 1.0 +transition = 3 +ease = 2 + +[sub_resource type="Curve3D" id="Curve3D_b33df"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -10), +"tilts": PackedFloat32Array(0, 0) +} +point_count = 2 + +[sub_resource type="BoxShape3D" id="BoxShape3D_aovgi"] +size = Vector3(6, 0.1, 10) + +[sub_resource type="BoxMesh" id="BoxMesh_0hdeh"] +size = Vector3(6, 0.1, 10) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_fsm1b"] +transparency = 1 +albedo_color = Color(0.988235, 0.478431, 0.905882, 0.0901961) + +[sub_resource type="Curve3D" id="Curve3D_8uw2x"] +_data = { +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0), +"tilts": PackedFloat32Array(0, 0) +} +point_count = 2 + +[sub_resource type="BoxShape3D" id="BoxShape3D_ctnqu"] +size = Vector3(12, 0.1, 4) + +[sub_resource type="BoxMesh" id="BoxMesh_f6dp8"] +size = Vector3(12, 0.1, 4) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_gwnkj"] +transparency = 1 +albedo_color = Color(0.568403, 0.988235, 0.762724, 0.0901961) + +[sub_resource type="BoxMesh" id="BoxMesh_7l3dh"] + +[sub_resource type="BoxMesh" id="BoxMesh_as6ok"] + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999807, -0.00216249, 0.00184445, 0, 0.648836, 0.760728, -0.00284214, -0.760718, 0.648839, 4.00185, 2.99999, -1.51096) +fov = 90.0 + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +script = ExtResource("1_lm5n8") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999807, -0.00216249, 0.00184445, 0, 0.648836, 0.760728, -0.00284214, -0.760718, 0.648839, 4.00185, 2.99999, -1.51096) +script = ExtResource("3_bd7x3") +priority_override = false +priority = 3 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D") +follow_parameters/target_offset = Vector3(0, 2.5, 2) +follow_parameters/damping = true +follow_parameters/damping_value = 10.0 +look_at_mode = 0 +tween_parameters = SubResource("Resource_m07s2") +tween_on_load = false +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="PlayerCharacterBody3D" type="CharacterBody3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.00185, 0.499993, -3.51096) +script = ExtResource("2_tsk60") +SPEED = 3.5 +metadata/_edit_group_ = true + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="PlayerCharacterBody3D"] +mesh = SubResource("CapsuleMesh_vr5ym") +surface_material_override/0 = SubResource("StandardMaterial3D_mjpjo") + +[node name="PlayerArea3D" type="Area3D" parent="PlayerCharacterBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_ca4wa") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D"] +shape = SubResource("CapsuleShape3D_ca4wa") + +[node name="Paths" type="Node" parent="."] + +[node name="PathPhantomCamera3D" type="Node3D" parent="Paths"] +transform = Transform3D(-4.37114e-08, -1, -4.37114e-08, 0, -4.37114e-08, 1, -1, 4.37114e-08, 1.91069e-15, 3.73176, 7.9199, -4.8731) +script = ExtResource("3_bd7x3") +priority_override = false +priority = 2 +follow_mode = 4 +follow_target = NodePath("../../PlayerCharacterBody3D") +follow_path = NodePath("../FollowPath") +follow_parameters/damping = true +follow_parameters/damping_value = 3.0 +look_at_mode = 0 +tween_parameters = SubResource("Resource_rw4bl") +tween_on_load = false +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="FollowPath" type="Path3D" parent="Paths"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.73176, 7.9199, -4.8731) +curve = SubResource("Curve3D_b33df") + +[node name="StraightPathFollowTrigger" type="Area3D" parent="Paths" node_paths=PackedStringArray("path_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, -0.45, -10) +priority = 5 +script = ExtResource("5_vdqkm") +path_pcam = NodePath("../PathPhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Paths/StraightPathFollowTrigger"] +shape = SubResource("BoxShape3D_aovgi") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Paths/StraightPathFollowTrigger/CollisionShape3D"] +mesh = SubResource("BoxMesh_0hdeh") +skeleton = NodePath("../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_fsm1b") +metadata/_edit_group_ = true + +[node name="PathPhantomCamera3D2" type="Node3D" parent="Paths"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 4.00185, 7.9199, -16.7205) +visible = false +script = ExtResource("3_bd7x3") +priority_override = false +priority = 2 +follow_mode = 4 +follow_target = NodePath("../../PlayerCharacterBody3D") +follow_path = NodePath("../FollowPath2") +follow_parameters/damping = true +follow_parameters/damping_value = 3.0 +look_at_mode = 0 +tween_parameters = SubResource("Resource_rw4bl") +tween_on_load = false +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="FollowPath2" type="Path3D" parent="Paths"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.92937, 7.9199, -16.7205) +curve = SubResource("Curve3D_8uw2x") + +[node name="StraightPathFollowTrigger2" type="Area3D" parent="Paths" node_paths=PackedStringArray("path_pcam")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0, -17) +priority = 5 +script = ExtResource("5_vdqkm") +path_pcam = NodePath("../PathPhantomCamera3D2") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Paths/StraightPathFollowTrigger2"] +shape = SubResource("BoxShape3D_ctnqu") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Paths/StraightPathFollowTrigger2/CollisionShape3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.45, 0) +mesh = SubResource("BoxMesh_f6dp8") +skeleton = NodePath("../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_gwnkj") +metadata/_edit_group_ = true + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("4_dfdlo")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Floor3" parent="Environment" instance=ExtResource("4_dfdlo")] +transform = Transform3D(6, 0, 0, 0, 1, 0, 0, 0, 1, 3.6, 0, -1.5) + +[node name="Floor2" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")] +transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 14, -0.516667, 1, -6.5) + +[node name="Floor5" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")] +transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 14, 0.65, 1, -6.5) + +[node name="Floor4" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")] +transform = Transform3D(2, 0, 0, 0, 3, 0, 0, 0, 1, 0.0666667, 1, -18) + +[node name="Floor6" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")] +transform = Transform3D(0.333333, 0, 0, 0, 3, 0, 0, 0, 1, -0.766667, 1, -13) +mesh = SubResource("BoxMesh_7l3dh") + +[node name="Floor8" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")] +transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 6, -1.01667, 1, -15.5) +mesh = SubResource("BoxMesh_as6ok") + +[node name="Floor9" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")] +transform = Transform3D(0.166667, 0, 0, 0, 3, 0, 0, 0, 6, 1.15, 1, -15.5) +mesh = SubResource("BoxMesh_as6ok") + +[node name="Floor7" parent="Environment/Floor3" instance=ExtResource("4_dfdlo")] +transform = Transform3D(0.333333, 0, 0, 0, 3, 0, 0, 0, 1, 0.9, 1, -13) +mesh = SubResource("BoxMesh_7l3dh") + +[node name="NPCDescriptionLabel" type="Label3D" parent="Environment"] +transform = Transform3D(5.21541e-08, -1, -7.7486e-07, -1.10675e-15, 2.23517e-07, 0.999999, -0.999999, -7.45058e-08, -5.68829e-14, 0.568982, 2.59595, -8.78089) +text = "Camera follows player while confined to a Path3D" +font = ExtResource("6_obo83") +font_size = 64 + +[node name="MovementInstructionsLabel" type="Label3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 4.0203, -0.455369, -2.69276) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("6_obo83") +font_size = 48 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3DFollowSimpleExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3DFollowSimpleExampleScene.tscn new file mode 100644 index 0000000..1693c2e --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3DFollowSimpleExampleScene.tscn @@ -0,0 +1,170 @@ +[gd_scene load_steps=12 format=3 uid="uid://buglvjwpn85ny"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_trxu1"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd" id="2_grjck"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3D_resource.gd" id="3_ac3tw"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="3_uymu2"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn" id="4_4u2y6"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png" id="5_1tybo"] + +[sub_resource type="Resource" id="Resource_beoni"] +script = ExtResource("3_ac3tw") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +fov = 75.0 + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_pda7a"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u74j7"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3xplc"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("5_1tybo") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Node3D" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -13.1946, 2.34415, 10.4086) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +script = ExtResource("1_trxu1") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player"] +unique_name_in_owner = true +transform = Transform3D(0.999954, 0, 0, 0, 0.906188, 0.422588, 0, -0.422562, 0.906243, -13.1946, 2.34415, 10.4086) +script = ExtResource("2_grjck") +priority_override = false +priority = 0 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D2") +follow_parameters/target_offset = Vector3(0, 2, 2) +follow_parameters/damping = true +follow_parameters/damping_value = 10.0 +look_at_mode = 0 +tween_parameters = null +tween_on_load = false +inactive_update_mode = 0 +camera_3D_resource = SubResource("Resource_beoni") + +[node name="PlayerCharacterBody3D2" type="CharacterBody3D" parent="Player"] +unique_name_in_owner = true +transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -13.1946, 0.344147, 8.40857) +script = ExtResource("3_uymu2") +metadata/_edit_group_ = true + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="Player/PlayerCharacterBody3D2"] +mesh = SubResource("CapsuleMesh_pda7a") +surface_material_override/0 = SubResource("StandardMaterial3D_u74j7") + +[node name="PlayerArea3D" type="Area3D" parent="Player/PlayerCharacterBody3D2"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_3xplc") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2"] +shape = SubResource("CapsuleShape3D_3xplc") + +[node name="NPCs" type="Node" parent="."] + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("4_4u2y6")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.6511, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.8332, -0.540694, -3.39517) +use_collision = true +radius = 1.53269 +height = 2.5036 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -16.936, -1.50101, 1.22863) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.81402, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -23.6875, -1.69814, 3.36997) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.14955, -0.599204, -1.04651) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.0848, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.44645, -0.497663, 4.44352) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.1764, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -18.1256, 0.335247, 7.14677) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.94346, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.30382, 0.138478, -1.89037) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.04727, 0.0440434, 8.36617) +use_collision = true +size = Vector3(4.57784, 1.08809, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D/3DFollowThirdPersonExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3DFollowThirdPersonExampleScene.tscn new file mode 100644 index 0000000..611069a --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3DFollowThirdPersonExampleScene.tscn @@ -0,0 +1,216 @@ +[gd_scene load_steps=19 format=3 uid="uid://4i5csj0s34nb"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_b4nxi"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd" id="2_whx47"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_oisgy"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn" id="4_lii5s"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/camera_3D_resource.gd" id="5_jt2lp"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd" id="5_p60kr"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="7_kg7u1"] + +[sub_resource type="Resource" id="Resource_0yw0t"] +script = ExtResource("3_oisgy") +duration = 0.3 +transition = 1 +ease = 2 + +[sub_resource type="Resource" id="Resource_bai5y"] +script = ExtResource("5_jt2lp") +cull_mask = 1048575 +h_offset = 0.0 +v_offset = 0.0 +fov = 75.0 + +[sub_resource type="Resource" id="Resource_xvcjx"] +script = ExtResource("3_oisgy") +duration = 0.25 +transition = 1 +ease = 2 + +[sub_resource type="Resource" id="Resource_yf1op"] +script = ExtResource("5_jt2lp") +cull_mask = 1048575 +h_offset = 1.0 +v_offset = 0.0 +fov = 50.0 + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_s61dn"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_47f0o"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_mv4do"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="PrismMesh" id="PrismMesh_wg1x3"] +size = Vector3(0.5, 0.5, 0.3) + +[sub_resource type="BoxMesh" id="BoxMesh_wsigl"] +size = Vector3(1, 10, 20) + +[sub_resource type="BoxMesh" id="BoxMesh_bj3re"] +size = Vector3(1, 7, 7) + +[sub_resource type="Resource" id="Resource_daoak"] +script = ExtResource("3_oisgy") +duration = 1.0 +transition = 7 +ease = 2 + +[node name="Root" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.499999, 0, -0.5, 0.866023, -0.0194088, 2.25688, 3.01476) +current = true + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +script = ExtResource("1_b4nxi") + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 0.866025, 0.499999, 0, -0.5, 0.866023, -0.0194088, 2.25688, 3.01476) +script = ExtResource("2_whx47") +priority_override = false +priority = 10 +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D") +follow_parameters/spring_arm/spring_length = 3.5 +follow_parameters/spring_arm/collision_mask = 1 +follow_parameters/spring_arm/shape = null +follow_parameters/spring_arm/margin = 0.2 +follow_parameters/target_offset = Vector3(0, 0, 0) +follow_parameters/damping = true +follow_parameters/damping_value = 10.0 +look_at_mode = 0 +tween_parameters = SubResource("Resource_0yw0t") +tween_on_load = false +inactive_update_mode = 0 +camera_3D_resource = SubResource("Resource_bai5y") + +[node name="PlayerAimPhantomCamera3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.953716, -0.0104945, 0.300522, 0, 0.99939, 0.0348995, -0.300706, -0.0332842, 0.953135, 0.431374, 1.35423, 1.41338) +script = ExtResource("2_whx47") +priority_override = false +priority = 0 +follow_mode = 6 +follow_target = NodePath("../PlayerCharacterBody3D") +follow_parameters/spring_arm/spring_length = 1.5 +follow_parameters/spring_arm/collision_mask = 1 +follow_parameters/spring_arm/shape = null +follow_parameters/spring_arm/margin = 0.5 +follow_parameters/target_offset = Vector3(0, 0.795, 0) +follow_parameters/damping = false +look_at_mode = 0 +tween_parameters = SubResource("Resource_xvcjx") +tween_on_load = false +inactive_update_mode = 0 +camera_3D_resource = SubResource("Resource_yf1op") + +[node name="PlayerCharacterBody3D" type="CharacterBody3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999903, 0.0139622, 0, -0.0139622, 0.999903, 0, 0, 0, 1, -0.0194088, 0.506884, -0.0163251) +collision_layer = 2 +script = ExtResource("5_p60kr") +metadata/_edit_group_ = true + +[node name="PlayerArea3D" type="Area3D" parent="PlayerCharacterBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_s61dn") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D"] +shape = SubResource("CapsuleShape3D_s61dn") + +[node name="PlayerModel" type="Node3D" parent="PlayerCharacterBody3D"] + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="PlayerCharacterBody3D/PlayerModel"] +transform = Transform3D(1, 0, 0, 0, 1, 4.65661e-10, 0, 0, 1, 0, 0, 0) +mesh = SubResource("CapsuleMesh_47f0o") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_mv4do") + +[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="PlayerCharacterBody3D/PlayerModel"] +transform = Transform3D(1, 0, 0, -9.31323e-10, 1, 4.65661e-10, 2.98023e-08, 0, 1, -0.0156226, 1.08631, 0) +mesh = SubResource("PrismMesh_wg1x3") +skeleton = NodePath("../..") +surface_material_override/0 = SubResource("StandardMaterial3D_mv4do") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="Wall" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall5" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.133, 3, -6.5) +mesh = SubResource("BoxMesh_bj3re") +metadata/_edit_lock_ = true + +[node name="Wall6" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.5, 3, 0) +mesh = SubResource("BoxMesh_bj3re") +metadata/_edit_lock_ = true + +[node name="Wall7" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, 3, 0) +mesh = SubResource("BoxMesh_bj3re") +metadata/_edit_lock_ = true + +[node name="Wall2" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.5, 4.5, 0) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall3" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, 10.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="Wall4" parent="Environment" instance=ExtResource("4_lii5s")] +transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 4.5, -9.5) +mesh = SubResource("BoxMesh_wsigl") +metadata/_edit_lock_ = true + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="CeilingPhantomCamera3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(-4.37114e-08, -1, 2.98023e-08, 0, 2.98023e-08, 1, -1, 4.37114e-08, -1.3027e-15, -0.200665, 13.366, -0.162648) +script = ExtResource("2_whx47") +priority_override = false +priority = 1 +follow_mode = 0 +look_at_mode = 0 +tween_parameters = SubResource("Resource_daoak") +tween_on_load = true +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="MovementInstructionsLabel" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 1.44357) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[WASD] to move" +font = ExtResource("7_kg7u1") +font_size = 48 + +[node name="MovementInstructionsLabel3" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0.0505604, -0.484909, 0.817134) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Right Mouse Click] to \"aim\"" +font = ExtResource("7_kg7u1") +font_size = 48 + +[node name="MovementInstructionsLabel2" type="Label3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -0.0440154, -0.490478, -6.30248) +modulate = Color(0.294118, 1, 0.631373, 1) +text = "[Space] to toggle PCam" +font = ExtResource("7_kg7u1") +font_size = 48 diff --git a/addons/phantom_camera/examples/example_scenes/3D/3DLookAtExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3DLookAtExampleScene.tscn new file mode 100644 index 0000000..55ae1f5 --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3DLookAtExampleScene.tscn @@ -0,0 +1,202 @@ +[gd_scene load_steps=13 format=3 uid="uid://bdhrdhbux7sjg"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="1_lldvu"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd" id="2_8md3q"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="3_odwso"] +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn" id="4_2i811"] +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png" id="5_u5qhp"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_pda7a"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u74j7"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_3xplc"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_2h36r"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_w3olp"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_cw102"] +albedo_color = Color(0.227451, 0.337255, 0.576471, 1) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_auy8m"] +albedo_texture = ExtResource("5_u5qhp") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="Node3D" type="Node3D"] + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999952, -0.00114636, 0.00116873, -5.82049e-11, 0.713788, 0.700216, -0.00163718, -0.700172, 0.713831, -12.3172, 5.78213, 6.64571) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +script = ExtResource("1_lldvu") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Player" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="Player"] +unique_name_in_owner = true +transform = Transform3D(0.999952, -0.00114636, 0.00116873, 0, 0.713788, 0.700216, -0.00163718, -0.700172, 0.713831, -12.3172, 5.78213, 6.64571) +script = ExtResource("2_8md3q") +priority_override = false +priority = 5 +follow_mode = 0 +look_at_mode = 3 +look_at_group = Array[NodePath]([NodePath("../PlayerCharacterBody3D2"), NodePath("../../NPCs/PlayerMeshInstance3D"), NodePath("../../NPCs/PlayerMeshInstance3D2")]) +tween_parameters = null +tween_on_load = false +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="PlayerCharacterBody3D2" type="CharacterBody3D" parent="Player"] +unique_name_in_owner = true +transform = Transform3D(0.999897, 0.0143636, 0, -0.0143636, 0.999897, 0, 0, 0, 1, -12.0829, 0.5, 1.40206) +script = ExtResource("3_odwso") +SPEED = 3.0 +metadata/_edit_group_ = true + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="Player/PlayerCharacterBody3D2"] +mesh = SubResource("CapsuleMesh_pda7a") +surface_material_override/0 = SubResource("StandardMaterial3D_u74j7") + +[node name="PlayerArea3D" type="Area3D" parent="Player/PlayerCharacterBody3D2"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_3xplc") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="Player/PlayerCharacterBody3D2"] +shape = SubResource("CapsuleShape3D_3xplc") + +[node name="NPCs" type="Node" parent="."] + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -14.6059, 0.519002, -1.52506) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_w3olp") + +[node name="PlayerMeshInstance3D2" type="MeshInstance3D" parent="NPCs"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -10.0461, 0.519, 4.06618) +mesh = SubResource("CapsuleMesh_2h36r") +skeleton = NodePath("") +surface_material_override/0 = SubResource("StandardMaterial3D_cw102") + +[node name="Environment" type="Node" parent="."] + +[node name="Floor" parent="Environment" instance=ExtResource("4_2i811")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="CSGCylinder3D" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -13.6511, 0.805455, -6.37532) +use_collision = true +radius = 1.71971 +height = 2.61091 +sides = 32 + +[node name="CSGCylinder3D5" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.9141, 0.31181, -5.46661) +use_collision = true +radius = 2.77591 +height = 1.62362 +sides = 32 + +[node name="CSGCylinder3D6" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.6099, 0.31181, 6.6322) +use_collision = true +radius = 1.57419 +height = 3.47475 +sides = 32 + +[node name="CSGCylinder3D3" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.75028, 0.201103, 2.71259) +use_collision = true +radius = 1.41311 +height = 1.40221 +sides = 32 + +[node name="CSGCylinder3D4" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -4.61885, 0.201101, 11.6804) +use_collision = true +radius = 2.21673 +height = 7.88261 +sides = 32 + +[node name="CSGCylinder3D2" type="CSGCylinder3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -3.81402, 0.805455, -8.78984) +use_collision = true +radius = 0.956285 +height = 2.61091 +sides = 32 + +[node name="CSGSphere3D" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.95333, -1.69814, -6.51262) +use_collision = true +radius = 3.34732 +rings = 32 + +[node name="CSGSphere3D2" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.4682, -0.599204, 8.81048) +use_collision = true +radius = 2.65844 +rings = 32 + +[node name="CSGSphere3D3" type="CSGSphere3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.0848, -0.599204, -2.42244) +use_collision = true +radius = 2.14606 +rings = 32 + +[node name="CSGTorus3D" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -17.2356, -1.90735e-06, 0.346393) +use_collision = true +inner_radius = 1.3 +outer_radius = 2.0 +sides = 32 +ring_sides = 18 + +[node name="CSGTorus3D2" type="CSGTorus3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 9.90455, -1.90735e-06, 7.89765) +use_collision = true +inner_radius = 0.971543 +outer_radius = 2.15226 +sides = 32 +ring_sides = 18 + +[node name="CSGBox3D" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.52545, 6.53866, -12.6331) +use_collision = true +size = Vector3(178.429, 14.0773, 1) +material = SubResource("StandardMaterial3D_auy8m") + +[node name="CSGBox3D2" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -21.1764, 0.760708, -6.1376) +use_collision = true +size = Vector3(2.64182, 2.52142, 2.30997) + +[node name="CSGBox3D5" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.31901, 0.335247, 8.22829) +use_collision = true +size = Vector3(3.80964, 1.67049, 0.932048) + +[node name="CSGBox3D3" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -6.94346, 0.138478, -4.36159) +use_collision = true +size = Vector3(1.53893, 1.27695, 1.80814) + +[node name="CSGBox3D6" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -26.7985, 0.138478, 5.20734) +use_collision = true +size = Vector3(4.03502, 1.27695, 5.2198) + +[node name="CSGBox3D4" type="CSGBox3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 18.1236, 1.78638, -1.60318) +use_collision = true +size = Vector3(4.57784, 4.57276, 3.11285) diff --git a/addons/phantom_camera/examples/example_scenes/3D/3DTweeningExampleScene.tscn b/addons/phantom_camera/examples/example_scenes/3D/3DTweeningExampleScene.tscn new file mode 100644 index 0000000..e39180c --- /dev/null +++ b/addons/phantom_camera/examples/example_scenes/3D/3DTweeningExampleScene.tscn @@ -0,0 +1,270 @@ +[gd_scene load_steps=19 format=3 uid="uid://5xtssqdfilal"] + +[ext_resource type="PackedScene" uid="uid://cixlwqycoox8h" path="res://addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn" id="1_ydeog"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd" id="2_b2yrt"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd" id="3_m2w30"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/player_controller.gd" id="4_68dqc"] +[ext_resource type="Resource" uid="uid://cptfoggk2ok67" path="res://addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera3DTween.tres" id="4_aj0kl"] +[ext_resource type="Script" path="res://addons/phantom_camera/examples/scripts/3D/3D_trigger_area.gd" id="5_h0ouh"] +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="6_wup4d"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="8_60rny"] + +[sub_resource type="CapsuleMesh" id="CapsuleMesh_qde4k"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_ks21f"] +albedo_color = Color(0.988235, 0.498039, 0.498039, 1) + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_12ynn"] + +[sub_resource type="BoxShape3D" id="BoxShape3D_j6fha"] +size = Vector3(5, 0.1, 4) + +[sub_resource type="BoxMesh" id="BoxMesh_xg4en"] +size = Vector3(5, 0.1, 4) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2dct5"] +transparency = 1 +albedo_color = Color(0.988235, 0.478431, 0.905882, 0.0901961) + +[sub_resource type="Resource" id="Resource_hml7x"] +script = ExtResource("6_wup4d") +duration = 0.6 +transition = 0 +ease = 2 + +[sub_resource type="Resource" id="Resource_pjwwe"] +script = ExtResource("6_wup4d") +duration = 0.3 +transition = 1 +ease = 2 + +[sub_resource type="Resource" id="Resource_ex8sv"] +script = ExtResource("6_wup4d") +duration = 0.3 +transition = 8 +ease = 2 + +[sub_resource type="Resource" id="Resource_n4qdq"] +script = ExtResource("6_wup4d") +duration = 1.2 +transition = 10 +ease = 2 + +[node name="Root" type="Node3D"] + +[node name="Environment" type="Node" parent="."] + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="Environment"] +transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 8, 0) +metadata/_edit_lock_ = true + +[node name="Floor" parent="Environment" instance=ExtResource("1_ydeog")] +transform = Transform3D(1000, 0, 0, 0, 1, 0, 0, 0, 1000, 0, -1, 0) +metadata/_edit_lock_ = true + +[node name="MainCamera3D" type="Camera3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999889, 0, 0, 0, 0.707092, 0.707088, 0, -0.707092, 0.707088, -0.0548701, 2.5, 5.82771) + +[node name="PhantomCameraHost" type="Node" parent="MainCamera3D"] +script = ExtResource("2_b2yrt") + +[node name="------------------" type="Node" parent="."] + +[node name="PlayerPhantomCamera3D" type="Node3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(0.999889, 0, 0, 0, 0.707092, 0.707088, 0, -0.707092, 0.707088, -0.0548701, 2.5, 5.82771) +script = ExtResource("3_m2w30") +priority_override = false +priority = 3 +follow_mode = 2 +follow_target = NodePath("../PlayerCharacterBody3D") +follow_parameters/target_offset = Vector3(0, 2, 2) +follow_parameters/damping = true +follow_parameters/damping_value = 10.0 +look_at_mode = 0 +tween_parameters = ExtResource("4_aj0kl") +tween_on_load = false +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="PlayerCharacterBody3D" type="CharacterBody3D" parent="."] +unique_name_in_owner = true +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.0548701, 0.5, 3.82771) +script = ExtResource("4_68dqc") +metadata/_edit_group_ = true + +[node name="PlayerMeshInstance3D" type="MeshInstance3D" parent="PlayerCharacterBody3D"] +mesh = SubResource("CapsuleMesh_qde4k") +surface_material_override/0 = SubResource("StandardMaterial3D_ks21f") + +[node name="PlayerArea3D" type="Area3D" parent="PlayerCharacterBody3D"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D/PlayerArea3D"] +shape = SubResource("CapsuleShape3D_12ynn") + +[node name="PlayerCollisionShape3D" type="CollisionShape3D" parent="PlayerCharacterBody3D"] +shape = SubResource("CapsuleShape3D_12ynn") + +[node name="-------------------" type="Node" parent="."] + +[node name="Tweening Example" type="Node3D" parent="."] + +[node name="Linear" type="Node3D" parent="Tweening Example"] + +[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Linear" node_paths=PackedStringArray("area_pcam")] +priority = 5 +script = ExtResource("5_h0ouh") +area_pcam = NodePath("../PhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Linear/EntryRoomTrigger"] +shape = SubResource("BoxShape3D_j6fha") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Linear/EntryRoomTrigger"] +mesh = SubResource("BoxMesh_xg4en") +skeleton = NodePath("../../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_2dct5") +metadata/_edit_group_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Linear"] +transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 4.8, 3.3) +script = ExtResource("3_m2w30") +priority_override = false +priority = 0 +follow_mode = 0 +look_at_mode = 0 +tween_parameters = SubResource("Resource_hml7x") +tween_on_load = true +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Linear"] +transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, -1.8, 0.5, 0) +text = "Transition Type: +Linear + +Duration: +0.6s" +font = ExtResource("8_60rny") +font_size = 48 + +[node name="Sine" type="Node3D" parent="Tweening Example"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -7.4) + +[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Sine" node_paths=PackedStringArray("area_pcam")] +priority = 5 +script = ExtResource("5_h0ouh") +area_pcam = NodePath("../PhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Sine/EntryRoomTrigger"] +shape = SubResource("BoxShape3D_j6fha") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Sine/EntryRoomTrigger"] +mesh = SubResource("BoxMesh_xg4en") +skeleton = NodePath("../../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_2dct5") +metadata/_edit_group_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Sine"] +transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 4.8, 3.3) +script = ExtResource("3_m2w30") +priority_override = false +priority = 0 +follow_mode = 0 +look_at_mode = 0 +tween_parameters = SubResource("Resource_pjwwe") +tween_on_load = true +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Sine"] +transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, 1.7, 0.5, 0) +text = "Transition Type: +Sine + +Duration: +0.3s" +font = ExtResource("8_60rny") +font_size = 72 + +[node name="Circ" type="Node3D" parent="Tweening Example"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -14.1) + +[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Circ" node_paths=PackedStringArray("area_pcam")] +priority = 5 +script = ExtResource("5_h0ouh") +area_pcam = NodePath("../PhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Circ/EntryRoomTrigger"] +shape = SubResource("BoxShape3D_j6fha") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Circ/EntryRoomTrigger"] +mesh = SubResource("BoxMesh_xg4en") +skeleton = NodePath("../../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_2dct5") +metadata/_edit_group_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Circ"] +transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, 0, 4.8, 3.3) +script = ExtResource("3_m2w30") +priority_override = false +priority = 0 +follow_mode = 0 +look_at_mode = 0 +tween_parameters = SubResource("Resource_ex8sv") +tween_on_load = true +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Circ"] +transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, -1.8, 0.5, 0) +text = "Transition Type: +Circ + +Duration: +0.3s" +font = ExtResource("8_60rny") +font_size = 72 + +[node name="Back" type="Node3D" parent="Tweening Example"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -21) + +[node name="EntryRoomTrigger" type="Area3D" parent="Tweening Example/Back" node_paths=PackedStringArray("area_pcam")] +priority = 5 +script = ExtResource("5_h0ouh") +area_pcam = NodePath("../PhantomCamera3D") +metadata/_edit_group_ = true + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Tweening Example/Back/EntryRoomTrigger"] +shape = SubResource("BoxShape3D_j6fha") + +[node name="NPCInteractionZoneMesh" type="MeshInstance3D" parent="Tweening Example/Back/EntryRoomTrigger"] +mesh = SubResource("BoxMesh_xg4en") +skeleton = NodePath("../../../../..") +surface_material_override/0 = SubResource("StandardMaterial3D_2dct5") +metadata/_edit_group_ = true + +[node name="PhantomCamera3D" type="Node3D" parent="Tweening Example/Back"] +transform = Transform3D(1, 0, 0, 0, 0.642788, 0.766044, 0, -0.766044, 0.642788, -0.8, 4.8, 3.3) +script = ExtResource("3_m2w30") +priority_override = false +priority = 0 +follow_mode = 0 +look_at_mode = 0 +tween_parameters = SubResource("Resource_n4qdq") +tween_on_load = true +inactive_update_mode = 0 +camera_3D_resource = null + +[node name="TweenNameLabel" type="Label3D" parent="Tweening Example/Back"] +transform = Transform3D(1, 0, 0, 0, 0.695913, 0.718126, 0, -0.718126, 0.695913, 1.7, 0.5, 0) +text = "Transition Type: +Back + +Duration: +1.2s" +font = ExtResource("8_60rny") +font_size = 48 diff --git a/addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn b/addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn new file mode 100644 index 0000000..bb58abb --- /dev/null +++ b/addons/phantom_camera/examples/models/3DPrototypeCubeDark.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=4 format=3 uid="uid://cixlwqycoox8h"] + +[ext_resource type="Texture2D" uid="uid://c7ja4woxol8yc" path="res://addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png" id="1_836jx"] + +[sub_resource type="BoxMesh" id="BoxMesh_d24c3"] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_aox6v"] +albedo_texture = ExtResource("1_836jx") +uv1_triplanar = true +uv1_world_triplanar = true + +[node name="3DPrototypeCube" type="CSGMesh3D"] +use_collision = true +mesh = SubResource("BoxMesh_d24c3") +material = SubResource("StandardMaterial3D_aox6v") diff --git a/addons/phantom_camera/examples/resources/tween/FixedCameraTween.tres b/addons/phantom_camera/examples/resources/tween/FixedCameraTween.tres new file mode 100644 index 0000000..640b6ae --- /dev/null +++ b/addons/phantom_camera/examples/resources/tween/FixedCameraTween.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="PhantomCameraTween" load_steps=2 format=3 uid="uid://c1v786g5agaw5"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="1_ptlie"] + +[resource] +script = ExtResource("1_ptlie") +duration = 0.0 +transition = 0 +ease = 2 diff --git a/addons/phantom_camera/examples/resources/tween/InventoryPhantomCamera2DTween.tres b/addons/phantom_camera/examples/resources/tween/InventoryPhantomCamera2DTween.tres new file mode 100644 index 0000000..38d9879 --- /dev/null +++ b/addons/phantom_camera/examples/resources/tween/InventoryPhantomCamera2DTween.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="PhantomCameraTweenResource" load_steps=2 format=3 uid="uid://cllveybboaqk5"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="1_7yoy0"] + +[resource] +script = ExtResource("1_7yoy0") +duration = 0.6 +transition = 5 +ease = 1 diff --git a/addons/phantom_camera/examples/resources/tween/ItemFocusPhantomCamera2DTween.tres b/addons/phantom_camera/examples/resources/tween/ItemFocusPhantomCamera2DTween.tres new file mode 100644 index 0000000..3a09b1e --- /dev/null +++ b/addons/phantom_camera/examples/resources/tween/ItemFocusPhantomCamera2DTween.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="PhantomCameraTweenResource" load_steps=2 format=3 uid="uid://cecrnq0wnkexh"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="1_sq5ls"] + +[resource] +script = ExtResource("1_sq5ls") +duration = 0.6 +transition = 8 +ease = 1 diff --git a/addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera2DTween.tres b/addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera2DTween.tres new file mode 100644 index 0000000..e23bdbe --- /dev/null +++ b/addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera2DTween.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="PhantomCameraTween" load_steps=2 format=3 uid="uid://euybd2w0bax"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="1_by4ei"] + +[resource] +script = ExtResource("1_by4ei") +duration = 0.6 +transition = 3 +ease = 1 diff --git a/addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera3DTween.tres b/addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera3DTween.tres new file mode 100644 index 0000000..7edea42 --- /dev/null +++ b/addons/phantom_camera/examples/resources/tween/PlayerPhantomCamera3DTween.tres @@ -0,0 +1,9 @@ +[gd_resource type="Resource" script_class="PhantomCameraTween" load_steps=2 format=3 uid="uid://cptfoggk2ok67"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="1_q5tix"] + +[resource] +script = ExtResource("1_q5tix") +duration = 0.6 +transition = 3 +ease = 2 diff --git a/addons/phantom_camera/examples/scripts/2D/2D_trigger_area.gd b/addons/phantom_camera/examples/scripts/2D/2D_trigger_area.gd new file mode 100644 index 0000000..b83428d --- /dev/null +++ b/addons/phantom_camera/examples/scripts/2D/2D_trigger_area.gd @@ -0,0 +1,16 @@ +extends Area2D + +@export var area_pcam: PhantomCamera2D + +func _ready() -> void: + connect("area_entered", _entered_area) + connect("area_exited", _exited_area) + +func _entered_area(area_2D: Area2D) -> void: + if area_2D.get_parent() is CharacterBody2D: + area_pcam.set_priority(20) + +func _exited_area(area_2D: Area2D) -> void: + if area_2D.get_parent() is CharacterBody2D: + area_pcam.set_priority(0) + diff --git a/addons/phantom_camera/examples/scripts/2D/PlayerCharacterBody2D.gd b/addons/phantom_camera/examples/scripts/2D/PlayerCharacterBody2D.gd new file mode 100644 index 0000000..0c4d3b8 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/2D/PlayerCharacterBody2D.gd @@ -0,0 +1,170 @@ +extends CharacterBody2D + +@onready var player_area2D = %PlayerArea2D +@onready var player_sprite: Sprite2D = %PlayerSprite +@onready var interaction_prompt: Panel = %InteractionPrompt +@onready var ui_sign:Control = %UISign +@onready var item_pcam2D: PhantomCamera2D = %ItemFocusPhantomCamera2D +@onready var inventory_pcam2D: PhantomCamera2D = %InventoryPhantomCamera2D +@onready var dark_overlay: ColorRect = %DarkOverlay + +const KEY_STRINGNAME: StringName = "Key" +const ACTION_STRINGNAME: StringName = "Action" +const INPUT_MOVE_LEFT_STRINGNAME: StringName = "move_left" +const INPUT_MOVE_RIGHT_STRINGNAME: StringName = "move_right" + +const SPEED = 350.0 +const JUMP_VELOCITY = -750.0 + +# Get the gravity from the project settings to be synced with RigidBody nodes. +var gravity: int = 2400 +var _is_interactive: bool +var _can_open_inventory: bool +var _movement_disabled: bool +var tween: Tween +var _interactive_UI: Control +var _active_pcam: PhantomCamera2D + +enum InteractiveType { + NONE = 0, + ITEM = 1, + INVENTORY = 2, +} +var _interactive_object: InteractiveType = InteractiveType.NONE + +var InputMovementDic: Dictionary = { + INPUT_MOVE_LEFT_STRINGNAME: { + KEY_STRINGNAME: KEY_A, + ACTION_STRINGNAME: INPUT_MOVE_LEFT_STRINGNAME + }, + INPUT_MOVE_RIGHT_STRINGNAME: { + KEY_STRINGNAME: KEY_D, + ACTION_STRINGNAME: INPUT_MOVE_RIGHT_STRINGNAME + }, +} + + +func _ready() -> void: + player_area2D.connect("body_shape_entered", _show_prompt) + player_area2D.connect("body_shape_exited", _hide_prompt) + + for input in InputMovementDic: + var key_val = InputMovementDic[input].get(KEY_STRINGNAME) + var action_val = InputMovementDic[input].get(ACTION_STRINGNAME) + + var movement_input = InputEventKey.new() + movement_input.physical_keycode = key_val + InputMap.add_action(action_val) + InputMap.action_add_event(action_val, movement_input) + + +func _unhandled_input(event: InputEvent) -> void: + if _is_interactive: + if Input.is_physical_key_pressed(KEY_F): + if tween: + tween.kill() + + if not _movement_disabled: + tween = get_tree().create_tween() + + _movement_disabled = true + _active_pcam.set_priority(10) + + _show_interactive_node(_interactive_UI) + _interactive_node_logic() + + else: + _hide_interactive_node(_interactive_UI) + _interactive_node_logic() + + + if Input.is_physical_key_pressed(KEY_ESCAPE) and _movement_disabled: + _hide_interactive_node(_interactive_UI) + _interactive_node_logic() + + +func _show_interactive_node(UI: Control) -> void: + UI.modulate.a = 0 + UI.visible = true + tween.tween_property(UI, "modulate", Color.WHITE, 1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_CIRC) + + +func _hide_interactive_node(UI: Control) -> void: + _movement_disabled = false + _active_pcam.set_priority(0) + UI.visible = false + + +func _interactive_node_logic() -> void: + match _interactive_object: + 2: + if _movement_disabled: + dark_overlay.set_visible(true) + else: + dark_overlay.set_visible(false) + + +func _physics_process(delta: float) -> void: + if _movement_disabled: return + + if not is_on_floor(): + velocity.y += gravity * delta + + if Input.is_action_just_pressed("ui_accept") and is_on_floor(): + velocity.y = JUMP_VELOCITY + + var input_dir: = Input.get_axis( + INPUT_MOVE_LEFT_STRINGNAME, + INPUT_MOVE_RIGHT_STRINGNAME + ) + + if input_dir: + velocity.x = input_dir * SPEED + if input_dir > 0: + player_sprite.set_flip_h(false) + elif input_dir < 0: + player_sprite.set_flip_h(true) + else: + velocity.x = move_toward(velocity.x, 0, SPEED) + + move_and_slide() + + +func _show_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shape: int) -> void: + if body is TileMap: + var tile_map: TileMap = body + + var tile_coords: Vector2i = tile_map.get_coords_for_body_rid(body_rid) + var cell_data: TileData = tile_map.get_cell_tile_data(1, tile_coords) + + if cell_data: + var cell_data_type: StringName = cell_data.get_custom_data("Type") +# var cell_global_pos: Vector2 = tile_map.to_global(tile_map.map_to_local(tile_coords)) + _is_interactive = true + interaction_prompt.set_visible(true) + + match cell_data_type: + "Sign": + _interactive_UI = %UISign + _active_pcam = item_pcam2D + _interactive_object = InteractiveType.ITEM + "Inventory": + _interactive_UI = %UIInventory + _interactive_object = InteractiveType.INVENTORY + _active_pcam = inventory_pcam2D + + +func _hide_prompt(body_rid: RID, body: Node2D, body_shape_index: int, local_shape: int) -> void: + if body is TileMap: + var tile_map: TileMap = body + + var tile_coords: Vector2i = tile_map.get_coords_for_body_rid(body_rid) + var cell_data: TileData = tile_map.get_cell_tile_data(1, tile_coords) + + if cell_data: + interaction_prompt.set_visible(false) + _is_interactive = false + _interactive_UI = null + _interactive_object = InteractiveType.NONE + _active_pcam = null + diff --git a/addons/phantom_camera/examples/scripts/3D/3D_trigger_area.gd b/addons/phantom_camera/examples/scripts/3D/3D_trigger_area.gd new file mode 100644 index 0000000..4fc9764 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/3D_trigger_area.gd @@ -0,0 +1,26 @@ +extends Area3D + +@export var area_pcam: PhantomCamera3D + +var initial_camera_position: Vector3 +var initial_camera_rotation: Vector3 + +var tween: Tween +var tween_duration: float = 0.9 + + +func _ready() -> void: + connect("area_entered", _entered_area) + connect("area_exited", _exited_area) + + +func _entered_area(area_3D: Area3D) -> void: + if area_3D.get_parent() is CharacterBody3D: + area_pcam.set_priority(20) + + +func _exited_area(area_3D: Area3D) -> void: + if area_3D.get_parent() is CharacterBody3D: + area_pcam.set_priority(0) + + diff --git a/addons/phantom_camera/examples/scripts/3D/NPC.gd b/addons/phantom_camera/examples/scripts/3D/NPC.gd new file mode 100644 index 0000000..b815a06 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/NPC.gd @@ -0,0 +1,66 @@ +extends Node3D + +@onready var npc_pcam: PhantomCamera3D = %NPCPhantomCamera3D +@onready var dialogueArea: Area3D = %NPCInteractionArea3D +@onready var dialogueLabel3D: Label3D = %NPCDialogueExampleLabel + +@onready var player: CharacterBody3D = %PlayerCharacterBody3D + +@onready var move_to_location: Vector3 = %MoveToLocation.get_global_position() + +var dialogue_label_initial_position: Vector3 +var dialogue_label_initial_rotation: Vector3 + +var tween: Tween +var tween_duration: float = 0.9 +var tween_transition: Tween.TransitionType = Tween.TRANS_QUAD + +var interactable: bool +var is_interacting: bool + +func _ready() -> void: + dialogueArea.connect("area_entered", _interactable) + dialogueArea.connect("area_exited", _not_interactable) + + dialogueLabel3D.set_visible(false) + + dialogue_label_initial_position = dialogueLabel3D.get_global_position() + dialogue_label_initial_rotation = dialogueLabel3D.get_global_rotation() + +func _interactable(area_3D: Area3D) -> void: + if area_3D.get_parent() is CharacterBody3D: + dialogueLabel3D.set_visible(true) + interactable = true + + var tween: Tween = get_tree().create_tween().set_trans(tween_transition).set_ease(Tween.EASE_IN_OUT).set_loops() + tween.tween_property(dialogueLabel3D, "position", dialogue_label_initial_position - Vector3(0, -0.2, 0), tween_duration) + tween.tween_property(dialogueLabel3D, "position", dialogue_label_initial_position, tween_duration) + + +func _not_interactable(area_3D: Area3D) -> void: + if area_3D.get_parent() is CharacterBody3D: + dialogueLabel3D.set_visible(false) + interactable = false + + +func _input(event) -> void: + if not interactable: return + + if event is InputEventKey and event.pressed: + if event.keycode == KEY_F: + var tween: Tween = get_tree().create_tween() \ + .set_parallel(true) \ + .set_trans(Tween.TRANS_QUART) \ + .set_ease(Tween.EASE_IN_OUT) + if not is_interacting: + npc_pcam.set_priority(20) + player.set_physics_process(false) + tween.tween_property(player, "position", move_to_location, 0.6).set_trans(tween_transition) + tween.tween_property(dialogueLabel3D, "rotation", Vector3(deg_to_rad(-20), deg_to_rad(53), 0), 0.6).set_trans(tween_transition) + + else: + npc_pcam.set_priority(0) + player.set_physics_process(true) + tween.tween_property(dialogueLabel3D, "rotation", dialogue_label_initial_rotation, 0.9) + + is_interacting = !is_interacting diff --git a/addons/phantom_camera/examples/scripts/3D/path_follow.gd b/addons/phantom_camera/examples/scripts/3D/path_follow.gd new file mode 100644 index 0000000..22973ec --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/path_follow.gd @@ -0,0 +1,18 @@ +extends Node + +@export var path_pcam: PhantomCamera3D + +func _ready() -> void: + connect("area_entered", _entered_area) + connect("area_exited", _exited_area) + + +func _entered_area(area_3D: Area3D) -> void: + if area_3D.get_parent() is CharacterBody3D: + path_pcam.set_priority(20) + + +func _exited_area(area_3D: Area3D) -> void: + if area_3D.get_parent() is CharacterBody3D: + path_pcam.set_priority(0) + diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller.gd b/addons/phantom_camera/examples/scripts/3D/player_controller.gd new file mode 100644 index 0000000..6521a81 --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller.gd @@ -0,0 +1,81 @@ +extends CharacterBody3D + +@export var SPEED: float = 5.0 +@export var JUMP_VELOCITY: float = 4.5 +@export var enable_gravity = true + +@onready var _camera: Camera3D = %MainCamera3D +@onready var _player_pcam: PhantomCamera3D = %PlayerPhantomCamera3D + +# Get the gravity from the project settings to be synced with RigidBody nodes. +var gravity: float = 9.8 + +const KEY_STRINGNAME: StringName = "Key" +const ACTION_STRINGNAME: StringName = "Action" + +const INPUT_MOVE_UP_STRINGNAME: StringName = "move_up" +const INPUT_MOVE_DOWM_STRINGNAME: StringName = "move_down" +const INPUT_MOVE_LEFT_STRINGNAME: StringName = "move_left" +const INPUT_MOVE_RIGHT_STRINGNAME: StringName = "move_right" + +var InputMovementDic: Dictionary = { + INPUT_MOVE_UP_STRINGNAME: { + KEY_STRINGNAME: KEY_W, + ACTION_STRINGNAME: INPUT_MOVE_UP_STRINGNAME + }, + INPUT_MOVE_DOWM_STRINGNAME: { + KEY_STRINGNAME: KEY_S, + ACTION_STRINGNAME: INPUT_MOVE_DOWM_STRINGNAME + }, + INPUT_MOVE_LEFT_STRINGNAME: { + KEY_STRINGNAME: KEY_A, + ACTION_STRINGNAME: INPUT_MOVE_LEFT_STRINGNAME + }, + INPUT_MOVE_RIGHT_STRINGNAME: { + KEY_STRINGNAME: KEY_D, + ACTION_STRINGNAME: INPUT_MOVE_RIGHT_STRINGNAME + }, +} + + +func _ready() -> void: + for input in InputMovementDic: + var key_val = InputMovementDic[input].get(KEY_STRINGNAME) + var action_val = InputMovementDic[input].get(ACTION_STRINGNAME) + + var movement_input = InputEventKey.new() + movement_input.physical_keycode = key_val + InputMap.add_action(action_val) + InputMap.action_add_event(action_val, movement_input) + + +func _physics_process(delta: float) -> void: + # Add the gravity. + if enable_gravity and not is_on_floor(): + velocity.y -= gravity * delta + + # Get the input direction and handle the movement/deceleration. + # As good practice, you should replace UI actions with custom gameplay actions. + var input_dir: Vector2 = Input.get_vector( + INPUT_MOVE_LEFT_STRINGNAME, + INPUT_MOVE_RIGHT_STRINGNAME, + INPUT_MOVE_UP_STRINGNAME, + INPUT_MOVE_DOWM_STRINGNAME + ) + + var cam_dir: Vector3 = -_camera.global_transform.basis.z + + var direction: Vector3 = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() + if direction: + var move_dir: Vector3 = Vector3.ZERO + move_dir.x = direction.x + move_dir.z = direction.z + + move_dir = move_dir.rotated(Vector3.UP, _camera.rotation.y).normalized() + velocity.x = move_dir.x * SPEED + velocity.z = move_dir.z * SPEED + else: + velocity.x = move_toward(velocity.x, 0, SPEED) + velocity.z = move_toward(velocity.z, 0, SPEED) + + move_and_slide() diff --git a/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd new file mode 100644 index 0000000..69b483d --- /dev/null +++ b/addons/phantom_camera/examples/scripts/3D/player_controller_third_person.gd @@ -0,0 +1,83 @@ +extends "player_controller.gd" + +@onready var _aim_pcam: PhantomCamera3D = %PlayerAimPhantomCamera3D +@onready var _model: Node3D = $PlayerModel +@onready var _ceiling_pcam: PhantomCamera3D = %CeilingPhantomCamera3D + +@export var mouse_sensitivity: float = 0.05 + +@export var min_yaw: float = -89.9 +@export var max_yaw: float = 50 + +@export var min_pitch: float = 0 +@export var max_pitch: float = 360 + + + +func _ready() -> void: + super() + + if _player_pcam.get_follow_mode() == _player_pcam.Constants.FollowMode.THIRD_PERSON: + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + + +func _physics_process(delta: float) -> void: + super(delta) + + if velocity.length() > 0.2: + var look_direction: Vector2 = Vector2(velocity.z, velocity.x) + _model.rotation.y = look_direction.angle() + + +func _unhandled_input(event: InputEvent) -> void: + if _player_pcam.get_follow_mode() == _player_pcam.Constants.FollowMode.THIRD_PERSON: + var active_pcam: PhantomCamera3D + + if is_instance_valid(_aim_pcam): + _set_pcam_rotation(_player_pcam, event) + _set_pcam_rotation(_aim_pcam, event) + if _player_pcam.get_priority() > _aim_pcam.get_priority(): + _toggle_aim_pcam(event) + else: + _toggle_aim_pcam(event) + + if event is InputEventKey and event.pressed: + if event.keycode == KEY_SPACE: + if _ceiling_pcam.get_priority() < 30 and _player_pcam.is_active(): + _ceiling_pcam.set_priority(30) + else: + _ceiling_pcam.set_priority(1) + + +func _set_pcam_rotation(pcam: PhantomCamera3D, event: InputEvent) -> void: + if event is InputEventMouseMotion: + var pcam_rotation_degrees: Vector3 + + # Assigns the current 3D rotation of the SpringArm3D node - so it starts off where it is in the editor + pcam_rotation_degrees = pcam.get_third_person_rotation_degrees() + + # Change the X rotation + pcam_rotation_degrees.x -= event.relative.y * mouse_sensitivity + + # Clamp the rotation in the X axis so it go over or under the target + pcam_rotation_degrees.x = clampf(pcam_rotation_degrees.x, min_yaw, max_yaw) + + # Change the Y rotation value + pcam_rotation_degrees.y -= event.relative.x * mouse_sensitivity + + # Sets the rotation to fully loop around its target, but witout going below or exceeding 0 and 360 degrees respectively + pcam_rotation_degrees.y = wrapf(pcam_rotation_degrees.y, min_pitch, max_pitch) + + # Change the SpringArm3D node's rotation and rotate around its target + pcam.set_third_person_rotation_degrees(pcam_rotation_degrees) + + +func _toggle_aim_pcam(event: InputEvent) -> void: + if event is InputEventMouseButton \ + and event.is_pressed() \ + and event.button_index == 2 \ + and (_player_pcam.is_active() or _aim_pcam.is_active()): + if _player_pcam.get_priority() > _aim_pcam.get_priority(): + _aim_pcam.set_priority(30) + else: + _aim_pcam.set_priority(0) diff --git a/addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png b/addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png new file mode 100644 index 0000000000000000000000000000000000000000..a4eaee3bfa50094014d0af77bb3b1395999490bf GIT binary patch literal 3107 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 z zBiT8DSUC&`u>f4{=YZT1I}^a)g`wNcHBq0?_k#4<2f-N5Fqhgi)d$lPvtB0q0^swO zf#-5MARZOl?N1ZqdP%kpw(-1j*7^XypNX`a=~d&gu}Sis5C9TB z8U}={;7;akTOhn)N(|ssKnwEE!)0Ocbqj>b5YnCeYU2FcPGAP1i_k-p0LkDXwPO4L z$3Qs@8zS!YxJ=ISNUWP(5^Gmis|P-h4n5Lqi3{>nm!F$-yhRHPX9I7T*MPCmDXXHO zSYbT1%d6F|6vu?3@1L(kd%$XQ2+T~|CEo{`^g5@3+M9zX`+lfvBI_u<6ceVSr zTW-#g7~k)q6>@a%JOH{yeX@PgzPjN^>BDsr6_cXpdnUk74v*&?-*^yhhVHQXc$WRG z%}#?(eL)Lav1VpNFX5(W6r*e8{0HErELHsyu%9UL%`G^$waMOrvV?2!RPj8ROaQd! zYtLCwi<)N!VRJ5J*>Nl9ZBR;0K{mpa(7;-EH8O{Z$l!mxPNknI_=;yY**i4(Z2na7 zDC}Uo5gxa^@~TWR^hE+UMzj9ZjBinW5pgpZixdP;VUi9M zVtxD9fUsV>iI)jCRQCPt-X-eqvjw%Ahk!R9nvtubvodbc{}T!xa&dr)KfNLbIh*2? zObg@XYwkl&v%f7Y2DGhJ?!fa@6BN{wq*~x~~ci zEEKSt^>15=9HWnk5nslZju3_&X5r|;KP4bVsEUcIPX{NtSadRjAKdN`%bFW;fY=4Q z=^~%~ZnbDsu%0_Pd$EzNV`Mpb)i2dZ^we}CLib*2`}kLW0-R}GQ`SoCa50M=R2s5l z)3r;XOKf|HIbGwb@H45HMHrJuy7z-O^S{lYij(W2@p*-&F0oAt9%e*CyLHX+2Gp$} zzw(Wy&Ds9_lB=&cB^N$vn8Nd0(~~(0pIS1Q5V>WGj}9v*kx(PPzgvTF`nuB^C{}y# z4p*Q46S|QJ2})J0I1MVbDl+5-=32_e>B&a0jLP&Vcrz@TO zG>$sHcu>eA9lprT!`O^*im8nkjO4tiMWwvo zu5y2HuUTzRRRjF#+dRi!`ol@~6b{#bCSQ}ieA}qRw#W}nQwW?y;d#6Gr;Gi@vi+3~ z|2*A$!zIH<2u|xl1ED+C=4;7H9j7q81Y6g}!r%7ttD>-*zC@!ItBU;&E)z+_{> z%asNxp2n2$arIyIN~9hes)x;y*s-EC(qPhTh$J--3e1JwQdJ*(H11q%w!BlJA6YRa z3(?~K__W1N1C+r}WxmpOh}UI2-xl7Vt@II$|J%JZVc=NemvKK?vGA^X`cYncA!7R` z5onozM`0csUDl3ZXze@*%aX51)UxrkL5MslJ4L4vg@#rlQnE!~3$^wy^i*aWq!53$ zvXy<&Tt1qeO^y(8D5<&8p3DepV#R*v9wu}FMf04v)g~FcuJwaOZUv z{G32GdqdLt;OW{utNY(IHu}&DrcuX%Z=9qwY+sE)uss}*u#2ga&TbX&XYGH!Q1j)YwAMNCNLef|Di?ju?s%DUkg0sx;E(r^iW9H9A(Iz=c`9yly&LVmkqg>_- zCFL0-qM_E~x%sUK5|wGzE7>duxnp9Fy-G?r4xx>e(Yl;RbVZlVF z(*4zqETaBNha=W{9LS~h?|wg;1C@Zcj804}^UM0|{j)F-m$1Ewd&NWoKdc30C6y#9 I#Eb*}4+*yQXaE2J literal 0 HcmV?d00001 diff --git a/addons/phantom_camera/examples/textures/2D/level_spritesheet.png.import b/addons/phantom_camera/examples/textures/2D/level_spritesheet.png.import new file mode 100644 index 0000000..520372a --- /dev/null +++ b/addons/phantom_camera/examples/textures/2D/level_spritesheet.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c77npili4pel4" +path="res://.godot/imported/level_spritesheet.png-26a44dd21a040a5480d5ccba54377d99.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/examples/textures/2D/level_spritesheet.png" +dest_files=["res://.godot/imported/level_spritesheet.png-26a44dd21a040a5480d5ccba54377d99.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/addons/phantom_camera/examples/textures/2D/sign_prompt.png b/addons/phantom_camera/examples/textures/2D/sign_prompt.png new file mode 100644 index 0000000000000000000000000000000000000000..a730837097daacd1e658959c81f529fcea7ff885 GIT binary patch literal 175934 zcmYhib97zZ_dOijww*RfW8c_r*v4q=G)7}Ic4OPNZ8WxRQ#^?!*-KgAfrwmklEQ;ZhnQ3qh z$v`~6D1YLL97mp)EKM!JnJD!Sbt;rVt3n#0Pm-`Qs+b;E;H%EV5uz=VDj$o!yeNob zsB_6hp`&-OZw1#8NwvMVNo3^FLr2yU&;CODdhpIufBFo}TJ^vC*B`oHK!E#$W*=Xt+>I#P$c{-w z|4!3ITTOkq!R9CzQa{q+t*5;OV91`E!OxQF^{02M$k$Nn=IRaoE>NR#*KK3<@IRQu zr=CQ+e3m&w*&xqjvN@xI$-d2;P-xa z^Cww%uOTg2A5-8!em5L%W=pl-X-Jk(wOuZ1o#N1@!4KXD6RKa8dbgWkt4 z+<@ywvfb|K4LM8HuN&5`G;08DHWz~lT=VncEd!#EOFw!Pr_MG0&m@YQNMZ}#TbLAk z_O`KWEl)?Ja4*$EM=XA)3Dw>Yzj%EA)CyWZ#r@C8!)NAfLU8DX()%*iE$$jWOIV*+Fb|(np2>#NT8|+M0f8;O0vCh7YZc_lE$bTxjVee0bM-QUa z^qjzd5J4B+z@I-G-;cV%=s@XEv-gyrVV`mi)=aUU+3FbcG><&jT9Q$nrNCkUw>cj12}GAaShno+DGadak(A1t4<9Vp@m{z5E-)Pw7=n<#c;eGr3`dy z$&VXu5>5&e$np@Luc%%9ZMlN8U)2Bb*&rbFhWvZgKmjf14KHZETbRm_U`~%#A@giw zpk!0;(nVx}!nSw&vRpwHPSCP?ww-7xb3yH2s(JrMHLLtp1jqDAGRNf*=i9AF_ZRj^ zp+96VVtrVUB7*sNU8yRJ0`0xg6jFaSJJWYvly|=8{OZ$e{xJ7%NMiHS27{Uo>!$ z8>ZDE4Xo7JqW@C=zZ^X{B~vU&!Vb0@nlw~qu%)tfS>$S1n5+abON_urX5yofON~e4 zb0dhdp6ca3N)ByCmGhu{CqnfHi2oJOKOz!Tl>JAk;96MDfh1FBuApWkDa4bi%A^(}qtEbfeXpp2=&0ELT zKiQy3EPwP}pzOl;H!y+PDH>4>|3!0z6n~h6OsmW0y+I4r^M`*Giw;rh@_;|)2d{`f zlljB;&MeG-<2&7)o(!@RA6LuQDITUHG!61{gSyydNUdvM>Xl2uycp!qwe zK!fS9zjlD`{poB?;fPe#TDk{Sh-ZDh_k67@<*VxB6}{8&{1EPeOeW@~w*&DWsKX9n z?m*Ty(Je_>2*m@!yOWll^IuC1{6B$MSI^g(DV)**c2he^vOI4zL4NBJ>KVz>@s{Wz zKyg$JMEgw*UG|Ojw7*3Q-Sfxnpv^8R#^X(P^;4+P@7;gY=Klj*{ZS-EYUdv=XWbVc zx2J^a#!(p^vNmE@K`hlSf0Xbh#^RAzHj3JcA>{VNlE{zRa5^?l3pzDg>TaqW()+h* zzW>)WeIlWI0FrZ&cK2+8;~EgDP0vAhigSmpgPZ7VCi5k^teoPsp=pS( zo?A!wthK{~ymKdvu_QIK`Ly6GW!wu0zY}ci=+=j-O7O2A^o)MJ%En zDbzJpe2O)sm18~)J#FrRZpfO+|BqDvm@v9`?#_@Q;heOzaPx(kbhCYGO=4KIfqKAz zC@Qv4(JTy&WgWbiOn-^Jr>*$%WGvn9D82#fiO=l(pj-OxYk7m8|8ewxa9kc^6Nkp| zl`Z?nzXnREeOH=n4jTk)xaK{?_oB<%W6!>c-yMN?sEzwJQG(MoNYkc*o~B;svfutJ zpydBuAml8~WBgT8f7ajFxXuG3PnVn-ii=ix3u``9br*-k!C^I2;IAJ))sqBYPRNPs41~9YvxB8pgi0k zePc$=Y=HEmNr||5n48b0ufc&bs>YH$)o^5OgzXOjCp!j`3-R5R-P?bC`+rLTv1(Lx zLXAy<*|oUK=nR(a6JlSk-iWTNpz`|M^VA)>BtCwCH#fx1QBz^(#w-N~U}G&7{kJqG zQZ_~4Uw8cfTUkBJ=f3woh!8=X3)i4_WHF_u6s2SV#oA)aU;#dq>({Vf;`um6&4GpT z;z$mps(;{)&;FNsE#h%KV4-+I>Z@m@ z&IX0GmUDDEO0x}JYLGOVeeHtz~mp{dj8L!%XKD5CoTnY z&0RY_?EA^?<>e~o%{ZpiUeZCdU)vBb*5}g-!$=8p#kg;pJ0MWqO;DfJrab&34$yl4 zg{1OkZQ(f-;lFT9&E~>O@DhUX1$6S;Ixvpi;3`}(BH5X>Q&@9Cu-F&>Um@`MPYBvB z%+Ux^P)t9XOleD2#$XFYmz4amqJ&G3MNS; z!fja9Hvs44k+m`5S?X(Pl#3P7e81cB{$a+I&(pvCvr}D6`LEeGpOiG>R0yXHdq2Bn z`Waxlbb+0_FKd;hfq3K(oV|Y^(60-Q`YZu>0s3vn#Q40SqaWP7*u{B?7zlx3=QbXq zy<$wT`xf;AJZaW~In?UGn*jT{(ctjv*T@7T&xy6A$Fl7A+U|#+fW52NQo#FQO!Ftd zOBEJ!x4qXrjn`u1wLLn!_BhENKEQ3E zq}HzCbH@}3(3fID3+G!)zrD1*&E6>NnGtWCkxz$u33QS8DJR(7=5nhW_??eNLzJBI z^HS=c^23{>P;{LNopQMgWL?djXMVai+xT^oKhFL5g>y|`z{T`*x(z{iiJm*N2l%Aj^-}Zg_|?T5^sp>nAf%z}wT|4CpPf$22NZ}+7*p8Y zY&OZfoqy9OC-u8LR^wVsd&s7WTCy1dV5pEY!GVRNxrq<*S%lDGa}~db>iq;z(l~8h`srJQ+sG2 z`l}K&`o`4_pJ0XekB5$Uo{YCS{uh!*kISbn8M+xIY+5D%`mpb;{BXb*U|ahk$&)Y1 zQT_cyXYpMfX{frkr#+rotaZgh?+d|csE>a~ZSBZS+ie^Ah5>rzbC?M+eys1=6>_B8 zho*}H&?yIBjYYWga_10trH7LsO^E*bvo`@DpL)8`%VWdk>6OqF<`+M*TfW!L*DQV? zhcM`~HV?IHp;uq;rRZK#A3yoZ$JSqD@_eP(t>z!?i5o?$zg~%si~GUBxsW`$^$%3; z<&YT6dOFc8p>Q2YzFfVD7&snNodz=B5`-#|B|>+R-R8#g*qv7{3C#3&s0(Wem9%v? zSMQMx4HZH&)_5h|T~3*M2ndtC%HH}DAHE1o@#m&d0>8DkJqbUy)!kWj(%TE&-o^6V z5xZvb-ODc>Pi+HpvOQByjmX^rA5B6#UWGk0Z&tn9#(FLAmz7RJHOnLeZ z^B7bMOUH9(F&>*9_da_Kcl#c?k7WbH!Q_!xz-rqtz{}il_Lea4u-i%S6nq>aeIT{z zj^R!v&m5B6oWw7~n`5sGeRb%W{giF! zLGNR%7K??fhl2@}9L*LT{iF!y!&9Tx2yKnHxgTRVb1->)i{qVEiRb~B;hY=0u2Nwh zUXV{L+FmWp8=X1?9$C5J|PWe_ij;*fKqeLU$*6;}zEcZkmwW zkEmFI1isZ=M1BtK`z7&`(5(EY(=n6Tt!(cP?<7-VJWUp`LcAq8nfMHgu4yc-5#O%` z1+w9-1uS*fuJ_(W-Mz@8r;qu%DjPVzRb)egWSqlU)#}~?saohV#6ECGs(bzVvge;1 zhoOGnFIC9Bbv&{IVaqP;!@U|VN5q}&LEu^zmTKSNrNWku(&pTHjQH`0?jE>-RF4|_ z^sN4Ty4xGAv%_^-o}>&Ac#})1NEyp4J1?2|=xmnyR^$g{!x1mKL168a4NoYnwf?Zpvo&iI0S@USAwVt&zh`IgAjcJGsX(n05TUh|M7vduz+NVu^WLWo=WOyb_XfcqO1;*;&cw)783bJ>Is;L+c4(8%JexDA-rf z*T7+9d3+sBu8u{2N>#*eyMaTy*J4_~H7cSF8tPo=!ePX*NOzg7{Jwg>WqYU+8SBXZ zcFSpO0ja`yR^LJW_$H>hyGsl~QgUt607 zuYg0OUb>ShLC#xGLVmmMJ=wxI14nOLT8e=y(RV^{gKA{TqXP2H>+Pkj?~-wj%nfcr z<`3GQe9bCDJd*RF&7pxeAtThjMUQLBzW1}z27X@Y05_7*tB2m<3{5){%@MuO%Vj?M zxfc|CBqAyTG@Z~E@#Ch@Fw`s5)|Ts>og~pxn_H0=pHF7IIS8*;p>ei*&~;@v9Qld9 zRj6_}P-|Ih`p%?qX<{XkFdh0=l5IegVWCZ~{%vZ~Fk!a~DXy>2X`Be1 zPd;6jx3A*S6p-;Bs?kZQ-P(4iM$7`Vsyi7O2`Z>Re84G>npP8u8cWO&FA3ix`_|4! zN_duKw)aijo#F_M|;EL@)||_ zSR~s<^4_5;*}qJmL+Ua;LyHQ>`BtH5T2oaAo#6`wo)hnt80~7LU2#I9Yji8;Swao@ z#qK7Og+~6zGksX13NdBS0sXvPi-SCQ`-a)bO?oR+aa&KUhB{RJ5LIz|ZNDO(^3mwDS{?c;4% z?VWtiF+T)UGQf}4?nb}W6xrVvy#MtQWimPVYXI^6*eN_^ud`arXI}yTJEKaGa6596 zb>>uA@blPBIrw`13;vDKc=^;UhA!sXOK2lVeXg30`INZ;F6e1SGW?RzR1abvZ5UB0v&$q~y-h*`K(tgAt zbRgcw$|-(yh$whB;yg(os{0Tq77h&)%)+{*qD!tsgXMm9Ylp5L@)GYPvBI+y$2*6% zPTyk)B)M{TjrUX!BtZCV%o>44O~O#DBUhTbs1ZG-|9Va$R|L?CV--9J5l*tY*6Hn9 zk0}tN{;&yxym#GuN) zC+_|-nqcBxfn2tF+01e@fxP=}fCS>j*iIqld~8`ivDFCimR^+lj-aCj97&ifja#s( z=$j;ss6{ABTUWBwJBOrg%oI&#O?drUnhB2!YG`mNd2zw3ufYo;EsV`YxauI9`)f;c zrTt5`WQU|hLY^_dtGN2RKz?{I!^%!}1W{Dc1iZOW(D6F$48FtyY^Z7WPwnTdj!w(% z2Z57-kX-{BlM5OOifukcMY6BQBAB7v5kdMV7uF3}$5$?Cb_v8ywhFk4Subcr*F&S6 zSeNjg^0yR$iV4nb~3QYqNU53T(e_N{8AgJ|Ea^|lo-U=!A48k5|zvCkJC$@PxT zvVj*8qhMX}_t7Vyyr1#JxH9?Hn-_O)xoB{slLn!BNd{J6Ygqzj!L__)2o9-PehPcn zOBW16rTAgNdda-#?u06@@m=D+nH9??4kbWEdQ7B_*ob}rJ z?cm4M7YuoXpB)>W8TG3*a1nKeq!5yK0;FapE&kZmyzr+d6V5V{gB%mTI(Z13(~3#s z7(SEuY-UzBqmZ0wZW9GT2Gx9)?#YT^-gPO`l%plIEXq&NlDtd*kl%ts*_vF(D&>Oy zk@@XP1bRScTSg+{NrK-faBn$Ua_bHiE}^<*df_)T*n?UbYOHwa83_kEj_n!lqK07X z&POZ`+sQ5;dc^&@k&1VA=m=y$Uvvq`brYs{ixf?5@PF*^hosLBbqCW7fJ6ZHF(p? zN1?1v6X+YTG&!kQ?hW?ZoPO|L-5eA$FXM&3k@qW|uLupm2Je&IVAcV^(W-Abxhu>& z;JxYUz1eraz3cjOs4noi_L^KzauFf30hJHxk}bc?MSX@xs0^X8$&IQC12+h!%=R<# zaHjZVoZnkyNQsezxPm)FCUs95Fs0wY52PJ7P2L8gkNNl_9g6k(UR%@+4~MVMBm};P z)D*^%g2rSPqU4)iepie`Mf^m496O(%IER+2G~S-35 zvRc-3$J^U*gP^gRgfWVYN)TO~1g{SusOul-6j z(>%n36l&CJH&Ck*uTbcnwn|7;orHtnjsy-wZ~#N`Rbv!$q?}3@#c@0{R#3=nF4reS zKDUkRC=;+(Lc$7|jO~!H>7@O38c6cd-WJ8)8`KXeN`n?G`8Jlgrr0W%0Sza^#-2hu zZi4Cf+E&nqQDw;`d>zO~gjVAR#R(HczU;h_A(mErPWQ zFTpFYGboClELYXC6HpK^{rb$p(3A-iL6!42aII_1SJ}!tPCKXCC}E)HY?b zN8@)&E}0p74kUdLE&zNZCnn#Fgx>Wx#c9vDT`dX|!gy6IlNVmEXsJ-=GEY+K7;Ti( zT`#MIb)7}(&s&2_SMfA zA?g_7{L7x}=Ck`<1qx+O{^t%v7M@FWrQBuPh`eG-gv)a;Yj9H#B;B3Q1Ne8La3jf* zKpY7a3EpJ>!LIK7Uig!g3_K9=Q+Dm6`th;Lssw}JOsW4?O!vEq-y6OkyDu^RU)omt zPLqRYub!K_o!=j}_(ekfPFh-Hg8X}&+a^l|p-Ab;Eol2DbNZ=VoVv2*$fWqCNz6*% zkqCa?BE@9DG2!~JtWE0@A2MLV*HEq}K0#IU?#f@C=1=>c+XHtEUc2A({oYeRjrQO^ z0KeUf8+rGuJEDDtg2@pnMcMc$1in6QlZ@(hAKE8a+kD<9>Stj&%(5L4NRhK2 z_G5&bu%lmGVv9eo!0w1*eJjc+VI(d^s3e)Z?{(XkCRZhj@SH>Pi2I<17l%n?t0B!r zA^k&QNX9aZqBz4t+hR*bUsQ=`jA}IJ8z&}Hwk3?es(&KHJBvgbta3ZfPIwK}QQ5Tg z_xvbg)hyGj81+9JNc5GD#264TF&OEt*1Eh|2?Q!uGlQYlV@%%MR9LXSn`tf^70d4K zS^U}N5=(7OAB%Z^|1z}FL=P_FvfeY~U6!cS>a|vlZx%$APRX`W%cnvM2lohN@f(I% z=fcFKUmZE0ik8HTJ@ys!Cu)aMQN2S9>F~)Xq;N9~5C*X^1KLPxb_Q$OqC9^*TZ$WV zMt_5hx`zoj2Imx77a~ts8Di10Vu4atL_gHv|MF)h(%{-a*##2P|PR0EDU#yyam6Oy5 z<*ZdfZX*cg3`0x4z*}qZkXF~@!}M;mV=o4{_Ud^tn-}za6_h`048+-q7LA#oA$j?9 z;*L#rpkFk{QA|8ld@btgX)8bRcBB^}8ZY&s>ByWXUj6)6`3$o+Loa(0RY$?NYt6I4 zYyQ?t<;{}s%b%}LThG&e59PzzfIIQ6S1-TE<-iy;+E>Y57NZ!Jal^b(j}J$dP>;58 z>Jcb_1T}TQYuP#)PN@<&qnQ1)uyy3U$@siq(yYIqyVQZes{Gv~Y~Nvt{}|%PTp*uA z5@1F!gprsdfFvMj8&8kpI8%=gX-BQM^#Q<8$qfh7OGec+p}C5W?3*bo34@(q(l&lR6N9&iL3nq4unw zg&dvqdhxSk*=PDJj5jZMd_OBp_&GQ$6e`0XSb`;Jn-RF#Q6nkl(}~98hU1@BH_7%# zuM6{QlY_J*ooQPgT^cJH*8P_1&p;Qc{683&oJuIf!g-}j%OFRUuDYkh0<7d@y{KMgYr~E-tGrRtC-$2ri#m4`dAeJh$vW zSetlSI#RhGuElLE)rUaQ)xaJIvN5RxL0cW3<;T^Vs zX4KFFGKm<-hh8rwypzy0+K~j}_!`E!Fp6dkY?+c`xn56(G(j%ij3}~-#1Y5?%1Hin z9?nR2y;cp+i3mVcc$(>2TZD8;8UKg!oETx22&(HP3dCz zr+2A*!iv6PT@KOScz@Rj^i8?hAXKE{NuZ1wjmG9^I>Dm;O`WDFJg4ft+Tf^%BN=SH zd_(13imI<4*eKn)U0iw78y{ zcGtEiS7O5^c}WJK=*S@*UL8iQnoBklwK&aq*m3OWypEF8eW;***chipEN|U#mfe^} z-916u4hx(QkAbCYMO>spUHV(xWyE5@P~HScizs2LVP9_jXPs)=)i^PVp`v($jmoO$ z^#a$VN1fO&I0EE_HC$2sf{VEEBR8TK?U(s36ra8mLl@lhKk7)W|WVi|-9!=;EQn|n{4xvd5vS$^tzv{ZjIKIRy6kUD#4 zQ+DCTMw25?g6Qc)bwm5YLlMcz!Tk2=lEuH=iH9zZJ(rxue$GQOI-Ytx5$s6%byRrA z)iyQGOW4;}@Ac~~LzT222I0Y540x^k`X~74xw-|k9tQ`y@)>RhZU5OKXz=p31AN^A z^*n((O)$G#813l?2Z~S@97KB)y2F(WkQNSTD+G&kz6r)Ie%efA#dRUv6|Q}khSNry z3cy{D+zysno|Qgn`6Rg0D?U0Y`H-t73wXH#ZGg}JbV?w&y6YLf%iU&SYcNk<_3HKf zPC&aFp*k#-Y=HHUdu(toZxT99r*SNO8&9f~xwt@yv#XgseTEiil3*x}fc@O9GuN2_ z{c1*30<9DR7f*Y7cJTE>z0BfTAw}A)v##2MJEi1zxhg9j*&Y`0NkI%V7xC|jBco%_ ziB7()DJz0hrq}JsnB35OGdty9z9)**)v6xX+<8APKr-9crr9&}<6ux6HsAzH@uTZH zed$@h-1_AWLre-zz-EQz2^xj&b3=iKYU_a~^sgj>_ zvbzDj8?6@fJYth1`|3vhjh6iFGw3v}AJ}m)!u8z>alQ4E2ar7V*-8kvfHoz*+6?L} z`A|pBLECCYcjcNwLW%iz8BkNZrkMpd7&u*!I2~%}rVYe^SK}z{XKc9)> zMhzIG87`_n3VV$}U|+PJjAJDTZQW`edkwZOZ zul5^4G|D9>5YW0}0GS;^8 z)D#G5>W4vPfhN>lC!V7*+ngAm;7p}=7QTGl~Xrd z#2^&xL^>aY!jrG4_?HsC!dW%ei>178>&d)M!ei_wToTCx;0XTji%|Cnd%bJ zY?TA{LO}~#Pg}3g01zu^bXu6D&+nZXyszbZ{p2IRb(}($L*>nr?hWBP!hx@#J<^In z8pf`L70RCqtz}-U62dp>ZPu5ynU7kpUFWX7fZm*vG&SEghRFyw%*Uq22|OB-D8so5jH6kMo_q7=ztK*BXKuJRTa!8uTR)t4}e96Yu_$MNP@Xi^*xQ(aWySur`L# zG0K+KeK$Yk+>6vNL^lYtP)g%j$Ig>Mk=nkuZ{{jWNTg=*<@cF|7Fzr`=_e%`d`o$< zXrt-gWSv@aq{ch%roj(%jka6Ya1<%Z9@*xeepnQJr1xLKeseO+f4JdTh4CO}QBLfT zU3DpN7Z#iDFIN3k_GOWYVxcbl{1T~41WZj4WIe(JUID)s=>F_ATMBAwx1fk{$YzCVQm4;<%m zaIGg}%T-9q6d9Hz$wDjymC7(3;hMLy*9KpPt-GG!yDpm9hQNb>moaqjwJTun-nP#= z*jIH*dW?ZXd2fZx2mow|<%p<&8!Sfsp7a*i2UE|C)h%C08p-cJT7{!ql1Y~CTDaUr zx`BlfZdw3+?UAPB#+!Fb5P83ku2WL5h4=&`-)yMu-n|n-($vWoB6w@0bNqFs zkjczjhdpQLBmQYD=WK3R$o2~yVX^zjXcqHMQ>LqN4uVx1=g3gqxrD^fn9g1OScPW& z@Qr!W?GAfEI=fO*IdaN(0^$3jTe@EV@#{O{z6%fqQai5p_5_QG{y6(G<;n9c8Kh# z^|t)?dV^C8pT2O$6^@wp<&5Tc5Z}Hzttt%r>I=vB+P%BdMRhmQ=tYZpWK55+9fOWln(@UOc`$a}Y5!8+U4` z41;T>Kaf3p^!aH(r8FdI8}(G}!#(`ubIa4+cH8H-^Va=52zb@oy50Nk^>VV8 z?{}{PyERb9J-T+&L=JpLHhAd<<8a16p>J!ldV=MA&=!J`ZHE*>xvZE zkp+q$t+O}a?0AnKxF)_ogdgb8sfI;$->591#uf`ERKcT&Q(@HMrA~Faob=&HKt=*m zmk8O>E+F*+BY?|UfR{b+?G?Bca5oqOAV*)SRR+)RIe=C*HZ6z5r#M!SF!!Sjiz_K< z2a}V7%0I`lbW*)qMHprg_SqaF6fmO5GTo<~ZIqn;RIq`Iq6 zhXmw{{V40><34|KT)tT$?ffp}0goA3$FN=@YHCk$nBFpvPX~v3K*!-9bWxeJ&#;sZ z_X#4xWc~bAg^D+me%^O){g-2!d77B&Glp_iwwnx!n#TeA=s=;1+v8=d3GO+!RPIMH z*QuXM=di@F+k0_WeL|Dk2YN8Xt(s+8`zukf<`rJuh*qqGox-0b5D@G;UB|~jBs`y! zv5ce(oZ7XRa_bnK+Iv2Oa?xE!zsABt!Bz5-uOYO?@#*53_2ITzM`;Kr(DAUdQ{9B3 z0NKiB&ju`tN|4pl5ov{GbKYN6ln=2OOJ^d3QMAvnhK*c819ubhWDK>H0t_mTid47xYYE`Br!FlBwfr?oG6R2F^- zuJ*0$zMls6kiXAmga7-QpkeCZc;r3!V42%p}KRkE+LrBQK|B$f`? z@auo^;iY|ZVaTzbZ~M6^@1?;jIQ+9+T$UpX45$_mqGa$%uE(g#_st!~WF{||R8X74 zh3MnhIiaA&=^m!E!>i2`XH#BFy^IW-rGJ^qlBS*dO#VpzUi7~1HT1mocFIcnldIdi zyft$1aGm~2K!e9xa@_UXbxv^(zML}hg`{uuU1aZ(@ZJty$R6XXh+aXC8?TP5{qH#G z+>D^oebHjHW@kBzL`Zl_Uc_U4=LHrqKK#6c2KGznGq@9v$ZZ`{UnPd zqV}MqN)e+G#PE8XASfd9XPRKKrpB=$G)lsVbGP}sG``6%J*|dcD4|uhb%P&A?n4iC#0;ch%%Qta8tW((5=Kz6L-SjfiFS8 z72CjLjC>di=%@_?^0j}FTP@0Alngc2R_>}7>uk+1Hq`CBhk2# zR}JFS3fhVyMOa}rb@OW-fyFoOWu%=ES6DF9u@jrda)iJxsXWbb~q4H)v5N+f# zb*bEsgPsCQl;%e9Pa<}cZv$`O*!%{q9rsYD%`o%H1i)gKV`9Cp@hpQJaHMR>uVK4^ zb)tsG$vjx}; zrlY6F(C-7EbiRIk{LqQTV8f}KZJ}7QIn3a>84x-9wnO>;y2e5TK-KZ%qtgwWnYVBM z+&^Rr+~ijdpjioFAxJ8(phRVU2q-U?Ez9Na5K8_bQ5MQ@O6qo^)qAq_CV*!0Zes8b zB)8t!D+X->p2y+OLAa8^Y<+GX&EHBN_pWRiU_@0dP~vVMizE4hHEbbH23c5f`Oui6 z5BzKO-CJ-5vKW;Z1X~coId`rXhH7Otp(6D@kmt$m@*U~#)!{im~V}2=4H>wH5p{`OrdPyQk9!jO%UT2QD!Ivd~5t8tFwK)ZhYGH^a=Tqu+Sy^mU-=lOhlZ6L%m+pi%|eump%va&VS4yX8VObi5P*KObyL470qj4Bnw`{ zCqUJyZ^~8_-8;7NDlXg3B|owBjd8veRtE-#i1RaJFmcNDuDd6ey!!U@3ENkl+{pc0 zN=5tOg8nh?Q1-7EwOa#YP@a_5mU|?ePS5AmQ9+A|6Gq9MH3@^$PqjhHIWXfqG8yq5 z<#xXcC`TC_`ndsGAr}Dyvaz*JS}dCd4A&G>P9>C~+vi9NPK&p%+~z_BAvF<-C9;H} zgh8l?en;x$&+GUrB`O-*Ah-d2Q^8iV>(tRz9w7{YLPITo=;;X}WIkpZdzaPf2+151 zrV6dkj5JDC@#Vk0d>2+PBN|OwOV;&fB`G+Tbh%dDAyEX6d1-nfp$sZbIqSH>)OslS z_1i{!$ppgX8?0(n^=lpE8W#%Rq^=OhV=*rRcRMpT5U670$x*DTD~(kRQwe&UZB8KFApojmGv}T7OOOm0{{&s!KvMAc>C0%x3Sin9E6wMeTb1 z$eI+*qIASb3)^gyXgJjJwO*>OA}E?)oGc!()TIakU>KkGg80PShn;pFTYX6LSnU{% zfaEdtVWs7>lHi;=wU!5Iq)Goo)e341bD=L4k@y%CD)ndMZ`5xSk6Q-n`o;0&k3M*p zi$Ss!+MG?#Lc>3-Oqpjmvn&*DR3#CW)VW-gjuvb@`nL7`lHuZue;j{CM7tEA%Z2SY z^Udr1Emc{fd|A;o{ZJ9fi~C$+mIzemAFR!CUc`}weG(PQJ@sEu!-@8E*5XVIC{aiI z`8DJA8wp(qDIAYc?K^caW&`TyxUMY5^;x^si|t&Ee2QiK_m<2Co}`vCU-FXB+r3eS z3~QO9_t>TB~CueUuqbn!WRDTW!k60dQtdQlvrad?C>ltvGr0%|*l{%U3 z6l~ce^@*8tx!!lqtgYmeS~oZW@csta1RcBip2d*zJa4!yd<=)09+U|gv5Nii4bPOX zE_~3QBzrXq3Wu+kZ7IS|QH}3c5R;{-%SOa&T_Pf3)b;v8-8TlPKR<)(cQU>)c`ARh zgE#t;LcwOOfQ}QO(0|(=-3&bQ+ehwxG6yeKzjt?Sg5RhOp7Hf#-hiq{{$@e7d=uW) zw-|zssc#?WBcLV?1Iw=y?WVGs*HYEj2&T z)EgA@ZK#FVvEaPsl;TjL2my_I2d1WV|d}uas=* zMO1`4SmBRhm1%pK?A7Km^qYMl%P5>g)0v4Q88^F;UI?5iJ9KQxnD*rrbm`I43T~XI zXC?)vnS8=QoL6lb*Ht3CBm7oo4U?Ie9#yv{TW7ZKb&FR{2$zp}xRlh)@y2%%h$A45 zIr?3zd}liVDee>IJn^1Ht9HT}qYTKcg*1t<=9!hg_9jpQK~8F>Bg(b}o0#&;m~l0s zyv@Wd?RqZ)T+Fc0kus;c(Pc7qwIv(5y|ha)^+QQN34S`FsK-yPQS1HiL=DFhwgAEZP!mOc&QxRJcwqYgR2VXA+vOmr-F73XAR*{j=}*r(6%Y}bZTXS zCSi38McM0}OWnNpmLF>{UaA1Nfgd@CD!u1>yQKItZAG&VDdq4Id+jfiuLsI;|P z-Hq+j4UiYkezmpOs2$({Twp?vtvz_OcN`@1VF|M3!XD+~hsNeUQ15ibLU3(vJ&a!z zlsA}Cq*-2tEJzSc55||hSMBNhUSdlQ0Uj3ouJL2Of<2HYss@kFO^ur#DS7yNluSY? zN?g_#s=d;SRoqVzuY#`^O(Ud*ztluF3GFII-8|@xsGd=j$Jk84SA|BLcT$X*DY@k% zEu8OOwcE8w^J#t@gjm_!SX3YG{;E zA}skP(Cd0_xk+Gt@TU4r_j|htm&J8}Udqcv^x@zDi`Tq5mb#dvHkKmOzFfPp+$-2f zpb+!_0YN~%zd|rKjb8eU(D6~tdnq?u3-*QMEPZd}!b43~bD4}Y51b@6g&d(xge*Ir zk~i!R6v{kDS!U1)j!@HmIXO2%&*mqRl z&oow=U6O$EbV>_}b+c)M09HwVi)kNfBFgt;U4%l&nHP{rw_oyxdtMv^%3IQ?alZ|H z_Y2skm}be(BY9&O+t1r=WM!yvhUr9LUar1}!dhYl>ny4|0*}?sD9)LFC(H z+F6wtu5=-Zi8=8;|5vtJRmyCTsoxIlWEVI4Hafm?(78@~F*QdYb9K#&>A`zdnkO8O zb=tM-E%HIjO-78hv7&>u@^3c-Ye(CY=%@l`l=xMVz=!3F6k>Q zRwtxuL2AgyVo|`7WI-jM;x>Lz{DQz*PdKW%(BP_O4$6V8;fjY&b70H8Ql#hl^U!nw zhlBYk?-9;!>93o-S1D}1cV}}5)}7Hvs}32T@xofte&2W9wy})y@!LOj2;$c@5li4= zxXA~g6bTW1EQv3fqk=_JN%aUbd_#%)RzNnw3W^FQ=>Z~^sZmDjNO;e6czg{{D6~I(1uZBg7db?@JP9vc%rC<6P75#lkNFydCCM#2@T6} zl;bDD3VdS_H&7SP&$hF`HJyr#Nv1Pd&kCE0k83&>;V5F&N(Tvly!UNk7LjMF+U+(g zw8xKd+3movcgt-bDQ|?R2T&d~ zNm)jxKa{C2%N^>C-H<}Le;)4XGo)C#6#d${LHo){Bv1M)Qsqs_^~Cecu*8w)B4^$8 z|B&6ODuz;49=*QxomLdsSp*}~z3|J?70(^sjpyC-Bg z?rmqrYoneGo6k3#Cty;^vMm@+Sg1{loxyRi)SPn}>Ev34O4;z=BWSDplCKP>5QAtg z>WGm;myp~Mh>rB6H^@=2#S^(HG_XQa>h(qq;P#iA$yM|uOrIyE}@}g z^=Orcb~3r3W;-WPEJ?YJv;K_{ELp)lclg4jXnyX{>J#0MFt0MykOS+sBl(XO7+*U= z>HqQn^8fyyef6il?+^Xy<8}YLl0uqjWyaE-v5Yd=x*FEKl)$dM>}PCNP8eB7#4#Sa zM={q9wBX&E7DDn*O*J*oBpfR+N>Cnz?oET)Nw9#Rsq;^&jNn1jg@|41bs+K*UbBUo zY|x=C_6lboT{1#B$Fp~>g_Z9ehImwFV8qHYmmKyHsLO&A@fjyb5iODU-PL_4SIh|I znLfby(=?C4;lFlMJ_rM`yFK1Gc#7PJnRx*T{BWxMFDulTy3~T}J zy?J-GUFG;k2n#wJl}hch7TRFQcc#j9U^IHKy0-9zxx|M~RA(2n-Y%a3$eSYoSs0J; zjH*RobRM2wJzv|7fkz1{qqB0pp2YO38O3beu={ib(-1sp<1|hVeX#~ph>W(m>`1tK z8G6gBg(`GLKj(2k4ybq#O<8?;ld%mAM6W5MgcKpOKXVH)(>ZoAfzq+-6@##PQ5~{c zw_;5$+8E{?Yq>rbmFvD9&-{_5i-qK$x`WQnRh_dKMbenG0_~1~=$CG7A1txEj9in< zvK9l6pJ+cw#fQApubyG0>mo`$4B54rCgYR~h$m-}RAh&xda;XD75^5sef5Bg_Q zM19e{-37H~I%yKCp+-OG+nwJv1mX%|s{76fMaRA1CgjjShaCY}UDbd2o$z-JXn_3R z6$qKL(6IZacvRd0rB2%B494UUOWxc`Y#YXgVwvWCElS52d@Yi1H|Dsq4J!!63wed^ zLU>-LbV;Q)8e9F8LT%eHHbnkJ{ds8HKPi&n_5tm}oh_R2oRczb&)pB}5- z3ce4`^3j)!GKX^f`@8q+<>&sw_y2(}{>0z;#lLhs!~g9{NH1L?k(o=8ln5APXs(C= zild>VcN@)LBMz^}f7<)rBZo<+!*F z5f2p>3@mG%k)n9V9>pQ)dVumnJvQIgW??iyYnH$|{i6nIe`Wsc{VqVEiW)-3 zNd-PCB?;AY*5WuYwiHCTb9g+B!0fUTK$qcdFSg}vqsDUq9tOYbF!*g`7)cGioTY-4 ze~upPHjw=<3}RUF=A)OAt3kFe0X{`uY)GSJN8}_j-70+%$mcktO?OW{i zWHfskVXZov)zBWW(qB#z7GnmdOI?MY`dqUQJDelx&s@+o>d1ZPeHPwG`U1B`Xh5$e zflJi-Lq6Ir@wx4ipSx^v*r@p2^%B4H-G#$W zhMTjfS3+WHQW<%k)63TXLpQ3+Vr47>1R*0Pb717q zP$Wc(D0*pN!)*j3Dl~Rc5yDNAf0&z8?`a)uPIoG|-IMoGc5wT(pWDXvKlzc5zvUm) zzWpDLZ~K$SM}Kq{x>J!qda;C+!p;1T%|a1kM<4we9rbihr)7FBSy0l11`_IU*F6iSMve{56EX!~dU^@_A|wAk z$%3~bCCR~Q9HFX0y;&%~96{9pGGZ6G21?{j%1GIFGWMLK}TOmY~C4AuKx zjW*azo2-?`E=qltsNq{_6#A<3>UggAQidjr1%OLOs@5 zI@jlJlK6R{NYgzr~cUS2xw>>`FkwOmwB~^q!$OTgu zKRgQp8tPRbHz+IH7_7Ap+LdqGj9!YI3BQugT5do3o!|P2q#!w^Wn%;w1V_wt?$zv@ z`t)sw(ntO?bwpB;{@{C@|NI><8*|911t&C{hA!ktbhC@IHbs$^ho=J`ga^ndc@>z` zAhWqhQJmb1c8W;nk%gK|8}=?$>X0;A@$NYF|Hkn#Up;>OpB%sY?{mPoN<&ntAwrUz z0X{HVdt&6@ka1Y~1Vsa(G5|&r`%?BDMaOEIQgS@BMv9#@-^2fbwa#tF|4AIPR8VkV}`Y4U{l*~*llfxLgS7U3t`aBoYAVdY;G8H{9`&ofIz z&-Gi{ zRzP0LVHKxv4QT{L8D^QR{e+rC`lMEkyOL6fYxo@Qi_5Q(5l*E-cpf5G8&N6xe5`t) zBI3Wyf*m7Wqr1qG08mFPd25BvRnV59Yvpl%_sM$~G$?=n0OfslNk=jt3ifUNUt; zh(H*tq0Nx7ev?y5qs+ZUG&7w#QI|3{UrEB51JM7=AkXnKwneGImi7XNlw(ACnxSv~2)@{~Gr%)%Ui3ocClsW4P<-_rP`wB`zs37G{_NkawV9l&_^WyK2S5gvJuHO{ulyYY%dt<#; z&M>8shO$e3M7*M$Y}C61EhBB`VSE9%Kh(+gUL5I(H8XHt0b*wZ{xU-0}$%RF=y)_l1;Prn0X>MG6r8|W! zVgmswMQ3x>{!O}Ilaa_=(Q-#WYAO(_EARRhLalU6)iyGmGePh?t5&o4ewKy;KY~Lb zuad+U>{Cz3;rKdkopO~B2q|jZbPLt1*>*wJ--|qDwjub|KVK21YB&KeE7ymqL>ubYndiFL!y^0x1&YYM3hQB&u@N52 z;buuCh0}yAen=8FPN6%ojE2$+P~vC^F*zm;PMMGs>BT<7tdUe2VOKA4jr?Ogl&iBM zW@$4b#<JaE;-1UOp$^yW zwj-sIHt^5k9Gg)k`R~8)B-$aZL)pQzGC#Vr;)9*B5;DlLCHx=vbnyHW6D~OU)O=0LabR0|S4%x{4S(uQd9M3+d z>#tR+HZ7k(46bxINz$FH|At{8A4Cu~+nx5GFPv`xeR=5C12JK`Y8Su2b@n= Ani z&2&yq3*=^kw=*$Xu~=3(#L6;TnA>xH-k zn5d=vBDJ13K1pW6eMPNyWOqSVjkWi|_M&PMMz#XMd{cUf?t=6BLO3z z%Dj=yD$fc^;7!eeZz6G^qY=m{yfHN2SEh<225bTujmZf}$9w+b@z<{&!t!f3l8q2q zI+AX~cqJ5pL~XM?Q}vfc@3A_Ui+tl;&@80AdiKl}O=M^w%3QOV*W{!KleYp!8VF3J2BFu=wb23M zxY0E@UJB!UuDOPZND~urQi#$jY0#Ora)Z3xiSZS@`9R~GlDvt?;)sh*_6zDWhjQz= z7`4bH2h%P|h+fe#pXW-0kA@O(&WcfNQ8odAx4gX>{+F}h+<1hYek#Q`GG|LG3FN62 z{*@IWjrPFtk~4!yl=_Ou!N$PQbE^>zsay=IM)C$(w*1q{CKqNmf>k<6OhF>IdDmRv zBZ5QT{m$ELW6Y9JdP>$4hjU6te;FOEV~J~{CMGg_slM&Rg>MR+n15!yE?SMc=fN1h zcb^p^7I`{#bWS1NY-Wr#5bt9M;i^;ZWw?HysM(#RK47b(M2QXuHUblmgppCd@d;UK z1}BJZRsk0?uvhIaYu9!DySdG$x1GJ;1=GAcg27HXTte-735^zeR8ojZ)uW+|+j6`^R8CWmq7zU6L=$ZlQ zoQM0=0$SLHnze5W-1A>bFb)4nMaDcFpKTBhPkE;6?Z^H9E64AC>3HuK;DEYlT+zYV zJCxt%oWiKH4%yEEc4c4~0lg?iL#}G`>{vHZaE{IFavM8F)#`0fu?8aS^4e@*vDWJ3 zGwd7?hqA$1Qmpk%)_tlO$Rvz>D682Hg&`g{agkn;a^KRdavFUy?zLXRQnXki& zDHc4KhA*|-$(r=j+)!=pJWGl*QhR&WBCDBWIR8BqzP3!ZlX91dml^dNI=Ji88{+=r8YzfGBTL zmd9gUwiSD=k(mx^SoX$TFP=f;iY5t4RG5;eA&lGd<};yP#x2Po$8+Cg(zge_-FDzA zq)MY|vHD$?{lZbB;xVL7JoSIe8~Q^JKEZ)-uuj=Rr9k8g$I5`N6 zl=Awd`s-rrnt?Ce9`5-a9_2(l+|T{G%hNAc*@x-ee7_!!PBQ;)$Pfo!Ii8RrQtnb6 zOQtm$V9p@fr$lZLF^LDU%dc8^Uw74g(0M4c3-8@|rRsZIUJo|s#eyQT$7;c zGeY8>TUE{`TWJ82Q5lQ7!N`+hzXU^>?>0Lr2U4Q`x6HeuPELl;dDc=3O%PqEeRa@K zt4l~bcPXa6`@V-aHSXZEk(iZ4@!2)1$Uff4#B{!};dlw$0xumUHVMUbgP57^b!y>i z#nb|eM(zad(=7~-2#)oQvGPA6X*4Xlvn-FO4Wg|(K`}vGBDG;wUFytostXjBO1$b} zUHaZ$kecZ{GmwJunWiJb;G~kvC8#T7wI!5TEqwq-jm70b7WkBdO6ai_B-srzyy?zX zRA~0>MFt|mK>Nf}9z~l4(k5F)hQ?a@DE1jvP8Tq(<-bCG!2_uc7~!{l5pRmnF|lI} zk${VX=P0hn4N8=)6~{Q;YeU4-#xjhG?dq&HL3NT?E~pgpR43}tFIBJlE>o!oehO-t zL*temU|f+JV~$bWvIVL0>{I^xfA20F3ri&raiXPCd^Hip&U}$V1J`6{=N}X3Objcf z;(FcS7*3~c=mKxC`dXLBKu|R)dE;;!qmFE%VrP#j8+A!jK#VvM z?W}2xvOP*}-tn_{WPQPb>6Bc5PNRHxmCsG|EGIm&pFy7WdWp=nMtg!JMxKBXWB^FL zXV9-<*qN^Tt<>K$9f+JcKBVzfor08XpFrfjK(RiQcCLo&68Lgi24aL8pX*eovU!cdn+tPru@N$j6u^d%LW~!5{$qj3}85ZllR^-EBOS(*^u2v zX8Wq&xLe`kbz>1zdId$0fCe9=>3dy~o8Q#T;0EY~DyKi`9xQrqLuG`3Mu`-8I;5PO z)L+d>H_UqonF|q95)^+vm()_pkSyjd$tOff>>QPh1-tN+Q&|vv)PD4Dd!JY?bU1(8 zrWiU_x0zO67v&|LyDE~UNCHCYi#4WIv2xTPV{kkt4s;9Ff|MrH5bpp9P7}~LiKSL) zWeUO*nTvwik&05;sHJT~BDOhG74{%?aVtqYTqQVDHM+@^iPC(CreBES;ND=U^?Kwk zi+L(Kko@^gzhiA9wIf?hh8)SD zr-un_jD?^J%bkQ?=j^ebG~@c*63o|sz9Weh9kAZ!Tx6h&LSO3uc2uKt>9x7ixngOd z+y!TI28|Co6<;*Kmre(VQLupn^s&zsBV8IK+(bL8)-ioF-stRvV zpMXP3|5Io8XxU~zqc_3W%7@SGP(Rv+N_ldn3f1k25HC=IS)Ok#?-z!-BY1Ny?z7gI zMWJ*sfFhwyrSML^4J$W71KpOLki20bgl=#ia8ZB?m4H$VG)=TuWAi+7_I(f&M|vI4 z{JY*=yBrCQ(N#f;_$P*ptqUjz(?LObCbI)WTG>z{M*+!1ZwmG$kV=Q^x71L$$yF`l zLjT{LLzIXLIi^LfctWv@DUAP{?>4qM?9Y6=6Jw|MHw=>@THd97;ni(~Vv^xLyqjPi z77-1aVHYPj6_v3LA@AdaCaK+C8QKzx5FOt<7%)++?) zQ$@uP)6|S(8fE308Fi$ER1WPfPm2At<)T+;GEJzCh0@Rb2S<~kY=X!I2nqM1H`_cJV+ z;rJ`MB63=xwzk>`Ny4wgL83E4e> z9nM@IbdfNi5c&%g1q(eXKz8%}+auGmF!>}@>I7K$jSQdD*^8o4ESAP;2qSy)iYXc5 zxB_kp<*1S=ox2(i5at4VHHOfg+t~|R#Fa{R+Zl_kd3|s!-qaMO@9>3C527tI(-Dp7 zf2?d6YGA@>iKR^Gh7~wFGGNxMoLob31mM+cf7=&XtYLRW52>EkoEZDMjC{KB@nWm? zXSU1^$$ygzXRz1r#wCUq=!gd;GCLdp*fik=cwhMNG5*mN*J62juU1IqF24oZk5|WFGnSqH=dfW z%)0pPN510=UnU(!L$hZHZl$+5Xrz)IVwlX|RI5eEl^V=+k3Iw+F;PLIti%KB^i(*& z2%wE;nY00RDT3ZCbFuQE^rn?)-v;v*?d9D{xLcT)*WSm*+(08;!Hs>u^@4VA?haXZey< zVF|H;LYsYvciH%h_K0@T1~_H7SVGo!fhk$ZJmaQwx|0tO3*bnV#!aee{VV_dEt9H`=cT@dz|7a)p5I(c0sT9sW)j;0mRVl||Q&ijc?fP99V0{iEi=BJzA$0Ee zvm)Y9xHVc4nE=KU(K%BLA0ZkTn{uLJOtZFGvDV5VYIz3HFX#fx8^?emr~rcy6PXrA zfVoc)5qZ9F&YeP3Ivr=UW#J=qcA~sljyGW_z4n_!Z*7Ys;En_>Z#g(%W@!DkGo{r* z0SxJ8R7#aFIIqV?zs|YFO{#O6YoM{$oWjKXDUchXJwv`Robf?p?m$NJR$|0(ve0C$ za!Bpei^OATKMAH8%2o+Qlyr-cY*U?1=ek6q;=&S)+qA0)Mc=(tMtkZ=L?%7#sh z>_h$Tse|bFuncU{ix$CZ1x&blzcE@;pVj7HJs$FrH!;g?KZywR3oaW;fn2;`I3=lv zgApY8z0NXHJGE>i-H991ubwJ-^1YR8M^eX?&yJbZTbiU=U}NjNq@!5t>3&?K?K&V? zP&7)g(gZl;PShc}xI91*^DK`Vr`?V1hrZ)mzMK*O3kiz0Su?g2N_%vN7sY&Lhxq7N zb0}QFSeMPo^2`GYNO^TA&JTh3!2fkHdeJXr|CVx5(F|a-Ba`qo@>HVs6BZk6i^n{u zYMdDwmZO>%kj)H`*+tjylw# ziN?PabwTkvf&qzU8%tz)9so_rFG-gjdYX@FX{jh=OzLnHhG5oY6e+#!G;uA(i=R91 z?-qEiz3+va~7rb$h`v|eAW#!qt<05zu zx$YTi0Z8v%V@H>BbSKXvT)Qq9Hca#xV#qGEC8)_{7)9PX+h!)C9yZko1K@Zj){$-^ z^M%qta<`OoEculoXN!=y(i@#7+XRu0Wsp^;IXI5;BcxoSOg<7@woKl%YZqE=leicK zlMm=FT6SoZ>&Aw(IqOJF0VDNa)B~v~jIKa`U6N#|n<5;agEu+X{n3ZKjl0_WzOa38 zsvko>B8rm0EO8E3vay47+DCEQ&)mp-N3s?^`NANlq#eA!-L%H!(Tngz)6rAX6{&u%*x zE*BKZTpK-77=Y_wq;`>3yK$EA>OZQ8S4uIKVe1oW_O_Kw{E|n{ssU2)4|X3_M^G$8pz`AQ%m2ODM6PQ){BAC)pgLy6)T0&tp}bUe#V{*YpwAOS5{_rHg%9 zT^otRCHKvS$3a}C3XSM)H-J7;o(83HnIkKg7Tg!r+x2mEzRb-2kg?H5*%?eie0e@|%zRLGgv{x! zdpcI!XPoe%E<*qMeVv9~W8N51(|Pcl=^^Sf{5vQFL5Hik!p8gX$V@rVMVOIfNuRMp z(A)b_-q}5bt%u&pvY()&06@#1y)u z)Sr4Q3n4kpdb<6{3!_Ur!4L+|-@Q$f?zonCZ3hS8hBhIlIJyiXNWorg%+Q~_e?@?$ z5MFsz=}jmA&j??g2t#>aOKQv4wzx4#6Yoxc<%$(?11xVuoIDiBW%IO$F`RP1+Rk&Y z2YNEl#oboWcj&|WPIWDPB+cWg^ z?uTN3XB>GPNOxH21K9`vB5Xv|c6{latYe&$RQU)_wz9ho#dqg(i-M1H)ryCFm0Aq| zM&=nICD(L2A$#XSlI%Sm+*gzXMEpjRGKz#Fpbp2e+siR8a&2Hx-lr1vFq+fU+!TY- z>|Mi34p=cMrS}7dif>cRFBG9l)G*B|-{n}4cE4Y+umhgxd7kokEexynvd`-gwbS!u zRZXb*f(Ccy+~hpHsDy%Drr6004IZY)@2RzBkd55es}o|!=O0Q1_xTy7DB=9JAg>v> zLu}pztTn|dr*dK6Su$BuEbc)<6UjnwW~WM6*!79k0aTE!3U3-l>_xs@h7|p-brRdD z=nXrvjy!n_n2=Vn3^URbick!F+hCKZIoT+N`H${o#wH|G=4?{00Sm}QB9}&ae4}%S zKj$PNuJ;?Ct=hbPf_EEhy{X`sGGbJz4oEx4$uZ3^p?mu8BoDRR1dL~i z0ZK4!1n*5z-$%;BmK@N##=}UDB1bs|L(e+PHodH&Plu@S#KA#S<=rfZ_t%R2e|Ky17%9{qv3!d#dcMYqCXj2bm~%!YF5*fdQ{Vy zXc%9a0ql3LS&!CzC%0JTcT4_DXf9y-DfThX6`1K$GY~x+AmljnOflfg3e5;+;}|=L z=%f`~w?1Mo7do78bIL)QnieF3Ehi{LgppFWNr7!DflT&m=YW^1pnrF&eAPgbjiA}w zzVz+i@`<|}O-1a<$mWb1sI&pi3MhitI~=+t^PamRNqMvRHqE8eu=3$~rlAL=zz)_p zg$Y~z`;A7ELd7dK9WTfE|dRn`bY5#ho7fZubb2VXbgmPU@hrIW3_Kv=n z+Rq8A*0aB$kSRHP_a3TIV*r75F$UfW5fLsqO2w^i!H_$h>3G(Qt~)Xr7%&lbj;h z;cqVwSvcXxhkPWBx6nNNPF#SCx>n4k)a7iC6CFXRlwR+AuMQ4}q-i5X>N0XI$#TpV z+8>JMkp3JxAJjua(?YfE!BMc=c$`3&?6St_E*<5oI$|}R@tF;+z0k9h73a=h()NU`A)3^9e( zcb;9WU%!st5$o$z7t6k^@W9Vu09ZW3syZlYmsWB{I6)-Tg=VrGVr^ii6xCEka4`$@=M+aZr5m(a=)QE^P?r{=3`8{CyIUWIEB->T zEFn@c8FBh=cnFr)2p&bMVi&u$YUP6Qom7q|qJ-ukbCrJJJ?J@{YsM{F87^;_!hn*k zJB>BgWOGBUQhrJf!ekDOBsAuiN@ikAJ#3r`B=F(mX=6X^z$^- zXc%;)1;h2ne1As_YQ4(*qLk=P?IguNRu?NUVdqLXoQj73TxCs326zybRqM|nLKZ<{ zWJsCFi)INTq(@c^o+g6@6NO4$6qO}Ru_=B%f|C0V`hR9_e3+S620o7BgR-3 z6Y_5ca_fcb@VH1TU3LoOUSfNbja|ZX=v7b7`>`K5rT;|cLlk`c9re<;=9El2LsCD* zzRGK?Ex8C0YyNW=v=Es@uY;9Zo9euFCsIUbk)MGxfKih@i=JhjjVP3Rd=GLaR%byw zI-#hOsWj*D7p=Tj$x{h2=AL$w5E|dX{_g#8)B`e@M024J{MmBLWEq*A+c3&9G?I~o zGxZw48Qul+x}7%ImK#Rfz>P(QTQB-yUCW}G^vX)Y~^@AZ=g^ghJUO83QV<2uLTtUDsfU?knQU^ptMSU5Bs#sqbfYmmAfk?_M)!4}bf-e;4Kt}1@mMZNEP zx6q5^apXC-dSr|Splo)2^0X$U8x(Ev+11r5&#q~;@~@6AZVyJ(N>_E3cqZk7@kYTa z_%|TR5D{;Ao$i%;4!`F-RT3gDL)t&Wo^rXJsytHkWd$^-y}jsjeGNH|SZBNGJmj^d z6`G@S?!D*OzS~wA52i_V69=RtY8CE_x4;o+8fwDk`RGlo?=9xO!FL!OPNL(clB^0@ zkoKfkIm8$WRCAUH& z2jwEws@%|CSE`|foIsM{s^pl)nX=F#m7Q7)Q>ew%m)Tr{STMHld^)0N4&;OYuo)4% zTS1=RiK`Jwr=^{<7ol1-+-RCa^a=qRQkmNKseE%SnbA;*t&j5!-2jIpSKM=Jw9lm5`}0)Qf%KAe5zhI24-0b2fiBy(JKJi-c&Q$DU6<;l@sr);*tK5H^WHBJZ=2Y6zj zJIp>>P|tDFPzGokZ}~$S)e6W_^_5AwdgeC7tXQ ziskM5TO-eqXCxHY5q#&c8@_6#{j#kJr6EWNpJm7;Qsk^zi#5syC}(Me75U3$8|zkr zaOFl8um?J7iA``FYUfbh;r2}XoK{;H>fqBQ=bng1ne*aB-`m(M5 z;!7!DDw85t{yY_3h9O0ke?Xb=QQ9CPmzSOzGfSmoWNRX)yd0y*#S>wdq9Mg4MTGZb z&2}OVrS*OzzFZpHiAiT^2PTGFJ!fS+IuP}!4zb{+c#p`)3Jx+0Cl##+<$Sa09-7!l-tc1g7?%Rm=rQJ} zhf1L|&ldy>bF^CTuru43#uSZu#4-ic6GQE48Ks5v4P*vtU95VIg5(LcPQbY*ibCb6 zw8F7JslhjTPnvuWIeACfUC^^rJy$``2}j>!59fm}WR6{|?4g`uYA}VF%y4ep!@5xs zY2M2MpMz~#oq~R)N0KU+WDTxv9zEKJQUTS2Y1qm{O^OzW0_4TjZcQ}fs`pBx zf+c<&=T~kHq@feM*P^_^nW_gzHe5!eoUl1BBoL2t(1oI8j_MT|beF@`PQ`%G0WZZzpHK-PM1m>MG#h?IME(c=V9rt6lOKmU}i{vY>Ko)4%dUcl_(9c z2OWnwNa%Ije(+!XmM@PyXSSM>-UaVvs9ODV-|kb&43Q)5s=eQv$PtYESaU^)#IT=~qhfPYDzk;mm8RMKN^LMQz@o5Th34!)6y} z4XbW1RnefFYpy(!YgtkDp-7dX@&k4>5bw`P7&)1S{8* ziiE_-#NKL{J;U7$8g%B65ZqlPv5X3g*@lL^^R;dN(2)x5>b7(a-^N%1kgSK5p$#%% zT$Uy8Ur-TigYQyWg3P_QaQTKHTs{NK@@SOx{`8nm!jM)FcDCRY=y~L$unA5u6o*qn zxE>IqN^@|oI;v2pi2d>f+|3tWWZQ^V%T z=+P|@*#XPvI^vAJBNm`Sd8= zbz8lIGd(23Xcm50N+llYia0qG=`%Op&neg^Wz_pcMsr54ssp}IDAX<=PART7Hb6>T zQi(I3$!<~%@RFrNrPq=J;5G3;iv~1qYJB6pnqH$IlUfmesumgYzuTS=;&-*jzz_*J zxp2niuv6ZY_fD47zOgG~iboKi-loniZ_+jeDFNMI|L%pJD4ZCzQ4TkQLU1HRqrZ8$ z-?6amb>1KVWQ3n9@s%57gU)`dJKMTl8AfI>sVb`R3;hEL=1ShEls5CQW$Y%3s1a@mT_qPyD3A zpiD7X8#Un2fmDNz&^bxfbe0?C)5#*6oowGJqR`3K-{*}m)Pft;9~KJook&Uc%+LA4 zgxYpZG`iTcM}CdH+IQ)cf%@KQm@`}>TVdy~wC959M#g(=yr`w*wf8<>G{S`k=R~>N7a~(&sjJ%*VZ%wJ?oH&Q!2#}uS!wtc;NAB}<}fi{M1OQ7 z<~uQ_<-vnJPve$qio(!n`r%G_16{7Cp+ym0a=X0C$;xvM8Xy0vd+~iE#kNb%@JzMl zB6mwlIhBN3Y`BO>1v7=`+Txt6HEA)>(f}6z&NqLP6SDEa0DewH=MS^Dk6Xccm5i9- zt^E#VkUVV;fakr=fgLxZ`15U^0~O>zvq$vKyr9WncQU{6{U2Qzugb~6`rv%1O*~ML z%+)+aJr7c;O1ZOKcQ-pydaG=#nX6|5k)A~N!qTjAT1o#a;^0^i)fsawt;?_Sq@;`S zxz|Bmfb@dx+p*3a5&t`kWc6T*Ts$HSQNSSo_l@Nvj%Yo%)fX11b=vQEcUgB@%Of3j z(q%R{2FmbQa?uzu4|#aXQyIqf23%KpL%6Yoy1P(QtLJApirdYQZNspgjTHLl+63i_ zOM}!wkx!8x*y3y~^3|$uUPKBhg*W{i7O#gCxS5IG=`xUW5DmSEhmsz`*ZMoXw?!xc zQBEE*mP2JS6#n5TZm_`wy!jHNmEO9ER$2=wc9QW`Rt8VdjWLR(qB09sxnn}MIwL?G zl%rh4EE)F^Vof@KG{hX$Vc7)tY061Tut{KwSY6jHOH(tQunp2=+>d&OP?x0R_eN(b z4Cm|XIQ3^|e`+(5z5j5Z8BHj?vY=@6^tER#2R(&agrhz;bLiidoJUT&5ffWyXP@p! zMyHJAX{JCdZ<+7Gr4SA_jgJ+P6Q&!nYA|CVlTyg%&xmpeq8(e(S(?~eV6=g4Hdw7kR>lBDmn+%<+EO=%^O=E_J4zOSLRWiX$ z42_qN6x(b(l3m7|h1{xo&(r4C+o zirYg2o>4c&dD-*tz4u=G; z7MYy+L*_MCWV6CILClDZ#J`6pUODV$L2&?8K&rp7MP+INQs?E!!0z)Ta#g%{n)fH`1&@0NyO~0lWtQ13k&nx)RTj%4W)bM?{ z*7GKk5=(EHrch2O;q5A0G?mA?%OIWx1l}C(e*#gVRzl;D4UUJ-1&r?*Ok_%sFt!Ya zQAdx_KNXZZlOo5ddtly6ePThvVJEFx`7*85@>U<9{MwYu=&2Gn_E2ZNv6jkbW@z1a zria)OtXMimW;&0qqX%|CsuhhIL3nJwfSXtmxF&;n$nI}2jL2P|jGt=*- z0Uksp5ZPUnhnK-!Q6~H9bDsK}w;$^BxL~Ax|_@y<$M! zlH@$6tHh^K3(jeI6KW`fm>gts;dv}8Ts1yPLDb8bTQ-JtrqCezxRSb^x&Ftkwlnjd zym2jgSS1)Vd3hr#=pf-K@Ohfv}&)_QSMD+F2#UN z8!rn#BW%D*PF@*LONmAZ_;`0uEmw)vn~hfls9uz zR#~FYw3^xkbI+%|O(F)8xAPwQB}30P1^=?a3*-$5g!(NA!6FaFXX{=odTj$W9^{QW zWtYJeTE!He_U}a1ur27)#&yA;S2;Qh0n-1>>rm9o)|Ye;Q?U9Xy9zNP2Po8%^EZ8t z*@Cqsa6LXhyXyHx`bzlb;X|_#KVM&=;-w8%h-Epp* zh8D7v6IEjpr#M&5pV_G8^)l(o`8F^+2Xou5M{`b!G5!kr@DQBj0Z+8_8Bk_7Z$t@Fhl$Ei(H1(Q1v?J)|E_0a6qEtomCb1*%A7a$rR>1$3WN15WeC_T zV97C_eZ%yR(6{?6j}szQQ(MQ0bf8+ieYlyrdA zrLEpDJjBsFyOH@Gt+S=55j`57HES9M#_(~j-qf!14zsnl5CWkHSjdbR;C!w(4U=$F zl*c?RoYKwr&S;sWLK)qmhLt*HW{;yYnGBhXJ9C0M+&*MO8eU4)dU^FVzNxNOPE6T9 zz@Aw92?aojiIgqII|`mz+zL5D)477>aGtYzC*{rkvqSO*G_Dn8BPn+pqN(T$pV7{u z3}|VYl;=I8C39^M(K3>7Zy?8WZu}q0!y_krVXp-lCF&qJWdpO&DSOEdVB{fW=^jgK zhn)5%q)}B9*pY=4G1rfMLK!5CqNc0H*^O%_YMF8n^jVurk{;wImJ`%JYdwXIa)Op& zz_kyX0y{zPC3!oZVL$sx3^Iz#WPkPK726Op?6}%Jbc8 z*we)z=8<_{3z#}U6evdp+L2lE@RgfXkvM-LSRw>jiV4V@=%RUe+hXcv=BfpqQoz(L zfE;p@f|ch5U2@^1JQ&8+9fzI`R*i58H&lkE)o6fwO0W&VlWVphgOPlPosY zv1UCucXyQ{dHR!$SQ5dXEe~Wb=Tam+ykOH!t7aDW-nHzn7}!DY?;Z2=NWVDpyl}p( zBTJmyiy^k9YS9dwdn*+BLho{dJ8k<}-GaERYqUnp!sxjy|+-TnxdZ9^V zYhJ=an#4DC%4^fw_1lzwRGyn0iByT+MG)duf;`lg)oZ!eN?nG(O08aLKYsW-zVHc4 zY^2EY1itO9OOSf{lBY-@N232EaO1 z$P1Q=$D-J7`xA8`(|jYiNr z7x9aP3FnmHT{kOnKBV!CUI^-Nd6B$pgz=XLi1fnma<`WVSBhk=;SUdO9;JVCMd*h9 z29;_t`eL;WN@R*n&{a}{jD@^Bl|3k@ihPB|`|L)Kx)iGjqAFK2U&{lOa%bNnW{(CTFAhPaek7Kl5kzBOB9BQ(jpc+6y-uZ|MqF3=(CMT5insJV<1`4? z-;y^o^4$fjI5)dI_uZ+RVR^eLn$uF$=`1^_Ad1ngo+X1RCtPKpLxBlD1HV%pG3qT{ zpQf;SDXHKC=VR^?N%)6wz8;KV&tWv&8V`c4b3EkrJ`x!SUpbs>L$$GAb^i#Y13@O6 z4&4wTssEqj7()<%*~2gjYWw$)_sf&4(2tk|50gNhfB(Wu+XV=rCee$z*QoF z&%2z>AWXMMN>lfX5QDXwgaro)I`l*-8F&^#hlE_2M_WWP=8D(_r!W{p9-$+v{!)<_ z1RKgr&*jmEy-fzzqgsby0ch-*Q zekx+_SLz&BtaGn_dc4_c9%Cwy^M!J9QVh_L;*SSZL!LV~sN$T2lX~5Q!x@hb*l(7% zp{`_3pNw4crc=PL;0$t|DLuc}I4agYWrq5JQ+r#HDYYZEZ$9qVB891w(NI}RIfWnt zq>-KEVVM2DQQ4DJS?Y8pPDq_kfZenMqX}pWe)ga4QYSR634MZpLB67L3QP{0AOO@k z*V)W{onym_C3#zCau%C>7_xSR6mh0ULb>{Ft@k2NnO$y9LmF|TY@A4lOCb9f*A=yC z5KW%VT$DY2ls6h-$*Pe~8ML9-x)D=Q-e_0`VOtp9%Ejz|KoeHGS2MTa#7N#s^0umN zc9lgz{zf_ntsG`jje zg~&{+c)ebkm$K2-hz~+=fVlR#x&dJ%prt=T!eHV8bAnJfP*iLx5V;f^pDR7L5{r4( zp~dN*JP07(vu1+^@r#Q*v!+$5asKMmgR-NXYEp5|Sml_ua^zAnAi#Uy&VIUN^;Ib1 z;Oj1A=2{6C;Y-isBnr_G?<^^oy`*&AtYndd4`!hWnx;CwNkW)&cpugIGNn zQw}f>x5`|-vngmnr*t<(U51uXake#2zvp&(|07qhTWf%eB4~~#JmoDWO9xiRE;whZ z)pm0kES%Pp`yOft(qk>hGTOd%8~E*gd0QyZJ{f(tV|IUt^dN6iIF16x84fJRRA&!6 z@*r=7$OjvdTt}?v$g)YY(IPPFyW1IORfC+2PH(A2DC$jZV2Uz91^%|5uqM&H6bm2F za!HwDcqxtF&<1pnt~x+}t+>vw@VN zI?-{D4tZl)85)OFsdF4#ls-7U)~7%G*P*9!XgZRDh(W&zYaqUW zn#HWCMnxm0RGB;(1%PmfwlZ?Z9O!-L#3ZK@Lk^IG0opX?vy^M6!BzzKAgrI>9e*FO z2t78)%Mg0%ilT-z!%dNG3T`8erqjv%oNABrWPb|cPDiYYvW6ovt%qTz_Waiz&&Q~R z9w8lp7ZDw1u~~+dUvjd@f)FD-+?o*@zlUDoWhhjkkD(^#5Pry5518oB{@i7=GBpcl zwQpp1qBBNv4ivCuk)5$omzXt*H5EfUd@pn9uJbTPtR@(Ke%}A^`^ip^2$R;zu;k!c zFDs^lt!Sn4Y;MFzL|x2E%8F$(il~*NgQ#s(F6HtW8Qo#$?M0DY3ckG6B3BeykgG?o zB1BA8k`s|^y{eif<*96(*0WyKoWi6-6G|j+;gEe+EqQaqVFzJSrTk*jjL<^+ZbEfHb9|Eja_qpPq0b9S7z0CL39>#D-C}QV5pW#Z~C<5h5Os&e#+$ zMmjz+&yOp9s%2XR)D!%~4}6$R<_b4wg2{ zCQy2iK9sfye$UR6?rcW*kfXCovPp>N(a5NlA#^G(ew>B-?q>0^>SkA&)_IR9!$IKx ztP`Xynj%(Q6cva(K}gp395i%_$}ltd;>3NDg50eiyUR-z8#6c(y2$%jP)R;CR-h-o z282HtuEj32!{KrX9XK_qholcS)aNs#qTwk+C?knw(#XJ}Gqu{1LSaf(*kN;NkQ|G3 z^Uj%hPd8GsjM}U&RsA}brP%O4G(*AL4I^5~Z_5AZSyMt7-q)a!o_BfDj}e9q*(B?g zN*wDJR;tTca31xc`XV$l9EW6*yp%#>7Au_bKs&Xf*-74ggF z)-QbP9xkmDM?m${G=%IvXL;+F^}vs=X;nu!%o`3Vb-gF1hee%_xk#S|4CcC9K9i!! zWPq?fFB~N-qb1m~5F}6@tw=@oiF}YZ8bT_$qF;@@m(e54#BxZV73Bv-yh*1(0ms&m zOumU&=gwn}(0m5z-Ss{SVo1$mrs0BIAh?jc3G!d%Nz0*%TbT&dM@e!r`D{4H=&Vs_*~;FA3QzkG$?OKFWQ*%dpu*A`qb%>if|idIqEv|%Q3(r zK>jmM=T*K2?ANEaJy)O^>LfThw>eIEL-#@{*Bf2q-As)lZvm54T82ltlpZxl&P83h7g>u4F9P!G~}Q zDF6LBj4@PBWUhm_@?dTtUN+q4@Cw3Nsp!!if(-eYW!?7xhB8S9HX5r1p$>1!VS@+S ze|kW+bIVtbTg2GIkEp%b$Rp1BwNC7J2d5X7EYvq$@b`w#ph&o>0oZfvas@`9{^|w2 zoRJSVL{ee-P{RY>1dtw$zROn*r~(u%S_R_}tf(gkiG} zL*>065ESw<4ag#d7>_An8PGinb zMl4bsB=jPwQZxpcRfjfw@IQOw`1X^fPs8PQgx7~?_R7(jt4`fc4w*6onP}!j5uW1% zQL8=AeM>1VB4)LQugh3K;QD7T%*TZzc%KCm;ryJITp6yjr+9iGN97|TG9|DXIjgJk^5DWRg{UFLO+bZ51(97M@m zQ4i46Sl;|R-7)H_vY?@I6b>ZB1LD0zv#4vJ{0ZMJr;<#8SfzQoUpm;C%Rq$EWYTR& zTua^vIoTU85;R9Lz z`*+_vNio#~$YymN)Gabl+!>^7g>`S1N}_Md`v$JMIgch==mSvC=_G zITmfiSeygbCf^^XX5Fc$;LoeX4zlNQwvQ3C9C|tv3W9baBhHDlgh-SR%Nx&ev-Y6` zH|Tw}fUX7F_VZ7F77X}^_vEc&@ore5!Eb>4t2%(4RA@36aVjZ*i=^er5Q{lxuOA+1 zE(W8$p%sk{davmqZ4iQm(wXOh#gvowditPTR5sL6`KyLPTx7u5T?#n~+^fnoQe*un zG*aIEo;Q{1r2j`@K<47EasrbUU~fg=A9_}FfFZ1jN0Q=I_{4tLn-0~iv%$kDR4&jL zp;OAcpG`R`tWh(|+xYe-x3S&CLF{{YS!9!NULz$m6aWol;b0Cbv&lR$=UmFOANq5Z zuh45PJ1cV;CCySTwuci3U>U2n4_3UsAix@2paV?S;iLh4Rnfgk9)eKeK-}i^OwZ+2 zJ73xUpZEEN9n4Zu6!sGx%D8tnIH>@c%19{%M~6U8dZuWe10%W_1&tWXKhUqUJVdpQ5R@umv~v8t&rTyF zLsrxK8B6dfn~pN9S2KGo$KnrEs7CBp@!$^Piz@EFpl@V(|fzAoawD1f& zS+DsZZ$=Lm6TW-BtG{#oCTC_jJJxaix%cJZQ8is2Vrgcyd&aJQsHM+zXQG6c8itQp+dWnnvJ&AY)I>hi zFhLO}wXa&=cowZ3jMH!^0)XP1=Rp@tM!Mlnm%;VyH2e|knd?+Sj&gV=Yp!wzLtrki za1>6(9Pi~@SqD!G!ia<``99~&13s__;{h^U40(C(?i`d-ma7ZZlDF|&<$T9VE%e`; zfQ5Yw{_af*z>(mz#gGxdKD^(E&y@}t&Vc1j-5}{Crn^0{QBE+*tE<8cA_`3BWUkrG zfa*hN%5SQPK0D*#yzm~az{7GI=jS!Lve!8ScF4h`;bq=mjUqgp!l@#BhjNYYmnCUG zAIPbz@*$XhGjb+Q377JwN(PUFrL*etDk=(|7os9^6L7GA()Hd#w-F8{ES#(U*wE+d zAeC#@vvd5940agK{-~?;BqKo*ri|W{nr}OwYm~||v(Qf68%d*!sZO=YE@jd|6rABo1)$il74Og< zb#Yt7fth&$mOj~WMv)B_)X9QeLd6qS`X}=|+LUs`^($FW<=WAPC(wp*I>K}697CNE z>KV&-eP2Z>+j2mUHP_)@Oisc8YeRkfS8wJM)k~&@R)YZ!G}WQOp%1e0lrxBj=*{;T z_Ezaokm09B0WKrTDMv;*tnh2@WDpN|?il4|1^&?2S>Lm2cgrxja_j8pD?I1g9IY-H z(?*)uCZbeq;rryJTv|vW;rJkLC{khjzLt}6+J$v1I>-8F$3punA)KRJzo=af-4K*vz z9IoZvPI*)GzPf`ga#k9?q|6VBJPm*#=Cs`7tPk`#Z^s`x@!jAL2IbBD2cSQ%r@Ud` z+|;B42Xu+rX{auoH?5qwOSNhZtTB-DAaD5~Z(NK#t0ROem*s7Z_Y5=gLtGgyt2)uS zy(Spp-JnQ8SqOOQ4;(@`V0&<1GuHfR?U~VoI^pbCb_r*Ye=NPPJ%S_mX@z?uV7%$e zmTMNlBNYFF6e>u&L|oPQXc~t+<*ny3jwz?9soz}9!YHf~{Hh!uc?~3C#1iuUhkBMH z%%6giA9Ty3Fr=FGq$9t6&6H<F!Vw^wrJ%Mr)+5IuSG45eQ5o$B%;!HmJNa%nHr#)wgzbDP4( z*eGGH#`KE7R9{Hr0`FcBzDXnf(d-_>H)xJ3)_u|eSh-^;4k_UfQKcx{?)YSQ-Aq$N z_>YGysq9+mPm=nwKDP}pvy1zHb=ZYde%eF3xn{+K&!}9v78ut1w2Q#T_7BFN!{fES zCcxCg8NJQvDOe?Vx)i;o81Sn_UjLUZ{3z@awi0|)826|OE~W$)%&QVN!f*W3XfV6HK7#S*`F8@sf*&M{;_4Y}H|u6$sfMw-v*Zd*cG zC~tJU=DB8)H?=6NGb&eiI`0+oh=sO?cwpa4KLV$HX-XDSBxD2|1yF7ivg=BL{{HK5 zOnfS^H|ZdX**WyW@|J=!EpG$H7w6oMpNwL8R!YX>o%kh+*4Jbuq(9!5w-p)gj2H<4 zYp8+rCv)NIQ_!zB9Pax7$A)VJMDbzNs3XLnbH)gA50|tsbzn3gggz#m1eQ3`IpwTe z68jkK-@zKDBk+nL3TX$YByX#-!wl+Tz~Uh%hFa6|_A-`}k=Awn^_{|VkRYc0X)oj$ zKg!#Ueg9)V$3R@>!W8QyyFGH<@Sc|Gm-vEJJ#EAdgwDL-O_x93o=^zsbJI z=@5Fj#&4=`Mx~fM{ z!O(cTO+w_2SfrL|;~Z#Os(QU}woBx!MW&R8&$`w`i#J7e;Tx~7&-adSrB2p#m zkpm$CfVG}x!KT{TsoyUk{~;!+osN|8aho?^(w#OSYYZ8oEa!DASEM#r7g<6RlAbDS zS}BzH`%PAcFfZyUJsK`GC;_>ReAw@sCpaZ$H1mei-LI(JEqF%`7J1A}d3}TgvEQF5 zcTDF7xp~lL?s6jT+7tN#`KjtK-#xVYxjp1rmB)-n$SefA4u@3Q_iYg372A8gUboFg zBC!Zlbr}oAUFB*of+>ZVkuRaw_cJwu^NPmye6QeP82vXHz7TAAl@Pug8_q!+>W{8l ztdW~>c2ZI^8T?eR|LWXixm1*db$6-LRS?`G^lj9`@@B%yWep>M_Q(}2Yn@rru^8-t z?zX}Ew5$=zpKgFr#4D`OxBwjqUo>@S7M;YFS; zVG;)1U4NUaSG5tBa(-N-sr3HC=~B8$3V5+>h0=5+K8gHra#;ya;PVqLS*2!&h$)XA zk~cVu?uaGUe|XOE^^~_D%uWcFUSTbHQ=3P{)#R0kVPAqk%ehWGSA=W!;RCe1T`6y? zoGcW0w7i+nY9~YI8+&Ku(JrD=T`Q{Bd0FzNhD_AIg1k@XH{De;FNRT+t8aaPDR^=A ziEyrUIh`H#pXW_5JDq3E4p{O(PWy(y%+757Ci^CNL)n&71D3aZkT;=YDfyx!L%0xs z8ZOV|9C+`wmI^ZkEN>z}D0fiHTUa=`mB3WQ8DX|C<`eTvSBTG?cPje0(Yq@xJfPwJ zoneg(^^_jTe#LVUAJ9knPE5zS(Gbc2qa$lmF15IeP!fd6mtq9tbQ^0kt`FrP>JVgy zqRh0^q3OSa6cK9G>6+JGV;@34OMkbcXnV^divT|9MYo6Ue6L(Pl|LX4w{k&_{H+Mh z4mPQxKU$2)lI)fvhR736nI&cT;H?kAon))CC-q^B7X!J4@u3ukKd&&(>^zHg?8<2c zorM%R1qN9La5yTYlBtP?7)+GGnVDhuhmMmv2VqU@eoB!t=c@?BLgBKoT~3#4T9b!P z-T2C6B%E15Nl>X2SNCoL#m z*=fBX^X_5(n3fXYR#QU{R%9J2AK}C+b1(qik(J7qV;rUBD)>w)@j9;*3z`j8N{^Uw zVi_#~-P+K1y52(!to?%@`Z5-`1UU$yetahNweM$p85_jM#I&IfRB(p5#CUw_B|3jT z552vHbv^N^Bi9#kD#FHZoDn_NwTKi_H>^0o=OH(td#`AEBqTD3GAeNKTB@-Iqfuji zk~cuZF3&Q`Akc$%zfh^Ux=Tsk7TFFA@3Dpft-4#=l5S~w;VRLK2{u8(9#fG+$5_YL ziGGyNtk1w^v`%rgc@Pd{iw+hiZVC0vT-`X6C~EmQ1kz=b#5kiezE||US?9@z8kLdA8J)yfKI=^pygXsF;ltcIJ!3 z%7YM|(J5!kz7nc+P7Dfyf_T!Za_3o~;h92w$GFIfjlaUV1>~2#1vv0ay7?DtN#zmtE2cv_0 zyYGvI%Sh)eDI+Y5T+gG?&=Eby-$^;rS=9QyvFA0EPrny?E%-@FD*Z`aC;RCkRa21= zbMHfC)PT=cQxGZ%h3n_da53^E-Sk)~J>G!^&Rm?O_M zkTcBc0h3Qu>V^CQ<2 z1XT@U#xu=To>_~Z7}4l-41Om?uPB0Ng?U-nmYoK!jEQ7wfQIVCtH>9zLr9KEEdpDL z!0G+z+m`{5e3YX;$Xgq>?uFp`_P2>MTIv%UpIY?Vy-6!JEOF3`YKc)oXPn$to)`chk2%T}tYW3k>Hx!=WI`LB>S!?*a6 zx|}V?lpW#-4r#I!Jfy*OGQs!AgYr1S2q~g$8M~g9Gr05X1Ig~RHS1>Je2w({VYV0@ za*Ey4dpZ!2ESLZ+9gvnS>BWVFH2l4x;R&3>l_w6#SI@pD!qfqh8wIr;swHo6>iV+0 zJ(gUBl*^=jn;7~)ND?{OG@husVjhM_jpE`Px1omRr{PpIQt<9ywpAy#U?k}fdGia_ zUPb1f$?MmsS%NqxgmiW?uc3>qNQX8g<%zs$Aw*tK9>P(@f2q3__8{CHD`=b)c_gF7 z)xOT(8$x3|k`7+*#Tr%l$bQinD#FJg?6WhMVHY_SI@t0*larmO03JzGYc8(~xYz5a z-rokzhtQFZ(GBN0rFhCSYaeDs!_iVX2fQ>JY!%O=wd7=ch=@SbYf}3qcyiSSs&Rt$ zm*vPFLAdtfMy1F|jz3e0$xtUYmO;!1+;zrcTMNE*?uOEB`nuL)v0XXQ?gCdyGEVt?S^v4muL&D7OStekKMEh-}u z2`^{5!;s%HrtbFCA7;oIj#8dX>>p}*2lI+^bxv7M336l zjq>Kl%k!Sq*u^67;OaUVRyoc>CF>pJx-D6z3UO zz+iA-5BVe+S$=;$$lDOhx}TM2S#Z;mw-U2)1%rUw9Yv}^iphTFyM*~ZC3(|11yLa2ztpWUX(V?ZOXYh%uS4()t(M?=@1Uj`ddX?@w9 zjRzcl#rA{W&Y=(c$-G@B<@nhUj*YX0=}Ua#W&BbK+|em++I^)*uC{*;w5){tXRjPe zzj8=bYr~uqvv9XTOwJ7r9oDiC3Z&CNyA8gznjFR=#>JfS)F6=CX2dpf?Wch(C}!ox z7Aup4tdT2puz{cQmJnS$I16K`>C>s`7rJ^wj>)6EVQ+=pth)3P%2DAoPpxiG{T+g< z_4i3*K&LrL2qkeUlT6=Cb$S!adr}rw;9%!C;%pp2LZ=LHDi_NUkB{++ffYlqI)Wjkke>u1S)JB-9sw?eG3_I(XZ zN&0Av5c4b-P3=(#sf4jv2Ghf3NLZQquTF4->1R#cSCfPkWv6=N z`qZQ%*)_Z!2D_9qS!EMB2k+H_h(D&*5)B9#l|9aVmBNYDLpr5Y1jitvBe`gO=Bx*0 z$I>O_q?dqpA$oiHf@{hfF3-#`7M_j9{bXx9VsXjDCWpdnw`48ONmmi8nYnu%BN9{8 zwuFbuuvT<%ktep4WGIK6tA*#v>k*sffxuc&$vouP!CG9~nnEfr%!#0U!mtgYKR6la z(A7V5r!+^FEj+ztpWb&x11098X9eR}gd%{lf|9OBXk`*>&|U z@k%O_y5`v~Qc>d~6q>!;k0a6*>O%?3FMlp9_}v8l|I609ZA+5n$YH>CkCWZhGiSJ{ zranaEEK<^kb$_$g;&f+3_=W;@fk!n}_|s$AnDJT4nA1*?-_QKl zEg;z&GVxMk;Dp44Epr|Q2GhCJ86aEx%ietQe(5=qsCC?*6Z50qhJ$%W_Zdr-1u6&G zn|sjy{Ql10*Q8=htQ36L-H-o6dxi-RgB=$m$Wb!-BF6Mt!mRAxUipVaSI=XsZy5@< zCHoC65x`eH$fQ@`Q-z!(LFt~ppPfzJ0ld_v8$0DPn5p=wg0(OPJLkncw1*kB#7UHpl)`zLe3r6*GOpV$IM!&iHEC>d3*@xx zzFRhw)O0%gx&C#0_1Rky%*CQeo3k~nF#065zv1`rwAA zJL%y8D%qR)5ygGc(wfhy`f>CY;V2%$-{M}QGG)Lqn-gD1Su^%T>A~)SW>!~C{t7#F z^a%SmE{Ua(D6$m$!lk{TYY-1~5RIkN;0kItCSj$a7X0_F=_h2wEMM=x?qK?=8VCoU zr=YYIuvE!-HgLbqOy*?_L7~4H%3EYw;!q!IAM|IO%g9mKNqY22+PyReWJpEDrl&?C z*4-z>2ma<(5G5}>08%ybLF4rc1b;G{#kDbGC`$$5yQG5+C{zb*`dg{2UXr9rdwB~Y zim976A`T>nsW1?vukB1R)d}yMIw6vo#FcT$da5so%QG8RL7mTu4Eb^NUidx>59AcP z_pk8|zF&-O1pkM}kabmA(0_>F>4? zEz0@oIo%_SJo-vBN8I9eUhV(YV$!q)VA;>VZEuG%VUAyg#gA$f;1*`Px410q&$?G1 z#P53?uI=Tyx6jNZe^Pv7vcuOqjAl;)Z2D2`P=DQHOXGjG5`4Ep@xFM(()QMW{*b*9 z`H(<5W7BNp!$Q$yvg7Z5^0<{qp@_)C{N}mAWXRVF)adlwcB$<)MKKj)-R9qarjg8OF zTPF&J*?!%sS@??=SZFcmY(atCchO-Eq36HzZ|e@oH!*O z+wj(G6+xojb|dl%cOWa{{F)WTyEZ}0CEW6WKfel@wEK{b6^9m%d*0RKAbnYVuf4Cc zkC%xbISvod6JW#N*9BFrYwxdK?JY)vvAK$ww|xkO2*OiCeAC&|Mi?e9WHrysC#ZAIV`(@`R^}9&}JM;PM&C2@ErP{ieDe-s^)40n)_6_YG^Cj5yBR0k_|A|DNp) zl^IdHd8cu!qk$M{5uT-h=wM3wCt5Q&muz+rkW?YV7MZm7nde^8dcH(h`X_tC4?)ve z<5-tx0vk(Ag?JlRd4YDs4yOu{ZZ-&a(Wnl2!7D82HNx@4)gI zcd{)KqV0`y$|_u31vmMM31%P=E+GPM=)>~?D^a=;93@ITZsVJ(?)Zi=xuuw>L?JyY zjFDUFs>ZzxfZvVVwsYeJ#YFn&B@yzR-fNyGc7aw`JKB`;2gh})*inW&WxfI&Aq19i zL(Dk`_2e9&UNU^3;LlKChOgqPEw&6#8A06!qBVjX3wiIaJ)DyHI~35onMcC-%CaT0 zE~iCCBM-)JF>-?rQ4kW1!dbFjSeZOUhzEgS#$Wo!o@BGmVIq^8)+fj~M8SvCbFash zvlEy8gX`-ZDv;Ru=0H5D8B7_u54W=I5B$13j|%kR%@VO*VkNt`Wnzwl#Mns5$(fEz}XVH~=)l;NM> z5{~eBH9T#O#Y3>U6F657u8P%%6hSfU00qU`5sjSSD!Dz_3LP>=WW?vddjZODpCz(h zW%qJMA|w{{!L82Lzw+xA&x0i!^2KVc_t#%c4sc$4eBU!h-mEp`#{(C3V=_EsTY$S=O)zVG#7;C`> z?F|zZeM$ci>z8xvI-9QWR}QSr-YZ*fhav@sG*yr+u7-`Ouhv4%wZbPyc==4eF7Xlc zE|ORnszpQI{-2*?#z8~X93lOElL`$vANn-02$w%-qP|*WwcRF2?OrzgQ2Rk1+JE9ED>E^VD z_W33LAPD;oQgurXzNy;4{+^zNmC7_5%D}J{Fr>6Ykb5eryH~dEDyx%}{#x~NXOm0k zI<^uxV!YV@yvzo<8^>~raHXNH-)fHAGjg$&ftW1~2) zuenoH1Z-^Du`Vw(kRh=>6BkUn&((MK7t6^akQkQ52*Q2asX#SqVnJSq2`rX)d>4DY>}jw50LVqEXNSk| z;>_)^u$fTtqTTO1m@Ltw$dt~U+q6C1l7j_-YHk!*Bc}(BD_#$d%UNPi#!_f7u7N~`TsG5Zj@&lvN zh2eNoM@I`;$%{oYfHmFK2VXh;*_~l83cJjK+;l?dAN4T57hmMpy1GYd?VT!9LFaas z2(V1d>=PJlORyG#UNY#_B)V;Q7h(g57D=$+-zIn!PYpl~T^7#b`RI;~$oI}p&7a`eU$RFz#rg1;mh=|V%|B+5{ zZLhivIa@+#pNFJ1cji~1FaB#r>iF&~IMILn51}2dt`!Mk|8{Ayt<0H)_X#3w~-3a*}+4AQ+E!o>7M;8zS252Th zO00;k0of3$R20}?o`tCrB_a!H(m+=tftQQ8|N7c- z{p(;`L)CNHw|C|Lqme$r=}5YqoNFCp$=~uO+I6SxjR|}EM?uhR>wU$yzMx+mwM2aT z^)*s={9pg&U;nBD3&>B9E$HKd7~NRT-|wp=o^M${z&`G?8DrAyK z`ak;t{ol{)hJ~~(#C|2T1DJh|kQn`!6FhG00*uX2X5BUc2faBXsu^dWm?`(Kic#9a z$We{~evco0F-c_;fmzBlG+H(4Lt>6Iktt@_lKoVY6ddmw<}a-ucfySG9$V@6@xGmf zE}KkDvz7WIETyKI?t$>Y$TnMBY~Wy4x6x})&T$|5EccBu>QQ0%EsguUwVn{qguw^b z_|QNr3|$UMP*td$Qx%nq**C>bpg$ZU*&x%jAVYRtv&3w9&)S6QL={=nuvSwG{Ln;_BCxb7ErO@ z2^N55do#rT_t%9(_2o~jCE;*_-|4nnDh~L3MU0*0WaIr_|Hohc^>3_rNc0g*o!3_% z4%xF{;B;oItMA18)Ko~y8T>l+q9Vp|^$q`~d<)4uNdxBED`z1d>5zg`-j3kOhcG?Y z`U=(#aFH3`kgE@6F`$mNt=PaQbZy?8q1G zz=A_9$E)>T^C6In!-1cfKHL?1QcF&O#&d+T+!2V7$bou9brTv$rcY<&?CJCWMnF?= z72JDA5(uIM55M6^8K_u*_^x!j_pMs;96<;^NeNT%CzbLXZ?+hip4%6&uyyv(HTsCZ6%fvWe2b0MD znWvbQcE(RtIB#wIDj_kG1SXw{0*tf!;Y>LB45wqVMF|?PvXv`(*S)J+oDlRmZkj+i zIhX{d?Z7HsUWdoend7o3|)A%kc;Tgpe zimyQDZCx>fNU}Es&#V}Mi%@Xip$%Rl56K6nP&4fAeQQcY0mK0pzhgA=p#M)ZeSHnG zHzjV&eZGA1EYdNg9_-2EENIh`ku?-{?nix}S^8jBXhhIFSqva}RY?A!VX>N^U`1c_Tcjx&F#}qTQVf$0rD^SO&)ZpoTmq-A zfZo^Ej$Y6l4tGBXLCbg?&eXifpl4|v7=2K69@2drARYFoN@jkG)S>N9rS~x8g@~9e zG{&K@qHuBs_*Vh4Gvw3#{NT_&9V!Ji#O0Y0o4y%C`fok7BI6s+F7+8^%>y}LFvnT> z^NCL2K0)R5kj! z3SxFT!+ThF()Cutx9d(?^$4MI_YG6}d}@qn(2uu%*FVF1*7bhbTQM-^1LO-iozu;eqR;Mh+Di$RoeFKGuhKjHs~CkjNNCA&UuN@^Uu<~=D>)> zto_D+*cOyd5Y=x-Ala-Uy*E19o>)MgUQB-K(kd52;nx0^)GX6w{&{L+5#Gha&yB7w z*;Zik6EV*y=cLCyiu5=}w{i5IgMu=3pF3@nOBNRgd_-7HO+Isl)x2yg2;#IE1{c+p zW}%#G1Vr$6?gpqV8K2Tm`mF>}J>N-$kGoh(?~b<$T{3r7>)=yGAF7p<*h}nV5Rs)s z)aN->+$ACFQIAuhGm4Lxc3=_#w=Dlgo>AmL?m%ol|LapwD!!@U;Qipo>?1b{(gS|E z@26Wd2hBb#TiowNM7vs-0x%hcmr3!5?8M}zCvT&Au(t{!a`!n9=v1{z0~pux;GqBfoX9U8t@$2OH{3X%_q_?~ z&_FtaB*`FEtOWa<|Du$nm5c_)!)OYtMUpY}JrBZ{r6B2kjm22tqaB$0o%GMMSI&2T zib2y~`z#XZ{@>@Db)zg8+p$V7Pj2GHB@Z*k@Cm?$`>9*ChcmX+ILCRSFiDuZ*rX;4 z);RfY-odG0;H-Bk;qoXG5St*(i$2*Va}#|$3D$`Jpddk`8g``;u#9^&sf8Rcn=SbK z%%$L3^E*fs)N1j}J)ONO=#^?qq!Okf#K_5$1*^)q%oO&lakmS0-PwoVpU77fU@j(6 zs-S0^TBKE#fEtu;ndgiZlEy`t)J(6i!t<;mIeNG!lkWCuFA)HDIQggdZff}jP{XLGS~Ehb;|CqR#ClEo7AEu@WqPSp6GDgMf3Ns=ToIa{!R=!iTe>%zaN zJ0XxU?v;XUCyB&F)iJJt44pCgUiH|q+@kHrI|3*m#fRLc^p9(o+jl%iteQL42)zr( zg)3&%tN)-B^v2iq<@E2Gle0L62cCg?$ti&<*f#$}>R?Hsn^Q|=7C9|=7H_i-Wd&kf zYe%;9)XNBQvMu3Wce}c{_Y@=9S^5AjY397x!zp&&P!i!aI!herW2!tD+Brdu#4*tZX7gleH-bR@F01Ra0I!>Pj-RQfUGvi&_}cAokT zJL;tj+v5Dps6+o%nr~w!#*C7|0PstWJSJA6p{y#iCDEtDY&K>GKacCFEjRw>$5P!TYA!|9mth~QZbz6tWEjOP6%0=94&FvR*pp0)_6w#hu}gLD8pY6> zOD$LDwNfwv;tJ$3T$(}NOtRef!GrwsaiDtX>r^$7t|t2?pH^Rqa4<$RqGrok$!Fen(4W^y&E|KvO;D+7+BiHQat#kLzOA^WKjSPZGb{^Sq}kgKMu#n% zsq)y`a>fejp_4&Micpj*fJQm4SV5+m{+EWg*xQ4;5 zh9}?^eSO{V(N50H2S?RT?w6_%=?O|KO zy?Kw#+1|LTJD_OD)&t+ytEQ+yZY3Wn9e5Hd*C3Mgza6fBGpS|JCTkh*uoIg0ef>Ls zLc2n9)k^01^CV&Qzr7b+L|Uwcw7o@$`CP**7!i)mu{1#s-oOn1xm-*Lxpz|H+MAcO3)8$q|_8nEG8NPqH{ zLogOjo}4kBX~SPlp8L^kIOc*?*!3o;>GjGpF9$*m1E@lm0Ls0M#+!zOw2(orfa$&{ zHnk+HPaA4~6WRhjF)+ZIgkw?!M?hRwJW6fAqQmxPrT0}%7UtUB3%ler`*&?`Mm4BT z{6)rb;8r$F<^o$Iml9sVW#i~)w!XNGKqjY8P9?tV|0W#Ht)cAibZg}h%-Girg*+jz zMz9>1FSRNzB1=OqB;lpROyz}C-7OqH_meG{sZf9r<<~ChaJtWN+ox z6HcZ!VGZ$nIf;pvsh`8S zXR}fpz8rg#t!(itXu>(44SORuC)w6w;tjb48FiocHV+z3{LI!Awu;s;k;O9OQ!FCu8 ztOqcg+yNjKu*}NY#Pf^QC$cm7Ek88&4~5Y>Yrw$_ez@u0T`;4+SdcPoG5pjjHvJ9* zCo*ptiJ(xNZ!H0!JYhifhnZ!7R^Ndg7D|YF&+>;I9B{w$C~YLFTUcJ%;nGgf3GR5X zR5&4?RAwuRX0NK=qzqRiawzqcdE!3&cT3et#@!>){?oYioo6p{(n$HGIK0bM1V&W2 zLQrK{vg#zvnG16=R?i8&H!W@-tLyjBBRZFv7RhmdCo4N#muEaX(?tI&InUYA$S^dF zRGvjpA)pySlj#_;N+VmJ_t(TewR?xX*vW?^?mP-JyRZ*=MkwiATwVCm>c5kExrALW zwkMz#_xS@72ulrwdy~x;-gg&(VF-U#=?RVD)}&0`$7o)M;kaPphp{Iuv#>b9K*lOC z0gL?>y8{eoX5f6rszP30mE3X2iKx;5WGci$YH+A(E@9Rd^zbwQ4Sx>-4T()mKYI5w z?A3?L0l+UkRp!H+-OXn1$>SwERlsux)oK?6A~eZ6ypM(hk(2F-@w5)y;0Uy=@{>qs`sF*{z@+Wuk2pl6T@q^Do)V7usik zswz+eD)=9?H^{ZYyMHLSor*tu$Ber&-mqd9q6GVIpP_L!CStKndMkhLQ>egJHUFUR z!ZXo1<5^@vE`OVj5#X()5I*~HCBtfKA>g2w-9AU#)o}k`@r?vssL(NaLM2|jNSu53 z-9+p)MEsoz+F=pi2$kLkZ`f@j$)9Q7Z2Q2Q3yz$9qxy` z)nm$>IWAU4u>>b;wVaA?I;%VHr<5MA(Q<6=J#F_|1y3Nz^2OpIaNXPI^iga?Y~e6j zz`+^C%~}?v2s4Q>_pIs*-@~1soQp-Zqs;uvM$*@5nN3{dE-tM8GUztqel};$+Bv3& z3}o;;=-YfjDZUQ;d^p48mrCjob8bu7WgEPW6UtIV8Q=(0i@Pjd;MId7k6>+8!Jr|y z!Lb$*pnOO_Ng#wyLN80nTzO2bKaX?0V$bUPp6VZMF%>sIo3qK1{G@%vK-F^M6BWtU zuDouf(>qOB6{w=#?p=Qs4N-MlG3wRbZ_YA+qej=qj6Mwf|<@I-HWN0eH42}cl-IFXc|8-Un5#8_PJEi@1 zAo<185lNtU1o*j5CS`AIohUt1-&rk!oEd91%sE`~&1;_D!|K(r*x&b-erMrjyQjjN|1qoDnSC)J>a+3N(uvwcmeR71tN+N`j znP#x+TG}`yN2cf~76{4LB6L)MyA+3VF57^GEmcDoM@=z#fvY=x{ z!u}1j-Ap14VxEE(>M<7>Novhmh!ILh4ftlpUQ!HYRVEQReaCmq2-!T#EX`%2dJd`o z;N6Sd#EMsPSND5R0@jskdj>tC5=&Obd_NnPf1SVdIeO^_gmMsxNw0q7kF%oVBi39h zUV2xMB4co^+$J1{;C|e_Dnnwv*}liV-Z$GIXvMrkFk;M%sYkisfGLlvx#=`firLWn z>l`jW%l=+kS@((3mu)*hKw0;Qk{!%Yl5cy{xD4U&m249ziw`*~XU!b1Q^iyIoUQMY zj~>T-Lz;J4Q?l=y5Y70-fL!usJQUNylKm&!9Xb1kb=)6caPg%)#O;H%zGul8zBm1lLn7~Qh_=7^#SyYJA7r)>xNu;Pd`2``*WEpV?T&iPYYGRyJ`3GFC=asPC%x>O zMIW|qg{p3O9f~>DF|bWInN6Sd+uo2pD49)-eT9;vG8?=f@^tR>=n&sDWpg_(KHrc} zmO10B{(kQEFJ2Uaq=kb-yo!*o{L{}lh?f2+9N(OS=+Qzci5r2khA7loaaURIudH7G zprU-eOMSIk9nh~kLm<;FK>)zqF#CyMjj`g)9C$H`NX&IZPcU+#YwmmT+YJ-c*Wm*T z`B-6g4WTRwfj$n`cN0%S3`1l@4^dIYK17xGfhe$$SFF3f*Cr*HfKYxC^kWtP;5}a? z8+yUTK9fVG{eAAM^iOaWc!Tl$oA89tFBU&rnG|Oeb*GEH>4AS1U=plG`=y>>8NIk) z7Vfj(ZLj3BsTPq5Y2k&0?Q7;m;Uq7X_x(2(YllxNFvr6TLc?|^4Mui7Br6^0A)U}TgI_PH~MS47xN>=hXZuKm6M4I9>|LVANB9= z_ej_2yeH)#dDK>N_F6C{S}0uw!M@edeBD-5%g&5vk-j~M9I;x<5t6sn84W0Qi~ym2 zY-M`AUw##~;pGZwe_VHP-&?^oLcKMhK|_GtvbS}6Y`i;s&vt^#`>+nP!*8E0!)m*x z8rLefG-k8V50066F6RneY>G>T$976j_?O0cKK9n6w>@y9I2@6Jk#E=mhr`dYl#jgS zBzP>jTGP+0?_FwkAar)nd&#Gfpr`Yf?j4i3R+I~d`kxfoHs2)`;B0S*3%b^d@>;@% zqDy44n@()+B+Y0_Vz$@^ixQ%E0G04dU8y2@G5i@!P$FYUduwT5@^|`F{8^58DG}6l z?Yft2blYyL)K)8v%Sh@TE!;vqeu-2j|DIruUlX8lbPi03gnh0n-}3Z?mPo)ZfSBzv zIwTT{_Im5Jv~6gIzyv}GCjFs@9$y8+Qp|DUI>H%rIwH;8lOwRVYtMYVo}d$fCf&jU zl@#QQ4vPI>Ra$6^bjG0W1@i@$A!8x1(Jd&=|Lh&#BUgIQGGd+UR67+TDxSSf_2YEG z_)U_1_+{+5RQk}GjmSe=nw=w~6zsjlNQS;ZFe98csE{+kEcKn~``D2os~I|_OH4-T z)S8UmOtj61C`cX8C|vJ=OnwUN}d8=E4OE59@bNj(uTVi~Sxjr_E_VMH@*n*l$HVX3J%f zf`OuKn0docj=?x@zXV&qw^s%7<-?9Xujka4h7!uYrWINZn3IT5%2A1&#{Psx5r!Wp z*#AZaMeo$l1PP0RmXaO7o1rSMWe;@(%ul5;4Rk5)>4W|pFDfUD0v7(}Q)!&@+Bg3OZC3{OQ z8X0?|I#0=|70_| zU(}^9`G^~vjr8~;K9o#mRf_#YN}Gq^_qG!b5;FhE{(WwZ5(1%EVNoM)DWdWml2M=o z`q};wb2<+B43X(3v3pU>gT6#CDwA|Fnopf=lS}=_wuVGjm393;PJf%hB|r8oG4eyJTCqVDAnQxyjUKY&KyCCf2hs;JQO*r7fIL>;i5 zXFEkL_PKvJ*9S^+UoIHg72&|?xja`qnhS=}6E0`0>44u3@1f14N?xS9y)a%y=S%@| zRMyf3Rnd>*M{$p@s)arH5|F{lLk;{U4!r5mInGeG!{!Ld4f$_okaS9div7I$_Dr^W zGmztFJ@&;cGda7*(3~EZI#ogS+3PHLX0o%qECBU1`(&UGFXcnHjF%E6Bwwnu-+EU4 zobW7|sI{ZRw;@wcq7SanaG1NV%-@ec{~UO}NbDpw{8&^mJJ-#uet!<`Ddw&m4XzXM zH_3qg_xCj-@())Z`gf*gM8BLw!@p+3_wQ+$I?;DgX`|49UZE*GdCREI47h0dV zc{sd!@=R$u3x0LKT?qt6PE_B6Rn3tyf8W6MIpb6f<%a`hAVuwu`%Qx2(#&h#3~C}G z*DX{5&O(x}Q3P2T@pKNLl+^d}-nWdTpN(2F&_V9=B($ll04NXze&h@$N8PgN$M|J$ zPGel@;VhD*!%?F~X-4IYumU$u35R}gLSVQNQu3R5QjYNv65b*No-A5&JJDluj*Rh5 zTN=)b>@D~jNnGsjro!GfNe$n zIc!DAMUoLV<3rVr_Gws~3y-%(E>$gzf=t7vG)vAvJn`~lw({tuA&_!o57~n3``|tB z;HeNppCzgO(nY#ix_yg>QRC0O88X!J@zMjWhe|9|euRQpF>)Ah5CI)ZNLM&ec{Lnlxd zt+%v@g65Q2O(J<(gl4!fJoMZ&Mki!Oq8ld9h`kv)04yVa7OJ>%6z}9_`J%q?Dg=?d z?TxBC?8kK?y?LJf`om~UzbF%f=p0fBB`aXwC-1Q>`xPMB;CXp@irPPfE^C|AN3vp& zytY-O0s3qkXWL`Y8T8kfV4~VE5$Qz&(I6WqSHgi)fuxVYzAT`lQLQv!?w(;+^j*zd zRFoUrG3cPS1N~pz`@exi?ONxtG{VSPTIeJ%Qa4?R?HW}#=pbk-8UE?Z=(EtadJ?V0 zSE5xBH!O0f%A!3OEP}fe!K%!bWkPyQLO46n;Ty|djQ7`%8;So?-#o~c=Q0fRQn{o1 z&7ri*wl&-n_3Tqgei0E_@{s)<502Jhvyyg3J7@z*e28z-7fZG`TWtMqPOXJZkrQ{# ztUPQQ?FZIv__|Ms$E(k4gz@uPYTgg-4&_{17+0ckvxa$9T$8k$~laVmXq>A3j@_MBySa4L{K*0 zgxltTdam2vk8l$HJf^y%tpb= z!}>rfn_y;7*?QkG4x6$>!xH^xPs~6OYH$YECGeA(2V7tm<_~2Wt`3cSI5=L)%KH&0 z@Zv{MwJtL}*%MI435P%i9QH7eD7!1GUEI~I1CI~jj5UL(U_L9!kkLqZvB)j`^xZTM z*B1)v`$`Y;d)x$v;!>sT0z`d2T(2skRQo*(>Y#_Z>7uSlLKk@TAx? zHL5|xAf1W&fflP1R<1hdNT*&17KA&P81HM$S?W&Z}ru+csq;zq7)^fuo zhW#W!HoCUiL$<216cZr1)=}C843Jm~F<;QXe=+9yOqY7fu>aq0ENAq}Pem!g{d&=; z3^gwLx@Z?hW=zf#JTtA4gWL;$M6%d41n*uc+kxFbzmy$poo)1DHJ*Xw^79OSQDYXr z-xC>~EcE&4#Fon{ggGj4Emrr0$-4^H4E0;dTPHzUSfU3~Lu$lx!h`_Dk*I{nLv~10 z0Lh2~kPt|=gZMG<7e+xCS2ke#MqY*L#E?GN(?dX8{l(}R>1KNu@#n$MAbOGjIGIuM zzeye6bU-gDb(j42A2Kjih$9J@lZ-*Tmrf^cF$HCi=t~8aqV(ftt>J6rJfUti<0|}o z&W7?@Ge~g6e{pD@0mOnNxrPXU^T&OZC7CS}%KZW7Iy~}$U?&mx+d(Cz4p9l!SHH-R z#|Bj7-X9>oGojRy(rAW#ZY4ZCy?owOv!c4xNh}EuxFMAe@~X}#Q>Q@FIm}BWA^HR+ zkq6-KBTUqLxbhYf(9h`U;cze&UzXbn+C{f8!TwccwH(p1389})CUR$pes*Z+KxIHs|k zJ(#?n?=QiIhTcP;ixvs9{!j3{APf-|{$3LAm~jtcf;cZoBjX-%I@LkPz4vIEVCS4l zIA)%bfv+@*$Li;~w;c!GnS0F<-obl}+@-4qREKMFoKJ<1ty4>n3`t7E!W~3b4C9=6 zP~NIrA{lAM_qMm8InqZ_k8&wtn;>bzP58Vn^t{sydB*{_dpIpT_I4~II|xcbXL!A| zR8?~xEh04A+6<9ixyYWUN5p*D+yf0A1o*B)cK1RHM4ul(*Z@b{-VSBGc=r8WpTiF> ziV!Q<&ygdrBYTr0)4|$hHg?%(J*Rk~CB0;C?ng67OY0t0-TZ^^#i)?Z2M`vv0q|)} zfQ0X;*%42@_F^R|cn8mb;xX9Y9wMq)48xa~nqi0iV-^|f26N_;`yIS5?SE!6rZKRR zDjeSxiYJ%Q5z-J~5JLgwmO{~YDwidkE8oE_)-`9W-^au^UO$QzAvD`bCY8rD@}VRI zd)qg6sxz?;_k}m=!V2q54>4FIeA=6FJjJ&q?Ogxm9byV{P-WH?Mm|m^J8z}! z7J5K1EKN%k_xUQBXo%4}IR))t77vFDa);OD3Yt=Htk6Pmm%_bnRItS=lD*JtIT`}f zDU;F3nWn3oOML`Z6ND1qn?D7~#65?BFUx5yD`)Jq1hX{mm5+d1Iy2(*!OYaL`x@bo z1Cro_jBngtnvR3c%v3UH%RLA7Qt4R2>M!M~gL?qqOG~uRb-;3uXF=YMjB#`9dH_s3C=w$@na#dj3j`gmm3j1*zTB%KG}ce@;SBN&vj-an}1Gp#%D`zN^gAY&L#?0fa=XMsDzT*9C~3 zJr_6t-4iPl%}HAk4b?T&aUhOxFuqRW#pgt}F~w8*!Mup_xTP>c^{8}3lkEh@%+=R5 z?>k)S>5MZ_nN1c#I;vxFkc$27t9+fW*_X{@t7n)o_y-IWgOGM0jp*5hA-d z6q$wdgp!-1Ve*-IS@?Bda^5}B(kRow8~5B7GhV){C@Fc7ecZqMCyXQIXwfprae;*# zxRVY^jebEW$)HoL{J+2B=Ukt& zNJOg|?uJks>W1e{r2Mis+*1{waR{X$G+32WU}ZwG0-G%!)& z%I;p|n~HzyNqZCfS7(_qiMr)V&G4)jB{e<2x4z#E59zW}o*oI%k-*>pdV*LGFX5KD z!<1(G)kD>b!Z!5OyA6m92YiK-|?RlA{v8AoJ^7OFU?MKX*70!B{rEX5PSzzJ|O{A$6^W zcOH0Oxg6hka-Hlf{(Sx8b&YQ$&mu=J`$iIws7Wzz*@(NR4I6r^;)i`M>1Dpe=5)o{ z#m6b{*6pI78@HNL!||*uV^mTq->zNhY+G=uGE?}Tl44ew)X>?~bK9WrVA&7psqCTu zREKqG%)w!*Tw%edWqP@GP|!hJp_C;HGQqFDZqFj5sXp8w?+9QMt$6jXJ~d7dG;S@;oems@-^DfoFaSM#!VI$h7^zP6ZW zCF0lTW&Hc+AwBmH<|hD1E|1#c895rR>|<<6M)G$E4JA1e>@NUbTXahP^Y-{F(a&Q! zgGy)oUv=e2`+jSMW)VZ)4IEVDeM z`caY(kUXc`gdyKw$tFl73oz5=i|~!7R7pB={QQ%>)i)GOM~%6C*&A-@%ij28QrRyb zvqz{Jf z9lk_3(%1WL#;g3si$}GmrxPW?3Br8ooR@>?d?1@IDs|qy7Zz+h^%RM><_)*KSQX)5 z_5Dz0Z{Rfi_?yeD`!K+n*Vpft%%!jQ31^p+`SjnJuD{q@7JNfuNdM9Ib(%mOzrN)w>M1tDz5q)C^(l% zXUq#T$L; zhdz%`xhI7PEpZGk?-L$`eh;*Fxb}t^g{vb zCBj_h|6*_EqgXLcX2LenL0$#85JEE5zs8h+P(Ar>0N**IZ}=pY{H~e^_e)w4zclui zIv?tbs&uo_COZyG@0)S{Mpinhfm+|DX1V5l$s>r-bif!I=3dFhX5m~hc25iEMIaa+ z_YY{)#)P(TRk1d zGN9=(J^G%S=kfazF;-5h3v48$O$?SA7zm!BtyI>RkRs3Gdz(cJI5Q%wu&BxsOFjSo zsfd^Carxkkw?ab6sf}}aG>YyvO-KfzFMagzu38+st>8)O;s$LS6)3YOZnFWgA@4wX z3xRVifrqXMnf;u&#R7W86ntXBBt~R#Kdr`9QfAQ4Gdlo1tvcx%FbTZRMcK?gjma_$1;6<^Bn$>9iLTNfMLMtSZkg|jgBN zj5y&#HBxtltI3lQOnGPymdTfTD#Q|^`H6Zp{On7-97M`f0*FtIq|y=U}_taWBz zu1XzP`?##-%|d&gi6?F06eS>p z@?EOL5WO-+Xh{5?(2OaUgpfBeJdfiK_NIjaNhFEohbn9NV$Jk6xo%4G(uhu|Pp>Jw z7%qrVD^J5%%fBPac4GC_dZSNd|M-NxY@veXd@D7Y%8f_5b_Gy!eH7>WL;JIONl)7G z=gnGvySR~U>6iysI1&L-!c6Ul;92UQ`$fJ;Nml?txc%w_=y~*6LEidUDg6aK_mGAG zU!X^EJ9$A-(ICuQRlHgx!?HgQ2`GgV1GevClAxTk1i>3bkNWs7k~sNnwc7xcbFhV( zNcTfJRbIGPyi|faWqLAW9}j8?$z%U{Dn;L zp=MWS7w}j`s0`y6EZzF))un;@%s)uN(Lh2~u)Yl0<>K5Pdc0zt9ylCI>3JSpRpA=F z@~huH0xu6N{!$x_5SRLJcap$fxA1m(D8u!iim6-)J>{*uQ})8#*{z_oRT;mgSI_%O zefbufsUJP|du9$ngfJ`NIDBrYk`DIBW{he}tGC3|5h>y4P*f)bg=gD`zI`3G2dyuG z`_G5`{$ykS^J6iW`ffN6@&FpeDJ5`(XTv0kL+~urz{;C*HV^C!JG0Nmm3#eE%_C^n z>;21024OTxR^ZaOLs&_N98D8$KHpt`IuBJn#JYBP@3bl+{ybQ(lquwWy!r0ZI^rJ5 z(Nl}9JaVa8#3)l~sQ>e!9pDdDz7C+?;*)Dhl2Y;lihN2sN2H>{S$@A~j%%6ljW$i( z%6L8-C8I^s08tA#{`H`l<)>ek%vn(BNV>5dAfsZR?~{=o_pO=8l0W#ozYDXNB;_b* zA?b?MBuV!!bBIomnUt(4&$#3>vwg{_$qC^e`3}xU4YF{-86nZB zY6=^ClXwB?^Jx@q^XwU=(Y|wzDZOSoJzRy*wpjYY7t4*pK|P^QKib!n0DTj^WT%Xk zV(BBTxJ5|+=!D6zw>&mmI<~jP@mjYbk|H&!UG7WEcvcuO(ksV^;>Ce@pifjLgWc@D zR1v+x@#W^4lJM`hpy)d6BZ0XOBT=paiDk-s>; zq$~`vg8f-|8dtwC&6W4!0TVs?p0L9*(;^sUcxyrVWa!H74Jnn`%@zlZ&$ z&DDKMc0>J?I=FB>dH7(-DA5F+$0R;|@UslHU_9cNo+GmE-TeNkRX^>&`0)l)$Do|sxpZ=R(jS}5y3#<;I;=c)hG;ewrnOj zP=YmySN{FF(uwD9XuR?R{fsoYkF(nERB$YM*o2E$nY9>tKdw4MP(!9gOiF!W{soeO zMM$0FHDXie8ig*)%dnjkgK{iag(A1~wI8Y|->jsN0A8$In3VMr0=!Q)p}OL~#EiwO z+TlP^N^ru(&|4Ljh+tjSFCztPS)`&wdc?@W7#@=y+1aP1ONBbMz5QB?s!6Q(l007; z)r-gy>w`q@etc$S1ZUAsKbitALOIQzXpLQ=MfKkrV$ z=O@};?f2N%Wsj0!f}5B61Fg{Kd4Dg@F)o{|AQ7-M{)uxo!Y|~|YAe%9RjKgLgL(x= zB#|f*s7bvB>bk0gai(_@%WS6>jYOG^Ife)B% zN!~Zwnz1m>wZyk#n}qiNyo5j(xe?%uh&;&xV;Q+LKPZW2=t&WF$MaW87%VnPV(Wi? zdmajHj!XVhIuUuF+DnXTM|P4owcLhnRtTAF#R<&2FD7Lw)@pE=hP-rvino}tLs({p zql4J7vf7ub9?RG%na%9E{>%j%P(Y$ z3vtwT)vF9wRR>$FcESUx`ezRmC?BKbOHArNkJOvYePuYEj_cLNc<8$~t|<9`r54W9WY*03lX9%~5R_97c)i z2Lpz-gp_-K_hNO;oeI{j7<=0`Lmu2C@84$yro>f(2^~yHxe1e11TSYXF<~>`2umk@ zuEae{+Slp?m1#R|{X5}^5a!qIgCo9e3l#|npys- zfOwYJV+Gn2%aeA{J=nTF8d8cZN&c4XydTOB?JfNFFwbiAB(1G5Tne&11HDE)8;!j& zA&1Sh{WrpD2}}eI3P9*RX)9fZ6|jIbV*H6^9sX~h18p3Fz5Ot?M$uvW?STr<-izG9GCS$zZP303U2H`Vr-19sc!2mN>c1qzys83){| z+Dm>XWQ&)4>?RT*gDYJY3o2Z95pqA$ig|Sh%%=@8y!k28C~Lx-x|0-s5t#VacDPR7=sEjLA;C)G)_haoEw;`c%bUPl*u)Yq0aQ_TyRBObHjW% zX_!Tc=JZNPKwxMH^sVSXy<3#gIQ$PvWICKZPQ=~YhFrdTn?=~Z4gv1%-<`3qyd5UB zMtPPP-v|CcEr`lRl-vF!%><`r>cV)$TbkfhzoC+s9hOlBR6w6UY7&v>ik)0(W_WJa zeZeKYW*RNosDDQW%v=pdN+$)ZryYmJFL<)^UKn0sE(n>dRKMBU?v$fMl?wbF@a4pi zaT>-?8QghS+IWFV7^E*O3Tk!Sqlbd}w&eq>A=x(Cho$op&y#b2rK6_= z&B%+1BCJ~0l7=-&f90{2gu0d>OkDd@GxOJ-42+GmYXoA_3og*BVhU%u)2Gg}&uB(W zApH^hH|3>7>T$9YbT|yylD^DK0bBo0*&EIPljRWU%#V&@|8maWE3Vhh{YUP^DR3_N^RG!nvD-CX>omvbPb@XEF>&S)MQLJ4UbWVBho1yVY=&Glg{P zZ8O5_Iqo>G=u;5Ge?&(h(1oltPL9?*wyd_wos(khco75Hq3)hU0 z+AhG^S%UQXzo7};736iXazzXfFreVo*KciVvegfb?%mTZKX(Sh@z@**RTez4#{Ron z^?mjm0T)2eQpMD4UBa_YE`RCoTQ-uUI7r)n>loa{BniAv&u+5YlC(GSQ#jYGJTDN# z`pmISOS0!Al`k>S-;*F~F8}(1SlwJs9XMtYq3jATdtZVtUp$PI2~4h>bC!zC>^=+l zz)Q|cfhRRJ1jq}AnMPS2-8d+(sjVHeq}_0HK5l(q=)<-neX{q%ESlgvh0-;)Y-Z^> zFO_S+xO$QDhIRUbN-waRcu(&5m&%lSyB@tC&QcIFzP}AGo@-auZ=9^+?@tUXxiKbRhIA8;^`x+2lMC^Gl1`b+|mFS9)5?p~}RN;xAyT&JWitwNR< zVWZLyx3FBG`U`ENk$*m~GsT!iCqP^zG!gEfY1WpG8lop{*s3r4bz_gn;(IjC!1RdO zImb8l@FF_Ve@c?FXsh%fl|w%1^5d-}PFb*^azaN&FX(vqx&1E~-0Fm7djJ-d;h|*E z35cd*#CT;^-z}c!$0^u}^tYNw-~V`S@F1$NRdL|rneeQ*?afsx6DPid3NNbAc*&TU zpE+l^wJ<LY0Z?9_iZD^ zcWE-C@8L(Nn#g?e1>%ns?@=T#R|P{vroG+cgGj!rmK4zPB{{FhTJ}w}e@?I91@QBk z_=^)F!W*SWk$LJ|n**>qmX;=v`u+U3|NUS7noEIA0Z|3M7==uO;h=Xdy@{09<H*b)NGfz{JgYm{$9t*VmwHs{poIy*@*R_z1^Z4(Nac1es&F|}9)w)? z0Pblb$q-;jE*F!I7ibPp-l7_vxa zljz-KY9mJy5`>t94ggF*v%jr+P*Qf{B)nCTQWe<2$}xLM(dWO{7_GcXDdTSEXVx&T zQ_0A0W_mgAn$1x})ZhEUwOt%DUlv>8`v#dVO`xI7+&ya3-=Q^?a4XcECX>=t*W+ZB z$0Y-|irb+?AtPtpg2D+Jz-Qu+7F6k5Zm7DQ44L@hv6*(j>!r2@DL3XWn4}RVWx-el zJGnQV-z-Rwnrg;ClvXjjPI;*p*{+l*5S+&Ln4Wd;0I07Wg0L;@G4^JdJ-*Vy??CNq z!g&rYTuHW$QfH~Z?MGu+o=9`DwQhS0gFuHcd{PB-V7r(^9htckA1vb#Ac1~f-6zla z1(K9qO!infam+@QGcv`u&=4SFo4a~lm0d+$0ys;ali8u$S909dqJl%XvJ7q9vL-pk zlKKj1H}qSAXf^4vt0f*S-ofgd_Ah&5g}v^vvXaxc@c{i;Id;0WxKRirM*K?t6Slch zt3wxg5;_AcOeiE$bfg;hqlfmi1J2rl-b2sYcl zW8NC22@+i2dK1ON)xV4Ulf(8Fvz0D>3-V1zVT;KMlch!O(rxIQPuc75Z z(9>VKP58IuHm=2fG|mGqILBtW1q%-VJyfoM)KDZG6SDA&8;ay4Fsih$T_v4JTar;D z57aXk2@tP>%s;SGGZgGYRXegd4hCh-;UmSR|J9XP!zm3vU^u?m7hV#w=x337AedL> ztS#oplnLV<3YIEC5=qK`45)*@mlZGwvU=-4_!8+W*gwJFwX@(ZRAxfxc~BlL^&&az ztI~o&km$A8hPdm_0w0{M)rb_KV)iGO9HfyS9#+{r#-mHHRwve-^V&U`c{|b zQv1d(N4b)eoch$5X}>mRaZ8L+SAt6T(5F__UmBS2bd>CTGC>jB#E38JA)^gL&&hF; zDyeYgr1~xqj=Y^bs-@4DHkY`c8Ic7#;Bu(^T>6=Zpr@EkS|^=Cx~*~yf)VDdw@xvn zUa8Z5?=1y^MXX_^y{I-0wGEb?K-4&p3#`~fQw6lrq=QoBTvMfE65t}^psOHU!^P1r z!DwhV$j5u63CPP^GLsaoKsDIUh78x6C{-^9r` z&pcpF2c1X24X(N@r|%Y9B{58G_mh>=7vtBFp>yumAAtM8@%*P2hl% zxD$@iYbqe(@Qs={lT`v0G~YDich;E!o>e7%*^#S(<&5vCO$8zWD04_Z+fas^Cb;xp zYe1f(2>Lk|8N|Hk6mn8A!ziD`U~Q44S+zk33nCRyLgie)mNyK->YR0in2(F!$A@V$ z&083VVOz<>&7nVyvqy-m#vUPcyIFbhK6Mb~hY!Cuoww&z^NhBt;@YD{JFNwMneUa! zh|miyG)f13AqNtYzt=JL&!1{T&>wPqdxDdS}`Sp&(&k2uYZC$2U2zZ1)my zsSy@>n=l(Su&n%R-pGu$Kokito3MB|HFyvus4otP_ELvnYAjR$e?mcMkSHaP;#8#I z)etnyH+pHi+No&+oZDkatw3C1pF($pL=CF?L%CcALWwO=369t2wiF8oR;Kdzc&2ZG z6GsRcDe<2g1;ltMkK_1M6{&~fN&Bcj|D55KwJSMtDF%N!1SEX*$FKa`|Nbw3bMHzJ zO{%g@3k#Ul>osF|_rkjT_gj$_nd7lMD;dTOPLY+~P`0UbhO>lhybZbX{*gCHaD5zf zDnaO*I0Q#7I_t#lg#lQZt@XbTkO4BC8#=2ybO5B3v&k4_8;nqTQT)s$0sYc}s#%Ry6({^hn*IRkxgO9=aRx>o#8U@R&5 z-})ZS#E~IPI8jJ<*!gzwc;AVYAWQ&i17{veT$c_os&gh#)*?<54^WNkXLDIGi0^1y zI54Ev#dq4qfB;9~v73RPdKN#632z61?z>@(K%dJLIVKQ??+fD{f~)m++Vu*wp?|kU zBupGhUJstl!OY*|MkIIWzLQW_+UTL5yk=}fm5oO$mX9+C&k>#hPOCAc$9XcS7)A!Z?Y(A;(ZPV5vKO7BOs)`1j}&n~JDJDm zx%(aDl4CdxW;2?Vi^A7;{bkC_z_!nayGC%G)NZM7L1_3LQzE>2%`poUI>5(<*8 zc;=WuDq7K=K6b)oC>!(cOc4-cj=U%Ai^yE4NPDZR@A&q*_Vj2|=lK#OF2vJF$|%NF zgwawHDlsE(_*)5HDb`7UKJMi({E<+LB~wYA&t?Dh+eME8msyiIA*L*-AAD zk`kTljaiXJ&SDgwyh#~iGNp6O@U+{0LupmQx5DRCoc{5!)=Gw@s zF+_2QB}~I5TUNoBaKs0qdF#cHXo3C-B*xydDj6>^u%KgHW?IX0lwieEuxu*RjF?3Y zI3`_Yp(oSmLQRJDWbbl;E{zDH9S!7(+e zC~;u~`=8PTNa}fTPEff7JniQU3&O21$)rL-xX&|Yjce>}5i;YDz8oBd3U~(`8=)8r z5(-IUA>idb0;H;F0#+Xs%u`dO==Q81w3J#&!fyS1PJPr4LZB z4qm~sxSwa+uXzsFBxOt(Ur^-&gP5=%$A@s$Vz_p~to|qS{0A!-C-cla5UCm>WuClZ z1aiD(omheZ0@!gKrpYv40p zARyNCo1<3WYh=s8oDZ301Dnk2z~(f>AK5`H4XExDkA zThKV25C@lwC}%8H_Bfa?j&us8it!6RkxT|S9%p;=$lF6CQm|iLi6{#ZvzPrIGNrM^ zSdxUn-rU90syQ%G(=E@(=%~sVhPunk0{C!vuDPQY@^XaqoxNgo<5Wi2*NEBEPZ&7> z;Z*qmEcFzAzu9#B&3jNtCY|XKKEWVA3?1vaJ`a_nG3d*bDn|4pR(hNvIc~IT>|A~J68WoCx+~=6B6JMK zp;AVA2~~HvPG~kOx$?1l%2*aFmuU@fbchd(Fb~6tVLUH-@9($D4ucxs{F9M0X96KK ziXqI?<3m-h)xC_Iy|hbt6&%otDJ9WN0*naRR#=52 z5J>HcWTELp_Z#_r(b4gzyqULtut3R;j2AQstOl?u#w6QJ?aLCXHFq0U(>i zL7$=aMXl?g@$t=>jD*TY0Wt{}!$2Qt*+W4)N!{w>AQ5b_8qBRlv(92*WhHz|fqs|9 z7QQlNG8wC!13}C{K}FDH`k7H2fy@q}`7LK=nAl_o4AgJBip8D|H79c2Y;iJ}$>^3J z#pi*Dwd2+{tvevURLe|)#aK^BMu~$0*pvbDZ#kOd9)}vJNQN@Oe^?=o`blQ6;d%KE zCOc`AAvy9DW;|1K8#9PIMy655lkTx!Bb}rd9|JeyJeW`5J`}}fcn?gLwldqAUNa0f zxDHL#y5`0m@Ryt)uZq1mRu@P>l~`U1Sb9(JxJS^A*n$WJqV3?!WSCx$qbnuIUcpqF z#e|*f9#><O+g6PTXRqJ@;f@Ovisq!HhP&#RfGHv;8nDdZ6|7SGiuNI~uT zB7TMqTV^+mbXNPZRevhz!QKeniY;8yk1n<~e34s-p$i>Xv_E3edkjm;dGQaRDjY@I zdX{dRvqe7luaj`n1`@L9c5 ztlipM^CKcmB{HGaky?t68sFWgJ%oJ&-C+_Bb}xUv zJVTqxXq6Qw`dvEd@Xngi#{Xpz3I#bloMyO^$WkK=A?FD8H%K+IXpM~+=3{~==SEQ& zCN`%Pm*fuKN?J_tb8Dt=>yZP|hd7wyq+dERUh}8qM}8>L5957tB7h2X#o6vEu?_eP zrJ)=DWN*|(W`(4FJPpa~;%@L5c_$ud9RDRa*6ko_x>B;ylHoJ*Z-| z4Qu4I4SO32QQi#uM-nLH^S~Zs#*5@LhW)?U{sS-K@DmG+1>)IR#HSNP6lhAi|A9U% zqX>BvPV_~<+A%%=*{sft6M+6Ikh+vf7GZh(n?x+`=3r$_e=XmF@958yFpinnB!n?x zv}j5>DSc>wna?6L=2_SmscL}}22g~QU`c9`QnzX_N6Z7so@l^HAsa)qrgz8Kff=NV z>UGyRHsCjw zIMTh>7TEyVPfJ^A@H0yvD&myq_W(tfkOYyP)C;PqYL(E1XQU8?lrcbityX&sHAAskHSuNDqlSrEB_pGvkziOliq?ll!rovIg zY+1T3loeYE?dkh^WDfJ*r5kxGJTtU6VWoVgo?%WW9X2!dy>T6Y{Ocw_$-nS#OU&{m z!kgZML!bzXdOG%sIe}f{U49HCh~cyLv{%xf$*R#1DN!KBUJ!l`ijU!Xm53qfW9w~k z!49j;BfZ1`Ya8ji`5o}}k3~Nr7h@qp}DRP*|rOA;lZqoBPW3iYzudf#r{4_4czpwjP$g_Qr;m2{4AFI5L3JHvoI|lAf z9{%kUhy}q)(841ZDPtvrhR&dJtE^HMl#aw^WVS>4F}Y<9BHx!b*o4MX5YZ(lFneqr zq#2yTEEA5(H005v&)TwbGet91Ju(O~P^EUtdR-j_-Ae1`bc8q)?SM0@?Q*A8lg5c@ zSR->TN=XoU33SS0V@FIfttX^l;LN2Mh}ef*Y~*u(IN1ADA~X)c)o$ug;(2XWQ;eB8 zV<7IeO5fF4>QWCkl;r};!QDvP|I)lBFq;X8idfYv^2!xrDLA=$g!ee5W4d|m&Dexd zTCj73e86plKR2ai_QJ9^+Qd^d9(>e*y$O4kpmNWMnxl>iihyFVaTk&-`fngF5 z{p|LPEG>RievhJ*LwZ1J%8HiBhn`Xa0J4bTmZNBYNtVrw&+n%xxHe4uB6WYHvv3g$;CJQU|D> z7hl}KU70y#reIL0SLC$out)VBud}o zYrg#FJh(ZB>@OyWLG1h>xdXyBdUpclTR4JQ2Xj%zzs}Bk-Vkx+^IZS_z9M{fi_r8t zI7Xygk%X?kE`daxM-wA7$vQ=Fk<;tv;kHx%JeLzpQU=G=jNm;eTFH{iz6SrVTRm^0 z4(Zx8V)WVlSd}pFf8Hf7acX>Bfe5zaYB0i8a1li-4c)jG#!Xfx$asu5$%;?6O|V>1 zt)eLqbOu;8ZH{HdjVA-a==Z8Vg$GVRYe|XSW09-lmm7LI6Rx?Xelv5AG|DTW*+a z>qD}y5(Ghz@5j~&1uM3c@P=ord+fCD(?cZkVVk-N=wXY2UB#_-t~7(b3%102Jc1B^ zppcMstqV$6q6onq3(&my5iBgOKvG4V3~f%rK#h$s^-Ve(WTP19XeyG#?B_tCor^NG z5)4{Px(1Qc$V0(Mz>~gOC&!~Nw6`zjIY`1Gja>R424RlK@tkm6RauVKAnpq1MuJMy za&SvQfQ-f=4i#KFM@NDh2_+_ViJ-s}ZE8fnp3OJ`-HO(i}0rB!y)NTnsWagw#J2b55f0@-U=o-tCVRNbkY9Cc|GB@gMA ze($~6=+Z_fdw4A(P_nJ}qIY}UOhi2YJ-&&f3?Oq=4rvP`U&*nOB_|c+ph{%>$cP3tHv9PCy_QlUY(HwOMCYzYaK3T>rCya4t=(w16MDFGK zFk&Bbh)~n4XgL9}J4I~l$A@^EDBurxn65C~i$w)%a$Mcgq)X&X_}7)TH)lN92K6>t6`YVnvU_bM5!6a} zun!&5hX+BmcU`y`vi*B82HuVM7&C6oPy%UO_@&U;Vena_x+spcy)I^Hmjav$3~q@@BiXy&nJlFaPPUU^vTR;(+gwkWH1+$SnW;DMcNA`EqG-ERieq9?r)>C_t4P zpdKY|?lx`G98`&-&$4fW<6E^(v-`hM?gfyg$>7F$%nm?(K$$#{_1KMi1dfaeoQ{)0 z_?mqhfstKdv{N%A%2{QcP9!5G5(aR^3GF{ zH0nX=#r`+XaOjLMb6W$m33SidsSKDcD04`eNh|R1hefJ_<9%zXhp!{_PA0$xAvOP5 zCtK!pUJQBSHOEvqfUq+q|HYp$#5ecmI}bs|dJ#-g*1hU6<4($w5GH;m$g&mT!$dm5 zk2I_iL=lv(Vvj;CN=KM52wH5yibn>`_ykKewKZJ7TkiOE|vFh6$BzEm4;PlZ=^U#2bwEVGjj?B#?$!nH-w*E%Ci_@ zYjMe*SKdlWZ&%RrJ(ROtVIO!NTv2++o?c=-q2N)1coIGu9o7AOENld0r+c51-YF&K4qaV%Bnu^^G5A$IT6+D*p^%*0AM^17&*?>RiathX9 zpfn2s;Ior?;foCcm;7`;6DU#<6qNAG6n13|3A8kdZ8@Pqh}3S0+D9I;y;SUZT@s2> zvb*&6FCvJgMtZpuX>Lv2Ne!OoQbO6^x_4MkJDBW6etN{of&?wzNs5d|eNDgw`i6Z& zT3Z!yA57xdiG~S0~7#z^a*Gvr)ZZP5uo8AP~#BaOB6T{O$YbV%=RfoFjOR}Fzr>S`wHiZ z8{c<-JE^^kXxTHI*u0|3!9(PfCoNUBoU=rRKKk1klJiSLDUwq!0nMEE4aijr;*% zo-8TJeBz{BypI@?jgy>ALy62}tIFh`r8w39#`?R9-dNQ5O8F1KSs zW?(}kgD42A*Iwio3>}XhTOIKRS!y_kXK+=`HUxz?8La5@ya0S-7 zTL+Am)Pa_RcxiSS0TWJ1+Q}K;Bs#f)nC&uM9dEE~KW9Sh+e46QiaN^8OEjAhX$2Yt zJu|P*Sd z1#4Kpl_YZI8R@iz`^Xj@fVS_%Tk_Vu5;3Pr3sV^81yy6&r z7lIg{ix~Gfv}j)x(ZWNSCecTcm{eXOz9DN`-x?CkXw(yef7Y%A_m`}70g~ti(pFWC zei45RXPfrl*Fb;dVwstt3D zbVmCjG8RJ6zJ(-Ik~*74Qsa*95~PEk6e`Zc_XiiGUKt*a=05=)w;(qTFcy{xLeaDL zcgiRS?rbNHF$SiR=rue9haIU*C4gg1m3vA1E!ws&nY^Uyt*q9Y*xBx zl$(W9*@}E!oyB(*pL~x%+%6i2oEbmt{k}Q78FLp*HU*8af>y=Giwu>@eb#>+O9B)h$9P@v zXdbBTAN{S~Kc@{SC{M>m^47~JhFJ#u)eu}^F$etYiT*q+e=`}eR=GCIunNP!)tI)Ewn`-hd|VBI!v6c7TQ~=>FxnFff7kCviwNf39~gJ+pJzcS zwYwSRJOqJiCYQ>DQ_c_yXTq6K%Vt8yd&0q`J*Vsq*Q|CRMrIHY-KS!ZAwrvKh4CEW zK>ZxcW5@6{9>+7uXz?A=u5~uGOBnvG@4avOaW4FRzu%WgC}NX?iOob&0$o9YjbI{& z_5o(S3Ev4#_H`^If;U7(Z6Wkh`M%3Zb0{g-{gozqkZ2+atBH$ULG&^fz3D0bY>VMy zw|(_-hbAW4Yc2=Rus=I>yFfX%X7Kr242dLh_}txGs)%XT^)qf;cqp(R|Mp-0^{)sh z;r=Bs;@Q}v@fbjw?74<9Qq2NF{pG82&;0Y_oEOQy${H3i=;3*&(FJ3b;5r z!ZA1K^alH>SB=PmU}K(}lkj}mK*(Z+id}j>Txb?ZZa)~mFkr+{Cps_1z4GxOyxSa= zb=;e-mTaPb{&`6~Ehh0!A|ZmKlPXYfzQ^)-gPxDbLTy}5;M}IM;0G!k(}iv z5=5tsG$i|HWP!GF4T^ggX@IzcTC)E}*9X zlEiF2Vy_OHMYJJ_hV1grV9UbAeOzT1yWeUw~mdabeQ6t!cD5U(uV-oxxjZ!h6OLH=^GH|EEYqUtu%(mzGcil)j%*_M2d>UDF~rd zYU~eWopQDu4oEptpvf82>m;kx`tqqUNsyE@fL*2xX-sWrk0CZyj%7! zPoU`p*gm0oNMUMqCCPOgq(ztvpj~7JR`67Jq z4wW74xas_*-+9%%9Sfv8t?2kmz1=IsNt)4_$HAG^Akif?r`2O7lStq*bYD+6WBi=< z`>K4|BpW!}VO7usqHB9R2-l5=j7k^^KOkM`wGq~l0@Hz=$*4NnDI~b`+8&8OvxWqS zU>)2C`bjv9I;*N~;qZho^o4SdCck%cuA{W(u2=yVP=#Xe37N07DhOAys_YRAP(uuz z{Ae3}LxK-%YT8?DLi!Jt9Oxi3m`SyWgZ}8X399G87C=>W(6L8|h0YXke?xHxNf|)} zFtjwbq#!fZo1g)0k=v*~M5rD8VX&;F@0;O74eV4`9dAf}>xV<-RtN2SR}l zN%{1#lR6hrBR~tVF(%TiAX!NhB|vr$sGB~oi-8_h;qsS@)inMAlz0qRp}oeC3|XJ6 z?Q<+8_LA6X@3okyM@T3oIA%m7gl(-xLm+M;sHShC6A#a0clIWAt8$XmhTQ((Rri>i znCU#-bO$&W8dEBYg-{CEW#mIqqWkn5?THyVqfN5kdMRM_KOmZgW}zchktO=d#l#5L zgLqC(N-7AOH{2^IRzKsr;2;Rc{ zFvp}Auz~!j(tU}H1tfGaaiJ!K_$$aB7?id4wFDd@CP3#pLJMRHzB17ABW+mzBt-^e za{6EY^S}I6H#nY_RFtZM}pX&n+4~RZ(QXkB`-?b!!tJWG|N{ZIn%gs}3<1 z!CvCOGqgKWvIV@dTp}vKx$iJ{R}fN(OG}F;eo#wU*Vgdt)7W~gBVy1G#zhc%mS>C)pI|NMJhPfSTKMNho_VtPT_M|}Ki1u6a$ptkpwThfohK8H)JjHu*P%Ju%$=2`r{4broLFD zCVVb=9=Kt#;proe!&(BVK>bCG(yTK_4+-I3hCD+VlI-med~Jp6eqP?_1wv(cy(DM< ziHH!Xp}jByELB@$Z&70txSra>pdSR8M@NDu^Gv)idJf>BpLd|{|Fz3Ih6(p7xuzY- zGxu3oHNC+w`+Dqc>P`5Ev^Y+Lq2kcJyG=kCSAUKXF89B+W{-$b-g@NZmWYEJtUspr~ZSzZH_j1mv}@C3M#_a6mFb#P|HIJqfi>ZYK|d&+gp>*7SD18mySGN zSGbT;LdTvUffqcUA_|6M*2ffQl$EvKj7g*WC-!Sz-c|>`+m< zj|S=|@|I%4%^ju2d8p^w&q}b|6zg3x>ei=#TrQtiS zu0$1{tlv|oI4zD6wl{oVL|7+WBb;nCRTz#nIf?tV7s+-hZEFM_FN1dg zeM+mEzDJ{qq1BVB5>uIh6Sd1d5jo(kAK}bVPTNU=o7JDnvev2xQXyYQd)v(0#R|vn zclMNNhxN4`EW&NJQ1S|nP7z$lFe@PjxI)Eej)Ck`62)8G5BQn%9JN3QBv~qz1f?d4 z1HlovPVqcOChBV31DG7yjJ!vDLJ9j8fzNa8ghOa|qZp_bXMY4ZJC`RdI92y16E4l6 z5vh~sxxf-HkK7^&m07$Q&G{~qngH0Hytp7juZ+6>!UdeU{(I_-O$^`W>k@^EsxBN*TKQ7Q=WU&+xJkP!d|uC=~K7qotF(IJ&?Upq0m{x7%` z0gn7gjTB**?r2pX%wj}@x*sH^;2KKgk$wwBf`KR-YE-P@iLFwtRe`iX8}osRTeukz z+mw9!P*j-cCF6-jgWW>O_>Y)y%rDp@g`-)rMD~G~oizJ6{WsW>w7K@m;@_^;Ul1Y} z=_A5O0;+iReFP(M+yI1&WsZne4_@U>KgkNAEtiKHo02FonjUWkDPhZ*Y(g(@&9*56 z*Z0B^z^h~o(>mOgXojb7=FeedO5aCiEk$Sr+y41Q7VMBy-neFpxKt4$EhXqXOyXtr zk4j>x#XvYxTHzEYIw8Bts$!)#C)u&#c)-9~kc0_9YSiSyF4{Ko>)reXIK(!(sT0lK8v+Nrid}87ff7@N8>1c>kC-mNqP<VaS<3T;Cit0eOHU%$ zzAnP?yuJ%)0EIYq_W`}0G%?bn*6hXpIP=fQ*`e*eYn!yjlAJ6093f30;g7x)rgd@xzQqAv}3r@gA)_=(g=~;TJU)6#Ng+>ZZva7yRz+#aQ+lJ zCE+3@pa%+*DhHuMexS#(u%HJ^BQPe1n`D=UNs*PTyvA}`L8+0(5>!`?Z}erTLoRIT zqq7H_Kg2^lrXpvittjD?znPAg&!coiy&cHL+d7YnT+@bzyT|LrgT z@vrC;6#Ihxr`)+%Dxc{D`!u}tg4oAUkY_*ML~1Bo{rTtY-M}TLrAv0D@4QwN451mW zWb@we*$kXlPPMsp>*5eHP6319sxpqiu)Z<*M1tr8IWt=>3(%{rfOoM7H?hJt znTgMfJvmiZWN71E93aW|Q~F^B{M8z$ktHN*B7(>kG$<6C_gL{&HRnUg7#B^HgDc2$ zmId5g6RLm_x*paLTswF}$SOTN`e951{F9dZ2ntP$?0dZDB91n{&QB22hzLPYz4fyUT(88h*A};G|LP8g* znRIh4LYuARF{o)>$q4~e<>-BgD4CQh{jSMIvitfn&xpOjK8~TfH`t=c8$$c&2jnu2fzKN$0MP~z!6)n&JlmL8 zVtrx-!}hQgzw5pNI!?kAVTKH? zp9vhe9z{P0uGPfcu@DtH8M6KvxR@9S{!LMYkAx_ZL%ZbTA>$pn{d{r>x{ z$a@^aP!{XiA|D5k6((JTCxeI|h9bd6Ua7_K4BV$tfsYM7>sD_|Ris>q5gfrUZt%&< zY1Q;U$8sCR)7i7bS^=B2bH5h~zobWmCXb+haK%rSP+xbWmzE0seX+5mYeWIlXO%$) z^UJn3*?&Q=0SUhnAeRmoMS#jlm}h&{-GQLX4vpKSR#UQ?gFol_U=r5cfIr$BZ4@Iv zA;z?KBIn~lL;@TLCF!&`{GOyRnJNwkLb;@x>2!N< zp^qx0O7Tra4$FvRvJ3tuT2@P{>|iyPb&0`}?FYOVxwRq?j)HXk{s1qNr=Lh}B?-&O z5rUBZaCpm0Q}I!4A}F(gtV)YjPw-^*jY12zlY(Gi|6~>WZ3eO8KC2=S-7=IGvkG7^ zJ=9>o7&J;N2bD~-q&-&|vs#dR&p>aBIUtLF5Z=)aPmy3$`kZ_m z!1|=lqTGb0@{;80rRm>86^9+Rn34eVPU%+nW&Vi8Bw_zO3k|}f53@`vDU<3TnG~*w zRBt#i!qkuPc@gGDE1}6o(MuODj`mR4~O8mg;Vh4 z9{OAyVpbbljsk}jAUIjS@ILlON}h`BY?@dK!#vnuqp=8X?caOvTk||JEq=1wScU8e znqphdk`r412a}+I?oA9qf~156iK(6EV=7y;0X8#f&d)CNrY-~*iqmW@w9wY1V$#;v z@lw_SVLO4m0$n)Q`H(VGQuKq>F@J`wmaQ|WWOx^Jtld~9G87Wc;IZzv_-ftaJ^eo* zS8ZpkU?dSBC)A|s$C_%$2vgo;T+aHn13Pdyx0S2tOFjwMzHz{AA$0FF*_tZ9{;F_` zM`tmGreGuvo4t5v8pFfyr1Kd-?M%=Vd|6sxH1kp$NEK^%@&~i30;Dv8pmge=#hxkU)RL1>$=HZlBW0qbCkJiL8iD$B3@J(UwErMYgtHhLu3IPqlzz19;pWqL;B#4Q?#Zf<4$Lo^{ zXdiJ1A}f(-*nl@%%~jgA0E4n6L3JiSPFDV@F15O94YY`|Uyv1`WM(U>-fjr42#s*g zss_rTLr^2r{sSszypZswAfa*_j+FuQ8Hjs~0O~Q2j4Kbeqr{ ztA#Sz!X-l(#v0gDd(Y7g&@hk^^h(WKLN&mi`g%S$^SVA~RN;J8P z;tqrfy^_uchRofCpr2pw!w~R*&pMM<+-iXxAr^FIsgX%log{MNG!F^$Qs&KSiJ10rHD;60Ecc5lehU_1H@pkx>98C0>PUVpDmXO}>JhlY@J4i;9ND zXHNSkro!j=z)0aTkq#Q&IFnTUg&niyHX=zl=}YhG#y?UCkoKRlX^G4f+dr<|l}a$a z<@+tN6`|>HC9gWvjYM*x4kBJ5i$#%gUz0s`Fe3|z7-;(ei2;1+*z^)NoD60qk~u=q z?@bYRBLHxM>{r2Y0s3H-v`S54H^F}n4<4i=D=bEpH7cD$fw8}TBn^`xoi?-$JESArt`LR1UnB`|}1I{vaK|iSN1~>vpC_53;m+FRe`DcQP}|(_>xi zAu(}b703R4nvIMKr&ks>w{B0hjlf4SigcF9C2yDdT}#c2ttP74t8ly$!YI$a_Ub_; zP9@R}R>>_9Es&fjN$~gz_Rt13%=Hi_jv?ag_p!LIb?qHV^An(nis z?*;^hm1LQW)&Gl2=)=i?M{Xz;$+j5Y+o|6D!72q#7*e+BO>QhV1rw(b6K^*osc0)} zj50bV(ip3pE&uY;IGB+xDjxFHln@prQG!v|%+z8@NpgKF$b&(R=f08OM2k9!T&ZfO zzo|(^q5E#f!Eso=Un!#^r{5gsE+c>q2d`w~dpp4FdupW=M60+Z?o{6~eE&*J(Q>1` zF@;U*D&OC~H+d4SP&GGids{AOKK6!3)qbDPpc84DN8d&hHq|QY79O3V8X62UpFXaL zSmw_#RMXL;hg*8s&9&%ra6rF6;yfkM5zEM;isnd35(!#z_X>e*4={l*s}ssMsVz`< zOA^8P5?OTSvVp`ky3&b9zh@xBH>(_I4oP+%6`lCU1aceMS_VHQG(u$USY}(3B-_7; zikMJDGuVd(t0u$2w_I!wrE3G?`73=IR?h4nE{b!6>^b*GIMYKwVTQ-;G3?s~ zB`n))Ltrk27QEVvhCztpt*WTu)L&jCP|T3~g)l$I4iaB&IvbMsNb%*8K!!>}PF^pc zI2eM>?qv?3(7SgMLJ}xRNJ_r)03=#T=r#=>Um68j!qPKl)-s>!L*cV^rLHoKLMSPk zesoglE0;3Jm%Q$g=BQd7YfD{>?_ZKhUg zoRfY#DXN?B)t^Jg`XY6++*cJ5qjJPY`dmBVNwzjp@le%iti0)JUUYHQ9I0 zJHz*zz@&sAhdi}1tW)a|rsabg>?1PeCTda11dXT;S+E$9yLi@ThOwVlKTDt~`<{Z> zZ0A6J5kC}Msb^QJa%Ov$RCxx*k#t`5e93GLHi9{EA>vk*D_#7o7d9O0Mz1g)h}cE) zj9|v}qJvNcegtJri(_nQQHYTJyUN6M@0yuaO=!+|)J;<4TO+(ouWkZle^9rNNGfBM z@8toiqMgvgFgmcJ=f{_hbA>8&bBy1}$fDigRZ9`9WI7|kYxOFpcOV}{YA#z}pcIJ7 zs1Zt`KGX|egsn;1T6vFEis?Z9o}+3kB_C+61v0!BQ0FSizfj~c$;9u z%lG3VQoUoq?Xp}Xe#`!wF=%Ui>D2iFbGvSmCr@0E?X5)o;u-jA-OT8(lGdPH*i{q} zJ@}y28)%r))1Ab?sj_8P8HQB`@T)Jll5Sfo#59*x8VZ6~`Vz#&fL5|?JPfV{yk`vM zc1BEu(5SNKx|d&*eS@s0wl6Z6q`|nA0W;&<&Rlq%tUS>i=)dpnJO{YjOMOf;yVKcG ziLu}0lHwq{yWKntHcVBz14}MFFdH&=?*`t3s~q0fQ0vwuM&etQiYg)!P!6&C03jhv ztW#UYDT=^%R6O*hKt>(dnvA=Ds?_t=0j05D+b);A(xCbs&YYczb&Ek#Fv=paH2n`U z=pRXP>eX}>ytXneIY%5!2X>K8=;Rse@Y$yW8HDkv{?o>90#OBfMi)5(sP_ALHay<{ zeyhp_`yJSy|1xuuQ7CDsVqO_>zE|$o248=1&?KQF=iUSj%7j+&iJQGH{5XK1RcUOb55DK`x^T!!j6)`O!@$Fn8CbM$Vi`qo~@*#=Nq8CsTmaN zVFnUnT=P@azR>}~p;Q4|8p-K@I9gITtF&#;n3q`R{HBY23aPF!W*~5>`Oar3SzZM= zEvG{;>Tl_Zk=MR=$)bmj-ih~y+?AwZ4dmP*yJ?|(1xV{pcaEb+zORE zw}4eG6b%_8)PBVIUu2dl#|{;LvV9V$+_9zbUuk*9><(XKcTdv6mVn~vOA@RH(gZ^0 zF23+Cs5j(xhk4#L<*Q(kXzzM%{Mv0+o2k?Wq!qffqGY;3XZA zO3ZA=ow$X9z5FT8Fr+>+!-G4WZ>oacPN_@rJd0khrLobR^0F z4px<@1GS6G;osYHq&%z^HThX?2ZcBQ>_he$lD3AbG>WYB+3Ww_3O?-?ndDdy0k)x3 zE#e<?W>)TT`BEv+1p0a%mjfe?}^fo zO?wCfp@snO|1~UoK($QFl_Ejz^6CXL950lh#OOiyKMi#rkU^!}0H0`!i3{9rG^^3?MR~n1I?18ut}nO34uU`aTq$) z9^jNrUaYC6=WM4JGAwNdVpagsg&^t7anLY~mwIpdb-D;vc$P(l8FZh{_njo}P&^~q z7f#jsOXa#`2jP@Br_T4n9@yQZk^q7Xvor^MTWX(Bkbvkk(-mas+@3s;xBxw8+^Znv zG89`6rz|u_wKdIm(bvrEx?s>0+z0z_TPN(wh+`s{ zD@Ex9%#rc35uAl)e}@TcVgH2$+e%>~9O7@zdmng8-4E<|occ;HUt#s7cR?7Rvc-Cz zd0A9GI0e!+hw({mi?esY`C(<5L=niwru}HPJicu*Fd~@pek911CkaH7q)%g_%y*(= z!h+;*rHxHQ<9XAfQu5@*B0;Suc1Iug9JzF&MZgkVw#K(=>f-yI1`{mBDBPbF@iKWI zx4nrK4Jg+ER>)?5_QfSeC+!b@^Aceb{dn42{poQk-bs9k=v{u(0-<@Egn8%|{F3_mL0B^E zns7K8?j|+9fAA)&?HM~_62PY3C760oV#)>Ua;j-3>hZA&9DS{Mco5z*f(%2UcO=+W zn#A}^GJ7}16OQH413CKDQ>Q||DcF^OfayfOqAK9nj4M7jC)mTRdaB}#Tur6=`OVUCiSKO;lZ zf%dX;(k2_}9GBL=4d$uIdBtE>KH*>!Bxr$eph~Z8yx*;=U?e}*-)_75Aq0bp(xlK$ z2o^TrM{dy?_IYh@Wg#1!U?m~9&F9{=Zm{*QkZrCZ%3SCPuf*DY_iowhRJ8`#DdAlzT#)+J3+OrF6R zR;lM1%wQ#1t~y@@!UIw4xo+Gaq*nKwUOtC}7<}?f z&>WOnTTN%6wi0YR4@A|$?Bk6uB&J4Mb-~$z;fWCr_8t@4VQ|Ijh4DQlE2lT%(3CH- zLe&t(mXqB3jE4J|Y=^{Dy}RzJrmy~r=_^VpD?C!=ah(a){#-L=+3G+d6z(B15!;@b zL=6eFp)~m%X6(yAA1gurU)N?;QG^DWOzB@s5=-ie!y`wTMyMEQ0&Ncld|OpBWhgHxqgM8Mn*{6%!iZ>l2)t zav}0JPMvs|&NbsvM70(LO~}&`@^;bnx1Vg0A`v?g@VGQ)f|(LC8k&nB+Z#tk2Qg&3 ziI0%3Jg3bzXJVu=?!Z`wzRc?d@!Mi4_kYXY%IDJ2=2EnJ6N+bXwUymwY7*i~%xRZe z%c_W7-S>4pmazjPJhQ+@RlAcQ#itA}UkT#~wtut}X&UMHcA8zSf+X`++HzX}F!~Fn z^xE=pEMWKz?!9**(+ZQJlpb~v5*V3Sz@P>u^?&`(|N1vk*vpkh@Gre4Y68*gwcQi; z!!?m0?c7n-VRmYjAv2ZLcp`XEV9C;0`d^j>B(v;$?se*OWkDHtaHEs#e|{a)#RhF( zFj{hCXqge4)**%R(4E1SDq0*OWrkiBfwwLxDZhO9WslGFQa+dS~LE}aeJ-s?pSV$i;3maRRb*e(33?4}?lvqR?VKQ_)pT(^)PEznWlN=G# z+~b5{H)`wfywHwIWWYlU33$zi-t`~tZOyrNwGIcXvwry{Ir)`SC^?~irl-!f-(L(v zIKazr&$yJX^u4Qc5(FU+mU_>82I*w&?d@yYx`ZHF94SFy*K8$P2jCt}HJs3c7lqa+ z3A6ANSWafSkstaKc@;FKfg;(&U`>J&M zB=OXjy;ZR{i?c@bC%1Zm+G=c;b>0S-+|AALn!FQ}{HnO=+4wG;7^nVw8HK=0zwK>8 zIY@o#L*rVvQU=957{6KQ587!-zvintXEM(!bEg^toPV7&=K1ATIu&i^6f6hbK>;sy@2tq18!tC8&aE5f`QYC~rViROi zXrn~C*KE_!Sd{dv`7I5r36Y+ruc8l)TNyTNFNYPUxq;S9m+6w-HuHn z4?Jf=6=b(uh_J$YW!2})IZI3Dh!qEe>r&8B9}>n?de&{|OU4x%j#vb?)osHR^=(#PJr$%DO$IxpICNT2hLUMbQuE1yp(ziD-m0tB6mL|4ZO-O(385(_G5szu8Yx?2tOa7=xm=vtUzj^%pIGf8 z^==O*`=~a}_eVlltdcQCMSl*G1ddz6H;J z$x5abVnHBmPGfFHtpxa~H_^u}t5M8wQML3w^UtGv=i)H*{M|ATj?>TSzyIYw{f*aE zVaK6Z!-|?tHcjY8_T?uPa$>=To&sq7d@g`Nf>ia+DBhzZo3dU*M_Yz`&)7w#_pcy> zQXd63(OJc*Q5_f^+Lt-(Z)g01c5yu#X}EhfC8)hh>#xFDJcfw-N1j$8qJwtf;huvD zNvi`BD;qLjcE3In455E5S#oJOG<%A-n?nag1aq#sywl#*s6| zGP!VQ%*1-TATE&XbbuIi5+2&jY-6(GQuX98XL(W{V3mvfigg+$DoS+rwMgHX*;Tn#>bf4syEJC8GQXwqM3}HWISE!u3 zshccPvWX#a>F-X$;WlWT#aPa+Is1Kzf%~xFfdcNOYxZX|=@=$Co@hIw^H3$sWE1by z!Hb9%^NmtqYWsLzLcSzeKnLgXx}EBc+s-xW7L%+z<8uDeILHO?}v4h3OPTev!Pn~ZX#oPReQj|q@WkvEq-rPD{|8Y0nk<%t>W{+q7) zxd{p4GU+3>hybQKj2eB(X+=bSwOum2T%PD#hI+^wMae$KyL z3VfeGe!ce;Ch}eF$JfDr`aFHKX!SiO3qws|kSo>K^-`kUWUasH+)hu1Jv%;p+^oX- z-(TE}!VM?kh2NgBC28jKtG^y=L^yu1{2)^qc#2C9X1A4l0iPa0z^UFnRBuxWRXmY7 z{lmQ}#rQanWdM}#3R!8opQ^siQm;W79}RqE%t%MXy@|wCo`R0xjwM(}Y)1v^le1!k z@E3!9AM$l4X>>4ZH>tnpetEdx9dw|&Pa*(Nnp&xzka8nFhV;kV0bBo-0uR_S#A=Pi zH9A`cW_%lGZ?Uz9LhEW59P_z6b%Zl(eT%QdnJTy!v)+47md^@L4gv^9F@g-kQibtY z6lPGiO)0x{w$IX*LnZSZ$!ug`7M#Z9@JNrc-&J}$5GN>$Y-jv)h$D5$iKy@!m>EW+ z^n0_aLT2v%Tr$}*F^!Rj{zs!~A!{MxKQ2-3af#H2D=YV%BS+)V_7*XV;5`oG=Wp3U zJ4OWmB33T7x@isEXbR1QgugZX0V`bdJk77v`?Uh zQH*RtebN5clcT6i2$kgFS{*2rBQPanzr;#!B<|*CM2g&*78Wr|LDYqwMYYc$IQ_<2>Y4tM z=rC=UT%WDgp?(L8Go&=O2SvL}@^z|~m^W3KRKTBwK=`iNUelk4o)g_>aUTdDTW#(s zy`)z4x`rCL8SimO@i{G+FSQ*}J<;poFuw%!BP=$~K_?{_Ew-P|Y6yGf?6GB1gTql? zL)gFcb7(D2aw$dsA3f9Ne(fc^w}^G>i~TgfHmNZV`c{lhgmrL3z=B@&CkN4)0(sF*Dg} z=_*?S`=c`~bYR|%i3a_BM3t6Tp5aiplYVG6e-oBVZGkGQBQ+$=8D%`WQdI)@mMg~g z9_Bosr;_2(FJ-D-F~l0e^W0Uc=YtDJrg<<+RppO&^kOB8$azsuaG?H^4ErMFO?vFT zTqA}{5sLh4aowg+N>>zJc`Tl5p*&$7@y%wc&ieny*4ype);4KDRri?lS&dO?5@-T-vde)rd=dQo2uDYs<>Q6&>lrfbYo(Wc1cXx3)foy6Y@WItg*gb&JKFF(YCmq}d{=T*i$o$PT1fCH1ac`A33~F2P9!K26p)5YX*c!x zsAB*5#Z4=2d66J03vYSFzHW_u^sGAUKV|k_Zhd>FAkeEr((Mp=K;f_NHJ^ zzC?~%-swKEK$U`F&JbqPmxp@j!@9y;r6Wp*kkn7ru9nB8%D2EA&G%U*k% zEQWXXO|?3!1-i%rAa=;^ipj3PEnc>`(w^KsvmS zHeVA!aDZSyQo1oQ1fTJRf&R|EdDir<@fj*Y$tsQ+feH~g2Kw%U@_n)FLWS^ll3h); z7Plm=walK??^%}qyf;4~a4SJ6B|WMj9E35(2Dq?@f)k#)ui+)_av3=t6{#6)O%Sd` z(1Tcvs-AI3egCHB-VoRX`%=<}ksE4o!!h*VLqZeeLfFwwwk`)y`g5LFh*Ok^OUW@S z>Q3_=T+H%iZ~Zg9Ui86_VrzqEk8^9w!GWSSzdpCCOH~cVAQ)&!w7UtTBv~Heh!VB&N6%X9fV=F{} zva21m>rPg<#elP6f9LcAX&WG2DxNJC3%%W{zSfK~p&Gm>mV*k9(DUZf1`7Z2|4C2! zfyI)siKbXTfU8_7i&8qkeEnAm0%Z@GpV4#O{U)fT43)rd5<(I(V7~qjdn-&%z@O^V zG15s=TVOjKp5ISJqbe$k(f)BiT9!b26Cj~=scHG>NwV3`g}ydLT8ian--p^8_=syp z0`V;Op|koBX3m^~&SLCs0Cgsf0y&9brB@(&d=f_v@0ZGvsrObR7Ud)*RQ;2Y<3?I& z)hFYPlM=_b<8S}PKl>~3Kv<^p<%G+RQ{IK9$`JtmQHt$`U|nksi8H!MU3BK9R;^$H z&TxLI_weu_XgCApcUoszeVZ`!$Qv|0f9CZh0H0o8B`1~ScNd|OP2)zEhJdGL{3(n+ z^L{HJDwSqfmsqb%BuNoo6tB=h##MtQNC`{MwlqSZ5b;#|zOVBk(tw38z$R7F(ifmT z&tw2Am?%+72gQ=ZDrHlI?g_bkiA+SJC!{HIRSroY!hObcC5O-8KRsW$cpbe=fLnTaqv(J;FMG9snNzj2Hq_LYZ8+C-VjbMp; zXET=`rC{O&+6x)NJywzkRpx^6owT+`doa2uCz&(bb@4PUdbYxxJj-z+!+10~N6i81Y z@@}0!{x{AM60OVESkt>7q)v(1z?c|yp|8W2N<776FL45xeqE+~t4hB_K0A@O)A8Lv zqS)LDNUXg0FV`M17s2kZztQdPr~LNQOA9~ncTbY=r0T`-9}!7sgBXN+`rImD9txP> zAlb3NM`%(Du;ibMf-gZLpMxp))mwA}XH?{_{+z7oD5)M(1}RdTi$$*MqZSlTem?z5WXzEprr*pDn~po?G=;BO-gBttsNa~ zxgXT2a>wBwub6_knaL1RAE*Pr%3fDJ*u~fmnzuIBXq^}Ja@)yjadauR6rFB579v|U zs~EF&2exyte^6Ky0A(JLXk1kQ_K;%~Nh2l;>od|DH97(2vH@%T(w_C6(C7Lgea1bA zcxU)cOktm(WRH}zB~cC%l6a4nFcr*5XI5$Wije{E-@f7E{=TjNuMb1-_w^*4 zRYodOL35>h(dFmb#3)s_oc+$wT(^u)!AvPHKZiVy9Kwkp+xhSA8$K0`Jq{J2eXuFm zHN}2a!_1JX$YH4&S|pGf4?$AU&*D$8aa=x+D~HR0!vCE#!LEK@*Yxf#v0s>zKwS(K zYJ}Lx%844$>GMhFPk*D$Qe`oatpouY*0c`=vD6w)hSL`jCdg2-UhGjUE`<3hJAsqu zpK7Hc&x4(!b12x`QlOQ<4|o&%R-5ZT|61yk*Ij>M$%Y6@55o_|v8aoit!@ILY^WC^ zXfLvTkuPrSAI~*5dzrxu;NZ0~=}T6vo+jwcLtglitmxtEitkX8lGMRYJuBH8GT9w- z4$+2s-^ylE$Yk|Y8?WV)EspX<3>N|RlqyaNU0tdLqS!)1mA!HVG8X;O=)HT+Unpfm zx-F@Ugu?Bra%U?n4ZMMPR-B9ac1u@p(DVkd_JONJhr`Wc>CPG{@f0J0@o zLWA~@{%0ldRI}|+V(lI-VAeGna`jU4&6Vwzad-M@frSnnR8Fd?q=Xj0sCds1FG#9a z@lJX0fwYm#bN{`R?uv%+*Lv81r*h+;rHn;7%VZShJ#v%!<^Ioj&EV?orrNue zllps(bk0TAZ0a8E03`&#KCd-F)Z0r{HO&`dXWVLG*(*1RF%4jYpJCR8jWDJ$n)={C_?CoDnRv| zMJi+PykuKJRHFF_cy1iYV+iZ_z%`N{BgC7-Jo_PJ1tiC9H7}lZS9;oaj`0W*F_&c) z1nHZ#;>AwfRf76F+k8i z*xyf2E$AK4?^fQ4WTuqzST&vuUS9P&41c}%Id>pkG04Y|Kn2Fg-b|LmQ4w(!Nr@J< zga%re&n*d&xKg6;Du1r*%{r~He=Yb>6?~uk(o&}Wo%2R$)S}9XBN}1CaaxKsl73F2 z7$6Jc1U?wwmcONc{I@v1U6;B|jb_k8xgE2Gl&iXDe{+Lup~%EI+2LsdJS)!7SUNvPz|Tjfl2y0=~; z7Yd%D_`6XBXP(_I@n#vR5^1L{4q^A?3T(t8!3n{5%g+}2q92I~H%T!w#DP-P!BGw; zDFw+(Fo@wiu;=$=Mo;Cgm=k_#E0Ee4csUP`g#_8|VW^Kz8_r4am&D*%7=w63*}1ge zG^q%^yrornYKzTaKLX;$B6{_E(Rbl&JA9PME@cCBEHqp3>!Gqf6)eZpvpnZ;Z4qvg zOYEQM-yb`e)ck_H$N-~HAQBFfS3fxhjHX-&m_|3GhOdIODb*@MXX9@*-( zc*)j4ggQp}3hbm#N-stY2galy{P!23f5aHJ3vLL!y;HYFT%h3ma^w(&mR_BZ9BLZa zPA#6~@hDd5++Azl4U#VGP3L;l(rGo~*Po3IK_xy)SpMrknj3wJ0qmD|^%PZytx&d74zY)T&v+&HFet@wDyjx2U*NcM<64Lae%I-zt5i zc-D3*sZz$+J>zli(;E3e459(Q?Jbb_X{x=Kk@VVQ1R%+)3h$(#BZ8WEOPA%Dz*(m868T_#*Zon#>16*-{5um8XkNt8Q&)X2bo< z!X9!8Q*E3eMBtDWRfld@BwRk}3`t{mAiIixAJ902C!{gZ)md-=ydiOB`(zw?`SfL{ z9Qgq)@%FT%nF)iL(FO`Bs=|#h#{^W8EHo#;UJEPXmk3uWWZ<2;ddo0nOk+GG*0E-jlLYA@ z!bBn%jr6OX`7I6P=b;<&*qAh~fg`l@+{&y|*MX{&KA0>%0Vvuht#hOCBX_YZr#VqxwcDLz3iGQM^^Iasbfbt6 zs4rQzH@Fa0zB~oVNN4#K`dUwR7)2nrg|ILW$D#h_^xiYa|F}}uSrO7n-_O;aYRQDr z6>2UxF*Oj)0!nIm(pFGV#jD>H9{T|@Vj&imjJYJSOC>eCH=qxktM;O$>qZG;>@5_+ zXfLUv3TGNsy51KtO?&5%k{AErCy2I85%r`U-v~P{)?_hIg?rriqKZ)r+Ro-xsrO&`LO)tC zIorG%Qo-{F1y?LjjBV}P4VGp_Kj!|J*1V0*2RX&!R&ZfCMUjq}5vh!OSFPs}`!)c% zEL4A*$mjJMz9ke&`#o>2pFuyXHIT``LnacRZ?7)n30EP;^OK>+%oo*M9#j-P1|jlV zgFOrEa_rF+4TM=dVZ0bL#yebl6=y$-N04;qKl8k%A!Sz-Vz!b|jdQ?61cES|NwrBh z>Q;=ys?hjAa`!Ehgv=ku5z{MTfF|UttRD83+if^RHd9Hw0V- z}_dukG2OSPoqO$+AB?Di0_7lnlm5k9k8WxiQwf~ z?M`Yi`bn=!Es5ZkzT3aDi2B|p=cQV+99i8?M%iaqznOELKs^=RQ#SPA$T9Da{t%w2 zU4#g^Y?mrB^ZW(be=hY;I+LdT@7}@5c*Nh+sEJ9!(-(X$VZSj6T%P^H0@U~!w01Ck zY4w{jB}$PoR6=SE8De-wFy;{G`i9`rwcl1%{ZeM=p+zJJa>|55VzOEGx7ovLBj}fN zdNe28KOhmu)xnO^Dl+Pr9a5+N!Ahzj6P--_b6ABWOR&d&Rm?&Mz$}{-#HFmgav;uP z5W5+;?w@uAR+=01Z0|<~?mnH~0v+t-nky+k$nT;nRdRt(8QIVhyd~!a1AG4^vFP0$qnwTV9h9!?lt)NaVQ?m!f?v9+QqRdYOQK#c`gnimbyxN} z8E(7YV?55hzC{$$9#c4YeuX?tF{&TDE{&CB-IXah4*i`!rMaBRqziq=7XIJ@@>Fn3 z{=R@xfftHNfFdW`X7Gb^@{$D;gf-hp@|m1_KMCvx{(zl{hh{DuIFB!A(_p@=r z7qWfrGEPB;_}iP30>!=0amA4 zA`>Gp=h=IqnQL;^6+ibpZp9_lEF>Bp)-n8JWUR+mbW(qo}fC7PFbBMj}h4-&6yE^M*=a1xNT$^!Y%N&+$E1>Ud8l zXS_Z83sZ3=`p^z-kLNjGjr8&!&jM0FhdHFONOD}bxl9mvve(L)+5iUv_Aiq&5{lc$ zn5tg&PqY}@C#=uwbP@z6X%(kO(B4xo=E38-xbTI6+afTmS4a?KPqw_TS|S~^SDz>! zE%>jyBNa}G zwznn+-fLCg&;76e`9Je31s+`XR{!9E{gs8{-wkms4CjULz{lMz4ewVF46(`TE@zpB z4Gt7(h8EQz2t$Z5tLQRsG4z+L&HWVJk63(qHomqySbF9%W_6+tDT6-yS`M3pZ;;!j zja!i6?ZJZ1L`ji%Ju^GY(d!;a|CBI^vNiPF7W*gd?DOJhkU+G(#61jEEfd}vR{E{S z!_YAPP8&40VR@NDnGAw=p}c|5ao0eRTSl3p6_QZNL&F{$XG$N0AB!8k(iype{458c z$@Az5vDA|9zJ^R~pOM@k4ZQBNMW|8*ger`1rW`uQqq&}PvJn#mISQm1P{8dIbZ^lK zBO;{=(_3n+6(^`sZxS+ozpw!k%6I@6E9kJxo;UOn~vGzs(6#BnRpohFUfnQaFF(^$k;94*4xSRXcnNG#} zAq~mbPH-1=X=Zu~h+z^HL{NZiY?HLCq_zo2>OYO z6%Yc=YY!b^77@((;5Io&YhOQtS@SB$EEn-pFBxqJGn;C3*)!wjaJlmHW;FT4a2CHS z&Av;cL;e}P5+`*__6CgPB^y>kG(^?0+n81uegsf7Qe405L8WQ$I&XoB{)Xm{J5FS# z0aW@EkAF!BN*0}>cbAA+szQ|nJWwnE>DDUB_+U!s*yyp$3lbNhlV!GO#~0h)eD-i$ z-+$av&phAsM6kEoI-{ZFS-hmb`4@iYcMnxspNC1B2xVW|-}}ekC%)8JxDSuXRH=;f z$2)s??Hcij{;|ICLsd8WDji_tgk(h6AY!>a^*LZbc6JLek$TO$?w6PDacjMp4u|?b znsH4-DGd?fhtC>$H9?D7ZAhvke#;2}A0BooJ2x6J@jw_v@wia`cB>}Z8RheS<2{f-Iy~%q9daPt9FbhgKF^fyw) zjpvX-locdT2g!(sW?N$%vUwOHA8qxLd0nX@VYmWx{(Xjayc0LW_gw1G_8lU?tXZnA zRxZ`emhKOUHUo;6H+aXzFUXtn2{0%2x0m@NNVpuFc`i8J_fQ6aXL*%p&L?2fG4sqy z&NZDxRS8d0a=hZBSDN?sBqmIrg|-L`f;FW*6~qQ2Ui71ngFDKZJd~b4dK2iMeWasd?yM}?i{QETNDcWF<UW#q`=CFZ?-pSA;4oT7Ed5TuPV0dU)CNezZC z+GL`JJWz$7`(KmjQEu)hm&-HiQd)A)J+JFg#u;Lw_nz; z&87c_G^ofwsf^0Q_vJ$(iz~f_wuD zu*Uv3m9Qp2t1{4vp&?)a2qFW-#Q0+QSn_m zEc$cK>TqVA6C*V_t{sP}XC+C2!D%8Mn(xLQ+u4%7eD+@ro?^ih2sqW9~V^6xH1#ph&O;qe;6 z!b(hv&yE$vu|~m%g5>)IPq^ zskAXZG}@$8BKcgvsK=ihs!vvV9^(r_r_{Dqt3$^V=*;e;!s=7cjn;;naR58qgDO75 z2>-Wq%QyF8uX)a{fQ3f=!d7_!MtG7z4@Yu&+6&LgG%`MMQ3gJ$@|>hR!_yBn)w@5( z-)~=VN$BBV&oqTLC0EapaB)m!BsRDs1-(&9%m*YDIk&x30O$1dT>0eql+KwRUQ8Pl z{VB0*tGuo-XYFSawjF!ZyB%9wvN!p_{yFMumR4sn9^lzskV9P_i5&GN`OMUKoBoW` z2%1m!ZO@-MNT?l_Wot`soLlPK*9ZqaMDlU9S}{DJkgDTM9)w2!Xm_(v0V-p+y-gM~ z1xCa#?QPnH@ymI5w_#j7;Lnw19KGv+=LH7iAg*Z&j{ospO;EM{A30`^{%q!*gr@`G z;sgfHM3qYO{PFh6jUl5`nW;$sj>T=yW-?Ej>n%Q!#?PfQVa4SQPXK-}e3Ce=wR&#%PVeKu&;HdCzNlf51~R6&|1`YdJ9^ z=p^mbIYFS+OZy=PWq-zJZ?obyUO2(c(W|6`)SHRj<3bO;pcl1mlT3Zf(S_b6!=s+1 zt5jsXhVChrND&Z#z)HL27{P%5@w~fcDQ4uwcfUdzt(I7X5g)^^rAls|pE7iesK^jY z&{{u7ObNa#EUsBwLR@C&H#|5-HdKK#dHJZ2Ljo?c)%b9Ja&)+W?`vBw7D{g)h`E;< zwDVqDM6>w#l_I7R=~~lTQH=6;2=9)8K$(=$CKi(`he!5a=-8mG-XzZ-2kcI@Oendb z5>&{BGT2VpY-_=TP*jwZZGH8t-23+p2?`zZ zqN|JkzKaOJ*!UrC#NruAFICwZJ>2per9`fO9s2!L;c$qru(wD)dKpBGi~o)@mda=GQ#u;? zksrmS%|l;Ga8v~{;4zrz?x3hMg3l-WK23;4!l|4ex8OpBXT5B1%ZU}<377SN|0EB@ z=g2|#-lQjiC3K)1P*F1l(Sk#y&7dE{-NW9M2YVEf{&tn0Pd|^BNS?BS^*S{_5agp^ zC6h*O>a{=0yC7Yj5QYLn)fjnSh*^<#_Lr!J#yIAvDOXKxVM>A^+v z$berO7vdqxaL@I%zkaX#mn7hFiGv2_;l&1`OKwTA2*3#gA|%~6)-VT0cXE1CI_#rH zWurXQ-{#QzfzSL&b)H_t05esfO;--OHI64yoDaW2f%H8vPCsw;Q1N1^nnQp@% zF$!hD&2aVz2knE^PT2_I)Kzf>4)Rtx!&N;vwaG0xvrAS^Quj-5!eil3({Onyd0^kN zKGOHNz4nrmb38FDqcwz{b1bE^05~kgDI;r`a2%PPpIbF{3b3oNU;=pyr{1keU{8=F z_n;@Q(m0!f)0f7u+U7j7U3aaGB+0OI#m$}gdF>GaVU-e7Z3B$}bjQt8BpVL#tB!ko z%uz;B@EiAs~p0bnQA6JVvbU1bs1*|r2 zZ!swQIYLqf=xLg^BeZ&*h1DcgD1}Wt3;%P)y*O zM4Fo`)_sJzq%kt9A6sN*wv$1@_1hW1XE;}TOJKtel8laiK%xmqVS*w+cO z{XcyF_divlIxuP9y>^2FJMC-am?ICwaWKeRTh}wE4mHkf)mO%BA$!eq)|!2m zkOOC%J7|0F=PqwLVpvKYj-(U9A%Cg=iL8n*wOTR9^P>G3AAMV8UcBaz`LdtHKGREl zyYlrbQR~lj^#kLNo0xZ%wqV5+tiwLVOy|aGW%iyERChCU@v~qnGW1OJb=CInC(0$H zNOe3g8u7`=*uv^%VqBz2dhE5bsv6ztv{a?rO?trPKKQknxVe&?eqxO1JAOvXt1M+_ zP2ISXYyei+%gV%xuSiyTM$&md?xReuQm@QpM$J90NunM?MCkBMv=R!{Z2*iDT?klK z-TGFA98SdKke+w7ZOK&5>Bl^>zLmk0%0b6{`#Pdb@h<@5B7H{73hzWp7F@ z&|c!4wa-XOeB(Gq#j5{4bO&@_m`ISlUHjhk+?RF{#~1Ak_WzAOsFr4w=A}8U zBda0@=OyB>7|g0db4HhxoO?^(Fst1*^cvS-9*uc(w7xVx*##gM!HD?P1=agph$&xM zcmZlXRkrwRsqTkADf?RLyf-TGV!_3GkAc&}9HxCMmQ`EMj4r89CnsH_7}Ni2vA*?y8fX5 z{e9X0GL%Ko!BVK4iAO4klL33EV&0q&p3KIFRIJey6qz<2&K)LtOW%~#EY0lU0~l^v z-ma`Plv}6_f{L7p2p*m}!*`p_*q`;|!O^dN^qPN$gFmlrrfz;k^_RI47NoIUk9{~%e3*=3vIj~i{ z9`0Ai4S_%-`xg-s4p>P!?nTm(AoG}Sp=23V`=|YT+fD#IG6#j|K;P4sO55)}OqKkw zH=M^WO0|uKv=gF~L4ml)nPNbzci%C*=+a48ade=h;*=WO5JO$|b;;iNE-1D#0n`Q( z;-oAuN8x9?^8;ui!4{Lb)_)W5}lX-1K7 zGvFs?#2SC8L;bEp8Fd%BTB2T;4&YjumSm{9MK(_2`s4DS&-Hssb~!|@Dx%L47P|9g zpep>{?2BKr2s`UjLJWO9Elrk!=t9+#PgdWHR+f=!n-(d#p+IHllf5ZBlj0Da_ZDLk z*(k4jpeN6@4FtI8lopw+I_8igbf3m>qS%9U(i}%%F5`_vFS1ybn>TB`6;5gw4idd0CCveS? z8Y$BKv{81&r&c$TLI-oQ{u?B+(Ps-%Zosc#9gGxbI ztO6(-*^y@M!wV{q_Gd1ShnN9grI9-&poZ`{39#)~q8B9`Q>zlL+^mN1>zHbr5#EG# zE$@iWWg1iQ#XV9NN=DDRWaRV(vNvmp;~hQ~pI52+SfikYwh9=gbjl@#sB-W=X>a9< z9ZYuy!{ua;Y+d#TsjYn@3{DPV!$=m!ftEaMeYRY_Pu7F*Z=LwdlMANJ8M%oWr;^|e z1w?=X$eEG?6vLBX5(&G7ZL#{gE94q5&m4_4mALxxDW_geEEsg*QR-VgV2$}TSqiM| zZ=RJF%}60;ZXFhcBzS9lud=rak2JAJIB0Jvdn<~=N;4UZQf-5+#7WN?N@+~q$Oq_46;nR_T+S`-{l~L+Z@DY4@AC{n zyZEXlXp?)M%P^Fn9uO8ni@l9zWU7)lD+owZ0`L{3Oh(bgUP;+Y!8CmF+aL;0s>iaUsZX%3{TGVLir_4J`khiC8L zuNWYxTl|F-OF!>QV;J;#Z-erjz8xH%pNN$?S6A5WY&lP727@xiJ=^Q|DOg&`B=;is zpKBy3sNH*nD?z<4j@8)y$%J)aDf$#t9QT?x+7|}BzYfkC@2YzxC%(5w!qDDH@-pdte5uOss;hm-!Q_x-q3o7HYUabcvRO+0xE!X?ZeiPp|14F(p?5`l42`>O1V)c5 z>lVk}?%>ZP&=_c+FUXmWb0?a^e`+?%_O`bxt&%d`2t7c=!y{p(0f2+=wX_%kN?1+? zJ*M*wU3(_kBB^$gu-UF+yZfgMA0#FT+$)%E73wpm?ya@3TQltc(zJ#NNP6v^bF>Vb+O&)>z!kEXp*wRS(TKR+f7>cxz=DkV{n!2wr+lsd*g@EARtIEmyh$(#{RljwVCQC$iuXfaT54bFgX>TcGIj7j zH=RI3PR+D?xW8-`b^*%9t#OOdE<3*z+Jr!Iqwgsb*SfxKXN-fa)m!LKB#ksJ?f_>S z5^zY2WT7lMe6p1|F#(Bp@HiF&IxF&DzpYqvyc9nXIQQneUJpOL4uz{AhW?0h_y(x1rwk62Yvfvky(ePC&e9 zga`_&a}k4Wo zFY<`H3&Fr7n4td%(6D-s3|3U++mrZ8sN?;Q&ED=zeQ040t5G2rg4luFbZAj7=A;2Jv$w^w^ms0`c2V{I^A@PphhUbDNL~GN^A>yM|VDplI}7-u;vGbif!s zd=SfL>uH(`DF*HLb#3*V8E7xXsl;eV89rY=GQ}(unI@lGKc}t3pX_r=XhX@tbKP^x z;mUrTvF;@yCc*Y90_d87%BopG$p3A!U@u(nMW*|BvJg9Zl^r48pU4vy*|~opesNn9pjVaKI0vy!uxpAYuIF>U76GMWz;%#_3{p*aV^litpM8D{cF@9+KN*NNXz#p1oh!Q9Zv(Cpu}zIm?; z1*owVV2mJzg7l?|ZGt_L3PQ1Fw(~4p+w=bprdvVr-MKdJof}CJGZOAoz<*GDgcEt)r(lJa{Kux4fS~L^93q*~Kz) zE6_=MzrqN>qEzlM!$C;Dt~HUtGAO6^)_5j)y*EX0p)nw^FfD?L4A(OVEX#Z##e& z#l^dKh%y-cq5|z-cEY5f@AurwkyP7#9RrC_T}QB&NH$88`Bz@rGGb_B-_9aE#>Aeo z#1VR5ZTgr*{Jp>SAN-f^2l$u!V-1U_62Z%YY6(~Bi8VdrNy&`6{37}EbRa}Pa<(tW z$TF6Y5k=+~AQ7q@6d_HG31BW+L@64P`@4ov;G~o>^?}hOL=9(whJjw0zy@vk=ywsf zBV^ViApmOgc6RAiYHhPPU|lUFgUPko3yUPN$vt4bt2pI!cz`I7-|r7SzeO1;F-%LB z@62~Z_WQtI3YmBpBIi@hE2iA$eX>eO{s9bE%3M+$BK)NcyGdxN{mr<~t%_RE92Ala zPo*wW_5OikWhhHoM!EIa9QvnCT((=ykuN)?S|F43X+wgdc{l#7Uz0jeEwV!x}_{ff1P?= zBoHnH0rEhkl=sv@@{GEjcCMTIfP_&QqEIvQZuHDJ5deQ_UF9VuPre}QAxcY(SLyt$Qe1Riuz#thL+F^#xF)&1r?IRRN!$G z0uCAno#GgTGfpgVZ(%Y80Z{hOVoi^Cz))1*UYzzfy7t&DT+GR(@6j5gfei@$56Mf?A`&&_ywXTm1+ zECx4Lu&Rz+(JWLXYN9M>$4i!!GI=`vZ&huNRHn8J{m!-@`VXFZEF@>r#6I~U(ol~H za6C>ek-hBOnKq!s|EHn#$pUIJXdZ`tB!X}E9 zvNj*#A)X)ARmw*{)t?m$9qa8pZnk-xmiz~T4J#a;=Mb{MgiZyblCwkhZ{(t%LI=DT z%Ije(mlJ0C0*ohz+Fk1A-p-aIgJlE_FZ|RW0?B|6qf(tnjY+$@%y zOlwFG2uyPp5v78v{j~UNmA9ZD$#c|)H$fJVc(BR;Y5&fT!Gury6OB{JKb#7P$gWYx+kfNG}Hfy$XL@ms$7sp$d~ zcga>=7ycL-WI&Vz^HR^2BTD?cOK1SlNuVjJv^6ON0hmeVQupR!@pWnBOOXMR!^ezH z#lDGZW%)%;e7sS}zwzgP=U3Q6yZ6W`GNriZt4g7v2c5OlZTf%=rX-U<`wDy%I1$!t+rwQK*l8-;iW*A1D(fnY`>nbD!+RkwBHy0>&IS*=%FGsiX%zvb9EY6VFK3j5F>; z=vXn+!*MG^AsJ=g3@Zhd;LYw=KkKFB@vKoxicfpfaS89kT}lFI|J2OpdnVZh8^{2a|}ew3a&&gOc;3lP{5Va+aVdca2@M=mP;wq{>nS>y15l znCi2$_n0KI`JE9l1V>^Kp+WLt;*Ss-k9;l7cUyKgM2=H@4{tGwVnE_3q*G;*kf>(1 zh2r>SBoj(Q=P7$5`AXm5!1B;|rE+lfqxT?$_xe8N$g+PEyL8;RbS1dm4O223KAG%j zy^AfB_Q<={q5gH)CJe(@jPFkOrPMNX>qskR=_t5V!OLpoi}&OixG&9nX9=g)v<=P! z?Qxr|mfr04>u*jL7#ddN(bpmC&G_*&wULRt5Cyb%Dy6VVd&}c*|Ha?=m7rHp!#Byj zz6i>FDJyvQMKqegH^h34PR`uLe!)MUR zaywohgx`LD@1Hz$v+7s6icD<^brG!0S^@ynqCtU=-i;n7om=VwN2P0NI&+9X*fLUq z!Uu4P>+Z$p@(qV{EJ9ugn4@^)@EMg{t~Cw&3!_Y zF$(G92+xC;F*2Nmb5CnhGQjCGn`;t0ihJmS@7_1= zrGFn!_mb}oL6{E0RwwMo`~JS(Gdw}NKfROnQ~eNY-5<*{%ELoR1#L?RGcF0$-|WG2 z+n}zcpTg5N$n!aZPkoI`uxGG+#WYmT6zA3S>k6*MTQVpGH}HW;VxjA0mfJ5*-!5kf zNT(r~MWUDBt(0nt2BGPw#Rh~j$w?ZA#{*m?^(+0??>yn35Pru0w!@|RgXn3WgkSMp zoy~Lx)IWngv|Qa8T)PE!WIn`@VWx>8?t1l*I!{eQA4@&Zv3}OR|pYO-n7wNdS_J4oIh7Xfk#HO8LSZq*;>^o|kc+ z_cMkoy(ltJLgP4Qa%Xxnk}y18r>gs^n*E){U;yOOz2&p6$XRcX51UamID>Rg5kw-P z`8;%?#3T)^si)Sz2qkShOYjg%!K1_tz`(9RCjK2>BV|%=A%Jftnq;GgS`-m%6$d#E zZT}#q(5HNkuyNP+ru1YxvxOOBlKc9ZaibOuww0vpWSl7Y|C(3=r@Lz&S%2rDFh{(F zOkXERtO!YP!eb*Q<^V5=&WzbA6EQvUCBoO<_o!Ku57nB%_49R2(lrK#v6WDtX5VBn z?a~#w4?A*;D&|cS=6uV*7ssICXr}M`}JEPcwalr$76zc z>bvY~ykz|vq6Q6RLBsh9F)c&Qn?Zm&D1p4P=m+{);qa3PLV@>U*+`;ai}wnR2T15@-{}S&76bWTu z8hMd!am>P$ZUw7SguxZr(kUN@S9^_Jh-h_nB5=vl`A%LU-0V%M-fwADyMng8eH}Ua z<4R%(=jY8%&zJ=)@v^40^3L6b0FrtVjW3l;{R_lUeF&0_MBo|(a{=Fo8k?@eW>6vCFqe9ozgHo}=_|N+y zN-9;o$O(RqE$?@`O|pBE>0ClXaE-adl21?Zn)4l0(Du3eM9@6DNrZ`fja2 z8nMT)lKbG-y4mlK6pEL_BHwCtguqq&8O1@onkGP)YisxDp{whc%5D_9Dr!iMKm)$z zD78}GJt0ae7nw#eSZ_b$)q z0k*2-(u&Q9*+IE~?wg}gp$s(`D6M!@$m}%%2fJ*9y}#{CTC>WcJ2b44KWaF>hww29 zrB#ltaI^J{XwyVOmi=C$7rH4z!2KCA_WD|B<+utr4z! zHXc3pr+RMeyml2$cvF>9al1|@ScjhFVltemZ2q2wM-sPLBU@v+{R#vYw9mGa=|%y* zqX9ZH{ko*@36Y)ID{`-GQB9RoF<$6tOQM<(TD zOky(#NGGF6CWB+7B1{4yOd0cv}<9J6ogH98S#zh zY|-C_!pGuxY6%>m8@0W0F;UE-khZt0I3WaN0!ahmZ1~0ga_s@#k{PsG2+v*J@_AmE z?i5#5n#O5(nl;t}?9j^z;x6$^S?4``w*v+z=!Gz+vQWa&rL8Vo`(FW%{F8t9&;Rc~ z_*pNK#6EhNf=Uf#ceREu=V%0kzO(c_-6OEb1K}Q$GAvt2NEVgbHUNVAWr7a>{KdYn zQ#pn%(1Ewliz5p4{w{nHykY1Pnph2F`9LLO^&5=fRrI zfF4P7vap6wg4udQX1+*QlyBuZE3rCLneg(ztxP2ttjbYo28oV>C4ka!HDtGGj`X%A zRb}DP7R-lhd}*`F5hKWRi+avoj=UY%*Rmt0mwgGp^>bC+<|Z^b6d@6bU92?tR9*(c zjE)T0$KN7rUYrYJy25IxG+`G%P?^=XLe(kZpZ=IW1K*ZJlJo2;`ck8B38I*Z5|&Zm z5_8VCkrrYy{j|x2AX)88z44b&8$N@se%TTs?n7JMk=hh{$VTfD_BdL+WJ%W zOLX?s!cyxtx!4BDHMY!cj`b)+g3Q)|{77%Kt5aFoq50QCHoI69WIEA#{~VGLEit(5 zjSZl$c8xYLAa7EyZw_UB601*x8zAT~K#W}36bNKi@&zjFL3k*0`6pa z0$`)lU_x*J4|Pq2%s)?0y=RPQ1sy(@28!rmpCu`f;haTq>k;+5`CTWKz~C6p z?X5LZbj$ADz%j{PLPu8er*w3kMfbn9F+H`7r>Ot}LVXsrs*UH(s%coqwuaSRKL~Gm z1Sc76Y5K07{rr*45gy@p5}oi?ElOYF`8esq7PB7vn^koil|4b)ho%-((@0!|hxgi( zBr)?5xeKaLom@yOoO_*BIpc z7*=%QcRH5wnI;i^u+WQJSBnT8pV2=*K*Npp6 zBY@~vKZ75F94@j5h|Z)~vPs99{?Y~YFmpIyqy6YD#o9-ly-mt}KBckUpU|sRAqYYU z8*bxkahhMKRkxCmL?PfUB8Lp_6qaBELL**Lo+iNOI6E;UdJ-hF;!|)HDl6>;MLAA7 z^h101hNoyk%{LZ4^zc@}+4E2DU@17hgcAmIAFtpqQ&9UwmyrUbBGV z$HTa(mzhXRiE2p5d6Lf^!ME?=#l!^9gCn!_8Q0jO`tQsd*-lkDiPg7i{YbD%_8@&~ zJ^%C^v+__+%`76Awep_ze+Y$9QtM7l2vPfm5K;MmL8S2Y{)ulQb{cn6f%RB9J*iT^ zt@O5b#jKhmL(IJ$-h}7R*iIQTF%D#Z!!GKpLb~$(0Kw4`xy6~hn83mQ581LBo52J6 zKFQ67C`WV!k^k&}_+S68-$w#)?%(cPe30-EYBOQxP?ely?y%3&{fGTf0Rvc#m_)ML zso6cVh4b%ytLcC^5Q^$9^L5Zfj4{y!y22JB@9M`gm12QTpVU6(VLXe$VHlK5LRiDo z$e7LIvj|^_=#;H$Lx{Mc@z?`vrZW3Qt=7o`^?u=j+`CcxrI_gGg{p^ks-L9sCvnt9tbZyhNyZ5h~8Q4|xiTDlj|ZhK)}%1)>$Cj{8|c zDsuyp0x@x0c9KVFhvtDf*E~FogA99Ad?Y6ANd|QOM3&-{XAsc>0x!d{=ig)Va6`^!iZ4W@UJewI5pE%L4XJUY)mJ108?*Sr(_(hQmX}Q-N zsZv(Wci@n{g%A{*S-MRAK6(GzAOuJKNG{Llg6x!@rR)+jpqTr9BddLG!Ri%z89_<* z?~-*1ihKYvXCPH>?!Iub<;Fz>Cn-?*$GreW2_&{MxpY}<(=0NDKB%QR=kIX)PYDT- zj^Mq3yp>Ke+4g#*H!J1m@|a?f-gq9<`z<1u$tCyplgJ?4Q#CpOluCrF2yt{mW2Gnz zyyo@Ly3QD*M4(YX?En9*^Q2X~)OuG^8W|3xOsZ(ZDM{QIs42|C&k1`=_JNiNIX{H@ z$KL3tM&fl61^R3znN^erCDeVeFO1~vOQ_sg?D>lHhiiXrkwb%<@V1`!Qox0DCfWsv z7m6QTtkGBF1wegg(m0=$q!d;+Vs*nRBbAsRPkYm0&-;w|UdvQS$R6i69 z+#hKtgro_dFKDRmjC(#=k?gu>s&)S}qLvjF^H5LMj=o|NlvKHuS|(rEHbu{11OkD6 zZ>|i)vseuob^z>UM;$Dl=tYYuDt``WHgCd`ISN%0DM;!;OYB4Xtdp42bKbEHG(W}*HO3m2H_EFNJv1@dn6Q|#cBy?qe^c1r_+7OjJ3 z%sZvyE5tij1;(GB;2qj6OSff9AQ{6dRf6j{X_EE75>e-iHZ=f!r28ffgDeiK<>^78)HZbh`Mf2oB)=O4B= zE^iUEN(Ob^e)+KmCi?MsXgd=mx0%W)0=;uhdb6}KvU_;I4M zP&8xgL}swctfrL@Y<3M_bU zVoMS-RX|^wiMNCor1RJmDn@h|>ndl&tSRvT4pnthvC#r)hyQ5O#Q*c(|BHY1PaKGs z;3t1>m9>UL4f}h%A@s9!9w0WnUp_~E=xbKF)zPLU=S!z7Xi*tHdjZLnX31Vdn$0Ov zg_Mmr?oj3RbMxr@@-9cMtIQn2*)EmhtnwHm5! zm6nl-tVN{;+wMIsqbYOG86pD?*{4k31U z5~%u)ChxR z0sB)x^q3v18VOJ2LXsj$;>9knP>vvn16RD5C<)F53U|qay%7++$s2y=7|_L?(#fq% z*VyUOMH8Q3d|x!Uz7{2lNQ&yW-k;q;wju-#|B))fA zl?kGUI2}SB9i(yhW&f$_8@5yI6?4jks8K(spJc|PwbULABXG(BoeMHau|PVz5w#eySjDBe39G%B_+r~TmB!c`oDE;Ol*j`xA{MB8gB+@<)Y zeF0SYTV7tm>j!z5sNb}*fDGx{Wd{1@P^5xXd7Vj=GA>CcS-_$14?9@p0LjToG0Dm1#mps)zk|#g zXbyK$lnQMF{%Q$O+18Smvy3B-cv999Ndw;`t7ax#$jCdGeUU^|N=8a8RlxJl6_ zUPT^uli{R7COJwAAcO))k017PwY&n^@tIz2njet#M9-y1Rs(An^^o6{5gdP4eM=%Z zDyA`(xCv(>m_o<|XDPk#p2bhG_X(vy_(`d2h>h?(?!=^&Xo5FaZSNejT=H3cZJeiG z@O^#aJQx^ZIYw4sBvXdfx7fbI$l%7537Pdo`S|$C!{8wzv_*w5eengt*`-ZZycPz0 zrk-j+r1H86>>C$i>6Y z95KZw+et~kxfPFPa(HHvQzZu>NlAavrz4i~oK@atuD`j+2xM^d#j_&7`!qR-bt6xE zJDM+P^jZms0j1P#CcDiQ&Z!-;{Zn52ZAG9%l{lHBTzHUxi}DY@*7Kiz2I5W_MyD7b zO;EZY}^degh2e=3lIr1JKb8TeG?XeXyOpqc3lmF(YS&RHu1fPcxvkN z{L4v^HCe-??C<@8D6GaAN;w{f@ilQt@{QrYEl8MEW@Zx~9)Lp+&scjNbrffC34;D? zM0cA3i3AQ9;Jvzg)PgScIW&egTJ}8fso>pftcn3qeNZ`&x;A$)sd7*vwyOJSL|>Tf z`T2sp!To^gRx6WpsuZ~*O9gb?51C?l-2G{(j4|n=E;(O3kP;<3{gcNuLcGj=Q_@h_ zCLqye8|8`6e}wl-Q+UCHBe}ak@Bd`Mz+il77b|~8$}Z%!0n_uQD37a@f?w2-z3%jv8K}VOz@9}9T(;Ov?Xa4%2OIN^)&b; zeD_RsmOMFE|6M?C`q+W15SFQbpXvVIwNhgoHwjI_+Uj9F)WITwoQkJ-7vc+W*KYx` zrIcNA!90**i20CoCC(h-eEx?HHG|=CvwYS6p5d@`9B*>r7sy{N`f;#;Ws)iTf&az3 zC8>{MNNa*1X<~iGF-p_qGF}2#CH52nQe$ZrpykB?a;a?YFH}z)=L>Vhdwb;OLz#=^ zhyJ@PE6HUI+~+;^_D)oxC6P||h*YX|q_fFHWtW)0LCIl7CK4=J^uYe5JD`%75|S>q z6i#qAWM~Hg;MB;HOMBZti>4)_J+6T~3VP-P{eC7zxkPS7LTD=w**@P%pOL3paWnQR z!ID6m=}Ho$OSu$%OrIT1;MljCx&!N!C)uv{)dxl_Y1Hna>|*KUXfh(d=+J6$Eg=!_ zQs)2e>kv~}DdLPaQ|v9KAK)UdWzt=_rC}pVmHsD5Hf6{7z1?HR zM-deg@rpb-R@>kH*~OKYuS?=5$s`%f?SRmTV8^%ef%Y_@yP)H;vZySEhe zIZxjiKkS_ZrZjVZqtc%CjhxT-l_ag$AEdep-R z7JZbGz2HOcV8@mV&#t6d17yOHOaw|or;0WbmZAt*F$?R|+!RM$MAjOJa&eLGQbDq* zaAcpQY$xvxKEs*)oxRb)`vRkPtTkcELc+ZA4mZLc~nHFWDzN&Lza+spSW> zHwl~2U8(1f!~_AVUCy`WZ~6^^Z7#u<2&oJv^Z-f~aEJ>u8r`X+RxQNk;7{MXd`1=# zCHhPRY)x#VkXOO34QeUTrchh}Uh-0ADO9y+a|a_Q&x0O(QCA;@&Ylfy{dz%K%)CWA zV8{FpcWmryVKWDH3Qo0SkI)Wy4-W_tMgo^6wUNit&(KSb(4J9x*Z%5ajpYKj7~fcf zjZeSW>`x1c3yOqydy2vQyfb7P3rC}htW;D_%c&;&T-u_#<4G!>1FSDj_0PlYr4h~D2 z>HC!s5^kYhEXQojSQg2P@@>gXKZ@C~7r!5}Q#gXSNjIC2sv#(jgb5{jEW+I(kL{lO zGSxIHKBBJ@0r!sa?~8tBj4}x1&`Q6_qalGMe<3JhoPp>B>-GB9%x$Q0?XP}AVuFSD z^mzEQ7Xz=nKUAyDltyGAbJVQ1cY>4Gpp7;@ z%z8ax7CHXo+?r#;DY_o3l5j9S;>mKzOQgNm`y`CPb69;XGKn6jKv43^a%Jfqy)^%&ea!fhe(tdQ*d+MK{@GqqRZoaj zPl*oWTPhk$kFRI5!A}XcllrfKP`db86wBcM2v;+J^ttID7P%3h{~&>^)Oo_FoC%3b zV?`ZgIV!oq%Q)rN$R~l3;Q5}KHDcQ{#(*>?1T?VEsh@4=&B2GbmJX~y6x7IU%46JH z=p0)NOfWg-LqNR0LwLwA%oyQp^ZvaS@QB~|^}h1oK8FBd5(LYB%{?w> z2HwEIKAK=^L6^8zs!D}NCNONT46uu`#`?GBw7nY@xr%X(;)o98SdAv}r3&*~v%snz z@^&X_a+YdwwwIRsF6qNW0!V*0NeO(m6y4{@msMQ|rx?mHj7xg`6EJGw+bHP?);P3A zP{otX(I*LgX`vptLoFoWEQWxiZz=9H;bj&Sq{ZKPM;BY@F#higlPtKFR$hBCP^Rt< zkdF8ImLBk8rUnB`YXi~Ym36%PcQ9utlp%`MARueT{gBd^+Xmo9G;8!#R0Fa!fQlIR z_;1Vkyl& z+t;G()2-)!nF zl!sL<1q#+b`pqExU;p+0@OPIW&Qvzbgb5dq*;Fdj5H8Z_M+(YGRic2XRFaYbsi3If zlOz(AGw-}4z_CTZXj{?neaHX-gnmgFLO%<~??nYIyXzIOKh@m1i}x z2a$zPj}m8OYtB(nI{V6~N=b%Tf`XpxSJvq8DnTI|J)~rW1kv*{ll>E^D+rfNjjAc% z#g~Ww*t^nXpchUay*om>h#3$ZS=7aCKyY|3JwHRR=k`8tzN?RMqP1mg z{ePU@Gx(D9`IKh4v+d?)7)lk3Ti?z1f2o~gH96X&=9e#3+HOtLi+qqVUtr;pfY2)3N6wvc!(j;6`?l&iCL^oO#`Q+Ot4p&7hr|EYRWq@0);>gI^ zCpkXsn=5CXHLvGYX(HJa&wVvMa2-$%P{5G!Bd+6`6ve8fA0jhU z_D8gyJ8G6^D^r+lI^M{`dZvuM_pg8b5B|6R&WAQ-k=Tu zKGRj8gt;bwUP}8jBuYSH6T06Q@k$&L?uw3iC@-;JPl=3h)Jvy^i3c1|zu1OL9K@0O zGMIB*O*LNsLsEJ$T6q9Db=(vRf`0d83#Z-}TQ=XUdPua2d)MLdq?+oGrNG_b6JLQd3 z6~kZH=oMbAR)QgM@n!9A%TkuEg-MkWmJMMzjG(A;#qZm;#8Kd>ET2xC7*dG$Itj>kapseHQnT{P4ATg+@KSMf{(onY=8{8t2U zv}7KOOIJFD`4XDIS|Gyzr;5+%+@*DS)Z#|4D7mlz5MV}X%C?gQLI`nTCaPd;(S-hs z%e$nJL`ZfplO!5e=WGY`G2kpedCISg)dQ-&^e78W=KcQR6D(QU$sw^PA_;8K@ew}o zZlHCI-gOh;ek@8=QYw~qrLlb5fofZBed;bw+hHT}U^c7m<%S&#of^{XQ-_4f;g-D- zO%UE#WS(1+Hjyyc7@o15 zuk9_v#BL!6w4bg0(wbB#LeR+q>+t|Q55K+CBT=iRtg5KQEyRKrgGZ2Ncz(Y4Wkk1V zgK8D^t$H6qiA&fh2z%|kNe+)`vOvajV^k!pK2VX2BH=MNfJ%;0*p)OZD9dv_>MlQe3 z(v^{mDfntnD}hv^Taxm~k7ebBelMX&=`{l$DsOecAL;avmvIp-nZvKXshGWtol8cz zD`i7aDKnbDst>)ty2k{i`UF9lves``wW?NK-LfhK5`X|#5&+P(AQ4mmpB~}9wW^6) zY!eW1jhqpl$p|1kWRYsNI|S<&`{$Y?58KO6j=15u0%B!C0pP;$yyiXWE%{<;pL{{- z_kkYW1CFme>Q=Pl)EqXUS`t6=5I4p909=ts9~p@NV>W|;#P;EE7RWeTFn$RcQ>B{s z$k8c@pC^PP3A@7w5bZ98B|BXfA<7ZT>-`Rm8#2%?pknP?zJwxeiarEq>g|#$ODRY^dVWPoz+~M*iYj)0Ch8A7FL8yTjm^;1ThL)>PeVaXPT{){{7Pm zl?YVJd44ZYS$&6xo4nz^Yl&FJ8(Ml6*o3!8V8a=d1gvN#uonSzs5lWKmYN6QQ7z6s z!;j0uMo_)+Zo$xD+b`xC(I;FblBeXhvD#Xp8s9i{#){W@CH5d}!qg$}?s|vl z3JYSdEd4f03O_?X3L80~=S}I6RLoqI-3{9>m6w(>yCyim`QiJdv5JGC4NZCg%))Wg z4ASTkIP+m|0Mk1l=|~Q)oSCu{#Vn$o!qz4e4SJVK{6F{y|Kk7rC;c=3&0qcZ|MJ(@ zzxBVrzxS^YNMZCrgT36F<^Tj4n0q$ffIxw`!F~g!8dC&?<>OD;x*CXNhR6wT&ZZ(j zHSTQ@(xn0wv!Lyz0))V~)MQkZU6`>woHwy0r!ve{HQ_;U1&|0fl+z@}t{VEb0Uc#( z?l@FE(P`TGrfQb$`cAo@DxtL2?tyJagy}8n&Z>uoq+}2kVd5~idKKjYFY&%ayx6xx z=Q0QD|N0j@9Yjo!C}^vqoI`S?j4Q`3sHhQ`XAhf0hh{n*daI_cfCcSGvR7G3kpJcC9LH|at|(o3qu(AZkQ0ik*5*~RzkyK#+j8i zIQ6jEgH&Qg2((0o!*h}$fi+HhOJP-^{4Jei`I!^>BTV{rux?e7o9vZ_v7_Qy4hLXt zM`HRaI3>neY_dG{m$1fT622sktvyCu9~^oR(gfG|+(EZm#y%Kg;cwlgV=;Bg`Nc4GLfZ1=2Kd;rXKE!p*0RQ2{_> zBq5wV{%L>a-+c$+^Le~0;r*AGg_Y^+=W&48{y&PT(9a`wW9HzISa|*HeWrehDtp(!#G==knw(t5ag{TnfD&t z(99bXd!LQ4YYiDGw>K^OK4}~;);*V6cc}`BL^OQ9*1)wW0Qcr3nBR-5EEOI*;Q9Il zcjbpTJ@zZBujb?e&-Eompmx5}r7gefO@ff3Ee-WzWh;VBsd?kcfQJ4LRBU*bbVhJy zV3KMai>{n!fg<<4HOrIDL`L@58@0YoJfXeuJv$=@LgM#91P+0@69$ind1o@qc_*Cw zM)&Y>HiRNvQnPb!(JjsV3+ z!({LK;x!!f)1UTM6hZPBZw zvIOd(^#=@VSs9e?{T{Mlc<#JaLEB_SHXL?835=%^g+7yl>@j^GxxB74A>FW)i?@;f zyslyM#k^Y*VqRK+feOdX?wNkITxSSM<##IW;pj${a!#TNg+lm3&fZK{ri%lNgYmCxScm>q(jn6?sB@q?`p_g9C%l zhLe1u86sdZa9z{lq(1-}LfZ%j?{dv6kp8x}J!3BY!)Sq#RXM;=|r>%dP9a$b?Q;lSD>S zd#Gty6zZ|<*(-+kT9bVbHez#OvOerKri;PPS5m64HTu5L>4g1N)Z|67Z6V7I36?des6bEUp@cQsMZ>L>mUB{JPf;NsgK36 zOjP8e3AA6Dx-Phh*nZfEZu3@By@lHQTJZyf^muQ8SKrT(8m`<~8|i?)JgG^eE-pn^ zOck9#nItzh{o^B!zw#=YmIx4rd}>Y z#m$23+j(g+*)JGL5 z%Me|VHOSWvCN|Eyh(_BLK8an-TrJv3vpiUYs1HTRzYi+lZmlouv)#yri~tAorLkc4 z5o7y2uxmqN#1J_=)|grvpVkg$HcoO5v%(Vhp)YBkI~*gg#Oigu#if70pNGhIAdwkX z2hnwFZ6|y z-047YCZ(%DX-YFw`6ZsId0xY2V2~l?+mv$gmapZCtH=l;hdH1 zA0i^CdA8N5`rRpE35flx5GZ@ox_u9VklHK=o?O6z#T%@mljBdt%8Aw6u{b}kgifS1 zJeM!DHHxVOTPn6CwiJZqIJV;ai*(CZNQAGGwXS$6CCTLL5(0P%-apO0mLG2C|IB;W zI6hP`x9&TM{*b`v-;ZL|f0ixPeu)Gt8Jv^`DGJhEn6|eCzi?ppF3}_xOC(PssR{0W zj$j*y3~eS98;W^{plNM{s`6?;tTW7@T6T{yNel<$R3Ji8gbN)v+1o9;LgXzkBb-8j zxe&)Id8LvVckqWT9BebGc2MG~Ix9E}v%Bv=qk9SeMWdY^&mRYW6t?x@C5LOhw6i=&GHJmm{^t zOZ+EYf6P&4rXAWJysl}crYQUjl3@2L@kzl>;v#Sx&}M&Fh(mZy-`9*Vq^c}t%?Fr_ z1?KT#=)e~i%JSkD*(x$-;xo9^G)itl2*)g1y^Z3Xhu(3dTO>1wo^rgw${~%4P*++H z;K*T<2M-XhlI;zW@)rAQY->bL&s*;{=!|?{t{}d1p-}7jU5l+ue=;M&QjGZCmBTC1k9|Ot5JLF0x8*lB&Jn-X^g7?@ z8RyXDD4n3V!noAfRL?mdUi>b@;k}3M&9=h8or^s~7a{4Rgg@uMJ&${w-GWAkK3iRh zsc2t9*J)E*Ds&2#Be&Z^FL7S?^0zk5{>x)k^FzH-g?sEg_sG z-oxj3&iK^u2rtOTCH|48h54Z7@j>oSzPibUxB)4F&mmXcXKiLkrrMyi8QTi9FZT z!|a`iCd2O#+@cLoDdpo3*-6zDVKN0oyzo;Z7=+1~_zUQo=ZxwJL>WmaCuf57GJ^>P zS8xdlOaVliFo_&3!^^0esAiU8_x2fbbwFN6@29bYACt-tULZy+g@^~1Z zuZ1l_ft)@~=QZ!`L9Uc_UE$h+uT73h0iXoqmz@%-kU5t=ZOy9#K-m>C0i^+c+NSsVJO@M16jOW zqZwwRqqXp31V8kU^gisz2$1+u!>gxv7}vWjn?ru z-hsG()Y67_-sKE=-?E3rUU3OBgC?mm&agXd-qRPMY;npOW}SqOwx*24`R-A^(TR*yC& zg!t!GUEos*!}FI(O#K~T^LZR!xq?}8O3HDwB|1>ajUI$zVb@Bermt~KLbB#SxjK-2 zD6`}e`Ti;Qfl$F^xN@7B^A=wk={eL|=z#3qw>HK-Z;q%0?^+5oB_zUuAs86g zOQJrLV43ONYR#l7h8*W%ugHWA!I2px*SzILyv1#h2^yB_^z-w(#>{H^J!%t86coM? zFm&C_qWAO`Q8CF|u>|nGgOq$79S1YYFfxI^pwj)1$$kdOk-fzl2((=J+TK`sCAZ<|Xb!Q<0vm4q zgf^Bj(_R>Rdmh@wl;NadNw!q(oz9a%oQ&U4@HMA{iJ@(iDtcUzN&9C~wfB+g`{__s z{j!2O+~3TY0LBVe3q@$lzhQ4FTj2h6ooPHyEoAXCD8KJe7I^#lzDh8QxIdT(x6PiC;xmvA*UJybi1TLzH_&VA#D7e~q| zm$DX1Ip&RwgdSQOBYGLF5F_>*{wib*!*iu%(rHB+EfAtd!fg9_5C>R-4bj{4V+f6rVI3hGQr>@> z8bi@RKyEtQYT{mJMghrCRyiYE5{6)3SlK#yUPLuQc+(B5wOkt(Pw*XrgZ@QjA#Zb< z7D9cbGzxH%s^h%1Na{K)ODbbrmLUhPP=RnaV(w@0%&3Y`k9@{>iWMnmubpUag@sUH zdCFBI2rmk@Z&S#`5WZ9eg);tcUOIkb$+(tE!uM&!dfSQuqB}uhVE4_ zDsn_-nCuz|yA#@54MD5F$M%2f z?d{v%BxA}mgQA4*7H}b@Tg8~>{n*7t`5hLu$!Tw8-GI*WDU_oc$M!$=9%?Hj1amm& z!`xIWH<$X>C|4X5IKv>QA{qQKadJt?Eff&H#9sHg?s?`OPt!&zKGjXeGDSFwYE^gM zIL^tHzUIemiJ=5TXeq@@_-xTx@REZCm9fIYdt8uOEYfw339CkBR&tw~)#}*3Pjg|y zN3C!7Tk2?~ropB7gu-GGMP(uz$HA|sEeEEUwm=yAr-n&UWk=cSX9%kZpH108KW;Xd2 zJ2PY!a&5Q9Ij5|QxTGow3AxK;AB+lY$-B84C21<1rSrJvFKV@5Kg`g#9^I0jv8e4i zOw-PE`!D?@sR-9q?zzx|Q_ zN%qr@G^c{@KRu-v-8S2!3-@#Q z=CTo0nxzxWRw5Gv79m3Fv_g+l08C&oQw`HJ1o+j&e)j9;IZ1`90)Tp%{g`p!_EPgzHXC zc3r+NeBe*2$pM{!lHQ_S$?u`2qwk~EJhdpeWhoThIl`r7JhWk*W4_CmEc!q~%u{1> zCEGp-S~Y#=x`}OUao%tND_<_R*kux8U&bDL^SB<(m6z$5x9#zW^6Zy_CeMRY3BHgQ z3B^G~YgK(%q?h_!n`3BOh>gZWS7|`|u{hQRK9=U7^bN?e(XYWwC+F2tS3Qs>U2iD! zDOINYe=-cyXHb`pB&!xeuBTRQvLYS&{j95E=nKwh>Y_5WQHQYZT}f+`6P0+fh2Aq*N&@y&!M1x&Er`^Cit8qrAR*&DdS2EVv*{DAXUNphaEu&_&I^yXMkMe#TJ@mXnb+LEo{QP3 zAZaasfKm^<3B)%NgT2<`Nb63@S$U>7a{lLv4b_pEb#bE_ z;40)ADB2@XRAZVzgCIf0x18SmQYs`uUZ~(r!uJx%DOSm5Zkwd2-P}-y(t9*(nea(^ zr6zmAGDB1j7577iOsE{*rWHEr4kHmAU^BgCs60cQf}o013gD=)Hf5Ejb5Z410H1An z-D0`=Ix)Slm1GiKG?XdLYAj9w!{3WM(vr5O>M_W_j3twWu8nJC?i-w^{AX#bi;2vm z<+6g6Vc7LC$@i4;B!Ek0-AjR7MHP-qU;iJSXIc6;{caS<*p{Qn2W&iID#cCY%7Qs5 z6)v2N>%-p6;Kt7B;A&ck_HHlchu8g7|BSz;#kxdkR+VE+YYXuMKzzZa4>c2$&yP27N$Gs zxY_6DKmiMtn?rH1Ef7PD=@0oj_)mq$fjLwCNkMA}0^Hi6zCwhuN@T=>UidOpMJ6*) z!3h~2y4KAkg!lV-ytC`2J(@Vorv@Tq=on#g-&EsMc<~LDT2ZAhY0LRa`KoS6w6qLh zSvHR;5DvKhL-3f4R}0FyXG9vth6B^HwZ-707u*Mg!Fk<=jw1?kn6|oE8gDamX4b&K zf~WG(R;WJkKaP+6s#w)`_n*|imD{G-v8uc)4>1!lqQITB3>v}?k@&pG)dxh^hf@g? zvSP+RX49;W!4^iV)PbdRl#_bQPSomE#3_;^Z)-tu>f2PMZ5B|=f>j{fU<)|i=g0^;XfhPmakGe%Mr|K%Vk zhmm*RRTaGugdft*`^dz})Xo^yto{S(Gl##Eq#r(WW!>yyu5?BJQC++Do%cHm&YBmp z`wJCEKUb1v)GNsuJ=9nls*So7I~Sjc8T~*bp6rR&p`LjL$(%%P7My$KN7Y}lf2E

}Q(l2f%fB&VWl&+Z*LAM$@4v8+hZ7zeCf1G~EB?fSijO zFs!_MOE1j=VmyCBodJ1?)`c=}0*Ead*GE>-anFd!5kovzSTx2jG^!bkm;pHt3d@&_ z_y2yn7lPVIr*ZlUQUdVMVhtH2!L0b^k&<6!>jDY$x{y@+eUUJ}J*0dWskG-|!j}cL zCKw^^g|@{#<6Clcyb1L(*c(uNtDN^+8#FrZHJG?y)h7&zTz>w*<>l>j#z&Z>4I)0y z^rO?*Y*8X&tQ#aEl}I3g!1jDg*$9+CW+C59rgMqu#v*dDn2%(@q`E(vo&4`b<>D*( z@_v^29)(rE8^%Y!LAmN}&!w~|FW0m>sp{0JH&HTlC%uteLGgkLyrKV{ps}Q@BQavz5KRNi)h&fe7Cp0k?mEeqYL$ ztf6qxtJY{$D_Wn`AA#F9;WKD&j$A|GG{cOqG;t9I$GuFoKjdpEJSw(_*cag9qIuk} ztKh@|tR{0Hsj-6&B2!izABgKMp08zlS08F%?$%|>=Hhyz*=&jVykWC9nXx?t`QAh_n6J7%ovm*h znmX8vbf8&OxEWc@mWJB0s5n2ccj>$#iwf;2eQGj z!&%bR)`T!SCc|--49>N|F^A0H-6EXkpJ@NED=1aA(SFbac?X5l>LtMEY4|&4?` z2mL%pI%2*|>e2b7Ccm7`2;RvvD)7oSSe}zK8;O=D!-`fD{6pgtbTLYoKM8%hPQTZ0 zw>aL8w&b_E$*D54nruxzMuq zba-X=!^9m=1h|esgiEoMi?e%PTKp5^oAKQW@g)!NKklQvDc%VVpPvGr1D-oU9cG8UKr3~6 zpzOje&@dbL?ewXX(IL)f>52;GoUc1*hG$bQ?=WgJPIFgCFsCh<-WsF_*aIr7&+=Q6 zZo#f~jdl?=Jbu6pJxB;#i-@2ht+N3StB|=TVYPk(nhxv=*rlRfAsYM&bAoPLbojNY zq`>)o(GdDK1fGs#7I5?Fa?7mX4xxk7_TFOi`1oc}2FM*N)KQ>=m=&R-V96p0$?oQU zO0DWeEvd$IA}7|cksmBkG$F+pfJ1N{;O$P}h?SD`TJ!}$G5!gKE|PAfzC3)USs;*Z z{TLqwDM@u5+{@WR`zrt(t0Ba6c%%XJX%bX6^3I0MF-j-mcV0b}F+X+jnSs?fJu3`zndveqSZt*AJQtBnwxE zGYbFeOWg2cOfK`&$&K-$>csH=y*C|&+P=uqBi=y3dnA`3%hS1Vzfc(NG;5dFMphs2 zcs-s2Zl}wMyf6q=yT@QmYby#WDFLhFwoI{FdIe?DJy=!STdwf2DBt`Gm6Pa}fR$ZZFJ2j)uu~ZYUAOZtsMujAW&BrPy&AQ_Jg%RqPzGx|m`GRi7C9 zq_GLbZdE9#*Z7pTm@P5m3dktnQ`m}9I zP?~m22|7NLEd;``SU3RP^I#?2vj&fatO1m#ASxO@%KG0B3I!umTNyPsa?7B9j5R^- zrU!C2qKho$7}1H6N0LspqoO4bhbmEHx5Me|^d@t)d=6=U5)YsLm&3PXcwnvI>iw`) z?N4VcMqer%$fv4V8=qmz5($N(A1*iYXH4_u^~;gBy>l0H?*L5V=si#xV&x=7han&Z zn3z<-%1Ij2-WN};8$IL>7^=nJm#VX;C)2AE$>w**-hbG3V=8&kx@2s8`$P=x8Y?&N zpG_w(TANA^4Xq`XXN#p>Xwl%F^5Y&OkuLc&Jre?-flH*bhqN8{EYw>w_%S?V2rD0i zNb(H%n_Mdd3RF(xKpsgfopj3_Rb3dRhx|14LZD(iW_H=SdMuTiV6c=-eBK-0ZC6K% z72Do8o?uPvu~!NajeU2-mya8Z7K2bLTY5U}E;EmZ>GyToEN6yXUC~NtizgLO_umvK z$4!>N%{%a1$&Q-?R#UtZxT#<5PkFb%>UFt7XIkvKeQ@3$W)cQUbii3Du)WaYR^&S& z&Vf{?oIn)|rqh|+7qt;9nTtE_4{f9T2e(W11$upnqS+NopHVw> z(O`9C^jf{i)D?vT?OojlyUS*e1Os8K1+Mh#>~`mJ-DcCu(fqPbbH}pAB-Q}IF6DaR zJc-ry5}e8o27iWD-E+|XFn1&OEAaHOR!rgb zQ8a*Piy=zgeS%I6m^n0HgCX1=H>;7H=}P7k7SPj{WD0T4%$tkDok?1nUz*r%@3J}^ z0h2i&f-{aLpB)M$?K^jPeVjcV+7ivCe}$7;IN{$IYfuTosv~U>!1j1tHn}=-5OO$u zz|9cLq&XZ>sV~j6AaRRuop5Q7tx^QW+!giZ;>MC$FVrfQdY8>*F3?*ZrvDKGQX0e9 zl*S)p@|nQxB(U-Zs0XNlWPp`Nzg|-OR9dm(NMu5+19&P^IAD+W388YN%i*_sOdZwI ziBh$QBHLc?-@Cd2HfOAmw;H0^YG@-B3jZ&?r3}~o7IywroHvFq!H~jaHtU_r9XyN) zzkuZrBJe$lv^5d%@&WzZF7Eau{8=HDOr(A1cKW<-U)Nz@sw4%4AZHf6C}`m_PM6iyPqBLooLIH|lV|DTYQ7AyWG;yeI|9epeo+whGU%@7Tdk zvLm7Q;f@w%+XR(uZv$Dz_E0}i(%o8JWko0Ee5eK`y+AbR{tntbXi*TJKqsVP^Ut{g z^gIOTNH^1-KO{*_@>}}ZiX%Zq=j-GYjN}kU;^_m~QT7xz4AaaOwoeN@Icqu@-%dxd zOh)4qv3T=;Y5y+h-$zb>RQ?6+pMK_k1=1HjgH(Q!-q@@L={=_22$pCOUJL`93;CmU zGbzjGOLvsZ*KC6B!X?BNY`^W*6=hZ8NtEH>6Ol)<1%quxxv{BI+0>}4v=~qZ>&?^U z#_8qqrrzSTRiFQ^Gh$1J98tS1O4hj|Hhb9R4BLc9N`(h9`DGWcS%2YhKJysbwvT1< zaFN!UihH@>^!plxe4ihFEi`=a`@|rwTQ8gt_R`ruLDww>91>u%kIs-z zKoMd`%b&%6aTk0moAZ_27hZtK3S~=BzXi@4!4o=TU7hEjSH*LNe7&I6Uc3`3BEL#2 zAi;X!-Ua_jc&hpFOb+?uCj4i1b24>fDlrU(+azVdmxzP@{LpMF zc@!1}_znUdS=PUzV$dpgE&l@M7TShFI&(!fmC9U!zvbY6^Lmy>_#e0`l-geEcS7&! zx58c?LUa$*)wpo#{`q4qITvX}#hid<{V*!*TDm4E9>joiYhpAs;UEL?)DA|mJ8}uhkibj8^ieAN7K3alhViGNJTEaOffB>l?m*x1JHjGtJY3$*|75lpvyz! z338p}HKB62)8X^_x~rwXmMS>hw&6$9IaDF!npJ#Ch_51gsxQo?zd?%f|i>#aGL7Pm^lkbes zxy-J8Ti;H{2Ks`RNPbUc@4Zx7prs0td@+B#SlXDzNdX(EPH)d2k8XO`WP0^E$9D#qLOgI!&YqnwGjn>ok9!UK4ZMIak8tsyPz2-#>zHs^==yTjwxaoHE z&t@07j}h=l!6_0m>;zsBCy`wd(1leeB{bU@peWQ**(7-+k>jlaQ@^WG4s%YosT$;W z>?m$s{vD8y-bJPV;WWzNOp)H)8*+wtg9|7W~IuN@G{x^t8z% z2`4nVsNiP5DC8mtrwyS;!PiG^|js_`WFywUyo?5C#$*iR81iSi9ntvbCqn?gS4p$KBL?4g|`EE}LbO-=^m) zfzeFOTe}-x9`gyVyW!W&XrLO?+x(j>wyq6u*PHX+N=0EwLL}=IYLmNR51awFzCpYL zw4b7O68snzjsg#nG9Pi{Z7{~JOfr&!+hA4))~?_SYR(W1+PvNS+V6yUcw)3u!^fOK zw^JYbxOa zP-_A$nRZ8V)fk^jBb8_1`n7EmmB}LB7it*O%O0~KJ zm22|}G4x7(WwnM{bnTH4YO07D0+c9|KrnB~jH?!Zfbr+c>4*yVd>Uh~%)b>Kbn3Zq zH&KnPn3+{7y~OR)ULrZlW^@OOwW61PUOIaYf6B6^s;Mo?nEu0HY zu5uQV;YcK$$~$!0PE#Zq(do3YWgE-omFe_!sj_i6268evcNC)x|4ePGF4LWGdF$2W%z1Zo-SZwA^OyQ< z+fQJWEpo&bFPQ>kh#qmpks@$6!`Q037L0e-bTl@0C<3ESL?fYP5wd^Y(Esj@hK8dP zbo|ELCEPBU7iQC?{j5l(FL523tT$XjA{+{*?FWVq*;A2dns{z~w}%L^NZPhjz8LL> zhbK!+KX3GzJy*l+XY6jYU~k;vdHdTv4th7*v&)#$AYkWT%$)+9;7&G*6ODi{p-hkU zfQ33gg1~(io^Zb+lbeDE;z%Z*oGyO>UEvqBvcuZj<~ySFoqd z(VEW}x#k+Q$V-_xsL6miVJ+bO4aNMlwv+fqKoyPz&Oe97n}m8=W8DBHn;R@z?WJfO zHy_>(9@voVNsUp@bqMHk1C8djIHQ%0Qc8Q-U63g=%w(f@X+FLtA-3jE2>Jp70 z*P-^tBEAm21}wAD-3|6!TxYF7pNUJwyQ~%xhc~+1`B*1f>D_Y;#2>O3zXB^A>nb&H z(t*+$UYr4smDA8@D$QBZEXSR+-IMfINYqCg;Xcd1EyxB!xPmIW1qK}w0saOBm7z++ zq<1)6o%KSW6rCSuyLS zM`ZI}ub6lHusCD0V#a$G4*irkSCmT_XO`p=$O5T?QXv@HqRs5~1G1loY`Dw1KrVrR z@S?djo=jOcE+Us6%@y3Ukm^R>JIwt7#)gWBwt2T@TtpEtFE_&|@X1agm#}mN&1NB` z$iYBHW?quU;?5?N1o@tvjaitk`5jUQb`Y(^!2AQP#K8OmIBqf=vce+#SPQP+L}PMB zy5m^(81ok_d;Fw$Lv0Ksj)%5u(024QjX}X@j6o4Q9f$2$c=3>9JN6jvSQww?Y`H%I z{4TnakCAS$j_@2YeVdQQL^07QpNq!&cc3DcPRi;HZj+=DK^ma^OYa#;znAl50^a4} zk>O>db&t2h{_R&|@kufrN|=n!`v-fc&g_}E{Hs>0UdX`12L@vnB3R+9{VVZUWYnK6 zI{rPD-`GESs1Gp2>{c)L6*;5&vNEHJck79n)?*?ZDK$YUfH^Cq0B{7vuPGd4Grng6 z)es6h7SNvm!m9w)l%z-Ts>zBohuCWkW&hBAl3n_ZhM9BEMY@Vu0CpJf5U~I_jbl=* zzs%sOm*_gM{M1+E{M5^spMv%bj#UFJZ*@!wS6gNH??gDw^w9o4Esh(b{m|$=g?~YW z-wi*pK4g;ChxB6X8`c?%fqJOcYA=|iW*o$OTeTvR;?(Lc3n$cEC}IlvG_z+UQz5j& zLs9|BdVD>0eI+X-h1ul~!3lssj3Zno?MNrKg#3Zf5mr*NG8puSE*(hn#@gma2g=Rf zxe0iG@dVQ)VvQKyhcE7DywYXyYj2SY$+eM`!4bsA{k9FGnFp8M!u_`%j+%KphT#6& zP)y)FH{6(tZ2O`nSj=>4omNxScL7*>iQd5H)+%nnZG`Sy_n)Pa#IlXJA`!@~6(P5l zB$!*nYDr=4^MEf_!osWVDxf4_2NVw=M1S z5_dZ2>w$+|y}q?rm9stMFIFR~Bk{b!6HRT`&rCL!b(lMs<>69xlesIB2pT#&yBv0_ zB^(GwY&Ms}(5?3r;FSs!Qq%yN2=m}=nh3QaI%#t4jvU_Al3kJ>IuIGFv7ERMlO2!} zSL!0NyT0!2vrd*7Hle$`6^2tu#0J6Z#q05aX#38T=;x z3j3XAhCzRgx5r-uJd;8TV%usL#Z0Wdt$0x^GQlM5ZQz%uA?vCOWvfAWtfG`A0kh5* zGsg9%n6Q+CfyDrJ zw$wg*hi(UpHPFjm_k9f2K3(05xp#}!j^q_BS?eHeUTzSq-s0j_4@$e2bT47$NI?P` z@1PZIzSgQO6dK9`yTi!RhcWmimf6k1i_wt@ya5#KdezI6M<9~|pT+nl@W^+mG!y-J z`217)ISloWPdj{%3jgTS57=8mTqpMcj zc9$0HY%HXI*K$7mq_vh<5qawWqwYK4?5N7VXXduOWp2NBW^S38+k4sGdv-TH*-bCI zDH~ErLJA2Xp(P|h0xCgKKy08WprD{A)e4B9Qp5(Rhynr%z9@)f_xqojdw1`K1bKa5 zzu)(5GIz?Id(Ly7^PH!h=R8M_caGmiuep86H2SyEaQ~Rxx0qqZ)?_mDr-60P_-sUE zl6-wiR8a%6ENe<0c%t)$>M`^o9qSb%P#@V9!ICE5^Up^N#XP+~S1jhnUi~g_xAWhn z-Q@00xemr}xQ-5Ghw8D+F&=w6SXVE-9g9b!FfC~kd4WjQM=4B2khuqOkRhSbY|x@ zHq6gDlaimyCgYK4JX>?^`c;?B%FNq2(6?iGI2(^f;#|z*kwkm2Yare-m`)G2gs1oU z`Lr0S0jxC`$z-<$tWBLnp$F=*1t zm?W_Q*f5|zUEX>jEeq9kZtsOz1hvxR?|=_~SRDtb71FFx(Nk1c7#a?K2j^5x2}uM; zBoisP?~y{v;&Rb)C?1Q`FU6yAIhIK3j9Qzkke$6cKZABTO*O{G;=mygha3uF8;pZB zMOUaU*?30ZRf~^zB|rqk7mwVy=pkh%Q&kcWb(3(}$}FUG_TaIObCw)BijQKUP{d(= z;I=)V9s1_&XWzK^_@>>vMn`w;-bDHwUN>eYtXgTZ&mEA0gkz(5q-;m2HA+&D#nVc5&;&wH>1&qR4RStjUyS@Su`x~|DMb0B^d`Vt%Ekn_g+hszcXG-b zAZdcOK9Wrc?%R;Dr@%Kz{!Gx|_T@)whPJl|jrq^LMHcO*l7Xz}u5_CikF$1*DV)t% z1#fXhZ+iax+-LHox@F)hgSxTeADF7pG8F(y{Wj@WoSK3M@RXA+a<%KRS{hLA1_T;pj$!cCT&^3YpSB4_9RtwM*Vo8H6>qsj9nCu54Q{np3)YDg| z3qQuHhpWW;z7j@V(78B zVrNbIf-5u}%+m9Ub>_ue}*Ez9jmvx-7R~w}|iGB+#Hx^IEuQ)1-^helEwN8mVgcF}>J)bxDE+>YII=k4l< zfV7tM>|cy@LiOYbCOyS8rWwrDD?4lFR_lW7>fZLn`TXMc+^nJ@U>cp-xw86bDv`ur zB1Iz*nv0~cQFRJ^5&(=fgNoS{)_pP-)QHL1Tvmjd^y=@J}gV& z-_2mFf{6q>(`JRc_m^QwhCxOX?{?*0_Dxyn)o4 zgk7IOy_h$g%2iamUQs9}==QYyR;=5Q@q2XsOd!@P*C4#Vtv4bUf@yCdC$xqGX|GF(0_C`{kNGKHXWcNxp z-j_{njQP2kOotr;8!L=GAA<1Sn99;!_x_M2y#cHgp)>ruyf)slHZ8dINIeki3d=dZ zCgn{!Y+4+1V1a@G1}a-_W{9UCaADDo$h2HT>uX3u`ulmBinB%@(F>j zUOg~veKRmXa_AAs{O|MHX)Dg}$qenCm0q0kIt)TW@VEP_doaF>1F6;(^=(_{or2eT zIFhj23}KL8)>9pClv+kR`nPr-5^_N?$MZQcm?Psl3Hzo1oSlx>B8vVy(M*+tHjKR% zj-iD+VreJ)t}T8q5(?0dCnKS7BpLD731e-3FE}l+pIiS|IPJo7yHowS_Sx+_=U~NA zq%GOIxO?BC{}!h`l1`;l_@Ab;t{5Lnr(@A9dL#@wDIjV^>5=#4w3zxl6{r1cdNAtq z>iCopXb`Ijr!DrS+J@`f&zimDKzC;7>_`QteZb}-l!BhHWCj~@$VJpV+A*-TgC6?$ z#swFTRMTe)IZ@0B>L(f9L*TXdVa#A9(tCNW65+nSkeze2FDIFtzN`EhcPf=K#&Wc6 zv8_smhPKe|h{ndQkLJ-<>-anLHu}rRrw>!i2Pw~%?b z5?`&*W>qf|mk@wCNahLn)o!+lk1oep4X4eD%E@C51G&;WG^YHP_?T4JhYoq7Ta0z^rJy(`uo z;8<(K=ZHEbq^i#F!5|-Wy9K{Zv;Zb6My@<_VRNRwB|S&aT1*H&G8zmn2W#;Oyx(eN z9eSPF8B3Tg=JvW|tKQBuk)exzG>*SZ??*qrM`u+Ltt37rXdrwvfljEWHBxw&9JgAI zvPn@!FjpYpG>2BOtF=L|71@h|&hNW|k?{A(9#~dy@Jkn7!4ldNfQ3!;O~hZPj*Lny zOsK0Qc&`-vFcGo`ZS|WGq%yTyLvCl%6Oe*It7tKLu^6fT0kWp=fYTlmqiwP5JiUoE zCu7d4swxEHcno@-!RGpEJwkB(y{t)W%@lhS8_c87?k$L@#7u-jyNdEdY;isM2U51I zqoUDM%(6$9u4))=<#JA+l?@_mIGd`eGDs;;(?D`YE$8!lIlo`OZGGR`2Bct$$Gire zE?48i+kH*Bp4f7qm-G2JuMha}0PkCY4~#`XK++3ER6dLTTkrNrtJFTGWH2h^oJVe!s(rDQVYN8TY2Zd9HS=N#x^{Os}9=waq(@C#5Ilr)#f z(2t-ttZ7g94OV*C8cziDR_wQFLf99xlCzm{MoIqh*EEkXKhq}EmSGp87W#5{O3^N6 zmEz?hZ+!lgZ=@Nti?n>=4W;E3Wt872aeKXcM6#x{aG5SadcUJz%GY95$Vvw~c*! z?0y?usWkNzO1VreWeH&;h~jC)qCfZ<_4?PWX5FSuTKM;Ux^3HaK9|mCqkHHs8?V>d z9AjU>GC!LQWyHtdq5eeOOPR~uP-PpJ=IZNnh1yzuLpD=ipUGmPjJ&&*dIj%durJX= zA`|(^sjf!Vi}hK1BA{^!c747HzpgV&=XiCVm^awMRoCY-^_@+DmTvF~rB3>Y#I$K|#O+%=XvH%mx@{l!rr-rJs)b~KxTq^z)kkSXs6@khC zv&KZ-i?KFLqt`G_h8Y=Wy=EAn3>5+%{|sAJ@$Kz}rH#%&qezZdLuIRck~U(ftF5as zgtel-RQZcxkR&>mP7=EY&=R(M8Z#5{lf+U}TJgG1WP`lj zRfR18n|xy4rwK}_mC3$MEzV?A3fr_=Um#y!kA&cLFNXvELVqGvK)NmRg5wIRe&8kk%jJP8rYj;Dwpr39VNHoHH;FxigyR8rSv`YJWT|$s)v>q=GWv0Yw^E&ei6SD=sEOPn1@Kr^8$>mMh;3Z8qaYE+*ii6vV|w% z5{3kZInl`yBvS`oQ>Q-n^9Dzg?~EX}dN_k`c2x0v#vE~nEg4?G7s5I*5)s!4O|bU( zv?bz>TGI3iYmOg^88iX>F~-CqU)E}K2jB;$CPVD+#3ue)|d>3iC_Q(cTBm~>m#I?2)fr*+Zef6;`E;8 zCgj7E0<+taiRms}1&4FIF60aN4Xz~~eaIK|89a%E%ZGQ`vdQEOH?D%iSwSb`E4_O$ zr<3O|jxIJv#2qG!;1K-gM{&0M{N_D=UszhTg?w%{TR5i>Fg=R1!xu1}7ZAeIhFt-H zcHRZq{MPt4=?%==L^gxFAO*F$InhPNXgXrAdaf##irS4{A5VKye&$YcPGSma>hClN zkpNpJTNyq3Totl&Mvc!J?a?&WI^7vadT8EvVzxhpGk*6sYK;08{q2(}ZAocNk4=tZ z8h%#n)j zctz1mf7%-idVdx4dV)cZH>kd^dE>P2Ypy!!ebo0WCVZ;*H!I~IKIwe|&j&C6z3o9R zm+O?>2uWY5Jh#-IPNlxRq`or(UUKpVFyhvL*KA}SBRdX5ekwe$0oFPA9XO0vNrLm- zv}U0(=cp@qS&z?R@w-`XvF^IHPi&j<;mf*ti>oftzI}Up`}S=e$yyij7Zp%ueW^@E zMygY6Bpv}JDjwl)+G~p_POw-659=+|*-=NsbsX!iNp@@_g>7$7)VVDDnkPvuDAPYa z8=T=grPUB5kTRZ7;KiU)f~QK|t{5+1k&$|0#}Y1C`hpJRx+8+@4+Q+OFlX8fIVA@i zPG_Lt_ZI?Ampy<7cZPd%*I!8A-HlA>AVp0yuDJf`oImEo*pBEk2_g+fL)AQY7 zp9-aK&a^w#+K0QVx^Bp|DKzV+_#PfZ4 z{t%vDs64-rJSXtbyQo*tE@*BG6cR@_BoviPZC%55hoZST^o6E6Xk4ZcbCXBshU(S| zdY@3;l#=$Lq=%G}6#71u4ybii=z#Q9UM(pJN+2@1l$1cUt)A+p$LS{l>mdc!L)4#@ zwiWUGAIkHKmFE|e=ct*y@1UO~`yK8jB2RS)fvgM$4AmF-ylucmBi(+@o$+4~qQ!<(& zjT%hlED%$%fLV%E&5`=VR7zYPHn`6p;ev9|Ye~e7dTtt_+ok+mYxi*50}u*{c#Pi6 zkrChypRtuliCA286H4aBj`xlzzV;O5U^X#z;E}im-W7b+LY&ud96(WUUtrv|HTCuA z26C#yDmxFbiqmbZP1|%0Yp~zfs&nf)?sw?fYnyd8>nHP8tFEZ4vXo8%li7afZj-wwaA<>*YmS%+@ zJuBWl(d1~PSe;h3*`-Ux4Jh%{7(25%ks@zhELXWN8F~3?;waEMsMhDTW zpdTu}ET~+ZD&1U)_s7d66!Ap251!NQiq%RHe>~AR+PiF%)KR=TZgH@>s%SVG)9Zav z@4^6`ipmK-887awjkWl756<>+vb~`#Ae#kGG@5cr=GqnQ;g;&8!x@eYW*QdcSIkNF zw{qbto$0&~4ku%ox&6V!e4!yKc$2B(5x*~WKh0X?I3Lf_&xQjKL~hzHhCBf{e~I6) zmsts}1!Gt7S(mkGBGnzGMZee>w@sA#Hng;C>ZkRoOh-`Oc%LlNdz&}(^{;PAr%t#! zWRZFBL`w%K$d3`$4m|czE0i)5lhLb$IugiC1nQ~4DiBx>&m(3B$0?CChDKGAYseF5 z3S<{f^6NOT2Q6QyUlkWzIxfb^vqPA&6yz)Ot-<<6tIyxDeRkclsMn$KMmda9eCd;p z-I?W0@iQBPV3?5g_eK`I|4o6w3{Mv5z}@K*5`7H)-F$7XRKkNl=rqo z+7=b;c4IgpvPRZMz7E>(bw^zJx;5OoxIm8!8GDP~R%NhDc3;NUqH`E<37X1c<(3Ax zaKR%!vvNF@82lY_}nhq9(3D-_H1o!7AGOX+IU~HxpDOHobpfS93E}# z$_;Jp>e@P(%MFtAP;TMwb?bH+%~et~Xn~Krp;+Bu(3?ET6nxv1c1nw;tE+lRe-a*X z>NX|9m8wD`cm^biGG4$a$liMhhErYj|FUiI?nL~Y8T02%1DUfXQ!2tsI;Ymdrd@QA z=LN3#uUogEmxc~8v!SKKBGp8bu>e2A$y(0neaFplZpCV+T}l?<1X<(Vjs8H)AYpNw zVi^)1ppFVMUs4+O9yeKTRGJ^1+(ro7@oD9#OLB>_eG|XYE=z%AuN-kLta7thNiyUb zI}%UTktjU6ihS0mXje2urv=IG@!fi>&l8D_J>3@#-Ei29zr#25rIXKKmKnYVDfEo8 zUyGl<1m4mQu;=o3i?g!X*@fy^nar$eganDfc$~f@Gow(Lo=M|#W_m?h45rgTkvL+B z)TPM2M9}dU5XPo@SBq<|K+2#u=d-tx zGHzXd;+ME2%P4OpdHu}PM`2ki`%vyBeOa0VP?PN-m|79+4)?dDaJD-vWxJ(trY9_C zK8ilEGz9`p-66RN&X=(_y9sS{kSrL$cVc4o74aVs9jPP^QJmg@-HRck8_FYA1FsKZ zUBqyp=MJuN<{gq-N_v9_WwHSlB3zhErM{>qus8PB(pn#=wN8h4X?(Y3XsLrSSKXmVz1qQ!Pmmp`O(o z{-qX|Tke@?`IP1>I5-}bn;HXw4b6c-1JKZb$+itmzF-rURxyYz{HJC%^B^$Md@@(V z#4<69z_Jx25M2u5kPZ>81*~5QvA_%Tw^x01eSO1*^ ztGHF{$*H-VuSQ~xsEp0v+XG|^-()zP@Q!^ikYUaz^JUMIj~&%>a=AIxMY7F#(E+E4 z53^K~F`HpR*#aLJ+f8pqA?XuO$8&<8zGCd^O!n_&JvuqQG-Wq*dx(oh?UI1~(9zG) z@r#)zP5VR!3Qpy|jgu)kuqDq_fvR={apXZ=A?xJnCBbBP;kiArfipV8$)Jez5slR@ zH){+ecy~rbh(f5RTFiL(gx|<|oYhEel{k@ zc$dk;8vP00laY#u*6FF1lWsogLvIMn8(H3x5wzIrA*AQc-lE4F(T5Jm;UA~-=gnSv z`G`xp$l(qL=Xq$I*0Ggb?i4j9J-R7^zA>rYWHzyu2)fCMCEU)9=cmP<4*EKdONPxvr2P|-$DiX=1*KIH;Lj;xy)_#W*3ANQ|C+0wjV2?-Q zign;EuxzcH=iRl~6Ee!yiv6*8f1s94SZ&sNa13`nz{3I*aUdBV2-dQZKL-i{{0|oK z$+8i)UYe0i&5-JF$M zgCGjxbmvl*^`u0MZYA>yn;5Tbg-hIsw_dJON0)Jy~vQ@(FJm%d$28C z?XiW$9m6YHw@ep7s7W!tG{m`d{+z@$XX~3o*`2Fav}~Bh5dxj**95GVY(9<+#yPv+ zZo@{`yk~S?+p4xIM=zn+UKh=|E$K|y4CNGtqu(TW*34;J*<$2pfm}6M53>TcBiU7_ zi<+xYY?*Iyk+Mp1a=soIv*pwW90Zoi_)2cPsVVhd>{wpNFYheQb6c14vdmwYtc@pX zB(**m(jwHHXx=i3U2d_GZV6FE*A zt4^fTiF~Lge=YfnJfgA8CO56s*OcpRA^l{9CDsq#y-4Y&xVj!nG0s7Lla{(-msSow z#o4Xe>UuZX#F?;e=$Imu(}wa?27SrQeSnN(dXFdCtbTy@K~!F@C1^Fv6cDWv_@ zj5|;Wn_XuSr{-airUQq_)pn;jTnKoQ4qt{hI6d-wbKBlUvgq}SLa5;Pk&DpcJ#A{V z9dcHgJcUGnJoS3ujU*TTM8RV;nh|!FWIbNAm4cVQ6ZRJ@e=;U0iHs_BO2xXb ziAJGmwSa*LYg8(;Eu));Np4Y?5fQ`^BWkm6<6DWHihZh zUAmVS45qG|qdtEmDZS#B4R$9Jn1@k7B9GO$=#?tPU<6mt$;4%dte@pqq)y z5R6Q;bb@f8!qoJyYhc~x3@6Isp29r)ZG>=WcagQ}!x2|Hz{h#L-IL!^w|1R_V_|zr z-2Tu!(;ehu?DeA6l1>Zt0X``h>>i@YDp{geer<{bOtdB$+kv8kCCld-~A-fba4dZxDIU0;CN1hzNm6s(WYf_RT z2E9z`&{oxfT)x;SWinC>1Dn9s7>P6yYHx}(?OvK$Bn7-$UoPOO_Ecw_=Mbi}e!cSf zOX8bOOL97RK1VR=UgiM*k!th(o7)_Av$Dehq+?PJl5d;H$IP@Wk)6KbZU#Sk1RRz` zwUI$uQv1=Gi7N%uK((s(8z#=6ph+7>A9>QB=5rY#<}i6?1yhOAMSaqj;uk45hfAmW zpuZT86}N2T)4p>V&dNp;kOSMb9xEG3;_9o(Iz&7dipm$WT5!hWSyylYYdoFFI99JF zltETZbOUm9hr(T^YF(lRia61L0U&X!ly5kwV7T58&GL;)ySRiX#l2li8u=`iNLWLD zRuTk>^@prkV?KJx^h2BbOyVpE{_rf()VKN2^h=_7JfAz-Xl7mti(>dC#@sYI2Tut^ zWM>kB%aTT3Ndpy>p&%1G?3DEMNm{_F(=s)bz)fg~_WtE?I@#`%Bwu^7e9k6=Da$!> zIvh@in*>=Fn!@FCCMKuxRmzx&e2oimTu?k)R8C)wW`oJGWAvGkOeS)N805GBz9J{? zcJdW{_Si=wFtHeA%#oF6iY=(v76gxgTS;U@##)5{g5#JBGFNFAL-;-J$>sxoEV>O8 zb8CCnwQA)&xyy^%mUZ21E)lc|P800JAht83y8}L-e>7KYTt5&+LY_dZZ$r~T?29{W z77Ecqy{iPxY(Ueh=xd}yC!m?QAh1Etp2QyBRi)60NqFS4(yKIoJ1iQ!F8!7!c87Ozn-^(XRqO=0Z0 z$vZM)&LEf|NEo{=SIvx;aYOiz2DL3hZ3t{4{_Y6|USIa)oK*P)A20KD0E6mhT_9jb z9M7^kA!y|xD(v3CD5-`KKqW@4C$ypWj_!*&yfy9Q+nsoe)9F`sPc)l z*`1{Kn|&DU+!Nl0gdqO#hoTT`@c)DZq&|Sl`#TZHNmGwdx6&U{R zOHh`B^g;6Z0(qSrcz+(%!x-sz$;yMhda~O*EbxW~^m`)-$AuFCY!ck|Tb^P_{{y8h6>)DyB!J1r6b>JaJze_GmcxwPFTeSibreX<^I{L z_Ctw5SH=of_SP2CWs4EJq`u(s`l77B%;^bztUS>r^sfdX|QlcMiO zeTdv8UTa{rRGV(fT}2&Z=TFv0PcNhBVdRb|qa!leu#b-*skE2=!q{>zvOPz5dPj#SHySNi zf@S>NlFyNyLM+BB`3^ZlB6x}@tyV4Vj2OXIV@!!O)Ya>V2|)j5?86 zt)M^8xip?=5(uY?kn@BvJS!Z1 z^Vnj1y21jzjmXon3kgb88u+Ba4i2Z^xp;>`ipqAwMq^Tj$~g8e5QUclWOWCkqbKV{ zOG-^4L~KA?$SmH}{-=LEb{vVnC3>3*z}RB?W(9z;y%jZYG^S)ZY22tnuw(H~y%dw} zADgInqGnO?Z~w~?J=MiS#`i%{lEi~#e5+T|Zzrq&NJyNG_Q|tJ?wHv!T8pcXOjOQ* zi;rT@oo5gY+^fuyVF)X3ec)ZSGck%4!9IbOGc6fxTxW!9 z2nEwtRxmqLvcbl8hX3UobjId%Sg}PUEu=l6sNHF`6Mt#SD@Pwb?KhyscIqLt<{T2+ z49@sJhxDP-SBBaO)H#d{PT?r=VKQ}CViuSbc^)MAkkS)pOQCZ@;ztObg`|f%@yizK z5F;|@DI>5PrL5%40MJCf>(5L1SlI1y2lo-ym-0&HYZqT@77rCe^foEbI(9r%^horT zW7{PUIHVT4vMgk7#7g=+nZwx&u8X)6Lcpq94IPQjQ(U{SUQk8CrSzdPL$5k^6B@5~ zwI$%uSvqo!IZQz#)qAHo=+#;}lEwVsmiE{{i219h){nK!p<5e=u{8D#PeyCiz|%Q5 zzO}1q{rtSgHQ&ZK0=9Ya4ec%K=VqPu&2+N`S%{j_GX`sxHOG7XV~rS#g6i8VE!jg>bk~4227h zNC3MNp>Mho^Warxn~42FxDPx{4i%Mz7r>x)V7~topmC#!mABSN=aRZe!eSD+P?U{y zEP23(j1AbSPx8=zX`NT_kXv}>gPt)5xh0Yxv$0C#Qs<-wujC$4`b#m4CY?J9QI(?2 zF*cPc6%0xRM@yrKNm?;)Akue6&(eJzVo$@$Xd)5ao=BPPMysug&jj2NpVi@JIcLO2 zQjbKlSFat|HI$ok#j5V@OM-Y1i6Z6P#_Q*)Ah_BMT!>$ zr;$uly^IWvol|YYvRky|!B*1kUY^VrGIU)wpH3xm*Jkd^q?n(QIp7mTvR4%I$rI~R zWT(hdwirYsVJ;da>rwJ-W?YSZNoXeg4^Ts0*p~{jlq@ZvLxcR5MN5e$&=Jm5&2@c> z?TLkrcbOXQTT1WmKzM#A6dHSo`At_U{_ZO|cn8Re=3XX&m7thTC-!XFjiLAx%if?; z96>}STatU_ax$BpE{MpzLK0vuQF5<{zLRsWMCwk?y>dZLi6bLkP<6$!YTZl>=186a zU&DVQX~}4*4Aqzz)?PX=YgbpOeW<2&w!=Z!E~rLGOC&0L?SgT^#lzK!8Jn8j5`2_# zpAaY6A=q zx3JabF$-S1$ILTH+%IZbwl24@4fg_vZ+ItXGX>Hdvx2vof+=q7w!Le6R@a@qrh9F} zHaPEF^R9fdtuVHE&)VMAb$ixyuW8t-KF+1uAp8xaMY_f*Em}aWQEf}rq<(Kpbc!zb zKWnjeztXs6qggb@jTVx|oG|>mXfU6$ee?fE$YH4J@d9*4>_$w+ZXc{rgi0W^UrF_( z46TFsq}pqFkzwpkmjI*K&M*OQq%Qaoht?sxx;cv(ft(+>c7)E5 zRSCrP6Ym*up0f7gf>RSn#7#1GIEkLF_F6=YV(mn?OLk}{YwtnZu^i@fZBHm|SLR?9 z^-RT3d32o)9<4bjV0zqWwdh!b!>h%*W_OY+)H%h|0C$;zsdAW&_9|l)%`jC~t5>Vn z`U8#-N%Ms)1u5!2%>XC>Jn7VsDv@pqTdM3kg)Nr!%I2ko#={XKTQknXwu=( z8_YHaGfc4rxi(=b5i`Du3DP-DH>4J{!QL|MfFG4Q5vzg94`HoNhc;kfYup9N6A7|4 ztN~m7P5&9(<5i{xvmD|W8&l)Zx~Nw$NSe= zK}M&n^VS(Q29q4722+(FowClQ&ahxIyGLE3T~}(SRa1v{!nQn3I~8TVJY6=Gc1{Vz z_ibUjiG)aEb7Cjx#^Q7(`Fu4OIu$^Equy&Xxs4_x&1j5PE2q_I1Cl!~t2E0 z8B5#fY3YO>ZwFO>A6c5g*G@;%Ge*iAJQl){yv>SvJIwj4#2_m2A-&r_=F7D)qP0ndv5bZ>Hj8o?bn}YdV8TP6`ol|yoaV+7eKfp#$_#?`QuJXsTl9wjE3f}2z} zo5FM&)1#syNu~nFhnO7ol@ess>EW7$WlublAsA-f3j?Wp2@|B^8aIiM?5!B;oy+aW zeULKun5>aFQ@78P6d|+@dm}C#`PHxRt1qd)s_cy}Ya(nj^}x$08SG4*Q|F3!5A#+F zX4(nt>+!2wG|QBJq8w9Mo}ChB%nucge`%dAr!2{ZW;{wxYLcy6FR4!{+rjm2eYMn$@-4*EaMh!vjW}+CwhS%p9P-u zb>-6QV8wwcChqla!3XL2y~t(Nz%vQ#;-sjkd=VZP933g3Pz_p%4=aw?*Tv;c#m_ z+7_M>;??IU^&%wvYBuQK-&uG6cAP%FXW=hym#6E!}b8LsApBIi@&R4wFGwmjD` z74FKhUD>ab@V-Y*)e1bxw89IA5lTa36uL}3tFosWvS&7G!-}1g>Z*_(ljYx9jct6A zW&5IR!0uPlISiH^5MlvD2s6)PjZ?u`Mk+gCXl9|?n zLd-*RzRTT+cy?Ca5L%cGy8Jrx7U8T4_aF)Iz*+SWLW#0t`(jSe88S2K>SkmNDu*>D z5jJfyA?dlwN;5r#!7_qCG#mjr+{VAeB&nquC-LYixPjXcGKRR!OAALcSrg{XB|*;` zjT$80Ws<2BU&uPGI$O}m%9cPh8UafqGV+tutIQ^4J!GO@SyiO!FI%>7lFK+ZmY7a| zvfE~I1e|p~p=~i~)h**bYSH*Tgu)k9aG#RK^G8KtNhF8_m@y7bZ2U3234NFNv&!00 zq~iKyE%M1s9Li$?!APYusq>3t&mkk_!>3=_nzG2eo~<&Wwb@K2YjlsjQEqGy5nr)X znk#@=(c_nnw@~N7eu2;*AhtiGvnuN<$P0!)c4So8F35{sb() zPOG6!i!3R#U@FuNJgC#@{i0p3)tJmiSSFx09c!9C$Dz|Eu_Yg=cP;9jkNGRCXGgun zpGKmkrmXnjyZSqdMF)>4IRk6pd|Id55qYq!Hb31_G|P}daWrfUV3hj?w+BHkDmgt*a$A66>cX(hXb_; zq5=OJAEdrI{x#CO1E=6$w}E$6BT*LK6d;LTWR6dAI(6f#o4P_0J-17i8RTP=+JjJC z=}itY~rwG_9V0XVV9;7UOF5M1EH@{%z{VOjdzL;U@5Y zfzWrFW3q*%t1ZyR*f;{DFo|ez>s(O}p*m&^eDzZ*)e+6_gHRnarkFAyyYgA#(C<=r zX+!@V+ohgxx3UC#>?9$pxdKeCY`eH7bg&6s4Azo{0qp-gwM;NnwB>`z1kJUTw#$S( zAaa3V_ZE$oTBP|r!LG_j)UjV0$r|m%P$qmHkbR{D*-7%F60S);U$$LN0RyRf3G*fu z&^&OG?Go-=;9!J!($_>S*j8BjMy2h_1lO&AAC`G2nkPqfI1I$3#>Xqy(;-aaMkkuFy@an zb}jvY-*+`qp@u$I3#=?-{)_se=00L?Ou&MURK16ZM87>L8`%bTwItQJ8muNM>FC$! z9gI8doQ(j%z-(vO%{bi+Ne*-nKrUzLvd z*-VgTwARGh;Fr?{WLHAr8_Pf^H)-xVorNn^yBk;|w*BqzcO)gyo~wp=&F`P(0--tQ z%yEMBT(kTz3Yqa?=5^`@ZR&$sxF$UowJ%;`lR3Sq(!zb6ShztCW1TYxLN!P%+#i$` zV2qGvc*uUB`C7@sohm6|kSUr|{}~R%9TY zBp|d7$}46PL_S>W{|J2fLDLjp{s*YN((PRG+*j0os(FmJ-+vy%6oh)NjG?zNhP=@1 z{&)TJtoZ}@=ies&dA+{upV#Zl{&`{|>foPOEm)^rS7o#lX#16(a-ygHr}G}~!QT7K zdz>1TnD;Q+%kv(@hwas2Y?bFd_F+U^qWRmu=QVjf+#WfN*W`8TL9O`jc}*C5Po>x7 zb-5`FKZ(K6Y}0x}YzyZPHz{5dxNZc+Yhs5)dR=p?G8a;^zbm~a#D7utntb2G>Dc-8 z!D2S)b_WdbnUDwb8UodL;0oda^CrW4+q)GP2^Q|qg15bkcu!b6WHIrVyaPI<|2O?5 zrl|ENP2|H7j_6SrP)u+^8 z!`@J3Pxw0({)tn8sJQ}uk+OE_e(*H#sbd%LD7xJLmcQhb@JuM5rJ1w$;EL#hU77&( zZOwT^2UYzgsughs{3Wy>4iinFY;h3nxC;6>iD*%xXM0tBSXEjhiT}QKTt&S4L_Zw zdhDz?=`ndTo#Kk{m}qSQmqqoMK*&QoXU?Kth5s4uqXmh2FPSATP5J1zZ1KfhsaPx# zYG%&rvC+0LhJPTK>dgQG4;`Uiraw4UJDe}Ypw1)%7$SI6(6-JmgehXzQ*NGIb`4J8|+ zF&wvIHK*QI-Td1?_2i|D^u^eaWoR~i(ZIs;_1J~eQQAL{*UNw?M|A!K+;ECS9`^+T zKKh1wzmIkVc-~*jBWvGy5&rT!;4g>QuIv{+9p}Hv<<*+H(_ADNu-m=xmb=^@t+_Kp z9yqK}@QAY<%)S%M9(mGTa1wC1@hUfJPgGGPN5_PngaHXNNuA)~wMgT`RC(Q_nBiIH zasjp()T7il=o<3=29;N+tmY!6B}{!lc$B2ot`!vTh7U6A2Oms^-A4eQUgJxI!Y(^+ zuz1`qx7IvRDUM;%d~ti~>|cVKr)gXZ_t3ls0$0*lk2`2&r~ zL(u= z8=kxZx=`O4rXOVP$CJO5eg(fBy@Voo`zQ4)^&LDJq>6a*E)AvyoNQpKX^+N#dhg^* zQ@xWW7t?FiS`}ApFcyu(6kbD0x`9d3L#k(&*#4L>gJYr6v-{2ma_ypRr_8FOJ|{VP z5X*R_0{c-WN@J61;-N)mTh!RtK<3aej^LbxX@u*aN75;5pYF6N;XN*%Nt;`v(H678 zWkcMw-eobn^=8&V^f8)x1LbW|%j?#w<&kA}38iecJX&-MP8&>1qs@gK+0#g7u6Ir? z%4IOO#GV5vPmjk}t4dftiG6SIJGx~%FQOA|t}@vj9P_TFB^qlr>7919%_g+jX0wy=i#ET7HvgQI z*R5d8@Sc{_L2OQ@Akl=qJ{=BT^HWnx97rSu+KhUa8A!CSc2Xcpq_i`swTKejj@U=s zRs3m{dk@ybte`efyQo9dhpFqRo2Wae2dE!WzouTK{)-w%4n-uZp$l{?!rm6ptLVGw z2k9s1=a?Gs)N`2cVHGB;5i~JPy{20;N3%zBL~~s8Db3BAZ)o1ooY1n`R_%axfp(R4 zi*~>E675ym8??7+@6kS_eNy`y?JL^1bQ+ya=hr24wYpB-EZq{_HM(!>tMqQYtk3G3 z^wae7_2=s!)BjTc2mKoclfi2U8}f!0L%(6jFk;wj*kd?o_>kdR!xs#{HN0BotP-mh zRjsMIpz2uF$E$9rx~=M-s)wqctolvWE5?+u-nhZI%XoqDnDOJr8;rLZ?=e1PeA47F z^_b?GmYdd_cA5^FK4iMq^aaz`O!u1}F+FX1-t=eFJ7&GvYmS>6%>CxY=C$T+=5x(Q z%*V~2GT&^z+x(#U3G;L2KUq?i1(u5}4JYrvYd9<+YJ`ZeqQ)<>*QTc5Z7*%q)RZFROT+icrX+dA7>wga|HZJ)4x(e_Q- z!?s`8Ua-Axd)HoNciUxq*4|`aXTQmQhy4NjkL*8paE^Y*kYmKL*|EoQ(D5P1BaWvX z&pZC?6rE{jgR{pu*SXfY&3U);LFW_B=bV3bzT?uvYaqJPt_D}XYsfX?+U(lnI_Ub4 z>sr?rTwinD?|Q`DP_I0|{b zmvE!pF76KQ0q#fK&$$=5|Ki4Z8y0>h_*%Y`pT#fXNBQmie*O~vD*n^_E&N^l_u%L^ z30`4PxKX%WxL0^scuM%K@TzaM@3`+5z88G2``-0e`K$di{fqr;{oDNK`j7aJ`#csTG>;I~0fust{?;i7ax}x2}zKoIMT87NOPs-(t2s9biQ;{x?1|2^cCrD=|Smf z>5tOiWxec`!*X73k^AK#c|^WJzD>SIen@^&{!OSibaCkWVO_W;+!3A`UL0N<-WEPL zd?fsM_}TEw;lD-b2pfTp8mW%7N9IIsj=UK8ugG}R9OW=iR*1Gnw?_9x4@a+zULXBZ z^y|^@L?4U(GRDOsu|ljhHV|77TNT?9+Z#I+`$g=9*z2)(u>s$<__^^T@#FDN#h*!7 z5_}?>C??tx(-R95S0t`Ud_M8j#IuQ)6Msw6Nj5o}+?%{B`Mu;%lD|&Al6)(rN!e2V zR3cTI>P^i{tw?Q1?MhvcI+pr)>W0*9se4inrJhXvCiP0{t+X}mOUKhS>5lZw^y2i| z^tSYO(vPKonf^m2m06S-&Rm}PXy%U01DW4t*=%R_^6bOepJt!QzLcAjyD|5x+#hp) z%@60V%iom$RsQ+>pYne#@CCV$EEEfC3R?@07M>~^ijBqf#m^O=D85_WQoXtQ_UhNG z->#Wf^O2fQ)ZAEeYt5f(^R+u`zgI`qEw5W!cTK&yep~(B4W@?G4L3IYrqS8h*ZAee zx0>Qj`KFepBTe6FrkiIrpVxd}i`0^7scq?O`EbjVt>)I5tw&pb+4_gpH(LMErfXx{ zgtk~)b=!Gum$iMY?XzvaXnUdU^|p80tJ>Y|a(lLYZ~KGoPjnI*)Z;)p=d#O`Ugi-qWS&YVTU!wZ7}pt~{MU-#keKlL>CoY`|u z&&55j_NIFqdN=ldq4&w&Ur(c^RZX)`D^6>gHf`E%)9#w~VjtJn-*-{pZGFG&_w@Jm zU)uj*|Bnawfwcph2lfn{KX7E=k?H2?!_%*u{`L%NM*WPNW->G9&iu^Gzs_oywPV%| zvwl9ib@s)xzc%~1IpUm+b3Q%i*}0LqnYml${%G#c=l*8yEAwjRojvc%^In;snt#sx zi|2o2{wL<&IRDo9-<<#b`9B@>42A}CgUy3y4IUW0bnv5tpBcP$@SB6*A94&04{aK{ zd+2XNCl=@yunTr9_|k%x7uptb3#EmLg|!Pi7p`0Q$%TJilv}iQ(bbE7uvoKr#o{X$ zKeHsWWZ{x8Ecx5g;L^dR7cRYbnPb_&vg6Bsx7@gV#qwL0KfZ!mkzKKV#n)H7yt1%z z$I7c$K07Q8Cx@$tTZVgwXAdtL9vR*+eAe*3;g1b}Vfe1$hlhVU{EOk=4!<<~`taK$ z)JWBceS{wgjig6vN7_dEM&^zz8CgBDX=LXq{(WrZu93$^-dM%0nzd@hsw1nuwrYI! z%+;$`A6Wgwnt?T=Yc5#xu{B>_^Yt~4t@*>66Kg$dgKO*8u3CH9+9yVRqaCAbM~{pi zAN|zm&7(gVeRCbP&a$q!ZsEGs>&{#E&>8F*N7w7t=hxr4A-Lg+4Zq)L+nC#SX0-1X#cVRzT=jk|B${kyZJvyYs8 z-`T&~L+@F>=ZkxOwYRu;@!tJ=5AD5u?x-QpV~if z|7Z3;vj5Ek!hxX!mmT=@frkz}f8fM}bA zxblK8T=49L#tZ8&+<4)~FZ|wxFI~i3#9h>O(VB~{zv#h>-Z-c~7&zE;aOmLPgSQ`i z@!*L=u|u7QmK{2D=xc`_IrNu{Qx}h3eCJ`!;pE{Jhc7w&;1S)Cl}EmMOZQy*xl4b18GTvtvXz%zblLTnedDqxF8jw(`_cZRBS+6Zddtxt9ewKP zvq%4U^e;!>K1Lt&9;-gqa%|DDkz*T*vpqYE^oek?&YJG zAG`bxRd1m**9Kkvf3mEywf&9KXkH?k%dff5|BRfUtNDEW*uk+^wQp)+s8V{Y_fh`n zH>n!tpOp1Kc(9daYyOPvsyJZ9bZK_MqQ4!hN>6h@7w^*T#(U237s&O*`C&L8aj*Rc z)y1s;&mP#zC(rbvj#qF#&7r_HgVL%n5;&h@&AQGn*ok*1Z+2SO8lS) zb1%xe8TozR=U|pm)&J2$q->gXl=I|+X`>2=YG+S-ESUNo{UQ}Q`M_)>8P{Zty=UzF zr=FE)xkT&0?}Io%`veZq@-y_#@zAAoGNJgAp3e$`KP=Om=L4WrD+*Iq1{25wa4&#A~#gMBUqBre<1Q!vls7l;`;}w zCe5WNe|-G++G;8W-&S4|1|J_N!TU#)7r-H4b?oBt6YwB+X}*O6zlC0->NH!%|2o0j zpQ2KlpNzk&(Sa@iBaSXycWM4gRgr_hpx}bwNJg7Udm8}9D`?LrAkRxWnxZ>F=PAqU z3HZf5%=e?~adSPR2_P&AIq)F4e>=rIO5ts5Z?89LMl3 zdA}Xkoj6}PKCU^RvMSFRz{=q_UhHX^p=#*N_;2Xy@gFm1jsHQj3GdEAIlIPx$G|fS z7-LG^%P3Csxe~lb@y>T~EX6yw0FLWXhZXnN;y3}=-YCJB25!i)k7~recocF!B$*H6 zIE!j$j^p?yWg-V)XjgDCg5Q4>Z6@tSnM!-!z?t9{hvpod3GO05PZ$0WG0L@5j>xd6-;|5KWQ_rf%EYn5?GYJ1bn2QNV}9X@DCac z{2%Jh1iq@`di=Az1PEaXxB$lZAQ%xI$$QBQ5VS}V5jR*IM_wRjsya zt+lpVtF2Y5))m*ondO`_ zbLY;GzfI}Gnn)54<=8V##Isffw>g;IME5Ms_cdif4(QFi*dOWwvKBu;@my2`p zZB)38rsMM?_apC0&1D*yr7zljlH~A=SKJT3M{rN#R~2_QEzd*24b?9q3tm)3&fk=( z-SquZel>c3&Z)+!-=ObqS7XF|nETkiPG6mceZbx0RBwI0YQxp&8!5jViSPSr9H1ORLOx8js>h}EL{*PV8_OGvK2o2hwApR#t@QQv)Y*^8%U+aUjY^4ofjCbh4M*$3 zY_D3xA!EtY1kIiPSDRRj?3ks7<8};pSI4gIU3=+^b7eCG=h{o3aCdFOwWWap=kU&z z;-I4s&QdnuTpN1;SA$y_?$z9<2iW1Ab8XVK&FImzPGIOV6d@i( z2k^Wd?#hssdwa+`nDuYtJ_TmW4EK|8L%4rt#;Cd29&`0swE44mgE^45k0t6r<~1hc zo(%AA$mE0cQ@pKh=gs3t=xTFaKk#>Vc^_o|x&EhYgs~O# zC&wo~?DS4ZC0b}PW9*5%EmGz*+J;g)`@23smFrB^4hW$ZU1*{3`eFT~{=0rlzh|~ETd}vpXm;@$Yj!t#nZ3<9W{tViJY-(530rFW z*#UM7JKT=2)i%TXsd4rP_ELMLU1RS`3`tZb#wVJ2FExiZQ>zlcNaTtJ7HwIyZBb1{ zuZn&Zn^$aEF|=aqicu9c6=N&5tC&);d&RyL3oDjZ993~r#aR{SR-9jPamA;}-pT&S zO_M{C9Fv}`N~V)_yfc`@JA-A(Ba){kf0n!~`OD;$$*YssC4ZN^HF^8cfkQVN%FFhl z)x*rN;$i)U@rCBFA;T($jT$z2*g?bEw|-!oH$FkN@pjey`cPhJc3rweXY-|SiM~c( zukWQ4Ue#~t_w;9!LKQm!remdWi@C%6(L8OHEv6L8D1}N}6-r@jtQ1sYi^Oo=&`nCr zP8^(Ao;WRWMG?zwiiQ_eSM;nXt=OcZoQzM`pOYQ;Vk2UIMoIK1N6 ziZgkq;!5F?WDiPVKypyBJeibIs7*G6QdpThmQuJhc{!!<>*Q~fHzaRPuIW$;MU+Ar zr7$>O3Ueui*C_>!y|X*kuQF?;G}QWw*I&B+7QV#|zuey)kYkU^+%_JSt6YEk`aiCJ zasB0i#NS?3uc+tMU(}Q85%p(wS^QJ(u-wAj+}sQ&HP*9^X8pnr^k3`Y<%)G|GojSW zbE04`Z};*~Uq0~Voz{Kya@)G6`QNebbNtQAJt7LF)}6qA@w%U_JNTssm3rw`9KG_T zU%vF?mkxgkS@~k|b1Ou-NR)?)k6|kI#NyM6&n!NttK^E0ci7@% zi%%{-#Zkp+icfT5z4Le%TlBMg+1d6ayO1}_58Kmt$GnO+%?s@B>;ZPM-QON;53~o- zuWzxp*}2x8rCCAG*@nI|g&jZq5~?YzVUJB1HKjo#DojG}U zx*n`o>J#;0`Uw34eXPA1xq6qrMX%9!=%@9C`dPKP?uk_XPz_>j&rm&px!ldLu{Kx3 z^g!l~hNw}j3uBZ0eUCSHJPvXRSWe2`arcvx2Yw1j#{i|tEGCbTA>%H!}TI{q+Y6y&`a12 z^;o@1{YamwPSA&|^Yt0(QhkBCLjOelO8-<{sV`R7vKH=l`d8`(eWkii|5DwduUEG- z3$sT5R{d2!te(&hsC)IT>M8wa^%xfDU-U!jc}|90r=L+TtGD&b>RtV+dWUhs_w~u@ zL4A+)PaUSdjaKfZKGRKVs{WSVUtNR+Iz;zo2B@#PSf8uM^mo(+`g`iv`V#dU{d4t4tlG!*pIANiYjr0Ydw{kotIp8J zsh^`Kzo(C9W#3x#Qd6QaF)`7CWUfz)V+F;S#Mnebq7|K$L0<2W*glc9Ywb(+Rr{8G z&%SP7w9nap+BfXW_BD3s+sf={HfOco1k-4mOtWDO$u9WYnBgYF?py=SCT3H!nJG70 zva8upGt5+?L2A*X^(Je^phvbd<4uE^$d3N4<}7oz`97NU0`nttk@<h(EQl^-kfW0Gq;-C(L#5co6RleE_125#QetGU?!V; z%@p$ovlIGhXLFy~+WgF%WVJcj8Z*fJzzi|xq1VqhQ_cNm7xO3fzka|>HxHU!(dxUI zKbslmVRZc?W)IFu+|xXc)_=mxGEbuW|6=wrPnmtqUpY(gX|un1#vEXtH3ymJO`Cba z%rvS6%xC61=5uqb`NAA${%wvo>&*!!XHK+=eGeZs2b$;1cR8Ey6xKKmXN_1&m#b<< zSS>oMCh0mxFT>TYx>4<+C#&6ci`rlBs+Q??wOr3vtMtL@D7{P_&8XxUPJO*Z|4{u* zpQnDT&sG;=IbNlIrmohPs+;sx>Sp~L^;>qi*9J*ZyP ze^Jlr$JGn$Z1{?Pj+5wLQv-E^QE9R2t=ta7>s4QsV^&PD;_=_8ihuFO?PDypPgGC! zDVE|#Y6o4-d8=u)qaLHi>MGTsN2u|7TeY1YsmAGTux4js#m-P?>J!x2jIvJBN2>2K z8a+jSTb+v4da^!Bouj|YS!t)LAL`T8dHQs9u0BQG&lhYD=)2WJ`uFN#{Rj03GkA~c z`&iFRNJ z30z{WCVBz?9Oq%J2Jz%!Ln+-FV9TDC_Xju;qbcH>`6!-ZWNiOH(-YX8rQ_o76@z;t zXD0@HX$sG*agtdrqt#@xmd7Ef#$14#550R39+mIza*C0ww=;$ zg1U_u4pB1*MK6)(<$Rl0jSfwd_w5KV9oHgIA>X4_A?%)nb$MMVsU~BgpRA5nUL7IzsS|TG=I(zO~Y_TqWtgTe+ z=<+A5Ez9V&NEfrhy{EcQ_rm(>jTOczVb}rv=;yz|qU4}yy$ROPrs`^>;AYrX%;6$Y zS$B=KIT-6|8?380u=KaooEnDxIh6j=PG7Io!}Zok!z#Uv9-+6@Be63cz^WUKy;6;h zm)04^%5{tr>#-0=s!#M7Jyws?4SGBl+je?;tdrO$6Oo>cNYf_lnPw#FB;BH0 zS=~9AclA@yKs#ai?5w9^El$H;+*R+UXQ*||r|qsXdZyk(@2U6Fv#^Nw!G@d1+rC;P z^8Q#>SaaCOZF)A=+uMZ&>`d&sv(y6g-&6YgSheS3-~Ldar_a|HV6k5)Hv3QX#n_AuXr@b;P53$baXU@~ zd`n-ZZqvWem+N2ZEA*B6SJ-CXLT|pNf1|I)qP|v5!dCsQzK(JC4f=QbMs(*P*#5V$ z7WOtQ=i9Mi??6u-j3s@yz6VXU1nsmKo%{!M`5$Su>$SqRy-(kd<+mfc>H&5teNaE7 z|BQ7y8J+%!8%LnmAJH}?8^oimD!CJZas6IjH%nj*EEDK>1XXnL6v)7zAqKI|FYmws`C>8Fk| z{Y{w};O$6tG?wJ%W{^4(yJrZto3kpN1sYkF!_C&}XQqnp(6?c>W?S`JB+|R+jy;&O z7-dq--&C`oUYhyzjHy+xnmY9bR%pH0q2tu4YA-C&@mQqJhMiz`U=(x=mT4oq-8ZS@ zOtbn9maVf>cf_`wf?c_@nTq8&4XbfiEXEmXZ?z8=<4i2ZJz3|xAA6MSrEbM$+#7pw zUu?zw%>inE-tGJyTd_^-L}t~n5a(kZF2pW81ezJvgxzgU;f>Kx)Wyu8oo>!B-!o_C?dfx|c7KSq zd%jrK&TfvZ>r1eSe~!g`nfZme-2Bp9VXid4GQT!gVL>~)`&uk-XLsL#)qNw@x3jQs z#o}HQEbhC+68}Ax_8+ja@57S*6IS$tSkQmQdVU1U^D!*vC$O6Tg2nt-tmS90l%K;= zegRAPZ`jB$VIRMYZTu=$@!zqC-@qDv3rqMNtl;;sfd7H@`%f(2e_{20jK%vYmhR_R zx&Ow(%`xkwt+9LwV2hZ4>S24@Ube*cW=5`$?aO>re`cfx*nxHvyQ$sGZf*y$etZaX zRONO{TVc1dNjuaIW5#MYtIDhFHq75`Ye(8qHf2XMhgDC^0VyQ|&J&R}L~Cbr_9%q+~Z zdt)>1YxiR&;Q*OQXk)fv4l@bub{;n40_GhKW_Dl^a}7(xvOE;qa)n(fvk-?d>OX>+ zgQKu9ou%n)&f^%*pI}e4C$XM>AeQ5%oC>fxR^VW)zb)9S;$-_>dx|}knT*rz8TNbj zOnVmd0^eul{JG2-{Lr3F{HVSN5C^^sVuS1_ab zD{R-Rm~*%qtM*#v9j>$2+Z&i2xzXOl9MCQHR^~<4*xT(LtfRY=8KJwGjrct?4E@xW z%#{2Zi~dqI3_JGs>bqF`#cF`sfj0vE?H|;2>U#S}d!M}@`=~e8{{hTHOkhspUS=F_ zP`^_*s+-i6>R0LxbtmJ15_YTm6LS{5)G2%ibUJg+XQ&gfs2@}Zs@K)=_91nT{WCK- zkFZnHqw03m!#-voS0CFa?34B{%u@Z;K5d_|&oY*M-oBttVpRJ#yH=gYICq_W8SDBz z^}f0p%i%0FRBfexsD7Z%WhSSM8J$M^iaJMK#CZ5Mb)ou^`i1?wx`5HiAJr|4j^D6v zGERQmzGL5IwER9_CVaqX`9u3J`;qqJ#zo5YC3w#=-JN~98_6V-{DM4B;tZK5ubWo$o&as4<(_Tw4VZ=d*9Vgh6P ziH!Z5m;;!^_`g-1$;@T5`W~}XPcsiNS-q5)!nYYO$jsG?YHebt#LkJSiCq%Y64MjA zCU#5ANbFwRID2{f>h>P1mMqM)G`9GA)0l8ihkI?fXWc!WX`bYt8|9gB&EYwOYaADz z8->0$E%BslYa{;alM=8EL=Wk)#7=J+7B;jp1X8q+nhP=OIAvXndWTqq&aOw$Zh%3Ho<0E z(vr_~W}M`UXWWf>X7>ZjYkk55(;35;aYYL^)9Jpu>Tr`K$Y4)X4o6eTBbjVJo zr71+!6cxyr9xZ`kDR>U8_xEg%7GD7VxhcwUYw?bfv)(%vnD(63)|TwpDYe>kV)E>^ z@VhRL+lX3dnHil^jjo*D=ltc`dKCDbf<{2O~r2^pT^Ggv%j<-$dC+k5ZS zG4gb#PI#eE#}-eOiYuO4DAY_{Q(`LF^?A#ahScjqs#)JIGR=*}(|i=uVo_x4edw%| zccvv9CD;`3<7~^4`Nh-o>}6Ueg{qnq5}FjMY*L6~l8>S`G?3cbP)~JH6^AC!+)^}s z!P4bRd_t2#c3Yy@0@b8Yh%MsNip=^tH5@z zz2+`#U*5iA;fmtD<}Yts-QIief~OBRE>vr4ws>zLap-iWsm^=1hSIMKMb$d4cppio zWS>s`v!S;C6!AH5r|LyZ=Pa5wbyDvs1-Q5^Us^PVRv&xQ*l-W>FG{sZIs?5eWUeuE zj>bqthj5JzK76Be5?Z0egGi42L%fZ`4gPgK+Cqu81(DoV5Xo)r`F519tq%o|Zsp(z2m@n^+lBAq_84_0u+bEXp*e(V4%uxEX*c^~s7=?G zwCB?eB^EeuiZ~zJqdneMG9k)LeUJ7IvNy`8giqHtNWIcOTZ`vQ4tvipaO;vvXKL$8 z=66cH)|Ydpr9QEsAd^E@GOfKAbc_SpTwlB}U;orY$bD^VuZ7ZBX3p5z^VJ;0U317^ zx~a#)z}Lbcq8H{{eY&=8Z100RrUffLXr^v#=^^u%x3@1@)V5^q!a2o@q;`uJWgNQOr-MFOtD zw$ojg=1TzC9jba#NNiH5@<}0zNj{3&sA1KH!mW#%NN7UMtwl=i&hoN);B9UO2|M4uM!!) zD&LwjEn^#s5A!YUumbzN4$I5%!@LYXqTuOU?zm9Bt@Xu6#ASHUMXjMNaoVWZW33Iv zM@lj!M|SGh4R!tIw=Z8zf0?~#MfIGvMJxL+6v_h+j%0dqTlI<+=}hl7!3S6hQ{Ylb zp|Lgg&@?vwkcmIk#UJYP4^HsQL;tn{t9f74M}d@wNpYWeT8#~HpQikS(-ZR0w=F8# zm|ty&C_G{BHYwIT6{!}o?$nC+3A!ab_-dAi645dO_A4kHdG6gN4M5=HMebJH+e@kd zOS=}>m93Lm^3cl(t~@%^QYYE2^)$`Gxjf(_oD-|`VIS+lLWTC2=TmiUBc1hD7I)wG zv);<$S=vrIiv|_C25;A8gME+# zbk+~lR`Q8QB6AA68P|=9-c$^mQaq~f(IYMw}kL5 zp&YzrpU$?1a%c_VTSNJ`hH$MRT&oXPANpH;=x6nzo!3Y0dR(CQW;*raF4`l ztqA6(-6#9!^q7v%4dXgKH#T;B4*t!P_weC^KhM6M`LSX;>+KHifj_TH(phgSq_Yj7 z-h!^lHbinF)L&gFkGk+2#)a8nV`RgiIU9_yY+Wd~x=`Qsp`OQue&Gkzq#w%18*Ah* zdJgn;p?>N@|H+1W&W8MkL3uVC@>?J1{V+V8^(Gzn&_BblJev*q%SQQ&;t%O(Lq4;i z-s>Z}=s7BfP%hb!-!R(E2Fod1AJPeyQ#Op1v%&7l`f+xeeY1jG2hIvp?D7EBMBoFEu zvPHWuoWHnDT320Y4RuY;J(=HhrbVXLk?qTuRC@BggTrF9(c)6q@fJ?&xAq@xmG(6&kG8kLwsXHd}Bj=V;fBKjKs7(rcU+w^acx);L-uP`wp4*1_jR{eQ(Irj`a$Z zd&6eS+Ltd}I@e8WGdDF?+Fx_yOrOohNhR|Z&R+$dxk8_kAC_UW3n#7PT3d@3FI>VL zdhv?(IZKz!6{<|8u2=htmCO~aY>zO3lcxGUbCxbzx@0k}W@X#*BNB6$E}5TbS+#tr zkKdO_ZQ7eIObSm*ELyl+S~$qSp0`)<98_%MoP zLdVxCL(ZP=ZO9>nBm`wc9$uL#)U}70Y{l|u(TcSV}t)#hwCL{B^O~Y86!F< z_-7n#h_fl+nyVRR2Anr8>e9`TUyNRAljp|Z*9e^HC4;9}3NVx&H!zPquyYQaf0XNN zh>1Z>oo9?~{@>1x{A;@KgeURc)!VOgvYHn2sz;jr0#S;_}uRkrhNB9~<|TiV;NL zeC_zhd;!JDrJe*4B5R8KN{z*RYvaDs*g7LRWL277XNrb+gw1i^W?1#igv^YI`?`LS z?u_V=oTI4gOwl2^#<;JvD?#+lH>0?}v@k&o%KI0ZS!c=)RpK8)4N9wvlS|X>=Zcy-&thN_g<~=O60oV_}#!aQ!^^_$F2&P0W!U(L2v#_0m4R<@wrQ z*()Mi*}p*JqN<+WSG+P!)zc+zY4)|zgl;g{YQq4oHVg!7qlxV3Wn$1*wZR~)4Fkp6 zVCdC0`)+}MfdPo*!L3u%>;=k-UG8pGs$xyMVr7tFwUK5ef@UQ`1=plXajj-mo@Q0f z9Iox`@u~ST;x(?X^R}HG3Hckoi0H|e@g({T3M^cu8FKRYvkI@ znljCbvOT%ZV(q_Xo!CmQt66!h`DWrlu776bu4X+Gsp!`Y-?*4QroS?*C}MY2)~1s~ zRuK*7T4gd^>r9sGcr%{s1lIg$*7@wjbr-V>*F9O;quq)gt_QH1N3)U#URb+xDAyHy zv#eR0b1YZZ=5RfgFPJqe+Rx?sBXbGYpPS!sWn~T58_kVeZ{1fh^ElTh&68Z8HP3Q=-u#X0YvvuU@0m}zeqp}g$~qXu){xe6Ew&|GAG1%h{^B`S zGFba+qC{C%6l}|tH2|#pZAdh5ZA?&x?#(~f$-L>;tf{c9ASq{+q2}AoKBg}vrCG6| z**VnT4-0onftqq_v=#K6EuLT5z`6!}iX;b0a?q2N5+A8D);W}@O7gL_v;@UEm64=a z#EQ2pE90iI+R9F9ojOzPIp>Jwi`1Tr+Ey-Mji^1OefbjAy0~rmA!_R4Llz&xdai`D zy2*rvZ`Pn0R$my_p-p2wiOX>-cn`TY=+;d-I`=c&UA_&R!q*P#rjAs_EtB^EKe2j; zpDWXR*$x+izjcSJxW2XnHMYZt6OUKAY5BxStj)|3&cy}&l+}`t1rr}`>Ob-6iNA{f z8z1*ijmrNgUdw-7quQx;=Rv!iH|^-@vv-}`I(x_AjcW20yH(HFq*2ZI%u(*XcH)iv z-&wsg(d=_%AeN|R+?{=if{k8Dy;oLj9XB;l)zEJJ- z%dL+PxzBPhIymlP;Om>Dco}(6yX0+XvF_$>>C$()y9!Q)#VE8 z?n28Kv`(t1T;Y3B+6=X1a_e(nh|lLDt(@ec#ybC?qW)vQp2%T-UDZy$mAbD({Le#M zeVttUwkE;R*`!1+b07NXy1I&gzW>GAUr)m2@liod3P%=R#A1g^bIucrPeu zO^J!xbh|ASutDQFYkz~EqmLJIr|y5wU(qIO!*lG`l}-`rSi6^JXa9)} z(7g7c&f{EHK@kafl3vJYWYEgty-;i8VO5QT&{)O|2;uhbJkSEj}Sgaqp zQ|s{`{xOR@?&D(eGBfw0Pcas=Sjdh#FM;~y-lxUAP2Kv|hc%yjgcu&lJ(zpc$D8|o z?xNho@iv`%ls4)tlXq~=zHoP^$?nHpB=J8<432`HmHQ*{Ny+6NcNAbmQsiFtJyNt? zPl=;bT?(y?2?+DKFA<09{ugRKR$2k`Qmhm@1&{T`pm%dGbRyxg>-u%QGxwIKcIA~@ z8w*(?qk4}h#cy3Ss-na{borqcq|||4jO8!E^G7-M8WM_FgaJ%CJwvJ$LLqsMh3-Hv z`HNa@Y^0XEffyLSdET9cNnI4Q8o43|pA}?J&~F{$mIv3<^S!;Ze)BCzT86Y^SB7EK z=*sOQX*;geK4jM@|r_%FU~F@e_$$ocGvOphTDj z**uSr0Co@KM~{}D@9nk1OF-ps`CgRA07%`0wkQ%ZYJ;v%cNxNmrboR`iw!-Wc*4v@ z6nE}l1?w@wargFXe^)=WD;bH0`0_EusJ{f1-gG1c`8e5|Qe`|p;?ifI zz`i0!2jp&%XXYIWKd7GLsUW#WxVePftGV07{u_c{tQBA(xTgV;78GmHSqHU+7$ZpX z)>Xc}gn%q?74@}P+l%6WCMSKdP>;TS_C#*GaD{vqf^?GFc=YeG?+h*kDcGvA+hHu% zxyuVw4$7T{L;G?)A$P0T)$Tz#y4;To@dz@1$sLmizZA$lL0f+!_oLh?xpTgh(0dk2 z&dZ(9nuudv$I!^~V4rlv7oPCX&*0^2H}CChiff@B@_ri!bS%f*JrZL{hxq>ExHrf_ zUWRSp(-A@IiKL0Qf+O#O1>!N0mZg-Uwo%$4?@>TE7E%R?6sY@ej3u0pqFW#?bGjwU zkLbIn_)mN~T1~_-A{I-Pz=NC);pcUdfcZ-SH{6v_{@1alXaOPvOY(6Hca)Uk_W2MU z0B0AX8&X{F$o;|30_6V26S@!y#-4w`?_!PoNuWP=2rLh|yTwW@~d(6%CcxQjho&@n#TW?jl>mp3NIyRC@VbLiq$1CtTpS31L1L?I5iI2?U)B<0K~6N2sd^gVpbUZmxpg1c|$ZU0Mpi zqL|(pDd^JRnJWg>h>oKs5MArvF2f44kebL-hs*0j z$s_X{4}p8rN0GZXw4*NOc|FBfT{ozY?n}Z&75Y~PnOFq=OG074d+i)}i$;O@oUu7f z9xm|jA$h+=-4>*1p40<{`A?a@S=Y%s_UI*{L*%aYW8awPHwMLKlvp~>(0+Bq1r8jo z+uJ(+%g=trkzK+v+faBv6SQ@A?`Qm+O~;5tAAn*uyZ z8Q;Z-v_l+W(RCq03T=Zurv z(HlrGtTA%Cl;mEM*`%J>Nsi|P7_>nbKWXD3&mTc`C$W7HqbnD9K$pF%RQSEbQ@fDS zj}q+{!5eeWT^*HSxGo$)oK<<9)Rh!)lE+IQM;rYzu`;V5 zhDbiSI`NWaxX6?d?ArG=evzIP>*f_7P~Iu$bH)tvTKHHOwJTScA?e9?;<(}=ROR@c= zFLh{{VP1@UZAMB#K8KiG@9*Llk5y(h0-f|IXH9yGa%~9O-`{0z&+z;p=U)Ti`pH7mYv(A>$U>IM9)R|w7;_ZBwbsz!RAtt94^S`{b^=&VYCpYV3 z4>8b{HhJHctE)>HeTn_-=Z9W&q_m`GW%lT`U@?YVN6| zOs+Tj7FroX`*KZorFlD#v7_|--M#I}Ym!&N^(?Fk=}75%Vux0h??vptRQMJ79^0YT z!-zsGD|2T!aD!jpIHqH%gc7H8W52E~kU&rfFYhBd$YUW9xh|ah5aHQ9gmNg6 zklwe`H5NPd96gCtk7P7*EBAm87Ju^_BHA?fJG3z?6nt3jFLkUfLVM}q%CI6ozajl9 z-?G;ftn^5>g%p{GE^b-6mL9zc+c9H6c>J;i>bj1nbVY zcND&U(T2C=>)z8wb?WjrFrPo^N9g`qVyAu!(aIYQ(bm-52z(!+P5X95JLb)0F)}aM zR?I)}o(ah)Wf}DzA6L-+E>-^<;CoSSt=Ms{%zU{4Az8& z{_gG62v=Cs=rCxI$GCaf(%-KaWkl<6Zr#C#zeqc}l>xMhu74tz@|2Dy)Y!i|)=43> zSo1GCJIG5bXMwt&NGasdA8$$=uk#E9KT;co&>rfvhBM49(|4TxOlcMDKZ#A+P|!#n z?E4MkWxY>$L*Bv5kLl5Tg?jP%bnmG*{JHw-_#58wvGCMYY6ah}pztPw5p*;|MoA43 z$|2OT8(oz!cJVna@p>rV%A*K3b3pDcUspiPrBnW_GXU+{9N$~^QxeJ#v*ef^Z&yHUReHCi(bhE_(O9>@sH*()XN*y_q}0P@9;Ry(%v zPaHiVuETu-*FC$LTiC=&&<%c@Ihm0AuEW#kef&a1>S(O)f39^$y~@MUQ}&NGbPgl=4cItt%0f9M=1eFp`) z4e}Rz=b4WxT64_X5O2AzjY_h^Ttc9S%B?@B%?BSNP)}CjIPO~WcmarUD}ZtN^)gYo z?K{%Br=T4+@W@MQ_wARXi!6WF7Q6bn8Y=X)4y|)T@~~zgw5?!CZYZM&=-OYf89Ug? zUf(&t&_cZyaY=QZKZSfRjC6zalhSkXMs3T5cfX;W(zI=$AM9oZ_-&=?<^I2Y>72I> z)BlRn-Y`HM)7eh!I7b<$%-bXR@ zBWM|S-(FIBC(a46Qnt>9bP!|bw{h<2UhIF@^O8Vo@NrKg@EO7NLP@P-Yb6Y!{)H95 z$dYtMhzx1CaZA>9(7q^ZUcNYZT5Y^F=?K(2opQ6&1(em0DU3c=? zSuS6;{+TG~&!4)OI?F7HUFJ`*7i0SO%j!zP{6D#{vOiz<8<&BoO}K9>f;J=|z5mU4 z_T&{rctgg|rxW9ZBr(br_%Ld58jac^}&)_WvI8EA($+#8OByDogB_yk!+? zwhKue-hA{cg!fQ*KNCtb=8Gj3)eq1s;?wc{Oo7-=+-Kt4iA(tE-l~7do&-e`=S6?8 zMPcs&xAVY;I}s#0?nJ;I1ZA=p!dO?66RWy(U%h{Uk@FgNYF>ri_>_NF103cCP$!=4a>^-RWVF2r0y%oS)TP?B9IR&%26;kYAd8^= z)|`~d$#ZsO?jgHF?hD(5<&$tZva8itdpPb$HJ17eX@Knwwl~<`9k5$~-2&_usz~p} z;k|ovO6WeE|2Lnrnl6RcK6*UoPhG3Bq?sknET?p4IRP`Pe}}sfcazF;&QOYThEnWt zk&;sBC*^b-Iaq_c9d`%rPTXC%yK&EO9?7$~=Wx&CUckMG`x|eL2dLYS0Bdl!SXgdy(-maKDfB0YH zGW@(xGA`uaZ_=-;HKfG<95aEhQyu0eRteU z+#a|+aeLur;r7Mthua@_0PY}M8*Vmk4sI^49XAg*AGZK^A?_O0$0Tq?xMExnTu)pt zTnVl>t`tY!g@eIxFc=O7!@*!U7z_u4;b1Tv42FZja4;AS2E)N%I2a5EgW+JX=$9GX zcgM}d?Sb19w-;^}ZeQGfxczYl;10sI;b!CJ;O64mar1EVaSL!4;;vDH;b1Tv42FZj za4;AS2E)N%I2a5EgW+H>91Io?%HW_34$9!53=YcRpbQSm;Ghf+%HW_34$9!53=YcR zpbQSm;Gm2;D1(DCI4FaIGB_xMgEBZMgM%_SD1(DCI4FaIGB_xMgEBZMgM%_SD1(DC zI4FaIGB_xMgEBZMgM%_SD1(DCI4FaIGB_xMgEBZMgM%{8%kHO=aFB$9Bpf8+APEOa zI7q@l5)P7Zkc5LI93JS>rZoX6ZB*NmHlYr(bRcEnA_O~LJqn~K{7Hw`x( zw<~Tp+zj0AxS6;;aC_qR!p*|%i`x&kKkfkBLAW;DY}_2&TwFVD9&SEv0q#QFHEKAu zGaRmmQ#-?{o#E8ZaB62bwKJUB8BSRYr*?+hxzx;RH35rk0v6c>PSxzkS?>LD&A3Up z7F;WCN8DuG6x`0ZskmKm({R&qyW)1k&A{!Bn~B>4wLgC>#xiqoHs#6pn_%(NH)V3P+z};g-Wy z7Ot{zm8Fff(%Lqs-MQWDHpjwE@x`ax&2FUZW;ac>tJR!5cQ||69V&a;T`zmu{Y`eW zdtG+3%emd`IJcGE>^Q5H-RyK^NJM-Rywa&5qMj+0BlV zPT9?llSSFhjx#~o&5jd3+09Nr;`XuAAG&?)^uOFbcKQ?cvD*god|OVuG@N*uq4lz- z9cOE@ryZwjvZoz8yRoMoA=%T8^V!+cj_~YhN2@-Fv&#p$-RwA9liln%#r;_RHFDBq z+U;h?+3oCR$2pnoX2(gH?(E2B&W-#f=VH2(BU|O<$jNeY>7)e>+af zWPdxeo7>-x)79DEjvmDRcAS{W{&t+2$^Lfah5hX~FO&W4I3bh$?KlyW{q4*Wx3isD z=60|%tK1HD<}kN|ojKg?U}uhSJJ^|{=&}7&6|Jv|)>lRAtD^N)(fX=reO0u+Dq3F^ zt*?sKS4HcqqV-kL`l@JsRkXe;T3;2duZq@JMeD1g^;OaOs%U*xw7x1@Ulpydiq=;} z>#L&mRnhvYXnj?*zA9Q@6|Jv|)>lRAtD^N)(fX=reO0u+Dq3F^t*?sKS4HcqqV-kL z`l@JsRkXe;THnXCzFJz}a9ZDRTHkQ{ZScq7zJoiKxnsxW|JQnz5#CU^90HfU;IbE7 z_JYd+a5(@j2f*b3;j)yvETt|>smoI8vXr_kr7laU%TnsHl)5aXE=#G)QtGmlx-6wG zOR39J>avu&ETt|>smoI8vXr_kr7laU%TnsHl)5aXE=#G)QtGmlx-6wGOR39J>avu& zETt|>smoI8vXr_kr7laU%TnsHl)5aXE=#G)QtGmlx-6wGOR3A!AW25S1>!HxGaLpBDgGq%Obceg3BVfEP_jBUUL6}%aL%I*L_{q zWeP4+aG8S36kMj@G6k0@xJm!sg3Aas1bX<9x-#GG|>A-foOK zxB%DicBf{zD@~=+*8*SU;S{*8;Ekb)haGh^e64nIjylE1?BO_m)UpCi2fPb=e2hN8 z@px)@6JGOCjl9>Z*?uG7jiK*EGwRF`e;nT(ypegx$GI`|ahmSZjpJkVqkcfW-snp# zeGc#i9v;P8^-)&^nAy^=gdP1QUrt|h5HvSCnwoh6-{Ij=*L97roy-!PY3a)xmH&A- zeQ^Q*b>VoN@vsg*>fUc2f6dR~?h2pVQ4hr6r-=X2fOqio9h<&l2ajULan$R9 z;@$Mc1$>;w!K2oB`fq}-*@x7aD|A1BKl5;^ltvWN94QY;cJFXVO#mOLAv?&^Cd9! zzMc5=;8^rv>MrmPr5=|&{IMIjGtI4mK927W{@;u%wuq;$d0aka|VQ zFZE&!rko?2C%s;&(JMVo2L0R>yfHNKu&Iwmn-sR!=$@ndZUBD~!v`3QaXE1GKCRK4 zxMv^de+F+5&k`R`9N!(hG3iR!5a-6w$7#AtH;#|fj~?Pm!~aGnBZ$5=6Bl&K=&AyK zbn5>SykK`X7t72sXIyGS26g@@YHXY^btND*1-`z9{>HLA0GYW=x6a=JNllDfIHLQ z7{bQ!-ND_(-yOZfNAYh=*f`C`gpJd04BSmVt7jF;t$LQP6UuW<^^5}Cp=`T}XLKC@ z8Zo@>!&g5*AAHKgqd!0wOxO^vPC&mt;6Ldab~M!`8`5kHzIrpl_V;0{%VY4y;J=J! zST}LT@e!P@9$#JU=&M_+Hx`~4=tp!48{u6%5j-oiy83|Xxe{W=|0USPIrYoqtWCqw z0WMYQ_Td67_^BJ><1}%&dSmjuF+9d;4kka#d>*P-178y0qrWD6JoKl8uxG}?UidX( z7xo7sp06ABI>KHR!d|`+u%o}((}z%ZxV!I<)z1t3D9=xI0ZX5a;qMJ_9N!)MzZqvd zEtj7tpK<)gz;RyU^xfgnq1CUu60A{9=jP!!-oc**ny-nkDXuB486aT?b(n9jh>f#G zI)9$W;Lx1InRD z2@aZR`c!)m+XD*51pN-)3Yw5KGICDql^2}8kBy;BG^xK60!29|9csPyy zQ(L+roOw5jC-b4R|NSqsE|Z90VlBb-4?dd}@D8dSR9oThnerHXhr_sE=7Bhm@%(sy zp&6DLk*O9an;Gx%nTh@`Sb;OGnW?pdm_rF$4N|Q z#^4{s;0p`&5-1e2Gi3gzD|{Cq@D`M(~)gpJiv<}>06 zUbV%AIBN$0hq~yl%)7;JUr4L=o4_&IUK@j1wYEL0){rWEvsuP{Am?fJ=bX)DoT0f~ z9jz9tW7G%gaNSGyQtz-P?eFSc{RaO(>359P53q8qRKLWE$D#TSv$feq|C=>sqgY$! zR+YJvQtM2yspsFrjOE{xRbdUL7puZ1vf8ZKw3z;8N3(NSXEw-8XPwtz)_3h~wle#g z{Y)h%sJ0RB9MjHfwfX#0W}#V5?5oUC#CME2j@4=>n3GMDIfb=nt>$!do|$YeFh3@y zpO~MqX6-Wb8?!&F&DIe54*sjmUFIIM+T6?k2-ce2XO5KBW=ETc&0kp0_E+(@mOf#!H5_%`S6WkA0`BmE=b3t6v`&_C8c26GYL>-5l< zab9mfeGO|k60CE)iPgF{>qk^iS%ceKKgG8R(`6-YZ@rFld^gp9r==R#Qi*|<%J)nO z)^;S^iM4LE4r@FTv^`cEnKCm#W#p{iDpoX>t0`uv8Oqx35oQFdA85_2)T%bsTx(2? z+RUU)Ms4X@w%Ud@lUY?kYu*n0_GWwNCzuIpN3(<30s4t%BHs`-n`SlHOfr+8X*I2^ z65i452+aCQXm&O`t1)hsB`NM^b_2hMVGWwu%j^a0P7xlUjYhS~PWctMZq}Xm) zk!2Q`1;7WJMXU>4VwMu>P_vwPR++zn#rG+0wZjUxcL-`$ZEb$y~jwkF1<^*U? z>1_^@ZU4v13uH7349jk6OS-wo3mNj{C#sitAH*r7pSSM?)l~XUzp2*S?`JO73NCdUzuM4|JwYT)!J8aw($UZ<27nqb1f$v z4>iB#gySM}ler1so6XI{aErMGj63sqnz_x~M%XoGjjA`do7-8jP9MhiPIDLV-R5rK zd(1s*7xQ~_FBo?^atVFB7xvz|C}CZ|d) zU6r+s+G$$9}Y_#pHIB&A^?0nVVE?@=Fcx2hZYLY#~9-_8G zqOAbG(yk<)Rjf)++10EN8Yyej``g1=DKt`6sHg0atQZ<8>(mF?Z?jrxYkQnMj#Y2R z+v8P@J;9y;e4;%O_#}HWt5i?5r}AyzY4$YLU{ANF^X=dn_6*gGtUMF^S@tZ|V$Zf` zv+nBq_8jQXwLjo{LS!gcWGG)$K5QRB$r@cIlC+0N(jG|CE!cys9C=!VG~G&VCz5n4 zBq`rB@;%`QR^DxkEY%F(YSgAGjZ`fXsj5Y)P7$e^6sc-Os#=k%+aOgJq9G6FKS&+I ze;c(3-8cwYyMpUVwVDb$jQ=+3aI~dGTOP~xIQ4VVx|DwrQus1r{{{b@MHXw3#e+o_ z_ZL~bgUI5c$l?e1it$19DEWO1x!hai^0p$Er;1!I6S+K6GW}3Oxo;*CdIgfb z7n1#aV!iu_A(DN7NcNc`*~|4k`aV|cxvwiqMY7Kk$zB?h?EZU; z1hz%7njl|YB(OpH((C#m(-R`on?$CMWA*wb>OfYnZ_3vQ?wgECvxV6Lspn*UU)IBK zrP3y8lE_vk_lIL`Yz@B3RDs#XY@-ek9WW4^W3-winqW)O1TCToGNK6@oQ*>$Y#grG zIJ|P&&U}lj(+B&BKG;(9!9dXm`-?spV_Hm$8Yuc;3|7lz=%<(|r0aCUK+z35if$N= zW#n|j3^RlH-8Utb*f%qQ-D&e%ineGGZ86!|P2kQ99?oa7^g)t@)b*^Xpsi&uH%T)X_0}V zMRvqyI*I(BY)+<>oJQ%3J$9;U6TLEA^vaf^SB8sT*;4dMt>~3L=#}rQt@&!;JhYV4 zF8xHiREc)k8trn4>WMA)Gw_$8U3!Xk>4SE;0{BXFOdruP)uLnM`vSGO=$P@MV|t=v zeoNTv%yrOTZ>|Tv!Q24+JM%kL50vFm#P(g(?|48 zPiH?u@AOR{(KnlmzS$b>@-Xo~Vjh8)N6|F>&@_)h!?z543+ePttLU4}(KJuv`wW_< zr~A5r_@6`H^y3?c7trWV)AU2rti$(Z^i4m}H$6q)^h4kL9s1YJ8&JN9*6AZ!XKT?q zJ<&QJf^qt0bM(!p#PAvVrb6`1c=K=bZ*t?oo$zNTZ`XnqIu9C_lNLj6S5z6xgf00}-70g8v>QV`Hs=%juSi)W;*Ea=!px_Ub zum?)m2D#3181n!!8D7D!k~c&8}RlT@C7!g+^*wOTD8xT`J?G z4SeC~)ty40QJ(^zA?@J|@%_HQ-}kV@la@TEC6!^4=V1=7?sKrZPvG;=v|8UQ^!G|y z_X=f3;EacbmyFPi7EHDJh)|;iKUyf4$#t~QEbx>Jv%Vx8!=Eua~g(63Xp_rVSS; z&#-Oo>S3vc9#Vs6NDODVl2^9~J}dZJgz^@t5oza)Y>7v2Av9Y^Y`^xs)xr8G!O!+r z!7RguqL&Hg)NmaSW>10LOsdvR62snt@h$L0foI5dXQA=6^QOZvZkJHv+bnR4PQl~j z4#xI@Mt|F1B@f34{$ZhfL-211yoll|hUyr(eI!0*5x}L7y7I=_c zhxx0zADW*EJVNNVQJ;Zn64=cbYQ09_H4aukbg=rNz+NJi=(nNSL?}lIMV@y~b>& z@6`|KCkgS2ew+V?`U~cW5^D3dwnZz=(}Qk zZ<}LgEm}CgO~1Qn>6}ISL%DwDu13kVSgxgV9k688;^k)0Qf{VV>GHWt%&se3D#KSS zTr$s$T(KgZF=?)~X3UCJvsakySFBpL!ZhjkVW0D1n|7a^Gy|F^?~yd)?Io&L<324( z{d{xd%%uIWdB#lOog4Szy36#b$wc|Isgsh4Ni(MJ0%j&OTxaZ@Oe~U;)I~pFd`h$l zb|!K6q7lqNayQJl34Xl4n@QeZzwYm*Dc~mu`qJS4aPYq;+{Xm`nsC20+&L%B#n0Y4 z{(eKaU+3>`c24}GaF=*|A`QML;jZ$}c5R@)*XKij;Ggwsc{ch3>d#FopagSs z*O_VNAQ!*dTCPdCZYI~Ea&>P}G_#}bDjJCKw}VUN%6k^zP30(fIpOZ*v|bED=2!>ub-3Fv+MWEkD%EP^|CUeT?!$4g`?t3s7+YekB zU%L(@)=iN#j>_k-K;_O3+8DZ$F6eY(S69M`JxNa|_Bx;$SD&664s}QYYBE zf$KDO{nCjUl#Qll9F4=KmF{r`_X_URXQE2!o-Y^sQY8kyZlCE?k>H2g*r+Z9LeXSb>4zQcq zA$AEfhFM!-huJF2_pi+T>BOF#*@rM`633`5 znX`XWzlA)0N58Az)9>ql=nwQikl{r&vxk8t&8=x2 zPpfScngL^QEo3-tixBu6OIA6%C-D{T)r$-?eFJ z&s$Ry+t?9yTk2z!P1(`ZRt@zr{(pccjkKOZ%hmQ^xy}PR-a)**p$9XMYwWSK2?O5E z7&r;3ZGY<|qh@TcnN`;8eWL9#w247T6O*V;Okf|lOYG&en(KhBwl~;Y?Oi}?>^=5= z`!LW0w56x)^O6p!@lU85)E)Xt_I3j{yD(e!C#+$I*XlU--Jma%%6P8ifZ0@cKMt(R zPnE5aK5du*-5ZRhC6&;QOB362b?w4YBN3R5)yy@XNtoWY56>DMt?kco$Q^q*4%ujt zAxI@{c@Jl=wKsCT(K=n%(+n|p$_G0cA*`Je!4W+|-FH?s8JDs;UhM6~H3G$41n72W~hCD0D^ZPE(yoD>W zTflMJPOyA~ZnvbR)Y^%5C*TU&Or34Ce3NdsqV;5LljYlVo1`7p+h)r*>UJnCYK)y^ z`Bt4iKboCxS}fnJ+e%v5INNIZcHIuAy*1b!nH!4sPSmn9qGrEBM$|S3Z`$qDL75cO zpUY{l8M}j}{}K8z`gUO_#gBPA;^>D9y_@6j_vQN^Itukc)Bg-R?Lg9#(uq0U#Yg0`R|d8d9PQaq}EfkiXqIWHkwA}>ds?k zv_{^4r6pe(={L2^oXz81iFvg$yux9Y`WxZw&bkc{)pX=R@?n0cdOZ%jaJQk zIql40^muvCJCByk+hpF2vR@;1pWC(3^_4x-Hy+iw<3;PcUAwVs&iRU z7zm=MvC7v*P<$+es37=Vu2gU-_?_Zw<#RENh>H3Ho?AMLS>z_U-J!ZF>FNs|x_JXD zB6GAgc(4ulidbE29z5SQ{37@zcya7|(P;~rnY|Fny;vqA*MqMG-weJX9xIM#zx2S5 z>XL0)&c|6-Itt&rzf!Wtzw*BAv3|D`xHD#nL3S3lqvx@bI{k#vq8i9o;YBiv{Mv$d zXPFt=jDGXfuEC?viTX{Y_6&w7!aTqOqrB?3z^qGWq}~mt9ZUyQd&|_{VdKZn#;Tpv y&GA&_vr1?9rGGTgJSae6FO!`OM^m{wo(?97e05Z!h)hyq#!cFU{FHRXh<^h$!Gv=F literal 0 HcmV?d00001 diff --git a/addons/phantom_camera/fonts/Nunito-Black.ttf.import b/addons/phantom_camera/fonts/Nunito-Black.ttf.import new file mode 100644 index 0000000..310d096 --- /dev/null +++ b/addons/phantom_camera/fonts/Nunito-Black.ttf.import @@ -0,0 +1,33 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://c4mm3of2mc8o5" +path="res://.godot/imported/Nunito-Black.ttf-2a374efbc207a97a99b8c70bdc4b7cbb.fontdata" + +[deps] + +source_file="res://addons/phantom_camera/fonts/Nunito-Black.ttf" +dest_files=["res://.godot/imported/Nunito-Black.ttf-2a374efbc207a97a99b8c70bdc4b7cbb.fontdata"] + +[params] + +Rendering=null +antialiasing=1 +generate_mipmaps=false +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/addons/phantom_camera/fonts/Nunito-Regular.ttf b/addons/phantom_camera/fonts/Nunito-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..dfd0fcb40ec761ccced488d783fc77a4276548db GIT binary patch literal 131736 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

Cg|u*xfjw`p@N!J?^468a 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 void: + _gizmo_name = name + + +func set_gizmo_icon(icon: Texture2D) -> void: + _gizmo_icon = icon + + +func set_gizmo_spatial_script(script: Script) -> void: + _gizmo_spatial_script = script + + +func _get_gizmo_name() -> String: + return _gizmo_name + +func _has_gizmo(spatial: Node3D): + return spatial.get_script() == _gizmo_spatial_script + + +func _init() -> void: + create_icon_material(_gizmo_name, _gizmo_icon, false, Color.WHITE) + create_material("main", Color8(252, 127, 127, 255)) + + +func _draw_frustum() -> PackedVector3Array: + var lines = PackedVector3Array() + + var dis: float = 0.25 + var width: float = dis * 1.25 + var len: float = dis * 1.5 + + # Straight line +# lines.push_back(Vector3(0, 0, 0)) +# lines.push_back(Vector3(0, 0, -len)) + + + # Trapezoid + lines.push_back(Vector3(0, 0, 0)) + lines.push_back(Vector3(-width, dis, -len)) + + lines.push_back(Vector3(0, 0, 0)) + lines.push_back(Vector3(width, dis, -len)) + + lines.push_back(Vector3(0, 0, 0)) + lines.push_back(Vector3(-width, -dis, -len)) + + lines.push_back(Vector3(0, 0, 0)) + lines.push_back(Vector3(width, -dis, -len)) + + + # Square + ## Left + lines.push_back(Vector3(-width, dis, -len)) + lines.push_back(Vector3(-width, -dis, -len)) + + ## Bottom + lines.push_back(Vector3(-width, -dis, -len)) + lines.push_back(Vector3(width, -dis, -len)) + + ## Right + lines.push_back(Vector3(width, -dis, -len)) + lines.push_back(Vector3(width, dis, -len)) + + ## Top + lines.push_back(Vector3(width, dis, -len)) + lines.push_back(Vector3(-width, dis, -len)) + + return lines + + +func _redraw(gizmo: EditorNode3DGizmo): + gizmo.clear() + + var icon: Material = get_material(_gizmo_name, gizmo) + gizmo.add_unscaled_billboard(icon, _gizmo_scale) + + var material = get_material("main", gizmo) + gizmo.add_lines(_draw_frustum(), material) diff --git a/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3D.gd b/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3D.gd new file mode 100644 index 0000000..6e62c1f --- /dev/null +++ b/addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3D.gd @@ -0,0 +1,11 @@ +extends CustomPluginGizmo + +var _spatial_script: Script = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd") +var _icon: Texture2D = preload("res://addons/phantom_camera/icons/PhantomCameraGizmoIcon.svg") + + +func _init() -> void: + set_gizmo_name("PhantomCamera") + set_gizmo_spatial_script(_spatial_script) + set_gizmo_icon(_icon) + super() diff --git a/addons/phantom_camera/icons/Chevron.svg b/addons/phantom_camera/icons/Chevron.svg new file mode 100644 index 0000000..8cef3a8 --- /dev/null +++ b/addons/phantom_camera/icons/Chevron.svg @@ -0,0 +1,3 @@ + + + diff --git a/addons/phantom_camera/icons/Chevron.svg.import b/addons/phantom_camera/icons/Chevron.svg.import new file mode 100644 index 0000000..fbec77c --- /dev/null +++ b/addons/phantom_camera/icons/Chevron.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://y4mdbb804sw0" +path="res://.godot/imported/Chevron.svg-93f7d046492ad140824afb8ee9e4ac3b.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/Chevron.svg" +dest_files=["res://.godot/imported/Chevron.svg-93f7d046492ad140824afb8ee9e4ac3b.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=2.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/PhantomCameraGizmoIcon.svg b/addons/phantom_camera/icons/PhantomCameraGizmoIcon.svg new file mode 100644 index 0000000..ac9c6c5 --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraGizmoIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/phantom_camera/icons/PhantomCameraGizmoIcon.svg.import b/addons/phantom_camera/icons/PhantomCameraGizmoIcon.svg.import new file mode 100644 index 0000000..379514d --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraGizmoIcon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://r1je7iad5kby" +path="res://.godot/imported/PhantomCameraGizmoIcon.svg-ac3a63e577cdd67a63dfefb53ff46c7f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/PhantomCameraGizmoIcon.svg" +dest_files=["res://.godot/imported/PhantomCameraGizmoIcon.svg-ac3a63e577cdd67a63dfefb53ff46c7f.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=0 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/PhantomCameraGizmoIcon2D.svg b/addons/phantom_camera/icons/PhantomCameraGizmoIcon2D.svg new file mode 100644 index 0000000..5038471 --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraGizmoIcon2D.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/phantom_camera/icons/PhantomCameraGizmoIcon2D.svg.import b/addons/phantom_camera/icons/PhantomCameraGizmoIcon2D.svg.import new file mode 100644 index 0000000..09e45f6 --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraGizmoIcon2D.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b671h5enwiljg" +path.s3tc="res://.godot/imported/PhantomCameraGizmoIcon2D.svg-5d7dab204f188a4185c9a05ae4e57434.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/phantom_camera/icons/PhantomCameraGizmoIcon2D.svg" +dest_files=["res://.godot/imported/PhantomCameraGizmoIcon2D.svg-5d7dab204f188a4185c9a05ae4e57434.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +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=0 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/PhantomCameraGizmoIcon3D.svg b/addons/phantom_camera/icons/PhantomCameraGizmoIcon3D.svg new file mode 100644 index 0000000..f84f1ce --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraGizmoIcon3D.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/phantom_camera/icons/PhantomCameraGizmoIcon3D.svg.import b/addons/phantom_camera/icons/PhantomCameraGizmoIcon3D.svg.import new file mode 100644 index 0000000..eabca0c --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraGizmoIcon3D.svg.import @@ -0,0 +1,38 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://u5tk5jsy6626" +path.s3tc="res://.godot/imported/PhantomCameraGizmoIcon3D.svg-f1749265faef32688ef013796d030703.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/phantom_camera/icons/PhantomCameraGizmoIcon3D.svg" +dest_files=["res://.godot/imported/PhantomCameraGizmoIcon3D.svg-f1749265faef32688ef013796d030703.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +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=0 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/PhantomCameraHostIcon.svg b/addons/phantom_camera/icons/PhantomCameraHostIcon.svg new file mode 100644 index 0000000..acba5fb --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraHostIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/addons/phantom_camera/icons/PhantomCameraHostIcon.svg.import b/addons/phantom_camera/icons/PhantomCameraHostIcon.svg.import new file mode 100644 index 0000000..3862bd8 --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraHostIcon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wmf1162mnoog" +path="res://.godot/imported/PhantomCameraHostIcon.svg-97309b98913e7760fc2cc984f77a836d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/PhantomCameraHostIcon.svg" +dest_files=["res://.godot/imported/PhantomCameraHostIcon.svg-97309b98913e7760fc2cc984f77a836d.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=4.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/PhantomCameraIcon.svg b/addons/phantom_camera/icons/PhantomCameraIcon.svg new file mode 100644 index 0000000..b3297bc --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/phantom_camera/icons/PhantomCameraIcon.svg.import b/addons/phantom_camera/icons/PhantomCameraIcon.svg.import new file mode 100644 index 0000000..4330867 --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraIcon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b5d72pljpr1in" +path="res://.godot/imported/PhantomCameraIcon.svg-9ffbadad50d28833b951e45d8f266e31.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/PhantomCameraIcon.svg" +dest_files=["res://.godot/imported/PhantomCameraIcon.svg-9ffbadad50d28833b951e45d8f266e31.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/addons/phantom_camera/icons/PhantomCameraIcon2D.svg b/addons/phantom_camera/icons/PhantomCameraIcon2D.svg new file mode 100644 index 0000000..665f311 --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraIcon2D.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/phantom_camera/icons/PhantomCameraIcon2D.svg.import b/addons/phantom_camera/icons/PhantomCameraIcon2D.svg.import new file mode 100644 index 0000000..84b8477 --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraIcon2D.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c88qnl38ej6nr" +path="res://.godot/imported/PhantomCameraIcon2D.svg-ff639bc802b50f88263b8dee8a265dab.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/PhantomCameraIcon2D.svg" +dest_files=["res://.godot/imported/PhantomCameraIcon2D.svg-ff639bc802b50f88263b8dee8a265dab.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=2.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/PhantomCameraIcon3D.svg b/addons/phantom_camera/icons/PhantomCameraIcon3D.svg new file mode 100644 index 0000000..f745970 --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraIcon3D.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/phantom_camera/icons/PhantomCameraIcon3D.svg.import b/addons/phantom_camera/icons/PhantomCameraIcon3D.svg.import new file mode 100644 index 0000000..0a01077 --- /dev/null +++ b/addons/phantom_camera/icons/PhantomCameraIcon3D.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ce6jv7etypg8b" +path="res://.godot/imported/PhantomCameraIcon3D.svg-2bc62e479ff60e942df3edb50acf2cff.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/PhantomCameraIcon3D.svg" +dest_files=["res://.godot/imported/PhantomCameraIcon3D.svg-2bc62e479ff60e942df3edb50acf2cff.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=2.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/Pin.svg b/addons/phantom_camera/icons/Pin.svg new file mode 100644 index 0000000..ada9864 --- /dev/null +++ b/addons/phantom_camera/icons/Pin.svg @@ -0,0 +1,3 @@ + + + diff --git a/addons/phantom_camera/icons/Pin.svg.import b/addons/phantom_camera/icons/Pin.svg.import new file mode 100644 index 0000000..3a2e1bc --- /dev/null +++ b/addons/phantom_camera/icons/Pin.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bs431wfbauixi" +path="res://.godot/imported/Pin.svg-e2d0362d47a5481549ac5fa1bd0f6a94.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/Pin.svg" +dest_files=["res://.godot/imported/Pin.svg-e2d0362d47a5481549ac5fa1bd0f6a94.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=2.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/features/Follow.svg b/addons/phantom_camera/icons/features/Follow.svg new file mode 100644 index 0000000..6ac5767 --- /dev/null +++ b/addons/phantom_camera/icons/features/Follow.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/addons/phantom_camera/icons/features/Follow.svg.import b/addons/phantom_camera/icons/features/Follow.svg.import new file mode 100644 index 0000000..5cf361b --- /dev/null +++ b/addons/phantom_camera/icons/features/Follow.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b8sogykt6nr4w" +path="res://.godot/imported/Follow.svg-20727eddb81c29f51080d89970d3deec.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/features/Follow.svg" +dest_files=["res://.godot/imported/Follow.svg-20727eddb81c29f51080d89970d3deec.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/addons/phantom_camera/icons/features/Look-At.svg b/addons/phantom_camera/icons/features/Look-At.svg new file mode 100644 index 0000000..7bda1b6 --- /dev/null +++ b/addons/phantom_camera/icons/features/Look-At.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/addons/phantom_camera/icons/features/Look-At.svg.import b/addons/phantom_camera/icons/features/Look-At.svg.import new file mode 100644 index 0000000..26fc6c4 --- /dev/null +++ b/addons/phantom_camera/icons/features/Look-At.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c842m6725xuv2" +path="res://.godot/imported/Look-At.svg-1406876d1233f3264e9f8a21e2b6b1f9.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/features/Look-At.svg" +dest_files=["res://.godot/imported/Look-At.svg-1406876d1233f3264e9f8a21e2b6b1f9.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/addons/phantom_camera/icons/features/Priority.svg b/addons/phantom_camera/icons/features/Priority.svg new file mode 100644 index 0000000..4d8e91c --- /dev/null +++ b/addons/phantom_camera/icons/features/Priority.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/addons/phantom_camera/icons/features/Priority.svg.import b/addons/phantom_camera/icons/features/Priority.svg.import new file mode 100644 index 0000000..62d92f6 --- /dev/null +++ b/addons/phantom_camera/icons/features/Priority.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cblr1js4af56m" +path="res://.godot/imported/Priority.svg-53e78ea3f4625745c7696391c34656d0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/features/Priority.svg" +dest_files=["res://.godot/imported/Priority.svg-53e78ea3f4625745c7696391c34656d0.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/addons/phantom_camera/icons/features/Tween.svg b/addons/phantom_camera/icons/features/Tween.svg new file mode 100644 index 0000000..5b05a50 --- /dev/null +++ b/addons/phantom_camera/icons/features/Tween.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/addons/phantom_camera/icons/features/Tween.svg.import b/addons/phantom_camera/icons/features/Tween.svg.import new file mode 100644 index 0000000..f42f5b6 --- /dev/null +++ b/addons/phantom_camera/icons/features/Tween.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bjuso2kbsicbh" +path="res://.godot/imported/Tween.svg-fb2fdd7fcf23c0b1f2702a06d00f0546.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/features/Tween.svg" +dest_files=["res://.godot/imported/Tween.svg-fb2fdd7fcf23c0b1f2702a06d00f0546.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/addons/phantom_camera/icons/features/Zoom.svg b/addons/phantom_camera/icons/features/Zoom.svg new file mode 100644 index 0000000..4335ce0 --- /dev/null +++ b/addons/phantom_camera/icons/features/Zoom.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/addons/phantom_camera/icons/features/Zoom.svg.import b/addons/phantom_camera/icons/features/Zoom.svg.import new file mode 100644 index 0000000..9e67fad --- /dev/null +++ b/addons/phantom_camera/icons/features/Zoom.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://oxksi2r6mjtp" +path="res://.godot/imported/Zoom.svg-fb4bc1d9ca6c467b16ba249b238b7b70.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/features/Zoom.svg" +dest_files=["res://.godot/imported/Zoom.svg-fb4bc1d9ca6c467b16ba249b238b7b70.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/addons/phantom_camera/icons/misc/PriorityOverride.svg b/addons/phantom_camera/icons/misc/PriorityOverride.svg new file mode 100644 index 0000000..de7fd01 --- /dev/null +++ b/addons/phantom_camera/icons/misc/PriorityOverride.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/addons/phantom_camera/icons/misc/PriorityOverride.svg.import b/addons/phantom_camera/icons/misc/PriorityOverride.svg.import new file mode 100644 index 0000000..d78acf5 --- /dev/null +++ b/addons/phantom_camera/icons/misc/PriorityOverride.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dy8eifa6aw2en" +path="res://.godot/imported/PriorityOverride.svg-e76e07f4bbd98169f119e17fe5f2f03f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/misc/PriorityOverride.svg" +dest_files=["res://.godot/imported/PriorityOverride.svg-e76e07f4bbd98169f119e17fe5f2f03f.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/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg b/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg new file mode 100644 index 0000000..59efad4 --- /dev/null +++ b/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg.import b/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg.import new file mode 100644 index 0000000..e8fb35d --- /dev/null +++ b/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ccnsrg8hq74p2" +path="res://.godot/imported/Camera2DIcon.svg-300e6f57281180711c5ecf391104d4ba.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg" +dest_files=["res://.godot/imported/Camera2DIcon.svg-300e6f57281180711c5ecf391104d4ba.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/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg b/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg new file mode 100644 index 0000000..2366c3f --- /dev/null +++ b/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg @@ -0,0 +1,3 @@ + + + diff --git a/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg.import b/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg.import new file mode 100644 index 0000000..79708e2 --- /dev/null +++ b/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dkiefpjsrj37n" +path="res://.godot/imported/Camera3DIcon.svg-4805c46004db1c89cc9443dd740693f5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg" +dest_files=["res://.godot/imported/Camera3DIcon.svg-4805c46004db1c89cc9443dd740693f5.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/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg b/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg new file mode 100644 index 0000000..87e3f79 --- /dev/null +++ b/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg.import b/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg.import new file mode 100644 index 0000000..364c4ed --- /dev/null +++ b/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg.import @@ -0,0 +1,37 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dk7omm0x44suj" +path="res://.godot/imported/SceneTypesIcon.svg-66e2255bd3398007bec03a5cbfa4d0aa.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg" +dest_files=["res://.godot/imported/SceneTypesIcon.svg-66e2255bd3398007bec03a5cbfa4d0aa.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/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd b/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd new file mode 100644 index 0000000..d5a0d22 --- /dev/null +++ b/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd @@ -0,0 +1,46 @@ +@tool +extends EditorInspectorPlugin + +#var _phantom_camera_script: Script = preload("res://addons/phantom_camera/scripts/phantom_camera.gd") + + +# TODO - Enable again once work is resumed for inspector based tasks + +#func _can_handle(object) -> bool: +# return object is _phantom_camera_script + + +func _parse_category(object: Object, category: String) -> void: + + var _margin_container: MarginContainer = MarginContainer.new() + var _margin_v: float = 20 + _margin_container.add_theme_constant_override("margin_left", 10) + _margin_container.add_theme_constant_override("margin_top", _margin_v) + _margin_container.add_theme_constant_override("margin_right", 10) + _margin_container.add_theme_constant_override("margin_bottom", _margin_v) + add_custom_control(_margin_container) + + var _vbox_container: VBoxContainer = VBoxContainer.new() + _margin_container.add_child(_vbox_container) + + var align_with_view_button = Button.new() + align_with_view_button.connect("pressed", _align_camera_with_view.bind(object)) + align_with_view_button.set_custom_minimum_size(Vector2(0, 60)) + align_with_view_button.set_text("Align with view") + _vbox_container.add_child(align_with_view_button) + + var preview_camera_button = Button.new() + preview_camera_button.connect("pressed", _preview_camera.bind(object)) + preview_camera_button.set_custom_minimum_size(Vector2(0, 60)) + preview_camera_button.set_text("Preview Camera") + _vbox_container.add_child(preview_camera_button) + + + +func _align_camera_with_view(object: Object) -> void: + print("Aligning camera with view") + print(object) + +func _preview_camera(object: Object) -> void: + print("Previewing camera") + print(object) diff --git a/addons/phantom_camera/plugin.cfg b/addons/phantom_camera/plugin.cfg new file mode 100644 index 0000000..5c8f768 --- /dev/null +++ b/addons/phantom_camera/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="Phantom Camera" +description="Control the movement and dynamically tween 2D & 3D cameras positions. Built for Godot 4. Inspired by Cinemachine." +author="Marcus Skov" +version="0.5.0.5" +script="plugin.gd" diff --git a/addons/phantom_camera/plugin.gd b/addons/phantom_camera/plugin.gd new file mode 100644 index 0000000..20baa69 --- /dev/null +++ b/addons/phantom_camera/plugin.gd @@ -0,0 +1,54 @@ +@tool +extends EditorPlugin + +const PCAM_HOST: String = "PhantomCameraHost" +const PCAM_2D: String = "PhantomCamera2D" +const PCAM_3D: String = "PhantomCamera3D" + +const Pcam3DPlugin = preload("res://addons/phantom_camera/gizmos/phantom_camera_gizmo_plugin_3D.gd") +var pcam_3D_gizmo_plugin = Pcam3DPlugin.new() + +const FramedViewPanel = preload("res://addons/phantom_camera/framed_viewfinder/framed_viewfinder_panel.tscn") +var framed_viewfinder_panel_instance + + +func _enter_tree() -> void: + # Phantom Camera Nodes + add_custom_type(PCAM_2D, "Node2D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2D.gd"), preload("res://addons/phantom_camera/icons/PhantomCameraIcon2D.svg")) + add_custom_type(PCAM_3D, "Node3D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd"), preload("res://addons/phantom_camera/icons/PhantomCameraIcon3D.svg")) + add_custom_type(PCAM_HOST, "Node", preload("res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd"), preload("res://addons/phantom_camera/icons/PhantomCameraHostIcon.svg")) + + # Phantom Camera 3D Gizmo + add_node_3d_gizmo_plugin(pcam_3D_gizmo_plugin) + + # Viewfinder + framed_viewfinder_panel_instance = FramedViewPanel.instantiate() + framed_viewfinder_panel_instance.editor_interface = get_editor_interface() + add_control_to_bottom_panel(framed_viewfinder_panel_instance, "Phantom Camera") + _make_visible(false) + + connect("scene_changed", _scene_changed) + + +func _exit_tree() -> void: + remove_custom_type(PCAM_2D) + remove_custom_type(PCAM_3D) + + remove_node_3d_gizmo_plugin(pcam_3D_gizmo_plugin) + + remove_control_from_bottom_panel(framed_viewfinder_panel_instance) + framed_viewfinder_panel_instance.queue_free() +# if framed_viewfinder_panel_instance: + disconnect("scene_changed", _scene_changed) + + +#func _has_main_screen(): +# return true; + + +func _make_visible(visible): + if framed_viewfinder_panel_instance: + framed_viewfinder_panel_instance.set_visible(visible) + +func _scene_changed(scene_root: Node) -> void: + framed_viewfinder_panel_instance.scene_changed(scene_root) diff --git a/addons/phantom_camera/scripts/group_names.gd b/addons/phantom_camera/scripts/group_names.gd new file mode 100644 index 0000000..8d5d355 --- /dev/null +++ b/addons/phantom_camera/scripts/group_names.gd @@ -0,0 +1,5 @@ +@tool +extends RefCounted + +const PCAM_GROUP_NAME: StringName = "phantom_camera_group" +const PCAM_HOST_GROUP_NAME: StringName = "phantom_camera_host_group" diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2D.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2D.gd new file mode 100644 index 0000000..68cfcaf --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2D.gd @@ -0,0 +1,477 @@ +@tool +@icon("res://addons/phantom_camera/icons/PhantomCameraIcon2D.svg") +class_name PhantomCamera2D +extends Node2D + +const Constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") +var Properties = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_properties.gd").new() + +const FOLLOW_GROUP_ZOOM_AUTO: StringName = Constants.FOLLOW_PARAMETERS_NAME + "auto_zoom" +const FOLLOW_GROUP_ZOOM_MIN: StringName = Constants.FOLLOW_PARAMETERS_NAME + "min_zoom" +const FOLLOW_GROUP_ZOOM_MAX: StringName = Constants.FOLLOW_PARAMETERS_NAME + "max_zoom" +const FOLLOW_GROUP_ZOOM_MARGIN: StringName = Constants.FOLLOW_PARAMETERS_NAME + "zoom_margin" +var follow_group_zoom_auto: bool +var follow_group_zoom_min: float = 1 +var follow_group_zoom_max: float = 5 +var follow_group_zoom_margin: Vector4 + +var _camera_offset: Vector2 + +func _get_property_list() -> Array: + var property_list: Array[Dictionary] + property_list.append_array(Properties.add_priority_properties()) + + property_list.append({ + "name": Constants.ZOOM_PROPERTY_NAME, + "type": TYPE_VECTOR2, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT + }) + + property_list.append_array(Properties.add_follow_mode_property()) + + if Properties.follow_mode != Constants.FollowMode.NONE: + property_list.append_array(Properties.add_follow_target_property()) + + if Properties.follow_mode == Constants.FollowMode.GROUP: + property_list.append({ + "name": FOLLOW_GROUP_ZOOM_AUTO, + "type": TYPE_BOOL, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + if follow_group_zoom_auto: + property_list.append({ + "name": FOLLOW_GROUP_ZOOM_MIN, + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0.01, 100, 0.01,", + "usage": PROPERTY_USAGE_DEFAULT, + }) + + property_list.append({ + "name": FOLLOW_GROUP_ZOOM_MAX, + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0.01, 100, 0.01,", + "usage": PROPERTY_USAGE_DEFAULT, + }) + + property_list.append({ + "name": FOLLOW_GROUP_ZOOM_MARGIN, + "type": TYPE_VECTOR4, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0, 100, 0.01,", + "usage": PROPERTY_USAGE_DEFAULT, + }) + + if Properties.follow_has_target || Properties.has_follow_group: + property_list.append_array(Properties.add_follow_properties()) + property_list.append_array(Properties.add_follow_framed()) + + property_list.append_array(Properties.add_tween_properties()) + + property_list.append_array(Properties.add_secondary_properties()) + + return property_list + + +func _set(property: StringName, value) -> bool: + Properties.set_priority_property(property, value, self) + + # ZOOM + if property == Constants.ZOOM_PROPERTY_NAME: + if value.x == 0: + Properties.zoom.x = 0.001 + else: + Properties.zoom.x = value.x + + if value.y == 0: + Properties.zoom.y = 0.001 + else: + Properties.zoom.y = value.y + + # ZOOM CLAMP + if property == FOLLOW_GROUP_ZOOM_AUTO: + follow_group_zoom_auto = value + notify_property_list_changed() + + if property == FOLLOW_GROUP_ZOOM_MIN: + if value > 0: + follow_group_zoom_min = value + else: + follow_group_zoom_min = 0 + + if property == FOLLOW_GROUP_ZOOM_MAX: + if value > 0: + follow_group_zoom_max = value + else: + follow_group_zoom_max = 0 + + if property == FOLLOW_GROUP_ZOOM_MARGIN: + follow_group_zoom_margin = value + + Properties.set_follow_properties(property, value, self) + Properties.set_tween_properties(property, value, self) + Properties.set_secondary_properties(property, value, self) + + return false + + +func _get(property: StringName): + if property == Constants.PRIORITY_PROPERTY_NAME: return Properties.priority + + if property == Constants.ZOOM_PROPERTY_NAME: return Properties.zoom + + if property == Constants.FOLLOW_MODE_PROPERTY_NAME: return Properties.follow_mode + if property == Constants.FOLLOW_TARGET_OFFSET_PROPERTY_NAME: return Properties.follow_target_offset_2D + if property == Constants.FOLLOW_TARGET_PROPERTY_NAME: return Properties.follow_target_path + if property == Constants.FOLLOW_GROUP_PROPERTY_NAME: return Properties.follow_group_paths + + if property == Constants.FOLLOW_PATH_PROPERTY_NAME: return Properties.follow_path_path + + if property == Constants.FOLLOW_FRAMED_DEAD_ZONE_HORIZONTAL_NAME: return Properties.follow_framed_dead_zone_width + if property == Constants.FOLLOW_FRAMED_DEAD_ZONE_VERTICAL_NAME: return Properties.follow_framed_dead_zone_height + if property == Constants.FOLLOW_VIEWFINDER_IN_PLAY_NAME: return Properties.show_viewfinder_in_play + + if property == FOLLOW_GROUP_ZOOM_AUTO: return follow_group_zoom_auto + if property == FOLLOW_GROUP_ZOOM_MIN: return follow_group_zoom_min + if property == FOLLOW_GROUP_ZOOM_MAX: return follow_group_zoom_max + if property == FOLLOW_GROUP_ZOOM_MARGIN: return follow_group_zoom_margin + + if property == Constants.FOLLOW_DAMPING_NAME: return Properties.follow_has_damping + if property == Constants.FOLLOW_DAMPING_VALUE_NAME: return Properties.follow_damping_value + + if property == Constants.TWEEN_RESOURCE_PROPERTY_NAME: return Properties.tween_resource + + if property == Constants.INACTIVE_UPDATE_MODE_PROPERTY_NAME: return Properties.inactive_update_mode + if property == Constants.TWEEN_ONLOAD_NAME: return Properties.tween_onload + + +################### +# Private Functions +################### +func _enter_tree() -> void: + Properties.is_2D = true + Properties.camera_enter_tree(self) + Properties.assign_pcam_host(self) + + +func _exit_tree() -> void: + if Properties.pcam_host_owner: + Properties.pcam_host_owner.pcam_removed_from_scene(self) + + Properties.pcam_exit_tree(self) + +func _physics_process(delta: float) -> void: +# print(follow_group_zoom_margin) + if not Properties.is_active: + match Properties.inactive_update_mode: + Constants.InactiveUpdateMode.NEVER: + return +# Constants.InactiveUpdateMode.EXPONENTIALLY: +# TODO + + if not Properties.should_follow: return + + match Properties.follow_mode: + Constants.FollowMode.GLUED: + if Properties.follow_target_node: + _interpolate_position(Properties.follow_target_node.position, delta) + Constants.FollowMode.SIMPLE: + if Properties.follow_target_node: + _interpolate_position(_target_position_with_offset(), delta) + Constants.FollowMode.GROUP: + if Properties.has_follow_group: + if Properties.follow_group_nodes_2D.size() == 1: + _interpolate_position(Properties.follow_group_nodes_2D[0].get_global_position(), delta) + else: + var rect: Rect2 = Rect2(Properties.follow_group_nodes_2D[0].get_global_position(), Vector2.ZERO) + for node in Properties.follow_group_nodes_2D: + rect = rect.expand(node.get_global_position()) + if follow_group_zoom_auto: + rect = rect.grow_individual( + follow_group_zoom_margin.x, + follow_group_zoom_margin.y, + follow_group_zoom_margin.z, + follow_group_zoom_margin.w) +# else: +# rect = rect.grow_individual(-80, 0, 0, 0) + if follow_group_zoom_auto: + var screen_size: Vector2 = get_viewport_rect().size + if rect.size.x > rect.size.y * screen_size.aspect(): + Properties.zoom = clamp(screen_size.x / rect.size.x, follow_group_zoom_min, follow_group_zoom_max) * Vector2.ONE + else: + Properties.zoom = clamp(screen_size.y / rect.size.y, follow_group_zoom_min, follow_group_zoom_max) * Vector2.ONE + _interpolate_position(rect.get_center(), delta) + Constants.FollowMode.PATH: + if Properties.follow_target_node and Properties.follow_path_node: + var path_position: Vector2 = Properties.follow_path_node.get_global_position() + _interpolate_position( + Properties.follow_path_node.curve.get_closest_point( + Properties.follow_target_node.get_global_position() - path_position + ) + path_position, \ + delta) + Constants.FollowMode.FRAMED: + if Properties.follow_target_node: + if not Engine.is_editor_hint(): + Properties.viewport_position = (get_follow_target_node().get_global_transform_with_canvas().get_origin() + Properties.follow_target_offset_2D) / get_viewport_rect().size + + if Properties.get_framed_side_offset() != Vector2.ZERO: + var glo_pos: Vector2 + + var target_position: Vector2 = _target_position_with_offset() + _camera_offset + var dead_zone_width: float = Properties.follow_framed_dead_zone_width + var dead_zone_height: float = Properties.follow_framed_dead_zone_height + + if dead_zone_width == 0 || dead_zone_height == 0: + if dead_zone_width == 0 && dead_zone_height != 0: + _interpolate_position(_target_position_with_offset(), delta) + elif dead_zone_width != 0 && dead_zone_height == 0: + glo_pos = _target_position_with_offset() + glo_pos.x += target_position.x - global_position.x + _interpolate_position(glo_pos, delta) + else: + _interpolate_position(_target_position_with_offset(), delta) + else: + _interpolate_position(target_position, delta) + else: + _camera_offset = global_position - _target_position_with_offset() + else: + set_global_position(_target_position_with_offset()) + + +func _target_position_with_offset() -> Vector2: + return Properties.follow_target_node.get_global_position() + Properties.follow_target_offset_2D + + +func _interpolate_position(position: Vector2, delta: float, target: Node2D = self) -> void: + if Properties.follow_has_damping: + target.set_global_position( + target.get_global_position().lerp( + position, + delta * Properties.follow_damping_value + ) + ) + else: + target.set_global_position(position) + +################## +# Public Functions +################## +## Assigns the PhantomCamera2D to a new PhantomCameraHost. +func assign_pcam_host() -> void: + Properties.assign_pcam_host(self) +## Gets the current PhantomCameraHost this PhantomCamera2D is assigned to. +func get_pcam_host_owner() -> PhantomCameraHost: + return Properties.pcam_host_owner + + +## Assigns new Zoom value. +func set_zoom(value: Vector2) -> void: + Properties.zoom = value +## Gets current Zoom value. +func get_zoom() -> Vector2: + return Properties.zoom + + +## Assigns new Priority value. +func set_priority(value: int) -> void: + Properties.set_priority(value, self) +## Gets current Priority value. +func get_priority() -> int: + return Properties.priority + + +## Assigns a new PhantomCameraTween resource to the PhantomCamera2D +func set_tween_resource(value: PhantomCameraTween) -> void: + Properties.tween_resource = value +## Gets the PhantomCameraTween resource assigned to the PhantomCamera2D +## Returns null if there's nothing assigned to it. +func get_tween_resource() -> PhantomCameraTween: + return Properties.tween_resource + +## Assigns a new Tween Duration value. The duration value is in seconds. +## Note: This will override and make the Tween Resource unique to this PhantomCamera2D. +func set_tween_duration(value: float) -> void: + if get_tween_resource(): + Properties.tween_resource_default.duration = value + Properties.tween_resource_default.transition = Properties.tween_resource.transition + Properties.tween_resource_default.ease = Properties.tween_resource.ease + set_tween_resource(null) # Clears resource from PCam instance + else: + Properties.tween_resource_default.duration = value +## Gets the current Tween Duration value. The duration value is in seconds. +func get_tween_duration() -> float: + if get_tween_resource(): + return get_tween_resource().duration + else: + return Properties.tween_resource_default.duration + +## Assigns a new Tween Transition value. +## Note: This will override and make the Tween Resource unique to this PhantomCamera2D. +func set_tween_transition(value: Constants.TweenTransitions) -> void: + if get_tween_resource(): + Properties.tween_resource_default.duration = Properties.tween_resource.duration + Properties.tween_resource_default.transition = value + Properties.tween_resource_default.ease = Properties.tween_resource.ease + set_tween_resource(null) # Clears resource from PCam instance + else: + Properties.tween_resource_default.transition = value +## Gets the current Tween Transition value. +func get_tween_transition() -> int: + if get_tween_resource(): + return get_tween_resource().transition + else: + return Properties.tween_resource_default.transition + +## Assigns a new Tween Ease value. +## Note: This will override and make the Tween Resource unique to this PhantomCamera2D. +func set_tween_ease(value: Constants.TweenEases) -> void: + if get_tween_resource(): + Properties.tween_resource_default.duration = Properties.tween_resource.duration + Properties.tween_resource_default.transition = Properties.tween_resource.ease + Properties.tween_resource_default.ease = value + set_tween_resource(null) # Clears resource from PCam instance + else: + Properties.tween_resource_default.ease = value +## Gets the current Tween Ease value. +func get_tween_ease() -> int: + if get_tween_resource(): + return get_tween_resource().ease + else: + return Properties.tween_resource_default.ease + + +## Gets current active state of the PhantomCamera2D. +## If it returns true, it means the PhantomCamera2D is what the Camera2D is currently following. +func is_active() -> bool: + return Properties.is_active + + +## Enables or disables the Tween on Load. +func set_tween_on_load(value: bool) -> void: + Properties.tween_onload = value +## Gets the current Tween On Load value. +func is_tween_on_load() -> bool: + return Properties.tween_onload + + +## Gets the current follow mode as an enum int based on Constants.FOLLOW_MODE enum. +## Note: Setting Follow Mode purposely not added. A separate PCam should be used instead. +func get_follow_mode() -> int: + return Properties.follow_mode + +## Assigns a new Node2D as the Follow Target property. +func set_follow_target_node(value: Node2D) -> void: + Properties.follow_target_node = value + Properties.should_follow = true +## Erases the current Node2D from the Follow Target property. +func erase_follow_target_node() -> void: + Properties.should_follow = false + Properties.follow_target_node = null +## Gets the current Node2D target property. +func get_follow_target_node(): + if Properties.follow_target_node: + return Properties.follow_target_node + else: + printerr("No Follow Target Node assigned") + + +## Assigns a new Path2D to the Follow Path property. +func set_follow_path(value: Path2D) -> void: + Properties.follow_path_node = value +## Erases the current Path2D from the Follow Path property. +func erase_follow_path() -> void: + Properties.follow_path_node = null +## Gets the current Path2D from the Follow Path property. +func get_follow_path(): + if Properties.follow_path_node: + return Properties.follow_path_node + else: + printerr("No Follow Path assigned") + + +## Assigns a new Vector2 for the Follow Target Offset property. +func set_follow_target_offset(value: Vector2) -> void: + Properties.follow_target_offset_2D = value +## Gets the current Vector2 for the Follow Target Offset property. +func get_follow_target_offset() -> Vector2: + return Properties.follow_target_offset_2D + + +## Enables or disables Follow Damping. +func set_follow_has_damping(value: bool) -> void: + Properties.follow_has_damping = value +## Gets the currents Follow Damping property. +func get_follow_has_damping() -> bool: + return Properties.follow_has_damping + +## Assigns new Damping value. +func set_follow_damping_value(value: float) -> void: + Properties.follow_damping_value = value +## Gets the currents Follow Damping value. +func get_follow_damping_value() -> float: + return Properties.follow_damping_value + + +## Adds a single Node2D to Follow Group array. +func append_follow_group_node(value: Node2D) -> void: + if not Properties.follow_group_nodes_2D.has(value): + Properties.follow_group_nodes_2D.append(value) + Properties.should_follow = true + Properties.has_follow_group = true + else: + printerr(value, " is already part of Follow Group") +## Adds an Array of type Node2D to Follow Group array. +func append_follow_group_node_array(value: Array[Node2D]) -> void: + for val in value: + if not Properties.follow_group_nodes_2D.has(val): + Properties.follow_group_nodes_2D.append(val) + Properties.should_follow = true + Properties.has_follow_group = true + else: + printerr(val, " is already part of Follow Group") +## Removes Node2D from Follow Group array. +func erase_follow_group_node(value: Node2D) -> void: + Properties.follow_group_nodes_2D.erase(value) + if Properties.follow_group_nodes_2D.size() < 1: + Properties.should_follow = false + Properties.has_follow_group = false +## Gets all Node2D from Follow Group array. +func get_follow_group_nodes() -> Array[Node2D]: + return Properties.follow_group_nodes_2D + + +## Enables or disables Auto zoom when using Group Follow. +func set_auto_zoom(value: bool) -> void: + follow_group_zoom_auto = value +## Gets Auto Zoom state. +func get_auto_zoom() -> bool: + return follow_group_zoom_auto + +## Assigns new Min Auto Zoom value. +func set_min_auto_zoom(value: float) -> void: + follow_group_zoom_min = value +## Gets Min Auto Zoom value. +func get_min_auto_zoom() -> float: + return follow_group_zoom_min + +## Assigns new Max Auto Zoom value. +func set_max_auto_zoom(value: float) -> void: + follow_group_zoom_max = value +## Gets Max Auto Zoom value. +func get_max_auto_zoom() -> float: + return follow_group_zoom_max + +## Assigns new Zoom Auto Margin value. +func set_zoom_auto_margin(value: Vector4) -> void: + follow_group_zoom_margin = value +## Gets Zoom Auto Margin value. +func get_zoom_auto_margin() -> Vector4: + return follow_group_zoom_margin + + +## Gets Interactive Update Mode property. +func get_inactive_update_mode() -> String: + return Constants.InactiveUpdateMode.keys()[Properties.inactive_update_mode].capitalize() diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd new file mode 100644 index 0000000..061639a --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3D.gd @@ -0,0 +1,1014 @@ +@tool +@icon("res://addons/phantom_camera/icons/PhantomCameraIcon3D.svg") +class_name PhantomCamera3D +extends Node3D + +const Constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") + +const FOLLOW_DISTANCE_PROPERTY_NAME: StringName = Constants.FOLLOW_PARAMETERS_NAME + "distance" +const FOLLOW_GROUP_DISTANCE_AUTO_NAME: StringName = Constants.FOLLOW_PARAMETERS_NAME + "auto_distance" +const FOLLOW_GROUP_DISTANCE_AUTO_MIN_NAME: StringName = Constants.FOLLOW_PARAMETERS_NAME + "min_distance" +const FOLLOW_GROUP_DISTANCE_AUTO_MAX_NAME: StringName = Constants.FOLLOW_PARAMETERS_NAME + "max_distance" +const FOLLOW_GROUP_DISTANCE_AUTO_DIVISOR: StringName = Constants.FOLLOW_PARAMETERS_NAME + "auto_distance_divisor" + +const SPRING_ARM_PROPERTY_NAME: StringName = "spring_arm/" +const FOLLOW_SPRING_ARM_COLLISION_MASK_NAME: StringName = Constants.FOLLOW_PARAMETERS_NAME + SPRING_ARM_PROPERTY_NAME + "collision_mask" +const FOLLOW_SPRING_ARM_SHAPE_NAME: StringName = Constants.FOLLOW_PARAMETERS_NAME + SPRING_ARM_PROPERTY_NAME + "shape" +const FOLLOW_SPRING_ARM_SPRING_LENGTH_NAME: StringName = Constants.FOLLOW_PARAMETERS_NAME + SPRING_ARM_PROPERTY_NAME + "spring_length" +const FOLLOW_SPRING_ARM_MARGIN_NAME: StringName = Constants.FOLLOW_PARAMETERS_NAME + SPRING_ARM_PROPERTY_NAME + "margin" + +const LOOK_AT_MODE_PROPERTY_NAME: StringName = "look_at_mode" +const LOOK_AT_TARGET_PROPERTY_NAME: StringName = "look_at_target" +const LOOK_AT_GROUP_PROPERTY_NAME: StringName = "look_at_group" +const LOOK_AT_PARAMETERS_NAME: StringName = "look_at_parameters/" +const LOOK_AT_TARGET_OFFSET_PROPERTY_NAME: StringName = LOOK_AT_PARAMETERS_NAME + "look_at_target_offset" + +var Properties: Object = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_properties.gd").new() + +var follow_distance: float = 1: + set(value): + follow_distance = value + if is_instance_valid(Properties.follow_target_node): + set_global_position(_get_target_position_offset()) + get: + return follow_distance + +var _follow_group_distance_auto: bool +var _follow_group_distance_auto_min: float = 1 +var _follow_group_distance_auto_max: float = 5 +var _follow_group_distance_auto_divisor: float = 10 +var _camera_offset: Vector3 +var _current_rotation: Vector3 + +var _follow_spring_arm_node: SpringArm3D +var _follow_spring_arm_collision_mask: int = 1 +var _follow_spring_arm_shape: Shape3D +var _follow_spring_arm_margin: float = 0.01 + + +enum LookAtMode { + NONE = 0, + MIMIC = 1, + SIMPLE = 2, + GROUP = 3, +} + +var _look_at_target_node: Node3D +var _look_at_target_path: NodePath + +var _look_at_group_nodes: Array[Node3D] +var _look_at_group_paths: Array[NodePath] + +var _should_look_at: bool +var _has_look_at_target: bool +var _has_look_at_target_group: bool + +var look_at_mode_enum: LookAtMode = LookAtMode.NONE + +var look_at_target_offset: Vector3 + +# Camera3D +const CAMERA_3D_RESOURCE_PROPERTY_NAME: StringName = "camera_3D_resource" +var _camera_3D_resouce: Camera3DResource +var _camera_3D_resouce_default: Camera3DResource = Camera3DResource.new() + +func _get_property_list() -> Array: + var property_list: Array[Dictionary] + +# TODO - For https://github.com/MarcusSkov/phantom-camera/issues/26 +# property_list.append_array(Properties.add_multiple_hosts_properties()) + + property_list.append_array(Properties.add_priority_properties()) + property_list.append_array(Properties.add_follow_mode_property()) + + if Properties.follow_mode != Constants.FollowMode.NONE: + property_list.append_array(Properties.add_follow_target_property()) + + if Properties.follow_mode == Constants.FollowMode.GROUP or \ + Properties.follow_mode == Constants.FollowMode.FRAMED: + if not _follow_group_distance_auto: + property_list.append({ + "name": FOLLOW_DISTANCE_PROPERTY_NAME, + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + + if Properties.follow_mode == Constants.FollowMode.GROUP: + property_list.append({ + "name": FOLLOW_GROUP_DISTANCE_AUTO_NAME, + "type": TYPE_BOOL, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + + if _follow_group_distance_auto: + property_list.append({ + "name": FOLLOW_GROUP_DISTANCE_AUTO_MIN_NAME, + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + + property_list.append({ + "name": FOLLOW_GROUP_DISTANCE_AUTO_MAX_NAME, + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + + property_list.append({ + "name": FOLLOW_GROUP_DISTANCE_AUTO_DIVISOR, + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0.01, 100, 0.01,", + "usage": PROPERTY_USAGE_DEFAULT, + }) + + if Properties.follow_mode == Constants.FollowMode.THIRD_PERSON: + property_list.append({ + "name": FOLLOW_SPRING_ARM_SPRING_LENGTH_NAME, + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + property_list.append({ + "name": FOLLOW_SPRING_ARM_COLLISION_MASK_NAME, + "type": TYPE_INT, + "hint": PROPERTY_HINT_LAYERS_3D_PHYSICS, + "usage": PROPERTY_USAGE_DEFAULT, + }) + property_list.append({ + "name": FOLLOW_SPRING_ARM_SHAPE_NAME, + "type": TYPE_OBJECT, + "hint": PROPERTY_HINT_RESOURCE_TYPE, + "hint_string": "Shape3D" + }) + property_list.append({ + "name": FOLLOW_SPRING_ARM_MARGIN_NAME, + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + + if Properties.follow_has_target || Properties.has_follow_group: + property_list.append_array(Properties.add_follow_properties()) + property_list.append_array(Properties.add_follow_framed()) + + property_list.append({ + "name": LOOK_AT_MODE_PROPERTY_NAME, + "type": TYPE_INT, + "hint": PROPERTY_HINT_ENUM, + "hint_string": ", ".join(PackedStringArray(LookAtMode.keys())).capitalize(), + "usage": PROPERTY_USAGE_DEFAULT, + }) + + if look_at_mode_enum != LookAtMode.NONE: + if look_at_mode_enum == LookAtMode.GROUP: + property_list.append({ + "name": LOOK_AT_GROUP_PROPERTY_NAME, + "type": TYPE_ARRAY, + "hint": PROPERTY_HINT_TYPE_STRING, + "hint_string": TYPE_NODE_PATH, + "usage": PROPERTY_USAGE_DEFAULT, + }) + else: + property_list.append({ + "name": LOOK_AT_TARGET_PROPERTY_NAME, + "type": TYPE_NODE_PATH, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + if _should_look_at: + if look_at_mode_enum == LookAtMode.SIMPLE: + property_list.append({ + "name": LOOK_AT_TARGET_OFFSET_PROPERTY_NAME, + "type": TYPE_VECTOR3, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + + property_list.append_array(Properties.add_tween_properties()) + property_list.append_array(Properties.add_secondary_properties()) + + property_list.append({ + "name": CAMERA_3D_RESOURCE_PROPERTY_NAME, + "type": TYPE_OBJECT, + "hint": PROPERTY_HINT_RESOURCE_TYPE, + "hint_string": "Camera3DResource" + }) + + return property_list + + +func _set(property: StringName, value) -> bool: +# TODO - For https://github.com/MarcusSkov/phantom-camera/issues/26 +# Properties.set_phantom_host_property(property, value, self) + Properties.set_priority_property(property, value, self) + + Properties.set_follow_properties(property, value, self) + + if Properties.follow_mode == Constants.FollowMode.FRAMED: + if Properties.follow_framed_initial_set and Properties.follow_target_node: + Properties.follow_framed_initial_set = false + Properties.connect(Constants.DEAD_ZONE_CHANGED_SIGNAL, _on_dead_zone_changed) + else: + if Properties.is_connected(Constants.DEAD_ZONE_CHANGED_SIGNAL, _on_dead_zone_changed): + Properties.disconnect(Constants.DEAD_ZONE_CHANGED_SIGNAL, _on_dead_zone_changed) + + if property == FOLLOW_DISTANCE_PROPERTY_NAME or property == FOLLOW_SPRING_ARM_SPRING_LENGTH_NAME: + if value <= 0: + follow_distance = 0.001 + else: + follow_distance = value + + if property == FOLLOW_GROUP_DISTANCE_AUTO_NAME: + _follow_group_distance_auto = value + notify_property_list_changed() + + if property == FOLLOW_GROUP_DISTANCE_AUTO_MIN_NAME: + _follow_group_distance_auto_min = value + + if property == FOLLOW_GROUP_DISTANCE_AUTO_MAX_NAME: + _follow_group_distance_auto_max = value + + if property == FOLLOW_GROUP_DISTANCE_AUTO_DIVISOR: + _follow_group_distance_auto_divisor = value + + + if property == FOLLOW_SPRING_ARM_COLLISION_MASK_NAME: + _follow_spring_arm_collision_mask = value + + if property == FOLLOW_SPRING_ARM_MARGIN_NAME: + _follow_spring_arm_margin = value + + if property == FOLLOW_SPRING_ARM_SHAPE_NAME: + _follow_spring_arm_shape = value + + + # Look At Properties + if property == LOOK_AT_MODE_PROPERTY_NAME: + if value == null: + value = LookAtMode.NONE + + look_at_mode_enum = value + + if look_at_mode_enum == LookAtMode.NONE: + _should_look_at = false + else: + _should_look_at = true + + notify_property_list_changed() + + if property == LOOK_AT_GROUP_PROPERTY_NAME: + if value.size() > 0: + _look_at_group_nodes.clear() + + _look_at_group_paths = value as Array[NodePath] + + if not _look_at_group_paths.is_empty(): + for path in _look_at_group_paths: + if has_node(path): + _should_look_at = true + _has_look_at_target_group = true + var node: Node = get_node(path) + if node is Node3D: + # Prevents duplicated nodes from being assigned to array + if _look_at_group_nodes.find(node): + _look_at_group_nodes.append(node) + else: + printerr("Assigned non-Node3D to Look At Group") + + notify_property_list_changed() + + if property == LOOK_AT_TARGET_PROPERTY_NAME: + _look_at_target_path = value + var value_node_path: NodePath = value as NodePath + if not value_node_path.is_empty(): + _should_look_at = true + if has_node(_look_at_target_path): + _has_look_at_target = true + set_rotation(Vector3(0,0,0)) + _look_at_target_node = get_node(_look_at_target_path) + else: + _should_look_at = false + _has_look_at_target = false + _look_at_target_node = null + + notify_property_list_changed() + + if property == LOOK_AT_TARGET_OFFSET_PROPERTY_NAME: + look_at_target_offset = value + + Properties.set_tween_properties(property, value, self) + Properties.set_secondary_properties(property, value, self) + + if property == CAMERA_3D_RESOURCE_PROPERTY_NAME: + _camera_3D_resouce = value + + return false + + +func _get(property: StringName): +# TODO - For https://github.com/MarcusSkov/phantom-camera/issues/26 +# if property == Constants.PHANTOM_CAMERA_HOST: return Properties.pcam_host_owner.name + + if property == Constants.PRIORITY_OVERRIDE: return Properties.priority_override + if property == Constants.PRIORITY_PROPERTY_NAME: return Properties.priority + + if property == Constants.FOLLOW_MODE_PROPERTY_NAME: return Properties.follow_mode + if property == Constants.FOLLOW_TARGET_PROPERTY_NAME: return Properties.follow_target_path + if property == Constants.FOLLOW_GROUP_PROPERTY_NAME: return Properties.follow_group_paths + if property == Constants.FOLLOW_PATH_PROPERTY_NAME: return Properties.follow_path_path + if property == FOLLOW_DISTANCE_PROPERTY_NAME: return follow_distance + if property == Constants.FOLLOW_TARGET_OFFSET_PROPERTY_NAME : return Properties.follow_target_offset_3D + + if property == FOLLOW_GROUP_DISTANCE_AUTO_NAME: return _follow_group_distance_auto + if property == FOLLOW_GROUP_DISTANCE_AUTO_MIN_NAME: return _follow_group_distance_auto_min + if property == FOLLOW_GROUP_DISTANCE_AUTO_MAX_NAME: return _follow_group_distance_auto_max + if property == FOLLOW_GROUP_DISTANCE_AUTO_DIVISOR: return _follow_group_distance_auto_divisor + + if property == Constants.FOLLOW_FRAMED_DEAD_ZONE_HORIZONTAL_NAME: return Properties.follow_framed_dead_zone_width + if property == Constants.FOLLOW_FRAMED_DEAD_ZONE_VERTICAL_NAME: return Properties.follow_framed_dead_zone_height + if property == Constants.FOLLOW_VIEWFINDER_IN_PLAY_NAME: return Properties.show_viewfinder_in_play + + if property == FOLLOW_SPRING_ARM_COLLISION_MASK_NAME: return _follow_spring_arm_collision_mask + if property == FOLLOW_SPRING_ARM_SHAPE_NAME: return _follow_spring_arm_shape + if property == FOLLOW_SPRING_ARM_SPRING_LENGTH_NAME: return follow_distance + if property == FOLLOW_SPRING_ARM_MARGIN_NAME: return _follow_spring_arm_margin + + if property == Constants.FOLLOW_DAMPING_NAME: return Properties.follow_has_damping + if property == Constants.FOLLOW_DAMPING_VALUE_NAME: return Properties.follow_damping_value + + if property == LOOK_AT_MODE_PROPERTY_NAME: return look_at_mode_enum + if property == LOOK_AT_TARGET_PROPERTY_NAME: return _look_at_target_path + if property == LOOK_AT_TARGET_OFFSET_PROPERTY_NAME: return look_at_target_offset + if property == LOOK_AT_GROUP_PROPERTY_NAME: return _look_at_group_paths + + if property == Constants.TWEEN_RESOURCE_PROPERTY_NAME: return Properties.tween_resource + + if property == Constants.INACTIVE_UPDATE_MODE_PROPERTY_NAME: return Properties.inactive_update_mode + if property == Constants.TWEEN_ONLOAD_NAME: return Properties.tween_onload + + if property == CAMERA_3D_RESOURCE_PROPERTY_NAME: return _camera_3D_resouce + + +################### +# Private Functions +################### +func _enter_tree() -> void: + Properties.is_2D = false; + Properties.camera_enter_tree(self) + Properties.assign_pcam_host(self) + + if not get_parent() is SpringArm3D: + if _look_at_target_path: + _look_at_target_node = get_node(_look_at_target_path) + elif _look_at_group_paths: + _look_at_group_nodes.clear() + for path in _look_at_group_paths: + if not path.is_empty() and get_node(path): + _should_look_at = true + _has_look_at_target_group = true + _look_at_group_nodes.append(get_node(path)) + + +func _exit_tree() -> void: + if Properties.pcam_host_owner: + Properties.pcam_host_owner.pcam_removed_from_scene(self) + + Properties.pcam_exit_tree(self) + + +func _ready(): + if Properties.follow_mode == Constants.FollowMode.THIRD_PERSON: + if not Engine.is_editor_hint(): + if not is_instance_valid(_follow_spring_arm_node): + _follow_spring_arm_node = SpringArm3D.new() + get_parent().add_child.call_deferred(_follow_spring_arm_node) + + +func _process(delta: float) -> void: + if not Properties.is_active: + match Properties.inactive_update_mode: + Constants.InactiveUpdateMode.NEVER: + return +# Constants.InactiveUpdateMode.EXPONENTIALLY: +# TODO + + if Properties.should_follow: + match Properties.follow_mode: + Constants.FollowMode.GLUED: + if Properties.follow_target_node: + _interpolate_position( + Properties.follow_target_node.get_global_position(), + delta + ) + Constants.FollowMode.SIMPLE: + if Properties.follow_target_node: + _interpolate_position( + _get_target_position_offset(), + delta + ) + Constants.FollowMode.GROUP: + if Properties.has_follow_group: + if Properties.follow_group_nodes_3D.size() == 1: + _interpolate_position( + Properties.follow_group_nodes_3D[0].get_global_position() + + Properties.follow_target_offset_3D + + get_transform().basis.z * Vector3(follow_distance, follow_distance, follow_distance), + delta + ) + elif Properties.follow_group_nodes_3D.size() > 1: + var bounds: AABB = AABB(Properties.follow_group_nodes_3D[0].get_global_position(), Vector3.ZERO) + for node in Properties.follow_group_nodes_3D: + bounds = bounds.expand(node.get_global_position()) + + var distance: float + if _follow_group_distance_auto: + distance = lerp(_follow_group_distance_auto_min, _follow_group_distance_auto_max, bounds.get_longest_axis_size() / _follow_group_distance_auto_divisor) + distance = clamp(distance, _follow_group_distance_auto_min, _follow_group_distance_auto_max) + else: + distance = follow_distance + + _interpolate_position( + bounds.get_center() + + Properties.follow_target_offset_3D + + get_transform().basis.z * Vector3(distance, distance, distance), + delta + ) + Constants.FollowMode.PATH: + if Properties.follow_target_node and Properties.follow_path_node: + var path_position: Vector3 = Properties.follow_path_node.get_global_position() + _interpolate_position( + Properties.follow_path_node.curve.get_closest_point(Properties.follow_target_node.get_global_position() - path_position) + path_position, + delta + ) + Constants.FollowMode.FRAMED: + if Properties.follow_target_node: + if not Engine.is_editor_hint(): + Properties.viewport_position = get_viewport().get_camera_3d().unproject_position(_get_target_position_offset()) + var visible_rect_size: Vector2 = get_viewport().get_viewport().size + Properties.viewport_position = Properties.viewport_position / visible_rect_size + + if _current_rotation != get_global_rotation(): + _interpolate_position( + _get_position_offset_distance(), + delta + ) + + if Properties.get_framed_side_offset() != Vector2.ZERO: + var target_position: Vector3 = _get_target_position_offset() + _camera_offset + var dead_zone_width: float = Properties.follow_framed_dead_zone_width + var dead_zone_height: float = Properties.follow_framed_dead_zone_height + var glo_pos: Vector3 + + if dead_zone_width == 0 || dead_zone_height == 0: + if dead_zone_width == 0 && dead_zone_height != 0: + glo_pos = _get_position_offset_distance() + glo_pos.z = global_position.z + target_position.z - global_position.z + _interpolate_position( + glo_pos, + delta + ) + elif dead_zone_width != 0 && dead_zone_height == 0: + glo_pos = _get_position_offset_distance() + glo_pos.x = global_position.x + target_position.x - global_position.x + _interpolate_position( + glo_pos, + delta + ) + else: + _interpolate_position( + _get_position_offset_distance(), + delta + ) + else: + if _current_rotation != get_global_rotation(): + var opposite: float = sin(-get_global_rotation().x) * follow_distance + _get_target_position_offset().y + glo_pos.y = _get_target_position_offset().y + opposite + glo_pos.z = sqrt(pow(follow_distance, 2) - pow(opposite, 2)) + _get_target_position_offset().z + glo_pos.x = global_position.x + + _interpolate_position( + glo_pos, + delta + ) + _current_rotation = get_global_rotation() + else: + _interpolate_position( + get_global_position() + target_position - global_position, + delta + ) + else: + _camera_offset = global_position - _get_target_position_offset() + _current_rotation = get_global_rotation() + else: + set_global_position(_get_position_offset_distance()) + var unprojected_position: Vector2 = _get_raw_unprojected_position() + var viewport_width: float = get_viewport().size.x + var viewport_height: float = get_viewport().size.y + var camera_aspect: Camera3D.KeepAspect = get_viewport().get_camera_3d().keep_aspect + var visible_rect_size: Vector2 = get_viewport().get_viewport().size + + unprojected_position = unprojected_position - visible_rect_size / 2 + if camera_aspect == Camera3D.KeepAspect.KEEP_HEIGHT: +# Landscape View + var aspect_ratio_scale: float = viewport_width / viewport_height + unprojected_position.x = (unprojected_position.x / aspect_ratio_scale + 1) / 2 + unprojected_position.y = (unprojected_position.y + 1) / 2 + else: +# Portrait View + var aspect_ratio_scale: float = viewport_height / viewport_width + unprojected_position.x = (unprojected_position.x + 1) / 2 + unprojected_position.y = (unprojected_position.y / aspect_ratio_scale + 1) / 2 + + Properties.viewport_position = unprojected_position + Constants.FollowMode.THIRD_PERSON: + if Properties.follow_target_node: + if not Engine.is_editor_hint(): + if is_instance_valid(Properties.follow_target_node): + if is_instance_valid(_follow_spring_arm_node): + if not get_parent() == _follow_spring_arm_node: + var follow_target: Node3D = Properties.follow_target_node +# _follow_spring_arm_node.set_script(load("res://addons/phantom_camera/scripts/phantom_camera/third_person/third_person_mouse_follow.gd")) + _follow_spring_arm_node.set_rotation_degrees(rotation_degrees) + _follow_spring_arm_node.set_length(follow_distance) + _follow_spring_arm_node.set_collision_mask(_follow_spring_arm_collision_mask) + _follow_spring_arm_node.set_shape(_follow_spring_arm_shape) + _follow_spring_arm_node.set_margin(_follow_spring_arm_margin) + + if not is_tween_on_load(): + Properties.has_tweened_onload = false + reparent(_follow_spring_arm_node) + + _interpolate_position( + _get_target_position_offset(), + delta, + _follow_spring_arm_node + ) + else: + set_global_position(_get_position_offset_distance()) + + if _should_look_at: + match look_at_mode_enum: + LookAtMode.MIMIC: + if _has_look_at_target: + set_global_rotation(_look_at_target_node.get_global_rotation()) + LookAtMode.SIMPLE: + if _has_look_at_target: + look_at(_look_at_target_node.get_global_position() + look_at_target_offset) + LookAtMode.GROUP: + if _has_look_at_target_group: + if _look_at_group_nodes.size() == 1: + look_at(_look_at_group_nodes[0].get_global_position()) + elif _look_at_group_nodes.size() > 1: + var bounds: AABB = AABB(_look_at_group_nodes[0].get_global_position(), Vector3.ZERO) + for node in _look_at_group_nodes: + bounds = bounds.expand(node.get_global_position()) + look_at(bounds.get_center()) + + +func _get_target_position_offset() -> Vector3: + return Properties.follow_target_node.get_global_position() + Properties.follow_target_offset_3D + + +func _get_position_offset_distance() -> Vector3: + return _get_target_position_offset() + \ + get_transform().basis.z * Vector3(follow_distance, follow_distance, follow_distance) + + +func _interpolate_position(position: Vector3, delta: float, target: Node3D = self) -> void: + if Properties.follow_has_damping: + target.set_global_position( + target.get_global_position().lerp( + position, + delta * Properties.follow_damping_value + ) + ) + else: + target.set_global_position(position) + + +func _get_raw_unprojected_position() -> Vector2: + return get_viewport().get_camera_3d().unproject_position(Properties.follow_target_node.get_global_position() + Properties.follow_target_offset_3D) + + +func _on_dead_zone_changed() -> void: + set_global_position( _get_position_offset_distance() ) + + +func get_unprojected_position() -> Vector2: + var unprojected_position: Vector2 = _get_raw_unprojected_position() + var viewport_width: float = get_viewport().size.x + var viewport_height: float = get_viewport().size.y + var camera_aspect: Camera3D.KeepAspect = get_viewport().get_camera_3d().keep_aspect + var visible_rect_size: Vector2 = get_viewport().size + + unprojected_position = unprojected_position - visible_rect_size / 2 + if camera_aspect == Camera3D.KeepAspect.KEEP_HEIGHT: +# print("Landscape View") + var aspect_ratio_scale: float = viewport_width / viewport_height + unprojected_position.x = (unprojected_position.x / aspect_ratio_scale + 1) / 2 + unprojected_position.y = (unprojected_position.y + 1) / 2 + else: +# print("Portrait View") + var aspect_ratio_scale: float = viewport_height / viewport_width + unprojected_position.x = (unprojected_position.x + 1) / 2 + unprojected_position.y = (unprojected_position.y / aspect_ratio_scale + 1) / 2 + + return unprojected_position + + +################## +# Public Functions +################## +## Assigns the PhantomCamera3D to a new PhantomCameraHost. +func assign_pcam_host() -> void: + Properties.assign_pcam_host(self) +## Gets the current PhantomCameraHost this PhantomCamera3D is assigned to. +func get_pcam_host_owner() -> PhantomCameraHost: + return Properties.pcam_host_owner + + +## Assigns new Priority value. +func set_priority(value: int) -> void: + Properties.set_priority(value, self) +## Gets current Priority value. +func get_priority() -> int: + return Properties.priority + + +## Assigns a new PhantomCameraTween resource to the PhantomCamera3D +func set_tween_resource(value: PhantomCameraTween) -> void: + Properties.tween_resource = value +## Gets the PhantomCameraTween resource assigned to the PhantomCamera3D +## Returns null if there's nothing assigned to it. +func get_tween_resource() -> PhantomCameraTween: + return Properties.tween_resource + +## Assigns a new Tween Duration value. The duration value is in seconds. +## Note: This will override and make the Tween Resource unique to this PhantomCamera3D. +func set_tween_duration(value: float) -> void: + if get_tween_resource(): + Properties.tween_resource_default.duration = value + Properties.tween_resource_default.transition = Properties.tween_resource.transition + Properties.tween_resource_default.ease = Properties.tween_resource.ease + set_tween_resource(null) # Clears resource from PCam instance + else: + Properties.tween_resource_default.duration = value +## Gets the current Tween Duration value. The duration value is in seconds. +func get_tween_duration() -> float: + if Properties.tween_resource: + return Properties.tween_resource.duration + else: + return Properties.tween_resource_default.duration + +## Assigns a new Tween Transition value. +## Note: This will override and make the Tween Resource unique to this PhantomCamera3D. +func set_tween_transition(value: Constants.TweenTransitions) -> void: + if get_tween_resource(): + Properties.tween_resource_default.duration = Properties.tween_resource.duration + Properties.tween_resource_default.transition = value + Properties.tween_resource_default.ease = Properties.tween_resource.ease + set_tween_resource(null) # Clears resource from PCam instance + else: + Properties.tween_resource_default.transition = value +## Gets the current Tween Transition value. +func get_tween_transition() -> int: + if get_tween_resource(): + return Properties.tween_resource.transition + else: + return Properties.tween_resource_default.transition + +## Assigns a new Tween Ease value. +## Note: This will override and make the Tween Resource unique to this PhantomCamera3D. +func set_tween_ease(value: Constants.TweenEases) -> void: + if get_tween_resource(): + Properties.tween_resource_default.duration = Properties.tween_resource.duration + Properties.tween_resource_default.transition = Properties.tween_resource.ease + Properties.tween_resource_default.ease = value + set_tween_resource(null) # Clears resource from PCam instance + else: + Properties.tween_resource_default.ease = value +## Gets the current Tween Ease value. +func get_tween_ease() -> int: + if get_tween_resource(): + return Properties.tween_resource.ease + else: + return Properties.tween_resource_default.ease + + +## Gets current active state of the PhantomCamera3D. +## If it returns true, it means the PhantomCamera3D is what the Camera2D is currently following. +func is_active() -> bool: + return Properties.is_active + + +## Enables or disables the Tween on Load. +func set_tween_on_load(value: bool) -> void: + Properties.tween_onload = value +## Gets the current Tween On Load value. +func is_tween_on_load() -> bool: + return Properties.tween_onload + + +## Gets the current follow mode as an enum int based on Constants.FOLLOW_MODE enum. +## Note: Setting Follow Mode purposely not added. A separate PCam should be used instead. +func get_follow_mode() -> int: + return Properties.follow_mode + + +## Assigns a new Node3D as the Follow Target. +func set_follow_target_node(value: Node3D) -> void: + Properties.follow_target_node = value + Properties.should_follow = true +## Removes the current Node3D Follow Target. +func erase_follow_target_node() -> void: + Properties.should_follow = false + Properties.follow_target_node = null +## Gets the current Node3D target. +func get_follow_target_node(): + if Properties.follow_target_node: + return Properties.follow_target_node + else: + printerr("No Follow Target Node assigned") + + +## Assigns a new Path3D to the Follow Path property. +func set_follow_path(value: Path3D) -> void: + Properties.follow_path_node = value +## Erases the current Path3D frp, the Follow Target +func erase_follow_path() -> void: + Properties.follow_path_node = null +## Gets the current Path2D from the Follow Path property. +func get_follow_path(): + if Properties.follow_path_node: + return Properties.follow_path_node + else: + printerr("No Follow Path assigned") + + +## Assigns a new Vector3 for the Follow Target Offset property. +func set_follow_target_offset(value: Vector3) -> void: + Properties.follow_target_offset_3D = value +## Gets the current Vector3 for the Follow Target Offset property. +func get_follow_target_offset() -> Vector3: + return Properties.follow_target_offset_3D + + +## Enables or disables Follow Damping. +func set_follow_has_damping(value: bool) -> void: + Properties.follow_has_damping = value +## Gets the currents Follow Damping property. +func get_follow_has_damping() -> bool: + return Properties.follow_has_damping + + +## Assigns new Damping value. +func set_follow_damping_value(value: float) -> void: + Properties.follow_damping_value = value +## Gets the currents Follow Damping value. +func get_follow_damping_value() -> float: + return Properties.follow_damping_value + + +## Assigns a new Follow Distance value. +func set_follow_distance(value: float) -> void: + follow_distance = value +## Gets Follow Distance value. +func get_follow_distance() -> float: + return follow_distance + + +## Adds a single Node3D to Follow Group array. +func append_follow_group_node(value: Node3D) -> void: + if not Properties.follow_group_nodes_3D.has(value): + Properties.follow_group_nodes_3D.append(value) + Properties.should_follow = true + Properties.has_follow_group = true + else: + printerr(value, " is already part of Follow Group") +## Adds an Array of type Node3D to Follow Group array. +func append_follow_group_node_array(value: Array[Node3D]) -> void: + for val in value: + if not Properties.follow_group_nodes_3D.has(val): + Properties.follow_group_nodes_3D.append(val) + Properties.should_follow = true + Properties.has_follow_group = true + else: + printerr(value, " is already part of Follow Group") +## Removes Node3D from Follow Group array. +func erase_follow_group_node(value: Node3D) -> void: + Properties.follow_group_nodes_3D.erase(value) + if get_follow_group_nodes().size() < 1: + Properties.should_follow = false + Properties.has_follow_group = false +## Gets all Node3D from Follow Group array. +func get_follow_group_nodes() -> Array[Node3D]: + return Properties.follow_group_nodes_3D + +## Enables or disables Auto Follow Distance when using Group Follow. +func set_auto_follow_distance(value: bool) -> void: + _follow_group_distance_auto = value +## Gets Auto Follow Distance state. +func get_auto_follow_distance() -> bool: + return _follow_group_distance_auto + +## Assigns new Min Auto Follow Distance value. +func set_min_auto_follow_distance(value: float) -> void: + _follow_group_distance_auto_min = value +## Gets Min Auto Follow Distance value. +func get_min_auto_follow_distance() -> float: + return _follow_group_distance_auto_min + +## Assigns new Max Auto Follow Distance value. +func set_max_auto_follow_distance(value: float) -> void: + _follow_group_distance_auto_max = value +## Gets Max Auto Follow Distance value. +func get_max_auto_follow_distance() -> float: + return _follow_group_distance_auto_max + +## Assigns new Auto Follow Distance Divisor value. +func set_auto_follow_distance_divisor(value: float) -> void: + _follow_group_distance_auto_divisor = value +## Gets Auto Follow Divisor value. +func get_auto_follow_distance_divisor() -> float: + return _follow_group_distance_auto_divisor + +## Assigns new rotation (in radians) value to SpringArm for Third Person Follow mode. +func set_third_person_rotation(value: Vector3) -> void: + _follow_spring_arm_node.rotation = value +## Gets the rotation value (in radians) from the SpringArm for Third Person Follow mode. +func get_third_person_rotation() -> Vector3: + return _follow_spring_arm_node.rotation +## Assigns new rotation (in degrees) value to SpringArm for Third Person Follow mode. +func set_third_person_rotation_degrees(value: Vector3) -> void: + _follow_spring_arm_node.rotation_degrees = value +## Gets the rotation value (in degrees) from the SpringArm for Third Person Follow mode. +func get_third_person_rotation_degrees() -> Vector3: + return _follow_spring_arm_node.rotation_degrees + +## Assigns a new Third Person SpringArm3D Length value. +func set_spring_arm_spring_length(value: float) -> void: + follow_distance = value +## Gets Third Person SpringArm3D Length value. +func get_spring_arm_spring_length() -> float: + return follow_distance + +## Assigns a new Third Person SpringArm3D Collision Mask value. +func set_spring_arm_collision_mask(value: int) -> void: + _follow_spring_arm_collision_mask = value +## Gets Third Person SpringArm3D Collision Mask value. +func get_spring_arm_collision_mask() -> int: + return _follow_spring_arm_collision_mask + +## Assigns a new Third Person SpringArm3D Shape value. +func set_spring_arm_shape(value: Shape3D) -> void: + _follow_spring_arm_shape = value +## Gets Third Person SpringArm3D Shape value. +func get_spring_arm_shape() -> Shape3D: + return _follow_spring_arm_shape + +## Assigns a new Third Person SpringArm3D Margin value. +func set_spring_arm_margin(value: float) -> void: + _follow_spring_arm_margin = value +## Gets Third Person SpringArm3D Margin value. +func get_spring_arm_margin() -> float: + return _follow_spring_arm_margin + + +## Gets Look At Mode. Value is based on LookAtMode enum. +## Note: To set a new Look At Mode, a separate PhantomCamera3D should be used. +func get_look_at_mode() -> int: + return look_at_mode_enum + +## Assigns new Node3D as Look At Target. +func set_look_at_target(value: Node3D) -> void: + _look_at_target_node = value + _should_look_at = true + _has_look_at_target = true +## Gets current Node3D from Look At Target property. +func get_look_at_target(): + if _look_at_target_node: + return _look_at_target_node + else: + printerr("No Look At target node assigned") + + +## Assigns a new Vector3 to the Look At Target Offset value. +func set_look_at_target_offset(value: Vector3) -> void: + look_at_target_offset = value +## Gets the current Look At Target Offset value. +func get_look_at_target_offset() -> Vector3: + return look_at_target_offset + +## Appends Node3D to Look At Group array. +func append_look_at_group_node(value: Node3D) -> void: + if not _look_at_group_nodes.has(value): + _look_at_group_nodes.append(value) + _has_look_at_target_group = true + else: + printerr(value, " is already part of Look At Group") +## Appends array of type Node3D to Look At Group array. +func append_look_at_group_node_array(value: Array[Node3D]) -> void: + for val in value: + if not _look_at_group_nodes.has(val): + _look_at_group_nodes.append(val) + _has_look_at_target_group = true + else: + printerr(val, " is already part of Look At Group") +## Removes Node3D from Look At Group array. +func erase_look_at_group_node(value: Node3D) -> void: + _look_at_group_nodes.erase(value) + if _look_at_group_nodes.size() < 1: + _has_look_at_target_group = false +## Gets all the Node3D in Look At Group array. +func get_look_at_group_nodes() -> Array[Node3D]: + return _look_at_group_nodes + + +## Gets Inactive Update Mode property. +func get_inactive_update_mode() -> String: + return Constants.InactiveUpdateMode.keys()[Properties.inactive_update_mode].capitalize() + + +## Assogms a new Camera3D Resource to this PhantomCamera3D +func set_camera_3D_resource(value: Camera3DResource) -> void: + _camera_3D_resouce = value +## Gets the Camera3D resource assigned to the PhantomCamera3D +## Returns null if there's nothing assigned to it. +func get_camera_3D_resource() -> Camera3DResource: + return _camera_3D_resouce + +## Assigns a new Camera3D Cull Mask value. +## Note: This will override and make the Camera3D Resource unique to this PhantomCamera3D. +func set_camera_cull_mask(value: int) -> void: + if get_camera_3D_resource(): + _camera_3D_resouce_default.cull_mask = value + _camera_3D_resouce_default.h_offset = _camera_3D_resouce.h_offset + _camera_3D_resouce_default.v_offset = _camera_3D_resouce.v_offset + _camera_3D_resouce_default.fov = _camera_3D_resouce.fov + set_camera_3D_resource(null) # Clears resource from PCam instance + else: + _camera_3D_resouce_default.cull_mask = value +## Gets the Camera3D fov value assigned this PhantomCamera. The duration value is in seconds. +func get_camera_cull_mask() -> int: + if get_camera_3D_resource(): + return _camera_3D_resouce.cull_mask + else: + return _camera_3D_resouce_default.cull_mask + +## Assigns a new Camera3D H Offset value. +## Note: This will override and make the Camera3D Resource unique to this PhantomCamera3D. +func set_camera_h_offset(value: float) -> void: + if get_camera_3D_resource(): + _camera_3D_resouce_default.cull_mask = _camera_3D_resouce.cull_mask + _camera_3D_resouce_default.h_offset = value + _camera_3D_resouce_default.v_offset = _camera_3D_resouce.v_offset + _camera_3D_resouce_default.fov = _camera_3D_resouce.fov + set_camera_3D_resource(null) # Clears resource from PCam instance + else: + _camera_3D_resouce_default.h_offset = value +## Gets the Camera3D fov value assigned this PhantomCamera. The duration value is in seconds. +func get_camera_h_offset() -> float: + if get_camera_3D_resource(): + return _camera_3D_resouce.h_offset + else: + return _camera_3D_resouce_default.h_offset + +## Assigns a new Camera3D V Offset value. +## Note: This will override and make the Camera3D Resource unique to this PhantomCamera3D. +func set_camera_v_offset(value: float) -> void: + if get_camera_3D_resource(): + _camera_3D_resouce_default.cull_mask = _camera_3D_resouce.cull_mask + _camera_3D_resouce_default.h_offset = _camera_3D_resouce.h_offset + _camera_3D_resouce_default.v_offset = value + _camera_3D_resouce_default.fov = _camera_3D_resouce.fov + set_camera_3D_resource(null) # Clears resource from PCam instance + else: + _camera_3D_resouce_default.v_offset = value +## Gets the Camera3D fov value assigned this PhantomCamera. The duration value is in seconds. +func get_camera_v_offset() -> float: + if get_camera_3D_resource(): + return _camera_3D_resouce.v_offset + else: + return _camera_3D_resouce_default.v_offset + +## Assigns a new Camera3D FOV value. +## Note: This will override and make the Camera3D Resource unique to this PhantomCamera3D. +func set_camera_fov(value: float) -> void: + if get_camera_3D_resource(): + _camera_3D_resouce_default.cull_mask = _camera_3D_resouce.cull_mask + _camera_3D_resouce_default.h_offset = _camera_3D_resouce.h_offset + _camera_3D_resouce_default.v_offset = _camera_3D_resouce.v_offset + _camera_3D_resouce_default.fov = value + set_camera_3D_resource(null) # Clears resource from PCam instance + else: + _camera_3D_resouce_default.fov = value +## Gets the Camera3D fov value assigned this PhantomCamera. The duration value is in seconds. +func get_camera_fov() -> float: + if get_camera_3D_resource(): + return _camera_3D_resouce.fov + else: + return _camera_3D_resouce_default.fov diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd new file mode 100644 index 0000000..5d09f0b --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd @@ -0,0 +1,87 @@ +@tool +extends RefCounted + +const PhantomCameraHost: Script = preload("res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd") + +# Values +const CAMERA_2D_NODE_NAME: StringName = "Camera2D" +const CAMERA_3D_NODE_NAME: StringName = "Camera3D" +const PCAM_HOST_NODE_NAME: StringName = "PhantomCameraHost" +const PCAM_2D_NODE_NAME: StringName = "PhantomCamera2D" +const PCAM_3D_NODE_NAME: StringName = "PhantomCamera3D" +const COLOR_2D: Color = Color("8DA5F3") +const COLOR_3D: Color = Color("FC7F7F") +const COLOR_PCAM: Color = Color("3AB99A") +const PCAM_HOST_COLOR: Color = Color("E0E0E0") + +# Primary +const PRIORITY_PROPERTY_NAME: StringName = "priority" +const PRIORITY_OVERRIDE: StringName = "priority_override" +const PCAM_HOST: StringName = "phantom_camera_host" + +# Follow +const FOLLOW_MODE_PROPERTY_NAME: StringName = "follow_mode" +const FOLLOW_TARGET_PROPERTY_NAME: StringName = "follow_target" +const FOLLOW_GROUP_PROPERTY_NAME: StringName = "follow_group" +const FOLLOW_PATH_PROPERTY_NAME: StringName = "follow_path" +const FOLLOW_PARAMETERS_NAME: StringName = "follow_parameters/" + +# Follow Parameters +const FOLLOW_DISTANCE_PROPERTY_NAME: StringName = FOLLOW_PARAMETERS_NAME + "distance" +const FOLLOW_DAMPING_NAME: StringName = FOLLOW_PARAMETERS_NAME + "damping" +const FOLLOW_DAMPING_VALUE_NAME: StringName = FOLLOW_PARAMETERS_NAME + "damping_value" +const FOLLOW_TARGET_OFFSET_PROPERTY_NAME: StringName = FOLLOW_PARAMETERS_NAME + "target_offset" +const FOLLOW_FRAMED_DEAD_ZONE_HORIZONTAL_NAME: StringName = FOLLOW_PARAMETERS_NAME + "dead_zone_horizontal" +const FOLLOW_FRAMED_DEAD_ZONE_VERTICAL_NAME: StringName = FOLLOW_PARAMETERS_NAME + "dead_zone_vertical" +const FOLLOW_VIEWFINDER_IN_PLAY_NAME: StringName = FOLLOW_PARAMETERS_NAME + "viewfinder_in_play" +const DEAD_ZONE_CHANGED_SIGNAL: StringName = "dead_zone_changed" + +#Zoom +const ZOOM_PROPERTY_NAME: StringName = "zoom" + +# Tween Resource +const TWEEN_RESOURCE_PROPERTY_NAME: StringName = "tween_parameters" + +# Secondary +const TWEEN_ONLOAD_NAME: StringName = "tween_on_load" +const INACTIVE_UPDATE_MODE_PROPERTY_NAME: StringName = "inactive_update_mode" + + +enum FollowMode { + NONE = 0, + GLUED = 1, + SIMPLE = 2, + GROUP = 3, + PATH = 4, + FRAMED = 5, + THIRD_PERSON = 6, +} + +enum TweenTransitions { + LINEAR = 0, + SINE = 1, + QUINT = 2, + QUART = 3, + QUAD = 4, + EXPO = 5, + ELASTIC = 6, + CUBIC = 7, + CIRC = 8, + BOUNCE = 9, + BACK = 10, +# CUSTOM = 11, +# NONE = 12, +} + +enum TweenEases { + EASE_IN = 0, + EASE_OUT = 1, + EASE_IN_OUT = 2, + EASE_OUT_IN = 3, +} + +enum InactiveUpdateMode { + ALWAYS, + NEVER, +# EXPONENTIALLY, +} diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_properties.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_properties.gd new file mode 100644 index 0000000..a5b6ee6 --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_properties.gd @@ -0,0 +1,488 @@ +@tool +extends RefCounted + +const Constants: Script = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") +const PcamGroupNames: Script = preload("res://addons/phantom_camera/scripts/group_names.gd") + +var is_2D: bool + +var pcam_host_owner: PhantomCameraHost +var scene_has_multiple_pcam_hosts: bool +var pcam_host_group: Array[Node] + +var is_active: bool + +var priority_override: bool +var priority: int = 0 + +var tween_onload: bool = true +var has_tweened_onload: bool = true + +# Follow +var should_follow: bool +var has_follow_group: bool +var follow_target_node: Node +var follow_target_path: NodePath +var follow_has_target: bool +var follow_has_path_target: bool +var follow_path_node: Node +var follow_path_path: NodePath +var follow_mode: Constants.FollowMode = Constants.FollowMode.NONE +var follow_target_offset_2D: Vector2 +var follow_target_offset_3D: Vector3 +var follow_has_damping: bool +var follow_damping_value: float = 10 + +# Follow Group +var follow_group_nodes_2D: Array[Node2D] +var follow_group_nodes_3D: Array[Node3D] +var follow_group_paths: Array[NodePath] + +# Framed Follow +signal dead_zone_changed +var follow_framed_dead_zone_width: float +var follow_framed_dead_zone_height: float +var follow_framed_initial_set: bool +var show_viewfinder_in_play: bool +var viewport_position: Vector2 + +var zoom: Vector2 = Vector2.ONE + +var tween_resource: PhantomCameraTween +var tween_resource_default: PhantomCameraTween = PhantomCameraTween.new() + +var inactive_update_mode: Constants.InactiveUpdateMode = Constants.InactiveUpdateMode.ALWAYS + + +func camera_enter_tree(pcam: Node): + pcam.add_to_group(PcamGroupNames.PCAM_GROUP_NAME) + + if pcam.Properties.follow_target_path and \ + not pcam.get_parent() is SpringArm3D and \ + is_instance_valid(pcam.get_node(pcam.Properties.follow_target_path)): + + pcam.Properties.follow_target_node = pcam.get_node(pcam.Properties.follow_target_path) + elif follow_group_paths: + if is_2D: + follow_group_nodes_2D.clear() + else: + follow_group_nodes_3D.clear() + + for path in follow_group_paths: + if not path.is_empty() and pcam.get_node(path): + should_follow = true + has_follow_group = true + if is_2D: + follow_group_nodes_2D.append(pcam.get_node(path)) + else: + follow_group_nodes_3D.append(pcam.get_node(path)) + + if pcam.Properties.follow_path_path: + pcam.Properties.follow_path_node = pcam.get_node(pcam.Properties.follow_path_path) + +func pcam_exit_tree(pcam: Node): + pcam.remove_from_group(PcamGroupNames.PCAM_GROUP_NAME) + + +######################### +# Add Properties +######################### +func add_multiple_hosts_properties() -> Array: + var _property_list: Array + + if scene_has_multiple_pcam_hosts: + _property_list.append({ + "name": Constants.PCAM_HOST, + "type": TYPE_INT, + "hint": PROPERTY_HINT_ENUM, + "hint_string": ",".join(PackedStringArray(pcam_host_group)), + "usage": PROPERTY_USAGE_DEFAULT, + }) + + return _property_list + + +func add_priority_properties() -> Array: + var _property_list: Array + + _property_list.append({ + "name": Constants.PRIORITY_OVERRIDE, + "type": TYPE_BOOL, + }) + + _property_list.append({ + "name": Constants.PRIORITY_PROPERTY_NAME, + "type": TYPE_INT, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + + return _property_list + + +func add_follow_mode_property() -> Array: + var _property_list: Array + + var follow_mode_keys: Array = Constants.FollowMode.keys() + if is_2D: + follow_mode_keys.remove_at(Constants.FollowMode.THIRD_PERSON) + + _property_list.append({ + "name": Constants.FOLLOW_MODE_PROPERTY_NAME, + "type": TYPE_INT, + "hint": PROPERTY_HINT_ENUM, + "hint_string": ", ".join(PackedStringArray(follow_mode_keys)).capitalize(), + "usage": PROPERTY_USAGE_DEFAULT, + }) + + return _property_list + + +func add_follow_target_property() -> Array: + var _property_list: Array + + if follow_mode == Constants.FollowMode.GROUP: + _property_list.append({ + "name": Constants.FOLLOW_GROUP_PROPERTY_NAME, + "type": TYPE_ARRAY, + "hint": PROPERTY_HINT_TYPE_STRING, + "hint_string": TYPE_NODE_PATH, + "usage": PROPERTY_USAGE_DEFAULT, + }) + else: + _property_list.append({ + "name": Constants.FOLLOW_TARGET_PROPERTY_NAME, + "type": TYPE_NODE_PATH, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + if follow_mode == Constants.FollowMode.PATH: + _property_list.append({ + "name": Constants.FOLLOW_PATH_PROPERTY_NAME, + "type": TYPE_NODE_PATH, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + + return _property_list + + +func add_follow_properties() -> Array: + var _property_list: Array + if follow_mode != Constants.FollowMode.NONE: + if follow_mode == Constants.FollowMode.SIMPLE or \ + follow_mode == Constants.FollowMode.GROUP or \ + follow_mode == Constants.FollowMode.FRAMED or \ + follow_mode == Constants.FollowMode.THIRD_PERSON: + if is_2D: + _property_list.append({ + "name": Constants.FOLLOW_TARGET_OFFSET_PROPERTY_NAME, + "type": TYPE_VECTOR2, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + else: + _property_list.append({ + "name": Constants.FOLLOW_TARGET_OFFSET_PROPERTY_NAME, + "type": TYPE_VECTOR3, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + + if follow_mode != Constants.FollowMode.NONE: + _property_list.append({ + "name": Constants.FOLLOW_DAMPING_NAME, + "type": TYPE_BOOL, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT, + }) + + if follow_has_damping: + _property_list.append({ + "name": Constants.FOLLOW_DAMPING_VALUE_NAME, + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0.01, 100, 0.01,", + "usage": PROPERTY_USAGE_DEFAULT, + }) + + return _property_list + + +func add_follow_framed() -> Array: + var _property_list: Array + + if follow_mode == Constants.FollowMode.FRAMED: + _property_list.append({ + "name": Constants.FOLLOW_FRAMED_DEAD_ZONE_HORIZONTAL_NAME, + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0, 1, 0.01,", + "usage": PROPERTY_USAGE_DEFAULT, + }) + _property_list.append({ + "name": Constants.FOLLOW_FRAMED_DEAD_ZONE_VERTICAL_NAME, + "type": TYPE_FLOAT, + "hint": PROPERTY_HINT_RANGE, + "hint_string": "0, 1, 0.01,", + "usage": PROPERTY_USAGE_DEFAULT, + }) + + _property_list.append({ + "name": Constants.FOLLOW_VIEWFINDER_IN_PLAY_NAME, + "type": TYPE_BOOL, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT + }) + + return _property_list + + +func add_tween_properties() -> Array: + var _property_list: Array + + _property_list.append({ + "name": Constants.TWEEN_RESOURCE_PROPERTY_NAME, + "type": TYPE_OBJECT, + "hint": PROPERTY_HINT_RESOURCE_TYPE, + "hint_string": "PhantomCameraTween" + }) + + return _property_list + + +func add_secondary_properties() -> Array: + var _property_list: Array + + _property_list.append({ + "name": Constants.TWEEN_ONLOAD_NAME, + "type": TYPE_BOOL, + "hint": PROPERTY_HINT_NONE, + "usage": PROPERTY_USAGE_DEFAULT + }) + + _property_list.append({ + "name": Constants.INACTIVE_UPDATE_MODE_PROPERTY_NAME, + "type": TYPE_INT, + "hint": PROPERTY_HINT_ENUM, + "hint_string": ", ".join(PackedStringArray(Constants.InactiveUpdateMode.keys())).capitalize(), + }) + + return _property_list + + +######################### +# Set Properties +######################### +func set_phantom_host_property(property: StringName, value, pcam: Node): + if property == Constants.PCAM_HOST: + if value != null && value is int: + var host_node = instance_from_id(value) + pcam_host_owner = host_node + + +func set_priority_property(property: StringName, value, pcam: Node): + if Engine.is_editor_hint() and is_instance_valid(pcam_host_owner): + if property == Constants.PRIORITY_OVERRIDE: + if value == true: + priority_override = value + pcam_host_owner.pcam_priority_override(pcam) + else: + priority_override = value + pcam_host_owner.pcam_priority_updated(pcam) + pcam_host_owner.pcam_priority_override_disabled() + + if property == Constants.PRIORITY_PROPERTY_NAME: + set_priority(value, pcam) + + +func set_follow_properties(property: StringName, value, pcam: Node): + if property == Constants.FOLLOW_MODE_PROPERTY_NAME: + follow_mode = value + + if follow_mode != Constants.FollowMode.GROUP: + has_follow_group = false + + if follow_mode == Constants.FollowMode.FRAMED: + follow_framed_initial_set = true + + pcam.notify_property_list_changed() + +# match value: +# Constants.FollowMode.NONE: +# set_process(pcam, false) +# _: +# set_process(pcam, true) + + if property == Constants.FOLLOW_TARGET_PROPERTY_NAME: + if follow_mode != Constants.FollowMode.NONE: + should_follow = true + else: + should_follow = false + + follow_target_path = value + var valueNodePath: NodePath = value as NodePath + if not valueNodePath.is_empty(): + follow_has_target = true + if pcam.has_node(follow_target_path): + follow_target_node = pcam.get_node(follow_target_path) + else: + follow_has_target = false + follow_target_node = null + + pcam.notify_property_list_changed() + + if property == Constants.FOLLOW_PATH_PROPERTY_NAME: + follow_path_path = value + + var valueNodePath: NodePath = value as NodePath + if not valueNodePath.is_empty(): + follow_has_path_target = true + if pcam.has_node(follow_path_path): + follow_path_node = pcam.get_node(follow_path_path) + else: + follow_has_path_target = false + follow_path_node = null + pcam.notify_property_list_changed() + + if property == Constants.FOLLOW_GROUP_PROPERTY_NAME: + if value and value.size() > 0: + # Clears the Array in case of reshuffling or updated Nodes + if is_2D: + follow_group_nodes_2D.clear() + else: + follow_group_nodes_3D.clear() + follow_group_paths = value as Array[NodePath] + + if not follow_group_paths.is_empty(): + for path in follow_group_paths: + if pcam.has_node(path): + should_follow = true + has_follow_group = true + var node: Node = pcam.get_node(path) + if node is Node2D or node is Node3D: + # Prevents duplicated nodes from being assigned to array + if is_2D: + if follow_group_nodes_2D.find(node): + follow_group_nodes_2D.append(node) + else: + if follow_group_nodes_3D.find(node): + follow_group_nodes_3D.append(node) + else: + printerr("Assigned non-Node3D to Follow Group") + + pcam.notify_property_list_changed() + + # Framed Follow + if property == Constants.FOLLOW_FRAMED_DEAD_ZONE_HORIZONTAL_NAME: + follow_framed_dead_zone_width = value + dead_zone_changed.emit() + if property == Constants.FOLLOW_FRAMED_DEAD_ZONE_VERTICAL_NAME: + follow_framed_dead_zone_height = value + dead_zone_changed.emit() + if property == Constants.FOLLOW_VIEWFINDER_IN_PLAY_NAME: + show_viewfinder_in_play = value + + if property == Constants.FOLLOW_TARGET_OFFSET_PROPERTY_NAME: + if value is Vector3: + follow_target_offset_3D = value + else: + follow_target_offset_2D = value + + if property == Constants.FOLLOW_DAMPING_NAME: + follow_has_damping = value + pcam.notify_property_list_changed() + + if property == Constants.FOLLOW_DAMPING_VALUE_NAME: + follow_damping_value = value + + +func set_tween_properties(property: StringName, value, pcam: Node): + if property == Constants.TWEEN_RESOURCE_PROPERTY_NAME: + tween_resource = value + + +func set_secondary_properties(property: StringName, value, pcam: Node): + if property == Constants.TWEEN_ONLOAD_NAME: + tween_onload = value + if value == false: + has_tweened_onload = false + else: + has_tweened_onload = true + + if property == Constants.INACTIVE_UPDATE_MODE_PROPERTY_NAME: + inactive_update_mode = value + + +func set_priority(value: int, pcam: Node) -> void: + if value < 0: + printerr("Phantom Camera's priority cannot be less than 0") + priority = 0 + else: + priority = value + + if pcam_host_owner: + pcam_host_owner.pcam_priority_updated(pcam) +# else: +## TODO - Add logic to handle Phantom Camera Host in scene +# printerr("Trying to change priority without a Phantom Camera Host - Please attached one to a Camera3D") +# pass + + +######################### +# Other Functions +######################### +func assign_pcam_host(pcam: Node) -> void: + pcam_host_group = pcam.get_tree().get_nodes_in_group(PcamGroupNames.PCAM_HOST_GROUP_NAME) + + if pcam_host_group.size() == 1: + pcam_host_owner = pcam.Properties.pcam_host_group[0] + pcam_host_owner.pcam_added_to_scene(pcam) +# else: +# for camera_host in camera_host_group: +# print("Multiple PhantomCameraBases in scene") +# print(pcam_host_group) +# print(pcam.get_tree().get_nodes_in_group(PhantomCameraGroupNames.PHANTOM_CAMERA_HOST_GROUP_NAME)) +# multiple_pcam_host_group.append(camera_host) +# return null + + +func toggle_priorty_override(pcam: Node) -> void: + if pcam_host_owner: + pcam_host_owner.pcam_priority_updated(pcam) + + +func assign_specific_pcam_host(pcam: Node, pcam_host: PhantomCameraHost) -> void: + pcam_host = pcam + + +func check_multiple_pcam_host_property(pcam: Node, multiple_host: bool = false) -> void: + if not multiple_host: + scene_has_multiple_pcam_hosts = false + else: + scene_has_multiple_pcam_hosts = true + + pcam.notify_property_list_changed() +# pcam_host_group.append_array(host_group) + + +func get_framed_side_offset() -> Vector2: + var frame_out_bounds: Vector2 + + if viewport_position.x < 0.5 - follow_framed_dead_zone_width / 2: + # Is outside left edge + frame_out_bounds.x = -1 + + if viewport_position.y < 0.5 - follow_framed_dead_zone_height / 2: + # Is outside top edge + frame_out_bounds.y = 1 + + if viewport_position.x > 0.5 + follow_framed_dead_zone_width / 2: + # Is outside right edge + frame_out_bounds.x = 1 + + if viewport_position.y > 0.5001 + follow_framed_dead_zone_height / 2: # 0.501 to resolve an issue where the bottom vertical Dead Zone never becoming 0 when the Dead Zone Vertical parameter is set to 0 + # Is outside bottom edge + frame_out_bounds.y = -1 + + return frame_out_bounds diff --git a/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd new file mode 100644 index 0000000..1ef175f --- /dev/null +++ b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd @@ -0,0 +1,366 @@ +@tool +@icon("res://addons/phantom_camera/icons/PhantomCameraHostIcon.svg") +class_name PhantomCameraHost +extends Node + +const PcamGroupNames = preload("res://addons/phantom_camera/scripts/group_names.gd") + +var _pcam_tween: Tween +var _tween_default_ease: Tween.EaseType +var _easing: Tween.TransitionType + +var camera_2D: Camera2D +var camera_3D: Camera3D +var _pcam_list: Array[Node] + +var _active_pcam: Node +var _active_pcam_priority: int = -1 +var _active_pcam_missing: bool = true +var _active_pcam_has_damping: bool + +var _prev_active_pcam_2D_transform: Transform2D +var _prev_active_pcam_3D_transform: Transform3D + +var trigger_pcam_tween: bool +var tween_duration: float + +var multiple_pcam_hosts: bool + +var is_child_of_camera: bool = false +var _is_2D: bool + +signal update_editor_viewfinder + +var framed_viewfinder_scene = load("res://addons/phantom_camera/framed_viewfinder/framed_viewfinder_panel.tscn") +var framed_viewfinder_node: Control +var viewfinder_needed_check: bool = true + +var camera_zoom: Vector2 + +var _prev_camera_h_offset: float +var _prev_camera_v_offset: float +var _prev_camera_fov: float + +var _should_refresh_transform: bool +var _active_pcam_2D_glob_transform: Transform2D +var _active_pcam_3D_glob_transform: Transform3D + +################### +# Private Functions +################### +func _enter_tree() -> void: +# camera = get_parent() + var parent = get_parent() + + if parent is Camera2D or parent is Camera3D: + is_child_of_camera = true + if parent is Camera2D: + _is_2D = true + camera_2D = parent + else: + _is_2D = false + camera_3D = parent + + add_to_group(PcamGroupNames.PCAM_HOST_GROUP_NAME) +# var already_multi_hosts: bool = multiple_pcam_hosts + + _check_camera_host_amount() + + if multiple_pcam_hosts: + printerr( + "Only one PhantomCameraHost can exist in a scene", + "\n", + "Multiple PhantomCameraHosts will be supported in https://github.com/MarcusSkov/phantom-camera/issues/26" + ) + queue_free() + + for pcam in _get_pcam_node_group(): + if not multiple_pcam_hosts: + pcam_added_to_scene(pcam) + pcam.assign_pcam_host() +# else: +# pcam.Properties.check_multiple_pcam_host_property(pcam, pca,_host_group, true) + else: + printerr(name, " is not a child of a Camera2D or Camera3D") + + +func _exit_tree() -> void: + remove_from_group(PcamGroupNames.PCAM_HOST_GROUP_NAME) + _check_camera_host_amount() + + for pcam in _get_pcam_node_group(): + if not multiple_pcam_hosts: + pcam.Properties.check_multiple_pcam_host_property(pcam) + + +func _ready() -> void: + if not is_instance_valid(_active_pcam): return + + if _is_2D: + _active_pcam_2D_glob_transform = _active_pcam.get_global_transform() + else: + _active_pcam_3D_glob_transform = _active_pcam.get_global_transform() + + +func _check_camera_host_amount(): + if _get_pcam_host_group().size() > 1: + multiple_pcam_hosts = true + else: + multiple_pcam_hosts = false + + +func _assign_new_active_pcam(pcam: Node) -> void: + var no_previous_pcam: bool + + if _active_pcam: + if _is_2D: + _prev_active_pcam_2D_transform = camera_2D.get_transform() + else: + _prev_active_pcam_3D_transform = camera_3D.get_transform() + _prev_camera_fov = camera_3D.get_fov() + _prev_camera_h_offset = camera_3D.get_h_offset() + _prev_camera_v_offset = camera_3D.get_v_offset() + + _active_pcam.Properties.is_active = false + else: + no_previous_pcam = true + + _active_pcam = pcam + _active_pcam_priority = pcam.get_priority() + _active_pcam_has_damping = pcam.Properties.follow_has_damping + + _active_pcam.Properties.is_active = true + + if _is_2D: + camera_zoom = camera_2D.get_zoom() + else: + if _active_pcam.get_camera_3D_resource(): + camera_3D.set_cull_mask(_active_pcam.get_camera_cull_mask()) + + if no_previous_pcam: + if _is_2D: + _prev_active_pcam_2D_transform = _active_pcam.get_transform() + else: + _prev_active_pcam_3D_transform = _active_pcam.get_transform() + + tween_duration = 0 + trigger_pcam_tween = true + + +func _find_pcam_with_highest_priority() -> void: + for pcam in _pcam_list: + if pcam.get_priority() > _active_pcam_priority: + _assign_new_active_pcam(pcam) + + _active_pcam_missing = false + + +func _tween_pcam(delta: float) -> void: + if _active_pcam.Properties.tween_onload == false && _active_pcam.Properties.has_tweened_onload == false: + trigger_pcam_tween = false + _reset_tween_on_load() + return + else: + _reset_tween_on_load() + + tween_duration += delta + + if _is_2D: + camera_2D.set_global_position( + _tween_interpolate_value(_prev_active_pcam_2D_transform.origin, _active_pcam_2D_glob_transform.origin) + ) + + camera_2D.set_zoom( + _tween_interpolate_value(camera_zoom, _active_pcam.Properties.zoom) + ) + else: + camera_3D.set_global_position( + _tween_interpolate_value(_prev_active_pcam_3D_transform.origin, _active_pcam_3D_glob_transform.origin) + ) + + var prev_active_pcam_3D_basis = Quaternion(_prev_active_pcam_3D_transform.basis.orthonormalized()) + camera_3D.set_quaternion( + Tween.interpolate_value( + prev_active_pcam_3D_basis, \ + prev_active_pcam_3D_basis.inverse() * Quaternion(_active_pcam_3D_glob_transform.basis.orthonormalized()), + tween_duration, \ + _active_pcam.get_tween_duration(), \ + _active_pcam.get_tween_transition(), + _active_pcam.get_tween_ease(), + ) + ) + + if _prev_camera_fov != _active_pcam.get_camera_fov() and _active_pcam.get_camera_3D_resource(): + camera_3D.set_fov( + _tween_interpolate_value(_prev_camera_fov, _active_pcam.get_camera_fov()) + ) + + if _prev_camera_h_offset != _active_pcam.get_camera_h_offset() and _active_pcam.get_camera_3D_resource(): + camera_3D.set_h_offset( + _tween_interpolate_value(_prev_camera_h_offset, _active_pcam.get_camera_h_offset()) + ) + + if _prev_camera_v_offset != _active_pcam.get_camera_v_offset() and _active_pcam.get_camera_3D_resource(): + camera_3D.set_v_offset( + _tween_interpolate_value(_prev_camera_v_offset, _active_pcam.get_camera_v_offset()) + ) + + +func _tween_interpolate_value(from: Variant, to: Variant) -> Variant: + return Tween.interpolate_value( + from, \ + to - from, + tween_duration, \ + _active_pcam.get_tween_duration(), \ + _active_pcam.get_tween_transition(), + _active_pcam.get_tween_ease(), + ) + + +func _reset_tween_on_load() -> void: + for pcam in _get_pcam_node_group(): + pcam.Properties.has_tweened_onload = true + + if not _is_2D: + if _active_pcam.get_camera_3D_resource(): + camera_3D.set_fov(_active_pcam.get_camera_fov()) + camera_3D.set_h_offset(_active_pcam.get_camera_h_offset()) + camera_3D.set_v_offset(_active_pcam.get_camera_v_offset()) + + +func _pcam_follow(delta: float) -> void: + if not _active_pcam: return + + if _is_2D: + camera_2D.set_global_transform(_active_pcam_2D_glob_transform) + if _active_pcam.Properties.has_follow_group: + if _active_pcam.Properties.follow_has_damping: + camera_2D.zoom = camera_2D.zoom.lerp(_active_pcam.Properties.zoom, delta * _active_pcam.Properties.follow_damping_value) + else: + camera_2D.set_zoom(_active_pcam.zoom) + else: + camera_2D.set_zoom(_active_pcam.Properties.zoom) + else: + camera_3D.set_global_transform(_active_pcam_3D_glob_transform) + + +func _refresh_transform() -> void: + if _is_2D: + _active_pcam_2D_glob_transform = _active_pcam.get_global_transform() + else: + _active_pcam_3D_glob_transform = _active_pcam.get_global_transform() + + +func _process_pcam(delta: float) -> void: + if _active_pcam_missing or not is_child_of_camera: return + + if not trigger_pcam_tween: + _pcam_follow(delta) + + if viewfinder_needed_check: + show_viewfinder_in_play() + viewfinder_needed_check = false + + if Engine.is_editor_hint(): + if not _is_2D: + if _active_pcam.get_camera_3D_resource(): + camera_3D.set_fov(_active_pcam.get_camera_fov()) + camera_3D.set_h_offset(_active_pcam.get_camera_h_offset()) + camera_3D.set_v_offset(_active_pcam.get_camera_v_offset()) + + else: + if tween_duration < _active_pcam.get_tween_duration(): + _tween_pcam(delta) + else: + tween_duration = 0 + trigger_pcam_tween = false + show_viewfinder_in_play() + _pcam_follow(delta) + + +func show_viewfinder_in_play() -> void: + if _active_pcam.Properties.show_viewfinder_in_play: + if not Engine.is_editor_hint() && OS.has_feature("editor"): # Only appears when running in the editor + var canvas_layer: CanvasLayer = CanvasLayer.new() + get_tree().get_root().get_child(0).add_child(canvas_layer) + + framed_viewfinder_node = framed_viewfinder_scene.instantiate() + canvas_layer.add_child(framed_viewfinder_node) + else: + if framed_viewfinder_node: + framed_viewfinder_node.queue_free() + + +func _get_pcam_node_group() -> Array[Node]: + return get_tree().get_nodes_in_group(PcamGroupNames.PCAM_GROUP_NAME) + + +func _get_pcam_host_group() -> Array[Node]: + return get_tree().get_nodes_in_group(PcamGroupNames.PCAM_HOST_GROUP_NAME) + + +func _process(delta): + if not is_instance_valid(_active_pcam): return + + if _should_refresh_transform: +# _refresh_transform() + if _is_2D: + _active_pcam_2D_glob_transform = _active_pcam.get_global_transform() + else: + _active_pcam_3D_glob_transform = _active_pcam.get_global_transform() + + _should_refresh_transform = false + + _process_pcam(delta) + + +func _physics_process(delta: float) -> void: + _should_refresh_transform = true + + +################## +# Public Functions +################## +func pcam_added_to_scene(pcam: Node) -> void: + _pcam_list.append(pcam) + _find_pcam_with_highest_priority() + + +func pcam_removed_from_scene(pcam) -> void: + _pcam_list.erase(pcam) + if pcam == _active_pcam: + _active_pcam_missing = true + _active_pcam_priority = -1 + _find_pcam_with_highest_priority() + + +func pcam_priority_updated(pcam: Node) -> void: + if Engine.is_editor_hint() and _active_pcam.Properties.priority_override: return + + if not is_instance_valid(pcam): return + + var current_pcam_priority: int = pcam.get_priority() + + if current_pcam_priority >= _active_pcam_priority and pcam != _active_pcam: + _assign_new_active_pcam(pcam) + elif pcam == _active_pcam: + if current_pcam_priority <= _active_pcam_priority: + _active_pcam_priority = current_pcam_priority + _find_pcam_with_highest_priority() + else: + _active_pcam_priority = current_pcam_priority + + +func pcam_priority_override(pcam: Node) -> void: + if Engine.is_editor_hint() and _active_pcam.Properties.priority_override: + _active_pcam.Properties.priority_override = false + + _assign_new_active_pcam(pcam) + update_editor_viewfinder.emit() + +func pcam_priority_override_disabled() -> void: + update_editor_viewfinder.emit() + + +func get_active_pcam() -> Node: + return _active_pcam diff --git a/addons/phantom_camera/scripts/resources/camera_3D_resource.gd b/addons/phantom_camera/scripts/resources/camera_3D_resource.gd new file mode 100644 index 0000000..eb47933 --- /dev/null +++ b/addons/phantom_camera/scripts/resources/camera_3D_resource.gd @@ -0,0 +1,14 @@ +class_name Camera3DResource +extends Resource + +## The time it takes to tween to this property +@export_flags_3d_physics var cull_mask: int = 1048575 + +## Horizontally offsets the Camera3D +@export var h_offset: float = 0 + +## Vertically offsets the Camera3D +@export var v_offset: float = 0 + +## Adjusts Camera3D FOV +@export var fov: float = 75 diff --git a/addons/phantom_camera/scripts/resources/tween_resource.gd b/addons/phantom_camera/scripts/resources/tween_resource.gd new file mode 100644 index 0000000..dd16a97 --- /dev/null +++ b/addons/phantom_camera/scripts/resources/tween_resource.gd @@ -0,0 +1,13 @@ +class_name PhantomCameraTween +extends Resource + +const Constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") + +## The time it takes to tween to this property +@export var duration: float = 1 + +## The transition bezier type for the tween +@export var transition: Constants.TweenTransitions = Constants.TweenTransitions.LINEAR + +## The ease type for the tween +@export var ease: Constants.TweenEases = Constants.TweenEases.EASE_IN_OUT diff --git a/addons/phantom_camera/scripts/viewfinder/viewfinder.gd b/addons/phantom_camera/scripts/viewfinder/viewfinder.gd new file mode 100644 index 0000000..20b15c1 --- /dev/null +++ b/addons/phantom_camera/scripts/viewfinder/viewfinder.gd @@ -0,0 +1,439 @@ +@tool +extends Control + +const PcamGroupNames = preload("res://addons/phantom_camera/scripts/group_names.gd") +const Constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") + +var _selected_camera: Node +var _active_pcam_camera +var pcam_host_group: Array[Node] + +var editor_interface: EditorInterface + +#################### +# Dead Zone Controls +#################### +@onready var dead_zone_center_hbox: VBoxContainer = %DeadZoneCenterHBoxContainer +@onready var dead_zone_center_center_panel: Panel = %DeadZoneCenterCenterPanel +@onready var dead_zone_left_center_panel: Panel = %DeadZoneLeftCenterPanel +@onready var dead_zone_right_center_panel: Panel = %DeadZoneRightCenterPanel +@onready var target_point: Panel = %TargetPoint + +var aspect_ratio_container: AspectRatioContainer +@onready var aspect_ratio_containers: AspectRatioContainer = %AspectRatioContainer +@onready var camera_viewport_panel: Panel = aspect_ratio_containers.get_child(0) +@onready var _framed_viewfinder: Control = %FramedViewfinder +@onready var _dead_zone_h_box_container: Control = %DeadZoneHBoxContainer +@onready var sub_viewport: SubViewport = %SubViewport + +########################### +# Viewfinder Empty Controls +########################### +@onready var _empty_state_control: Control = %EmptyStateControl +@onready var _empty_state_icon: Control = %EmptyStateIcon +@onready var _empty_state_text: RichTextLabel = %EmptyStateText +@onready var _add_node_button: Button = %AddNodeButton +@onready var _add_node_button_text: RichTextLabel = %AddNodeTypeText + + +################### +# Priority Override +################### +@onready var _priority_override_button: Button = %PriorityOverrideButton +@onready var _priority_override_name_label: Label = %PriorityOverrideNameLabel + + +# TODO - Should be in a central location +const _camera_2d_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg") +const _camera_3d_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg") +const _pcam_host_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/PhantomCameraHostIcon.svg") +const _pcam_2D_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/PhantomCameraGizmoIcon2D.svg") +const _pcam_3D_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/PhantomCameraGizmoIcon3D.svg") + +const _overlay_color_alpha: float = 0.3 + +var _no_open_scene_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg") +var _no_open_scene_string: String = "[b]2D[/b] or [b]3D[/b] scene open" + +var is_2D: bool +var is_scene: bool + +var has_camera_viewport_panel_size: bool = true + +var min_horizontal: float +var max_horizontal: float +var min_vertical: float +var max_vertical: float + + +func _ready(): + visibility_changed.connect(_visibility_check) + set_process(false) + + aspect_ratio_containers.set_ratio(get_viewport_rect().size.x / get_viewport_rect().size.y) + +# TODO - Don't think this is needed / does anything? + var root_node = get_tree().get_root().get_child(0) + if root_node is Node3D || root_node is Node2D: + %SubViewportContainer.set_visible(false) + + if root_node is Node2D: + is_2D = true + else: + is_2D = false + + _set_viewfinder(root_node, false) + + if Engine.is_editor_hint(): + get_tree().node_added.connect(_node_added) + get_tree().node_removed.connect(_node_added) + else: + _empty_state_control.set_visible(false) + + _priority_override_button.set_visible(false) + + +func _exit_tree() -> void: + if Engine.is_editor_hint(): + if get_tree().node_added.is_connected(_node_added): + get_tree().node_added.disconnect(_node_added) + get_tree().node_removed.disconnect(_node_added) + + if aspect_ratio_containers.resized.is_connected(_resized): + aspect_ratio_containers.resized.disconnect(_resized) + + if _add_node_button.pressed.is_connected(_add_node): + _add_node_button.pressed.disconnect(_add_node) + + if is_instance_valid(_active_pcam_camera): + if _active_pcam_camera.Properties.is_connected(Constants.DEAD_ZONE_CHANGED_SIGNAL, _on_dead_zone_changed): + _active_pcam_camera.Properties.disconnect(Constants.DEAD_ZONE_CHANGED_SIGNAL, _on_dead_zone_changed) + + if _priority_override_button.pressed.is_connected(_select_override_pcam): + _priority_override_button.pressed.disconnect(_select_override_pcam) + + +func _process(_delta: float): + if not visible or not is_instance_valid(_active_pcam_camera): return + + var unprojected_position_clamped: Vector2 = Vector2( + clamp(_active_pcam_camera.Properties.viewport_position.x, min_horizontal, max_horizontal), + clamp(_active_pcam_camera.Properties.viewport_position.y, min_vertical, max_vertical) + ) + target_point.position = camera_viewport_panel.size * unprojected_position_clamped - target_point.size / 2 + + if not has_camera_viewport_panel_size: + _on_dead_zone_changed() + + +func _node_added(node: Node) -> void: + if editor_interface == null: return + _visibility_check() + + +func scene_changed(scene_root: Node) -> void: + if scene_root is Node2D: +# print("Is 2D node") + is_2D = true + is_scene = true + + _add_node_button.set_visible(true) +# var camera: Camera2D = scene_root.get_viewport().get_camera_2d() + var camera: Camera2D = _get_camera_2D() + + _check_camera(scene_root, camera, true) + elif scene_root is Node3D: +# print("Is 3D node") +# Is 3D scene + is_2D = false + is_scene = true + + _add_node_button.set_visible(true) + var camera: Camera3D = scene_root.get_viewport().get_camera_3d() + _check_camera(scene_root, camera, false) + else: +# print("Not a 2D or 3D scene") + is_scene = false +# Is not a 2D or 3D scene + _set_empty_viewfinder_state(_no_open_scene_string, _no_open_scene_icon) + _add_node_button.set_visible(false) + + +func _visibility_check(): + if not editor_interface or not visible: return + + if not is_instance_valid(editor_interface): + is_scene = false +# Is not a 2D or 3D scene + _set_empty_viewfinder_state(_no_open_scene_string, _no_open_scene_icon) + _add_node_button.set_visible(false) + return + + var root: Node = editor_interface.get_edited_scene_root() + if root is Node2D: +# print("Is a 2D scene") + is_2D = true + is_scene = true + + _add_node_button.set_visible(true) +# TODO: Figure out why the line below doesn't work... +# var camera: Camera2D = root.get_viewport().get_camera_2d() + + var camera: Camera2D = _get_camera_2D() + _check_camera(root, camera, true) + elif root is Node3D: +# Is 3D scene + is_2D = false + is_scene = true + + _add_node_button.set_visible(true) + var camera: Camera3D = root.get_viewport().get_camera_3d() + _check_camera(root, camera, false) +# editor_interface.get_selection().clear() +# editor_interface.get_selection().add_node(pcam_host_group[0].get_active_pcam()) + else: + is_scene = false +# Is not a 2D or 3D scene + _set_empty_viewfinder_state(_no_open_scene_string, _no_open_scene_icon) + _add_node_button.set_visible(false) + + if not _priority_override_button.pressed.is_connected(_select_override_pcam): + _priority_override_button.pressed.connect(_select_override_pcam) + + +func _get_camera_2D() -> Camera2D: + var camerasGroupName = "__cameras_%d" % editor_interface.get_edited_scene_root().get_viewport().get_viewport_rid().get_id() + var cameras = get_tree().get_nodes_in_group(camerasGroupName) + + for camera in cameras: + if camera is Camera2D and camera.is_current: + return camera + + return null + + +func _check_camera(root: Node, camera: Node, is_2D: bool) -> void: + var camera_string: String + var pcam_string: String + var color: Color + var color_alpha: Color + var camera_icon: CompressedTexture2D + var pcam_icon: CompressedTexture2D + + if is_2D: + camera_string = Constants.CAMERA_2D_NODE_NAME + pcam_string = Constants.PCAM_2D_NODE_NAME + color = Constants.COLOR_2D + camera_icon = _camera_2d_icon + pcam_icon = _pcam_2D_icon + else: + camera_string = Constants.CAMERA_3D_NODE_NAME + pcam_string = Constants.PCAM_3D_NODE_NAME + color = Constants.COLOR_3D + camera_icon = _camera_3d_icon + pcam_icon = _pcam_3D_icon + + if camera: +# Has Camera + var pcam_host: PhantomCameraHost + if camera.get_children().size() > 0: + for cam_child in camera.get_children(): + if cam_child is PhantomCameraHost: + pcam_host = cam_child + + if pcam_host: + if get_tree().get_nodes_in_group(PcamGroupNames.PCAM_GROUP_NAME): +# Pcam exists in tree + _set_viewfinder(root, true) +# if pcam_host.get_active_pcam().get_get_follow_mode(): +# _on_dead_zone_changed() + + _set_viewfinder_state() + + # Related to: https://github.com/ramokz/phantom-camera/issues/105 + # REMOVE BELOW WHEN 2D VIEWFINDER IS SUPPORTED + if not is_2D: + %NoSupportMsg.set_visible(false) + elif is_2D: + %NoSupportMsg.set_visible(true) + ### REMOVAL END + + else: +# No PCam in scene + _update_button(pcam_string, pcam_icon, color) + _set_empty_viewfinder_state(pcam_string, pcam_icon) + else: +# No PCamHost in scene + _update_button(Constants.PCAM_HOST_NODE_NAME, _pcam_host_icon, Constants.PCAM_HOST_COLOR) + _set_empty_viewfinder_state(Constants.PCAM_HOST_NODE_NAME, _pcam_host_icon) + else: +# No PCamHost in scene + _update_button(Constants.PCAM_HOST_NODE_NAME, _pcam_host_icon, Constants.PCAM_HOST_COLOR) + _set_empty_viewfinder_state(Constants.PCAM_HOST_NODE_NAME, _pcam_host_icon) + else: +# No Camera + _update_button(camera_string, camera_icon, color) + _set_empty_viewfinder_state(camera_string, camera_icon) + + +func _update_button(text: String, icon: CompressedTexture2D, color: Color) -> void: + _add_node_button_text.set_text("[center]Add [img=32]" + icon.resource_path + "[/img] [b]"+ text + "[/b][/center]"); + var button_theme_hover: StyleBoxFlat = _add_node_button.get_theme_stylebox("hover") + button_theme_hover.border_color = color + _add_node_button.add_theme_stylebox_override("hover", button_theme_hover) + + +func _set_viewfinder_state() -> void: + _empty_state_control.set_visible(false) + + _framed_viewfinder.set_visible(true) + target_point.set_visible(true) + + if is_instance_valid(_active_pcam_camera): + if _active_pcam_camera.get_follow_mode() == Constants.FollowMode.FRAMED: + _dead_zone_h_box_container.set_visible(true) + else: + _dead_zone_h_box_container.set_visible(false) + + +func _set_empty_viewfinder_state(text: String, icon: CompressedTexture2D) -> void: + _framed_viewfinder.set_visible(false) + target_point.set_visible(false) + + _empty_state_control.set_visible(true) + _empty_state_icon.set_texture(icon) + if icon == _no_open_scene_icon: + _empty_state_text.set_text("[center]No " + text + "[/center]") + else: + _empty_state_text.set_text("[center]No [b]" + text + "[/b] in scene[/center]") + + if _add_node_button.pressed.is_connected(_add_node): + _add_node_button.pressed.disconnect(_add_node) + + _add_node_button.pressed.connect(_add_node.bind(text)) + + +func _add_node(node_type: String) -> void: + if not editor_interface: return + + var root: Node = editor_interface.get_edited_scene_root() + + match node_type: + _no_open_scene_string: + pass + Constants.CAMERA_2D_NODE_NAME: + var camera: Camera2D = Camera2D.new() + _instantiate_node(root, camera, Constants.CAMERA_2D_NODE_NAME) + Constants.CAMERA_3D_NODE_NAME: + var camera: Camera3D = Camera3D.new() + _instantiate_node(root, camera, Constants.CAMERA_3D_NODE_NAME) + Constants.PCAM_HOST_NODE_NAME: + var pcam_host: PhantomCameraHost = PhantomCameraHost.new() + pcam_host.set_name(Constants.PCAM_HOST_NODE_NAME) + if is_2D: +# get_tree().get_edited_scene_root().get_viewport().get_camera_2d().add_child(pcam_host) + _get_camera_2D().add_child(pcam_host) + pcam_host.set_owner(get_tree().get_edited_scene_root()) + else: +# var pcam_3D := get_tree().get_edited_scene_root().get_viewport().get_camera_3d() + get_tree().get_edited_scene_root().get_viewport().get_camera_3d().add_child(pcam_host) + pcam_host.set_owner(get_tree().get_edited_scene_root()) + Constants.PCAM_2D_NODE_NAME: + var pcam_2D: PhantomCamera2D = PhantomCamera2D.new() + _instantiate_node(root, pcam_2D, Constants.PCAM_2D_NODE_NAME) + Constants.PCAM_3D_NODE_NAME: + var pcam_3D: PhantomCamera3D = PhantomCamera3D.new() + _instantiate_node(root, pcam_3D, Constants.PCAM_3D_NODE_NAME) + + +func _instantiate_node(root: Node, node: Node, name: String) -> void: + node.set_name(name) + root.add_child(node) + node.set_owner(get_tree().get_edited_scene_root()) + + +func _set_viewfinder(root: Node, editor: bool): + pcam_host_group = root.get_tree().get_nodes_in_group(PcamGroupNames.PCAM_HOST_GROUP_NAME) + if pcam_host_group.size() != 0: + if pcam_host_group.size() == 1: + var pcam_host: PhantomCameraHost = pcam_host_group[0] + if is_2D: + _selected_camera = pcam_host.camera_2D + _active_pcam_camera = _selected_camera.get_child(0).get_active_pcam() as PhantomCamera2D + if editor: + var camera_2D_rid: RID = _selected_camera.get_canvas_item() + # TODO - Missing 2D viewport support - https://github.com/ramokz/phantom-camera/issues/105 + RenderingServer.viewport_attach_camera(sub_viewport.get_viewport_rid(), camera_2D_rid) + else: + _selected_camera = pcam_host.camera_3D + _active_pcam_camera = _selected_camera.get_child(0).get_active_pcam() as PhantomCamera3D + if editor: + var camera_3D_rid: RID = _selected_camera.get_camera_rid() + RenderingServer.viewport_attach_camera(sub_viewport.get_viewport_rid(), camera_3D_rid) + + if _selected_camera.keep_aspect == Camera3D.KeepAspect.KEEP_HEIGHT: + aspect_ratio_containers.set_stretch_mode(AspectRatioContainer.STRETCH_HEIGHT_CONTROLS_WIDTH) + else: + aspect_ratio_containers.set_stretch_mode(AspectRatioContainer.STRETCH_WIDTH_CONTROLS_HEIGHT) + + _on_dead_zone_changed() + set_process(true) + + if not pcam_host.update_editor_viewfinder.is_connected(_on_update_editor_viewfinder): + pcam_host.update_editor_viewfinder.connect(_on_update_editor_viewfinder.bind(pcam_host)) + + if not aspect_ratio_containers.resized.is_connected(_resized): + aspect_ratio_containers.resized.connect(_resized) + + if not _active_pcam_camera.Properties.is_connected(_active_pcam_camera.Constants.DEAD_ZONE_CHANGED_SIGNAL, _on_dead_zone_changed): + _active_pcam_camera.Properties.connect(_active_pcam_camera.Constants.DEAD_ZONE_CHANGED_SIGNAL, _on_dead_zone_changed) + + # aspect_ratio_container + # TODO - Might not be needed + # _active_pcam_camera.Properties.disconnect(_on_dead_zone_changed) + else: + for pcam_host in pcam_host_group: + print(pcam_host, " is in a scene") + + +func _resized() -> void: + _on_dead_zone_changed() + +func _on_dead_zone_changed() -> void: + if not is_instance_valid(_active_pcam_camera): return + + if camera_viewport_panel.size == Vector2.ZERO: + has_camera_viewport_panel_size = false + return + else: + has_camera_viewport_panel_size = true + + var dead_zone_width: float = _active_pcam_camera.Properties.follow_framed_dead_zone_width * camera_viewport_panel.size.x + var dead_zone_height: float = _active_pcam_camera.Properties.follow_framed_dead_zone_height * camera_viewport_panel.size.y + dead_zone_center_hbox.set_custom_minimum_size(Vector2(dead_zone_width, 0)) + dead_zone_center_center_panel.set_custom_minimum_size(Vector2(0, dead_zone_height)) + dead_zone_left_center_panel.set_custom_minimum_size(Vector2(0, dead_zone_height)) + dead_zone_right_center_panel.set_custom_minimum_size(Vector2(0, dead_zone_height)) + + min_horizontal = 0.5 - _active_pcam_camera.Properties.follow_framed_dead_zone_width / 2 + max_horizontal = 0.5 + _active_pcam_camera.Properties.follow_framed_dead_zone_width / 2 + min_vertical = 0.5 - _active_pcam_camera.Properties.follow_framed_dead_zone_height / 2 + max_vertical = 0.5 + _active_pcam_camera.Properties.follow_framed_dead_zone_height / 2 + +# target_point.position = Vector2(viewport_width / 2, viewport_height / 2) + +#################### +## Priority Override +#################### +func _on_update_editor_viewfinder(pcam_host: PhantomCameraHost) -> void: + if pcam_host.get_active_pcam().Properties.priority_override: + _active_pcam_camera = pcam_host.get_active_pcam() + _priority_override_button.set_visible(true) + _priority_override_name_label.set_text(_active_pcam_camera.name) + _priority_override_button.set_tooltip_text(_active_pcam_camera.name) + else: + _priority_override_button.set_visible(false) + +func _select_override_pcam() -> void: + editor_interface.get_selection().clear() + editor_interface.get_selection().add_node(_active_pcam_camera) diff --git a/addons/sound_manager/LICENSE b/addons/sound_manager/LICENSE new file mode 100644 index 0000000..09351d9 --- /dev/null +++ b/addons/sound_manager/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-present Nathan Hoad + +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. \ No newline at end of file diff --git a/addons/sound_manager/SoundManager.cs b/addons/sound_manager/SoundManager.cs new file mode 100644 index 0000000..3dadd47 --- /dev/null +++ b/addons/sound_manager/SoundManager.cs @@ -0,0 +1,178 @@ +using Godot; +using Godot.Collections; + +namespace NathanHoad +{ + public partial class SoundManager : Node + { + private static Node instance; + public static Node Instance + { + get + { + if (instance == null) + { + instance = (Node)Engine.GetSingleton("SoundManager"); + } + return instance; + } + } + + + #region Sounds + + public static float GetSoundVolume() + { + return (float)Instance.Call("get_sound_volume"); + } + + + public static float GetUISoundVolume() + { + return (float)Instance.Call("get_ui_sound_volume"); + } + + + public static void SetSoundVolume(float volume) + { + Instance.Call("set_sound_volume", volume); + } + + + public static AudioStreamPlayer PlaySound(AudioStream resource, string overrideBus = "") + { + return (AudioStreamPlayer)Instance.Call("play_sound", resource, overrideBus); + } + + + public static AudioStreamPlayer PlaySoundWithPitch(AudioStream resource, float pitch, string overrideBus = "") + { + return (AudioStreamPlayer)Instance.Call("play_sound_with_pitch", resource, pitch, overrideBus); + } + + + public static AudioStreamPlayer PlayUISound(AudioStream resource, string overrideBus = "") + { + return (AudioStreamPlayer)Instance.Call("play_ui_sound", resource, overrideBus); + } + + + public static AudioStreamPlayer PlayUISoundWithPitch(AudioStream resource, float pitch, string overrideBus = "") + { + return (AudioStreamPlayer)Instance.Call("play_ui_sound_with_pitch", resource, pitch, overrideBus); + } + + + public static void SetDefaultSoundBus(string bus) + { + Instance.Call("set_default_sound_bus", bus); + } + + + public static void SetDefaultUISoundBus(string bus) + { + Instance.Call("set_default_ui_sound_bus", bus); + } + + #endregion + + + #region Music + + public static float GetMusicVolume() + { + return (float)Instance.Call("get_music_volume"); + } + + + public static void SetMusicVolume(float volume) + { + Instance.Call("set_music_volume", volume); + } + + + public static AudioStreamPlayer PlayMusic(AudioStream resource, float crossFadeDuration = 0.0f, string overrideBus = "") + { + return (AudioStreamPlayer)Instance.Call("play_music", resource, crossFadeDuration, overrideBus); + } + + + public static AudioStreamPlayer PlayMusicFromPosition(AudioStream resource, float position, float crossFadeDuration = 0.0f, string overrideBus = "") + { + return (AudioStreamPlayer)Instance.Call("play_music_from_position", resource, position, crossFadeDuration, overrideBus); + } + + + public static AudioStreamPlayer PlayMusicAtVolume(AudioStream resource, float volume, float crossFadeDuration = 0.0f, string overrideBus = "") + { + return (AudioStreamPlayer)Instance.Call("play_music_at_volume", resource, volume, crossFadeDuration, overrideBus); + } + + public static AudioStreamPlayer PlayMusicFromPositionAtVolume(AudioStream resource, float position, float volume, float crossFadeDuration = 0.0f, string overrideBus = "") + { + return (AudioStreamPlayer)Instance.Call("play_music_from_position_at_volume", resource, position, volume, crossFadeDuration, overrideBus); + } + + + public static Array GetMusicTrackHistory() + { + return (Array)Instance.Call("get_music_track_history"); + } + + + public static string GetLastPlayedMusicTrack() + { + return (string)Instance.Call("get_last_played_music_track"); + } + + + public static bool IsMusicPlaying(AudioStream resource = null) + { + return (bool)Instance.Call("is_music_playing", resource); + } + + + public static bool IsMusicTrackPlaying(string resource_path) + { + return (bool)Instance.Call("is_music_track_playing", resource_path); + } + + + public static Array GetCurrentlyPlayingMusic() + { + return (Array)Instance.Call("get_currently_playing_music"); + } + + + public static Array GetCurrentlyPlayingTracks() + { + return (Array)Instance.Call("get_currently_playing_tracks"); + } + + + public static void PauseMusic(AudioStream resource = null) + { + Instance.Call("pause_music", resource); + } + + + public static void ResumeMusic(AudioStream resource = null) + { + Instance.Call("resume_music", resource); + } + + + public static void StopMusic(float fadeOutDuration = 0.0f) + { + Instance.Call("stop_music", fadeOutDuration); + } + + + public static void SetDefaultMusicBus(string bus) + { + Instance.Call("set_default_music_bus", bus); + } + + #endregion + } +} diff --git a/addons/sound_manager/abstract_audio_player_pool.gd b/addons/sound_manager/abstract_audio_player_pool.gd new file mode 100644 index 0000000..4a5e009 --- /dev/null +++ b/addons/sound_manager/abstract_audio_player_pool.gd @@ -0,0 +1,84 @@ +extends Node + + +@export var default_busses := [] +@export var default_pool_size := 8 + + +var available_players: Array[AudioStreamPlayer] = [] +var busy_players: Array[AudioStreamPlayer] = [] +var bus: String = "Master" + + +func _init(possible_busses: PackedStringArray = default_busses, pool_size: int = default_pool_size) -> void: + bus = get_possible_bus(possible_busses) + + for i in pool_size: + increase_pool() + +func get_possible_bus(possible_busses: PackedStringArray) -> String: + for possible_bus in possible_busses: + var cases: PackedStringArray = [ + possible_bus, + possible_bus.to_lower(), + possible_bus.to_camel_case(), + possible_bus.to_pascal_case(), + possible_bus.to_snake_case() + ] + for case in cases: + if AudioServer.get_bus_index(case) > -1: + return case + return "Master" + +func prepare(resource: AudioStream, override_bus: String = "") -> AudioStreamPlayer: + var player: AudioStreamPlayer + + if resource is AudioStreamRandomizer: + player = get_player_with_resource(resource) + + if player == null: + player = get_available_player() + + player.stream = resource + player.bus = override_bus if override_bus != "" else bus + player.volume_db = linear_to_db(1.0) + player.pitch_scale = 1 + return player + + +func get_available_player() -> AudioStreamPlayer: + if available_players.size() == 0: + increase_pool() + var player = available_players.pop_front() + busy_players.append(player) + return player + + +func get_player_with_resource(resource: AudioStream) -> AudioStreamPlayer: + for player in busy_players + available_players: + if player.stream == resource: + return player + return null + + +func mark_player_as_available(player: AudioStreamPlayer) -> void: + if busy_players.has(player): + busy_players.erase(player) + + if not available_players.has(player): + available_players.append(player) + + +func increase_pool() -> void: + var player := AudioStreamPlayer.new() + add_child(player) + available_players.append(player) + player.bus = bus + player.finished.connect(_on_player_finished.bind(player)) + + +### SIGNALS + + +func _on_player_finished(player: AudioStreamPlayer) -> void: + mark_player_as_available(player) diff --git a/addons/sound_manager/music.gd b/addons/sound_manager/music.gd new file mode 100644 index 0000000..a505997 --- /dev/null +++ b/addons/sound_manager/music.gd @@ -0,0 +1,133 @@ +extends "res://addons/sound_manager/abstract_audio_player_pool.gd" + + +var tweens: Dictionary = {} +var track_history: PackedStringArray = [] + + +func play(resource: AudioStream, position: float = 0.0, volume: float = 0.0, crossfade_duration: float = 0.0, override_bus: String = "") -> AudioStreamPlayer: + stop(crossfade_duration * 2) + + var player = _get_player_with_music(resource) + + # If the player already exists then just make sure the volume is right (it might have just been fading in or out) + if player != null: + fade_volume(player, player.volume_db, volume, crossfade_duration) + return player + + # Otherwise we need to prep another player and handle its introduction + player = prepare(resource, override_bus) + fade_volume(player, -80.0, volume, crossfade_duration) + + # Remember this track name + track_history.insert(0, resource.resource_path) + if track_history.size() > 50: + track_history.remove_at(50) + + player.call_deferred("play", position) + return player + + +func is_playing(resource: AudioStream) -> bool: + if resource != null: + return _get_player_with_music(resource) != null + else: + return busy_players.size() > 0 + + +func stop(fade_out_duration: float = 0.0) -> void: + for player in busy_players: + if fade_out_duration <= 0.0: + fade_out_duration = 0.01 + fade_volume(player, player.volume_db, -80, fade_out_duration) + + +func pause(resource: AudioStream = null) -> void: + if resource != null: + var player = _get_player_with_music(resource) + if is_instance_valid(player): + player.stream_paused = true + else: + for player in busy_players: + player.stream_paused = true + + +func resume(resource: AudioStream = null) -> void: + if resource != null: + var player = _get_player_with_music(resource) + if is_instance_valid(player): + player.stream_paused = false + else: + for player in busy_players: + player.stream_paused = false + + +func is_track_playing(resource_path: String) -> bool: + for player in busy_players: + if player.stream.resource_path == resource_path: + return true + return false + + +func get_currently_playing() -> Array[AudioStream]: + var tracks: Array[AudioStream] = [] + for player in busy_players: + tracks.append(player.stream) + return tracks + + +func get_currently_playing_tracks() -> PackedStringArray: + var tracks: PackedStringArray = [] + for player in busy_players: + tracks.append(player.stream.resource_path) + return tracks + + +func fade_volume(player: AudioStreamPlayer, from_volume: float, to_volume: float, duration: float) -> AudioStreamPlayer: + # Remove any tweens that might already be on this player + _remove_tween(player) + + # Start a new tween + var tween: Tween = get_tree().create_tween().bind_node(self) + + player.volume_db = from_volume + if from_volume > to_volume: + # Fade out + tween.tween_property(player, "volume_db", to_volume, duration).set_trans(Tween.TRANS_CIRC).set_ease(Tween.EASE_IN) + else: + # Fade in + tween.tween_property(player, "volume_db", to_volume, duration).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT) + + tweens[player] = tween + tween.finished.connect(_on_fade_completed.bind(player, tween, from_volume, to_volume, duration)) + + return player + + +### Helpers + + +func _get_player_with_music(resource: AudioStream) -> AudioStreamPlayer: + for player in busy_players: + if player.stream.resource_path == resource.resource_path: + return player + return null + + +func _remove_tween(player: AudioStreamPlayer) -> void: + if tweens.has(player): + var fade: Tween = tweens.get(player) + fade.kill() + tweens.erase(player) + + +### Signals + + +func _on_fade_completed(player: AudioStreamPlayer, tween: Tween, from_volume: float, to_volume: float, duration: float): + _remove_tween(player) + + # If we just faded out then our player is now available + if to_volume <= -79.0: + player.stop() + mark_player_as_available(player) diff --git a/addons/sound_manager/plugin.cfg b/addons/sound_manager/plugin.cfg new file mode 100644 index 0000000..cf1f62b --- /dev/null +++ b/addons/sound_manager/plugin.cfg @@ -0,0 +1,7 @@ +[plugin] + +name="SoundManager" +description="Manage your sounds and music" +author="Nathan Hoad" +version="2.5.0" +script="plugin.gd" diff --git a/addons/sound_manager/plugin.gd b/addons/sound_manager/plugin.gd new file mode 100644 index 0000000..3649ffa --- /dev/null +++ b/addons/sound_manager/plugin.gd @@ -0,0 +1,10 @@ +@tool +extends EditorPlugin + + +func _enter_tree(): + add_autoload_singleton("SoundManager", "res://addons/sound_manager/sound_manager.gd") + + +func _exit_tree(): + remove_autoload_singleton("SoundManager") diff --git a/addons/sound_manager/sound_effects.gd b/addons/sound_manager/sound_effects.gd new file mode 100644 index 0000000..2b67f07 --- /dev/null +++ b/addons/sound_manager/sound_effects.gd @@ -0,0 +1,7 @@ +extends "res://addons/sound_manager/abstract_audio_player_pool.gd" + + +func play(resource: AudioStream, override_bus: String = "") -> AudioStreamPlayer: + var player = prepare(resource, override_bus) + player.call_deferred("play") + return player diff --git a/addons/sound_manager/sound_manager.gd b/addons/sound_manager/sound_manager.gd new file mode 100644 index 0000000..c95d404 --- /dev/null +++ b/addons/sound_manager/sound_manager.gd @@ -0,0 +1,154 @@ +extends Node + + +const SoundEffectsPlayer = preload("res://addons/sound_manager/sound_effects.gd") +const MusicPlayer = preload("res://addons/sound_manager/music.gd") + +var sound_effects: SoundEffectsPlayer = SoundEffectsPlayer.new(["Sounds", "SFX"], 8) +var ui_sound_effects: SoundEffectsPlayer = SoundEffectsPlayer.new(["UI", "Interface", "Sounds", "SFX"], 8) +var music: MusicPlayer = MusicPlayer.new(["Music"], 2) + +var sound_process_mode: ProcessMode: + set(value): + sound_effects.process_mode = value + get: + return sound_effects.process_mode + +var ui_sound_process_mode: ProcessMode: + set(value): + ui_sound_effects.process_mode = value + get: + return ui_sound_effects.process_mode + +var music_process_mode: ProcessMode: + set(value): + music.process_mode = value + get: + return music.process_mode + + +func _init() -> void: + Engine.register_singleton("SoundManager", self) + + add_child(sound_effects) + add_child(ui_sound_effects) + add_child(music) + + self.sound_process_mode = PROCESS_MODE_PAUSABLE + self.ui_sound_process_mode = PROCESS_MODE_ALWAYS + self.music_process_mode = PROCESS_MODE_ALWAYS + + +func get_sound_volume() -> float: + return db_to_linear(AudioServer.get_bus_volume_db(AudioServer.get_bus_index(sound_effects.bus))) + + +func get_ui_sound_volume() -> float: + return db_to_linear(AudioServer.get_bus_volume_db(AudioServer.get_bus_index(ui_sound_effects.bus))) + + +func set_sound_volume(volume_between_0_and_1) -> void: + _show_shared_bus_warning() + AudioServer.set_bus_volume_db(AudioServer.get_bus_index(sound_effects.bus), linear_to_db(volume_between_0_and_1)) + AudioServer.set_bus_volume_db(AudioServer.get_bus_index(ui_sound_effects.bus), linear_to_db(volume_between_0_and_1)) + + +func play_sound(resource: AudioStream, override_bus: String = "") -> AudioStreamPlayer: + return sound_effects.play(resource, override_bus) + + +func play_sound_with_pitch(resource: AudioStream, pitch: float = 1.0, override_bus: String = "") -> AudioStreamPlayer: + var player = sound_effects.play(resource, override_bus) + player.pitch_scale = pitch + return player + + +func play_ui_sound(resource: AudioStream, override_bus: String = "") -> AudioStreamPlayer: + return ui_sound_effects.play(resource, override_bus) + + +func play_ui_sound_with_pitch(resource: AudioStream, pitch: float = 1.0, override_bus: String = "") -> AudioStreamPlayer: + var player = ui_sound_effects.play(resource, override_bus) + player.pitch_scale = pitch + return player + + +func set_default_sound_bus(bus: String) -> void: + sound_effects.bus = bus + + +func set_default_ui_sound_bus(bus: String) -> void: + ui_sound_effects.bus = bus + + +func get_music_volume() -> float: + return db_to_linear(AudioServer.get_bus_volume_db(AudioServer.get_bus_index(music.bus))) + + +func set_music_volume(volume_between_0_and_1: float) -> void: + _show_shared_bus_warning() + AudioServer.set_bus_volume_db(AudioServer.get_bus_index(music.bus), linear_to_db(volume_between_0_and_1)) + + +func play_music(resource: AudioStream, crossfade_duration: float = 0.0, override_bus: String = "") -> AudioStreamPlayer: + return music.play(resource, 0.0, 0.0, crossfade_duration, override_bus) + + +func play_music_from_position(resource: AudioStream, position: float = 0.0, crossfade_duration: float = 0.0, override_bus: String = "") -> AudioStreamPlayer: + return music.play(resource, position, 0.0, crossfade_duration, override_bus) + + +func play_music_at_volume(resource: AudioStream, volume: float = 0.0, crossfade_duration: float = 0.0, override_bus: String = "") -> AudioStreamPlayer: + return music.play(resource, 0.0, volume, crossfade_duration, override_bus) + + +func play_music_from_position_at_volume(resource: AudioStream, position: float = 0.0, volume: float = 0.0, crossfade_duration: float = 0.0, override_bus: String = "") -> AudioStreamPlayer: + return music.play(resource, position, volume, crossfade_duration, override_bus) + + +func get_music_track_history() -> Array: + return music.track_history + + +func get_last_played_music_track() -> String: + return music.track_history[0] + + +func is_music_playing(resource: AudioStream = null) -> bool: + return music.is_playing(resource) + + +func is_music_track_playing(resource_path: String) -> bool: + return music.is_track_playing(resource_path) + + +func get_currently_playing_music() -> Array: + return music.get_currently_playing() + + +func get_currently_playing_music_tracks() -> Array: + return music.get_current_tracks() + + +func pause_music(resource: AudioStream = null) -> void: + music.pause(resource) + + +func resume_music(resource: AudioStream = null) -> void: + music.resume(resource) + + +func stop_music(fade_out_duration: float = 0.0) -> void: + music.stop(fade_out_duration) + + +func set_default_music_bus(bus: String) -> void: + music.bus = bus + + +### Helpers + + +func _show_shared_bus_warning() -> void: + if music.bus == sound_effects.bus or music.bus == ui_sound_effects.bus: + push_warning("Both music and sounds are using the same bus: %s" % music.bus) diff --git a/project.godot b/project.godot index b096d87..14833c9 100644 --- a/project.godot +++ b/project.godot @@ -17,6 +17,10 @@ boot_splash/bg_color=Color(0.92549, 0.92549, 0.960784, 1) boot_splash/image="res://splash-screen.png" config/icon="res://icon.png" +[autoload] + +Dicebag="*res://scripts/Dicebag.gd" + [dotnet] project/assembly_name="Starter Kit City Builder" diff --git a/scenes/main2d.tscn b/scenes/main2d.tscn index ef14422..6d80761 100644 --- a/scenes/main2d.tscn +++ b/scenes/main2d.tscn @@ -19,7 +19,7 @@ selector = NodePath("Selector") selector_container = NodePath("Selector/Container") view_camera = NodePath("../View/Camera") tile_map = NodePath("../TileMap") -cash_display = NodePath("../CanvasLayer/Interface/Wallet/Cash") +cash_display = NodePath("../CanvasLayer/Interface/Panel/Wallet/Cash") [node name="Selector" type="Node2D" parent="Builder"] @@ -33,6 +33,7 @@ texture = ExtResource("2_xat7u") script = ExtResource("3_2wqv3") [node name="Camera" type="Camera2D" parent="View"] +visible = false position = Vector2(566, 362) [node name="TileMap" type="TileMap" parent="."] @@ -50,20 +51,33 @@ grow_vertical = 2 metadata/_edit_use_anchors_ = true metadata/_edit_lock_ = true -[node name="Wallet" type="HBoxContainer" parent="CanvasLayer/Interface"] +[node name="Panel" type="Panel" parent="CanvasLayer/Interface"] layout_mode = 1 anchors_preset = -1 -anchor_left = 0.0190972 -anchor_top = 0.0277778 -anchor_right = 0.211806 -anchor_bottom = 0.109568 +anchor_top = 0.888889 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 0 +metadata/_edit_use_anchors_ = true -[node name="CashIcon" type="TextureRect" parent="CanvasLayer/Interface/Wallet"] +[node name="Wallet" type="HBoxContainer" parent="CanvasLayer/Interface/Panel"] +layout_mode = 1 +anchors_preset = -1 +anchor_left = 0.0130208 +anchor_top = 0.208333 +anchor_right = 0.149306 +anchor_bottom = 0.8125 +alignment = 1 +metadata/_edit_use_anchors_ = true +metadata/_edit_lock_ = true + +[node name="CashIcon" type="TextureRect" parent="CanvasLayer/Interface/Panel/Wallet"] layout_mode = 2 texture = ExtResource("2_thubv") expand_mode = 3 -[node name="Cash" type="Label" parent="CanvasLayer/Interface/Wallet"] +[node name="Cash" type="Label" parent="CanvasLayer/Interface/Panel/Wallet"] layout_mode = 2 text = "$10,000" label_settings = SubResource("LabelSettings_i6wk0") diff --git a/scenes/main3d.tscn b/scenes/main3d.tscn index b53389a..8ed12ed 100644 --- a/scenes/main3d.tscn +++ b/scenes/main3d.tscn @@ -31,7 +31,7 @@ shadow_color = Color(0, 0, 0, 0.392157) [node name="Builder" type="Node3D" parent="." node_paths=PackedStringArray("selector", "selector_container", "view_camera", "gridmap", "cash_display")] script = ExtResource("1_jybm7") -structures = Array[Resource("res://scripts/3d/structure.gd")]([ExtResource("2_bwyku"), ExtResource("3_o6o81"), ExtResource("3_6fpyf"), ExtResource("7_kqu4g"), ExtResource("8_1swhv"), ExtResource("4_b632v"), ExtResource("8_4il2q"), ExtResource("5_v5o2m"), ExtResource("6_f4603"), ExtResource("10_84or2"), ExtResource("12_8obn7"), ExtResource("13_ut2cy"), ExtResource("9_ifw7y"), ExtResource("10_vaeah"), ExtResource("13_t5d2v")]) +structures = Array[Resource("res://scripts/structure.gd")]([ExtResource("2_bwyku"), ExtResource("3_o6o81"), ExtResource("3_6fpyf"), ExtResource("7_kqu4g"), ExtResource("8_1swhv"), ExtResource("4_b632v"), ExtResource("8_4il2q"), ExtResource("5_v5o2m"), ExtResource("6_f4603"), ExtResource("10_84or2"), ExtResource("12_8obn7"), ExtResource("13_ut2cy"), ExtResource("9_ifw7y"), ExtResource("10_vaeah"), ExtResource("13_t5d2v")]) selector = NodePath("Selector") selector_container = NodePath("Selector/Container") view_camera = NodePath("../View/Camera") diff --git a/scripts/Dicebag.gd b/scripts/Dicebag.gd new file mode 100644 index 0000000..54108cf --- /dev/null +++ b/scripts/Dicebag.gd @@ -0,0 +1,63 @@ +extends Node + +var rng = RandomNumberGenerator.new() + +var bags = {} +var tables = {} + +#Flip a coin: 50% chance of returning true or false +func flip_coin() -> bool: + return randf() > 0.5 + +#D&D-style dice roll, for example 3d6+2. Returns resulting roll value. +func roll_dice(num_dice = 1, num_sides = 6, modifier = 0) -> int: + var result = modifier + + for i in range(0, num_dice): + result += rng.randi_range(1, num_sides) + + return result + +#Roll one or more dice with advantage or disadvantage (if advantage is not true rolls are disadvantaged). Returns the highest (advantage) or lowest (disadvantage) value of all rolls. +#This script was broken in godot 3.5.1. I simplified it and rewrote it from the ground up. - Cablefish +func roll_special_dice(num_sides:int = 6, advantage:bool = true, num_dice:int = 2) -> int: + var max_or_min_roll = 1 + var roll + + if advantage: + for i in range (0, num_dice): + roll = roll_dice(1, num_sides) + if(roll > max_or_min_roll): + max_or_min_roll = roll + else: + max_or_min_roll = num_sides + for i in range (0, num_dice): + roll = roll_dice(1, num_sides) + if roll < max_or_min_roll: + max_or_min_roll = roll + + return max_or_min_roll + +# Pick a random place in a user defined table. I.e. a loot table. +# Parameter weighted_loot_table is an array in the format [[weight1, value1], [weight2, value2] ...]. +# The function adds the weights and returns a random value based on the weighted probabilities. + +func roll_table(weighted_loot_table): + var total_weight = 0 + var acc_weight = 0 + + # count up the total weight + for item in weighted_loot_table: + total_weight += item[0] + + #get random number within the total weight + var random_num = randf() * total_weight + + #find corrosponding die side and return its value. + for item in weighted_loot_table: + if random_num <= item[0] + acc_weight: + return item[1] + else: + acc_weight += item[0] + + return weighted_loot_table[-1][1]

7F|KGB*rUJ0G^2NGTBGNd4i2xtBw_6ZKF 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 Zr;80l#Kucx>8VaWkM8SeRH|8q{y$8cqYeN7 literal 0 HcmV?d00001 diff --git a/addons/phantom_camera/examples/textures/2D/sign_prompt.png.import b/addons/phantom_camera/examples/textures/2D/sign_prompt.png.import new file mode 100644 index 0000000..a5799d3 --- /dev/null +++ b/addons/phantom_camera/examples/textures/2D/sign_prompt.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bloouh2jtndx1" +path="res://.godot/imported/sign_prompt.png-18d451127e1cd1a16367acd23cec47e5.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/examples/textures/2D/sign_prompt.png" +dest_files=["res://.godot/imported/sign_prompt.png-18d451127e1cd1a16367acd23cec47e5.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/addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png b/addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png new file mode 100644 index 0000000000000000000000000000000000000000..4aeae6c6aadbee8c0335d4134fb372c403aa46fa GIT binary patch literal 2861 zcmd^>|4$QV9LFENWI;BkWyzA$z2903Jkw=y z01Cy1y4@c*N0PsfpDqoqufKZarR@WirP9_f%Y_ZK`Pmow6Y$#YOXuGFes;&T3y@FTQ$6Ht2#C#x!#0TYVxodZ83gJ_?>k?s17 zoTX8O#;O%UP1bnvK`8(gs~q3+EIB9kv~)woK;*I8Zn$xATi18GE-60Z;-WLu zZL=X)_S+wcx*<0XPGJ@)|Jl02mHdnBnQ}Q6Ux}nLk4fE}eBLKlxw-%Jwg~qXS9YM> zBMlFYL+!V-Bje%W$pfDFnJM6$idM1gT?Q}P$-7e+pG}> zGo;FAzfmj@DOXy(M##XM^y%rX)`Wj%B_gI4ivZZL1|Ftok-eL`?D+-Z^efhnglejt zQ%_XYw2xKW#}Zl=M`28N?wYTmCKR(PxR2Os2CS$XH?dvUV>|uJ5yre3l3D5W8XTq!vL>%I?DZN2yy$!) sSXf?s_(sPpj9I9O@FP4J;8a;JF3x4Daw4XaWc~#W^^J9&+K-R_3yfXaJ^%m! literal 0 HcmV?d00001 diff --git a/addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png.import b/addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png.import new file mode 100644 index 0000000..8a7d694 --- /dev/null +++ b/addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c7ja4woxol8yc" +path.bptc="res://.godot/imported/CheckerPatternDark.png-fdb2fea143d8c120db563be7371308e4.bptc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png" +dest_files=["res://.godot/imported/CheckerPatternDark.png-fdb2fea143d8c120db563be7371308e4.bptc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=true +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +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=0 diff --git a/addons/phantom_camera/examples/ui/UIInventory.tscn b/addons/phantom_camera/examples/ui/UIInventory.tscn new file mode 100644 index 0000000..12a6069 --- /dev/null +++ b/addons/phantom_camera/examples/ui/UIInventory.tscn @@ -0,0 +1,38 @@ +[gd_scene load_steps=3 format=3 uid="uid://dg7rhrymsrrrm"] + +[ext_resource type="Texture2D" uid="uid://b7cs6me43ufh3" path="res://addons/phantom_camera/examples/textures/2D/inventory_container.png" id="1_pi2dp"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="2_0rdcn"] + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="TextureRect" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 4 +anchor_top = 0.5 +anchor_bottom = 0.5 +offset_left = 136.0 +offset_top = -255.0 +offset_right = 1016.0 +offset_bottom = 183.0 +grow_vertical = 2 +scale = Vector2(1.2, 1.2) +texture = ExtResource("1_pi2dp") + +[node name="Label" type="Label" parent="TextureRect"] +layout_mode = 0 +offset_left = 345.0 +offset_top = 12.0 +offset_right = 535.0 +offset_bottom = 60.0 +theme_override_colors/font_color = Color(0.356863, 0.105882, 0.133333, 1) +theme_override_fonts/font = ExtResource("2_0rdcn") +theme_override_font_sizes/font_size = 32 +text = "Inventory" +horizontal_alignment = 1 +uppercase = true diff --git a/addons/phantom_camera/examples/ui/UISign.tscn b/addons/phantom_camera/examples/ui/UISign.tscn new file mode 100644 index 0000000..8de13b9 --- /dev/null +++ b/addons/phantom_camera/examples/ui/UISign.tscn @@ -0,0 +1,84 @@ +[gd_scene load_steps=4 format=3 uid="uid://iq5xd1ob1res"] + +[ext_resource type="Texture2D" uid="uid://bloouh2jtndx1" path="res://addons/phantom_camera/examples/textures/2D/sign_prompt.png" id="1_tftrk"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="2_y5454"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_r4h3u"] +bg_color = Color(0.470588, 0.6, 0.45098, 1) +corner_radius_top_right = 47 +corner_radius_bottom_left = 40 + +[node name="Control" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="TextureRect" type="TextureRect" parent="."] +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -410.0 +offset_top = 108.0 +offset_right = 137.135 +offset_bottom = 474.0 +grow_horizontal = 2 +scale = Vector2(1.5, 1.5) +texture = ExtResource("1_tftrk") +metadata/_edit_group_ = true + +[node name="Label" type="Label" parent="TextureRect"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = 25.0 +offset_top = 64.0 +offset_right = -25.0 +offset_bottom = -88.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_colors/font_color = Color(0.207843, 0.0470588, 0.0666667, 1) +theme_override_fonts/font = ExtResource("2_y5454") +theme_override_font_sizes/font_size = 62 +text = "Stay Awhile +and read" +horizontal_alignment = 1 +vertical_alignment = 1 +uppercase = true + +[node name="Panel" type="Panel" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -240.0 +offset_right = 240.0 +offset_bottom = 200.0 +grow_horizontal = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +theme_override_styles/panel = SubResource("StyleBoxFlat_r4h3u") +metadata/_edit_use_anchors_ = true + +[node name="VBoxContainer" type="VBoxContainer" parent="Panel"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +alignment = 1 + +[node name="Label2" type="Label" parent="Panel/VBoxContainer"] +layout_mode = 2 +text = "Example Textsdadassa +" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/addons/phantom_camera/fonts/Nunito-Black.ttf b/addons/phantom_camera/fonts/Nunito-Black.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1081731539aa811b4f0e69aa547cff7f7c2a3ecb GIT binary patch literal 131568 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