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 0000000..fcbb753 Binary files /dev/null and b/addons/markdownlabel/assets/screenshot.png differ 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 0000000..a4eaee3 Binary files /dev/null and b/addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png differ diff --git a/addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png.import b/addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png.import new file mode 100644 index 0000000..dfa938a --- /dev/null +++ b/addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cwep0on2tthn7" +path="res://.godot/imported/PhantomCamera2DSprite.png-6bf2b757da36375026c0e7c928edb9d4.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/examples/textures/2D/PhantomCamera2DSprite.png" +dest_files=["res://.godot/imported/PhantomCamera2DSprite.png-6bf2b757da36375026c0e7c928edb9d4.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/inventory_container.png b/addons/phantom_camera/examples/textures/2D/inventory_container.png new file mode 100644 index 0000000..7dd5178 Binary files /dev/null and b/addons/phantom_camera/examples/textures/2D/inventory_container.png differ diff --git a/addons/phantom_camera/examples/textures/2D/inventory_container.png.import b/addons/phantom_camera/examples/textures/2D/inventory_container.png.import new file mode 100644 index 0000000..72be1e5 --- /dev/null +++ b/addons/phantom_camera/examples/textures/2D/inventory_container.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b7cs6me43ufh3" +path="res://.godot/imported/inventory_container.png-12241277f279bfc4bf7d5dad6b3e8ff2.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/phantom_camera/examples/textures/2D/inventory_container.png" +dest_files=["res://.godot/imported/inventory_container.png-12241277f279bfc4bf7d5dad6b3e8ff2.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/level_spritesheet.png b/addons/phantom_camera/examples/textures/2D/level_spritesheet.png new file mode 100644 index 0000000..939cb28 Binary files /dev/null and b/addons/phantom_camera/examples/textures/2D/level_spritesheet.png differ 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 0000000..a730837 Binary files /dev/null and b/addons/phantom_camera/examples/textures/2D/sign_prompt.png differ 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 0000000..4aeae6c Binary files /dev/null and b/addons/phantom_camera/examples/textures/3D/CheckerPatternDark.png differ 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 0000000..1081731 Binary files /dev/null and b/addons/phantom_camera/fonts/Nunito-Black.ttf differ 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 0000000..dfd0fcb Binary files /dev/null and b/addons/phantom_camera/fonts/Nunito-Regular.ttf differ diff --git a/addons/phantom_camera/fonts/Nunito-Regular.ttf.import b/addons/phantom_camera/fonts/Nunito-Regular.ttf.import new file mode 100644 index 0000000..29ea6f5 --- /dev/null +++ b/addons/phantom_camera/fonts/Nunito-Regular.ttf.import @@ -0,0 +1,33 @@ +[remap] + +importer="font_data_dynamic" +type="FontFile" +uid="uid://dve7mgsjik4dg" +path="res://.godot/imported/Nunito-Regular.ttf-b6054d499efa1a10921004862b1e217a.fontdata" + +[deps] + +source_file="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" +dest_files=["res://.godot/imported/Nunito-Regular.ttf-b6054d499efa1a10921004862b1e217a.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/framed_viewfinder/deadzone_style_box.tres b/addons/phantom_camera/framed_viewfinder/deadzone_style_box.tres new file mode 100644 index 0000000..7353299 --- /dev/null +++ b/addons/phantom_camera/framed_viewfinder/deadzone_style_box.tres @@ -0,0 +1,14 @@ +[gd_resource type="StyleBoxFlat" format=3 uid="uid://dpa7yvxlq043a"] + +[resource] +bg_color = Color(0.227451, 0.72549, 0.603922, 0.2) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.227451, 0.72549, 0.603922, 1) +corner_detail = 1 +expand_margin_left = 1.0 +expand_margin_top = 1.0 +expand_margin_right = 1.0 +expand_margin_bottom = 1.0 diff --git a/addons/phantom_camera/framed_viewfinder/framed_viewfinder_panel.tscn b/addons/phantom_camera/framed_viewfinder/framed_viewfinder_panel.tscn new file mode 100644 index 0000000..d2f652f --- /dev/null +++ b/addons/phantom_camera/framed_viewfinder/framed_viewfinder_panel.tscn @@ -0,0 +1,436 @@ +[gd_scene load_steps=22 format=3 uid="uid://dbkr3d716wtx0"] + +[ext_resource type="Script" path="res://addons/phantom_camera/scripts/viewfinder/viewfinder.gd" id="1_lgg6a"] +[ext_resource type="StyleBox" uid="uid://dpa7yvxlq043a" path="res://addons/phantom_camera/framed_viewfinder/deadzone_style_box.tres" id="2_cvat1"] +[ext_resource type="FontFile" uid="uid://dve7mgsjik4dg" path="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" id="3_6wxxp"] +[ext_resource type="Texture2D" uid="uid://b671h5enwiljg" path="res://addons/phantom_camera/icons/PhantomCameraGizmoIcon2D.svg" id="3_rn5hf"] +[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="4_dj3lt"] +[ext_resource type="Texture2D" uid="uid://dy8eifa6aw2en" path="res://addons/phantom_camera/icons/misc/PriorityOverride.svg" id="6_8cb64"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fle8t"] +bg_color = Color(0.227451, 0.72549, 0.603922, 0.2) +draw_center = false +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_color = Color(0.227451, 0.72549, 0.603922, 1) +corner_detail = 1 +expand_margin_left = 1.0 +expand_margin_top = 1.0 +expand_margin_right = 1.0 +expand_margin_bottom = 1.0 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_xmo1t"] +draw_center = false +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color(0.745098, 0.858824, 0.380392, 1) + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_q7vs4"] +bg_color = Color(0.929412, 0.87451, 0.619608, 1) +border_width_left = 1 +border_width_top = 1 +border_width_right = 1 +border_width_bottom = 1 +border_color = Color(0, 0, 0, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_iho1a"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_obaj6"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fsxik"] +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 +content_margin_bottom = 10.0 +bg_color = Color(0.129412, 0.407843, 0.337255, 1) +border_width_left = 4 +border_width_top = 4 +border_width_right = 4 +border_width_bottom = 4 +border_color = Color(0.227451, 0.72549, 0.603922, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yh38y"] +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 +content_margin_bottom = 10.0 +bg_color = Color(0.129412, 0.407843, 0.337255, 1) +border_width_left = 4 +border_width_top = 4 +border_width_right = 4 +border_width_bottom = 4 +border_color = Color(0.988235, 0.498039, 0.498039, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gci88"] +content_margin_left = 10.0 +content_margin_top = 10.0 +content_margin_right = 10.0 +content_margin_bottom = 10.0 +bg_color = Color(0.180392, 0.576471, 0.482353, 1) +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4b76l"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_g5wua"] + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_x4bx8"] + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_agqdu"] +bg_color = Color(0.72549, 0.227451, 0.34902, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_blend = true +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ja3vm"] +bg_color = Color(0.53, 0.1643, 0.255725, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_blend = true +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mk273"] +bg_color = Color(0.43, 0.1333, 0.207475, 1) +border_width_left = 2 +border_width_top = 2 +border_width_right = 2 +border_width_bottom = 2 +border_blend = true +corner_radius_top_left = 10 +corner_radius_top_right = 10 +corner_radius_bottom_right = 10 +corner_radius_bottom_left = 10 + +[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_840sd"] + +[node name="ViewfinderControl" type="Control"] +clip_contents = true +custom_minimum_size = Vector2(0, 300) +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 +mouse_filter = 2 +script = ExtResource("1_lgg6a") + +[node name="FramedViewfinder" type="Control" parent="."] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +metadata/_edit_lock_ = true + +[node name="SubViewportContainer" type="SubViewportContainer" parent="FramedViewfinder"] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +stretch = true + +[node name="SubViewport" type="SubViewport" parent="FramedViewfinder/SubViewportContainer"] +unique_name_in_owner = true +handle_input_locally = false +gui_disable_input = true +size = Vector2i(1920, 1080) +render_target_update_mode = 4 + +[node name="DeadZoneHBoxContainer" type="HBoxContainer" parent="FramedViewfinder"] +unique_name_in_owner = true +clip_contents = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/separation = 0 + +[node name="DeadZoneLeftHBoxContainer" type="VBoxContainer" parent="FramedViewfinder/DeadZoneHBoxContainer"] +clip_contents = true +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 0 + +[node name="DeadZoneLeftTopPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_styles/panel = ExtResource("2_cvat1") + +[node name="DeadZoneLeftCenterPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_styles/panel = ExtResource("2_cvat1") + +[node name="DeadZoneLeftBottomPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_styles/panel = ExtResource("2_cvat1") + +[node name="DeadZoneCenterHBoxContainer" type="VBoxContainer" parent="FramedViewfinder/DeadZoneHBoxContainer"] +unique_name_in_owner = true +clip_contents = true +layout_mode = 2 +size_flags_horizontal = 4 +theme_override_constants/separation = 0 + +[node name="DeadZoneCenterTopPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_styles/panel = ExtResource("2_cvat1") + +[node name="DeadZoneCenterCenterPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_vertical = 4 +theme_override_styles/panel = SubResource("StyleBoxFlat_fle8t") + +[node name="DeadZoneCenterBottomPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_styles/panel = ExtResource("2_cvat1") + +[node name="DeadZoneRightHBoxContainer" type="VBoxContainer" parent="FramedViewfinder/DeadZoneHBoxContainer"] +clip_contents = true +layout_mode = 2 +size_flags_horizontal = 3 +theme_override_constants/separation = 0 + +[node name="DeadZoneRightTopPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_styles/panel = ExtResource("2_cvat1") + +[node name="DeadZoneRightCenterPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_styles/panel = ExtResource("2_cvat1") + +[node name="DeadZoneRightBottomPanel" type="Panel" parent="FramedViewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_styles/panel = ExtResource("2_cvat1") + +[node name="AspectRatioContainer" type="AspectRatioContainer" parent="FramedViewfinder"] +unique_name_in_owner = true +clip_contents = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +stretch_mode = 1 + +[node name="CameraViewportPanel" type="Panel" parent="FramedViewfinder/AspectRatioContainer"] +layout_mode = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_xmo1t") + +[node name="TargetPoint" type="Panel" parent="FramedViewfinder/AspectRatioContainer/CameraViewportPanel"] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -3.0 +offset_top = -3.0 +offset_right = 3.0 +offset_bottom = 3.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_styles/panel = SubResource("StyleBoxFlat_q7vs4") + +[node name="NoSupportMsg" type="Label" parent="."] +unique_name_in_owner = true +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = -8.0 +offset_bottom = -8.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_fonts/font = ExtResource("4_dj3lt") +theme_override_font_sizes/font_size = 24 +theme_override_styles/normal = SubResource("StyleBoxEmpty_iho1a") +text = "2D scene support not available yet +(Control scenes are not supported)" +horizontal_alignment = 1 +vertical_alignment = 1 + +[node name="EmptyStateControl" type="Control" parent="."] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="BGColorRect" type="ColorRect" parent="EmptyStateControl"] +visible = false +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +color = Color(0, 0, 0, 1) +metadata/_edit_lock_ = true + +[node name="VBoxContainer" type="VBoxContainer" parent="EmptyStateControl"] +layout_mode = 1 +anchors_preset = 14 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_top = -80.0 +offset_bottom = 80.0 +grow_horizontal = 2 +grow_vertical = 2 +alignment = 1 + +[node name="EmptyStateIcon" type="TextureRect" parent="EmptyStateControl/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +texture = ExtResource("3_rn5hf") +stretch_mode = 3 + +[node name="EmptyStateText" type="RichTextLabel" parent="EmptyStateControl/VBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +theme_override_colors/default_color = Color(1, 1, 1, 1) +theme_override_fonts/normal_font = ExtResource("3_6wxxp") +theme_override_fonts/bold_font = ExtResource("4_dj3lt") +theme_override_font_sizes/normal_font_size = 24 +theme_override_font_sizes/bold_font_size = 24 +theme_override_styles/focus = SubResource("StyleBoxEmpty_obaj6") +theme_override_styles/normal = SubResource("StyleBoxEmpty_iho1a") +bbcode_enabled = true +text = "[center][b]NodeType[/b] Description [/center]" +fit_content = true + +[node name="AddNodeButton" type="Button" parent="EmptyStateControl/VBoxContainer"] +unique_name_in_owner = true +custom_minimum_size = Vector2(400, 54) +layout_mode = 2 +size_flags_horizontal = 4 +focus_mode = 0 +theme_override_colors/font_color = Color(1, 1, 1, 1) +theme_override_fonts/font = ExtResource("4_dj3lt") +theme_override_font_sizes/font_size = 24 +theme_override_styles/normal = SubResource("StyleBoxFlat_fsxik") +theme_override_styles/hover = SubResource("StyleBoxFlat_yh38y") +theme_override_styles/pressed = SubResource("StyleBoxFlat_gci88") +theme_override_styles/focus = SubResource("StyleBoxEmpty_4b76l") + +[node name="AddNodeTypeText" type="RichTextLabel" parent="EmptyStateControl/VBoxContainer/AddNodeButton"] +unique_name_in_owner = true +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_top = 9.0 +offset_bottom = -11.0 +grow_horizontal = 2 +grow_vertical = 2 +mouse_filter = 2 +theme_override_colors/default_color = Color(1, 1, 1, 1) +theme_override_fonts/normal_font = ExtResource("3_6wxxp") +theme_override_fonts/bold_font = ExtResource("4_dj3lt") +theme_override_font_sizes/normal_font_size = 24 +theme_override_font_sizes/bold_font_size = 24 +theme_override_styles/focus = SubResource("StyleBoxEmpty_g5wua") +theme_override_styles/normal = SubResource("StyleBoxEmpty_x4bx8") +bbcode_enabled = true +text = "[center]Add [img=32]res://addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg[/img] [b]{NodeType}[/b][/center]" +scroll_active = false + +[node name="PriorityOverrideButton" type="Button" parent="."] +unique_name_in_owner = true +visible = false +layout_mode = 1 +offset_left = 5.0 +offset_top = 5.0 +offset_right = 165.0 +offset_bottom = 57.0 +mouse_default_cursor_shape = 2 +theme_override_styles/normal = SubResource("StyleBoxFlat_agqdu") +theme_override_styles/hover = SubResource("StyleBoxFlat_ja3vm") +theme_override_styles/pressed = SubResource("StyleBoxFlat_mk273") +theme_override_styles/focus = SubResource("StyleBoxEmpty_840sd") + +[node name="PriorityOverrideIcon" type="TextureRect" parent="PriorityOverrideButton"] +layout_mode = 1 +offset_left = 8.0 +offset_top = 4.0 +offset_right = 32.0 +offset_bottom = 28.0 +texture = ExtResource("6_8cb64") +expand_mode = 1 + +[node name="PriorityOverrideByLabel" type="Label" parent="PriorityOverrideButton"] +layout_mode = 0 +offset_left = 30.0 +offset_top = 1.0 +offset_right = 140.0 +offset_bottom = 24.0 +theme_override_fonts/font = ExtResource("4_dj3lt") +theme_override_font_sizes/font_size = 14 +text = "OVERRIDDEN BY" +vertical_alignment = 1 + +[node name="PriorityOverrideNameLabel" type="Label" parent="PriorityOverrideButton"] +unique_name_in_owner = true +layout_mode = 0 +offset_left = 6.0 +offset_top = 21.0 +offset_right = 153.0 +offset_bottom = 44.0 +theme_override_fonts/font = ExtResource("3_6wxxp") +theme_override_font_sizes/font_size = 14 +text = "PCam_Name +" +vertical_alignment = 1 +text_overrun_behavior = 3 diff --git a/addons/phantom_camera/gizmos/CustomGizmo.gd b/addons/phantom_camera/gizmos/CustomGizmo.gd new file mode 100644 index 0000000..f094f7b --- /dev/null +++ b/addons/phantom_camera/gizmos/CustomGizmo.gd @@ -0,0 +1,93 @@ +extends EditorNode3DGizmoPlugin +class_name CustomPluginGizmo + +var _gizmo_name +var gizmo_name: String: set = set_gizmo_name + +var _gizmo_icon: Texture2D +var gizmo_icon: Texture2D: set = set_gizmo_icon + +var _gizmo_spatial_script: Script +var gizmo_spatial_script: Script: set = set_gizmo_spatial_script + +var _gizmo_scale: float = 0.035 + + +func set_gizmo_name(name: String) -> 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]