diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index d4300057..00000000
--- a/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-_testing
-
-# Godot 4+ specific ignores
-.godot/
diff --git a/README.md b/README.md
index 36ef3b58..f88c975a 100644
--- a/README.md
+++ b/README.md
@@ -1,43 +1,20 @@
# Godot Game Settings (GGS)
-Godot Game Settings allows you to create and manage game settings for your small to medium projects. It takes care of all the fundamental functionalities required to have proper game settings, including predefined logic for common settings (e.g. display, audio, input), UI components, saving/loading data, and applying settings.
-View the [documentation](docs/home.md) for information on how to use the plugin.
+Godot Game Settings allows you to create and manage game settings for small to medium projects. It takes care of all the fundamental functionalities required to have proper game settings, including predefined logic for common settings (e.g. display, audio, input), UI components for making scenes, and saving/loading data.
-View the [demo branch](https://github.com/PunchablePlushie/godot-game-settings/tree/demo) for information on how to get the demo.
+View the [documentation](https://punchableplushie.github.io/godot-game-settings-docs) for information on how to use the plugin.
-
+
+## Update 3.2.0
-## Major Update: v3.1.0
-This version completely reworks how the categories and settings are stored, and adds several QoL features to the plugin.
+This version mainly ported the plugin to Godot 4.3 along adding other small improvements.
-### General
-* Categories and Settings are now saved on the disc instead of being subresources of the plugin data. This allows more flexibility when handling them such as moving, renaming, and deleting.
-* Icon and description support for settings and components have been removed. While this was a "cool" feature, it didn't add anything significant and just added to the code bloat since I don't think people would actually spend time designing icons and writing descriptions for their own custom settings.
-* The plugin now applies settings (executes their logic) using a separate thread instead of doing it on the main thread.
-* The preferences window now includes a button for updating the plugin theme to reflect the theme of your own Godot editor.
-* The preferences window has been slightly redesigned for clarity.
-* A "Send Feedback" button has been added which takes you to a Google survey where you can provide feedback regarding the plugin. You can still request features and QoL changes using issues on GitHub.
-* Options were added to the Save File menu that allow you to remake the save file from either `current` or `default` values.
-
-### Settings
-* The settings panel UI has been reworked.
-* You can now group settings in a category for organization. Additionally, you can add settings to multiple groups at the same time, speeding up the process of adding settings to a category.
-* The way custom settings are created and added has been slightly changed and streamlined.
-* The predefined settings (previously in the settings directory) are now considered to be templates.
-* The templates directory (previously the settings directory) now supports tree walking. You can now organize your templates in folders.
----
-* The input setting has been reworked to use `InputEvent` resources instead of clunky strings.
-* The input setting now supports multiple inputs of the same type for each action (i. e. you can have more than one keyboard or gamepad event for an action).
-
-### Components
-* All list components now support using item IDs instead of indices.
-* The input button now supports icons for mouse events.
-* UI components now warn the user when they don't have a setting or their setting is invalid.
-* You can now set up sound effects for UI components.
-
-
- Full Changelog
-
+- Made compatible with Godot 4.3.
+- The plugin no longer features an editor. All operations are done through Godot editor itself.
+- Several code improvements, including using doc comments to generate documentation inside the editor.
+- Unique icons for components, making them easier to distinguish when making a setting menu.
+- Small improvements to the custom property inspectors.
+- New icon.
\ No newline at end of file
diff --git a/_premade/components/_misc_components/apply_btn/apply_btn.tscn b/_premade/components/_misc_components/apply_btn/apply_btn.tscn
deleted file mode 100644
index a1867bea..00000000
--- a/_premade/components/_misc_components/apply_btn/apply_btn.tscn
+++ /dev/null
@@ -1,11 +0,0 @@
-[gd_scene load_steps=2 format=3]
-
-[ext_resource type="Script" path="res://game_settings/components/_misc_components/apply_btn/apply_btn.gd" id="1_dk1tm"]
-
-[node name="ApplyBtn" type="Button"]
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-script = ExtResource("1_dk1tm")
diff --git a/_premade/components/_misc_components/input_confirm_window/input_confirm_window.gd b/_premade/components/_misc_components/input_confirm_window/input_confirm_window.gd
deleted file mode 100644
index bece485e..00000000
--- a/_premade/components/_misc_components/input_confirm_window/input_confirm_window.gd
+++ /dev/null
@@ -1,285 +0,0 @@
-extends ConfirmationDialog
-signal input_selected(chosen_input: InputEvent)
-
-@export var listening_wait_time: float = 0.35
-@export var listening_max_time: float = 5
-@export var show_progress_bar: bool = true
-@export_group("Text")
-@export var btn_listening: String = ". . ."
-@export var title_listening: String = "Listening for Input"
-@export var title_confirm: String = "Confirm Input"
-@export var timeout_text: String = "Timed Out"
-@export var already_exists_msg: String = "Input already exists ({action})"
-
-var chosen_input: InputEvent
-var src: ggsUIComponent
-var type: ggsInputHelper.InputType
-var accept_mouse: bool
-var accept_modifiers: bool
-var accept_axis: bool
-var use_icons: bool
-
-var input_helper: ggsInputHelper = ggsInputHelper.new()
-
-@onready var AlreadyExistsLabel: Label = $MainCtnr/AlreadyExistsLabel
-@onready var OkBtn: Button = get_ok_button()
-@onready var CancelBtn: Button = get_cancel_button()
-@onready var ListenBtn: Button = $MainCtnr/ListenBtn
-@onready var ListenTimer: Timer = $ListenTimer
-@onready var MaxListenTimer: Timer = $MaxListenTimer
-@onready var ListenProgress: ProgressBar = $MainCtnr/ListenProgress
-
-
-func _ready() -> void:
- visibility_changed.connect(_on_visibility_changed)
- confirmed.connect(_on_confirmed)
-
- ListenBtn.pressed.connect(_on_ListenBtn_pressed)
- ListenTimer.timeout.connect(_on_ListenTimer_timeout)
- MaxListenTimer.timeout.connect(_on_MaxListenTimer_timeout)
-
- ListenBtn.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(ListenBtn))
- OkBtn.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(OkBtn))
- CancelBtn.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(CancelBtn))
- ListenBtn.focus_entered.connect(_on_AnyBtn_focus_entered)
- OkBtn.focus_entered.connect(_on_AnyBtn_focus_entered)
- CancelBtn.focus_entered.connect(_on_AnyBtn_focus_entered)
- CancelBtn.pressed.connect(_on_CancelBtn_pressed)
-
- ListenBtn.focus_neighbor_bottom = CancelBtn.get_path()
- OkBtn.focus_neighbor_top = ListenBtn.get_path()
- CancelBtn.focus_neighbor_top = ListenBtn.get_path()
-
- ListenTimer.wait_time = listening_wait_time
- MaxListenTimer.wait_time = listening_max_time
-
-
-func _process(_delta: float) -> void:
- ListenProgress.value = ListenTimer.time_left / ListenTimer.wait_time
-
-
-func _input(event: InputEvent) -> void:
- if not _event_is_valid(event):
- return
-
- _set_btn_text_or_icon(event)
-
- var input_already_exists: Array = input_helper.input_already_exists(event, src.setting.action)
- if input_already_exists[0]:
- AlreadyExistsLabel.text = already_exists_msg.format({"action": input_already_exists[1].capitalize()})
-
- ListenProgress.hide()
- AlreadyExistsLabel.show()
- ListenTimer.stop()
- MaxListenTimer.start()
- return
-
- ListenProgress.show()
- AlreadyExistsLabel.hide()
- ListenTimer.start()
- MaxListenTimer.start()
-
- chosen_input = event
-
-
-### Input Validation
-
-func _event_is_valid(event: InputEvent) -> bool:
- var type_is_acceptable: bool = _event_type_is_acceptable(event)
- var has_modifier: bool = _event_has_modifier(event)
- var is_double_click: bool = _event_is_double_click(event)
- var mouse_btn_is_valid: bool = _event_mouse_btn_is_valid(event)
- var event_is_single_press: bool = (event.is_pressed() and not event.is_echo())
-
- var is_valid: bool
- if accept_modifiers:
- is_valid = (
- type_is_acceptable and
- event_is_single_press and
- not is_double_click and
- mouse_btn_is_valid
- )
- else:
- is_valid = (
- type_is_acceptable and
- event_is_single_press and
- not is_double_click and
- mouse_btn_is_valid and
- not has_modifier
- )
-
- return is_valid
-
-
-func _event_type_is_acceptable(event: InputEvent) -> bool:
- var is_acceptable: bool = false
-
- if (
- type == ggsInputHelper.InputType.KEYBOARD or
- type == ggsInputHelper.InputType.MOUSE
- ):
- if accept_mouse:
- is_acceptable = (
- event is InputEventKey or
- event is InputEventMouseButton
- )
- else:
- is_acceptable = (event is InputEventKey)
-
- elif (
- type == ggsInputHelper.InputType.GP_BTN or
- type == ggsInputHelper.InputType.GP_MOTION
- ):
- if accept_axis:
- is_acceptable = (
- event is InputEventJoypadButton or
- event is InputEventJoypadMotion
- )
- else:
- is_acceptable = (event is InputEventJoypadButton)
-
- return is_acceptable
-
-
-func _event_has_modifier(event: InputEvent) -> bool:
- var has_modifier: bool
-
- if event is InputEventWithModifiers:
- has_modifier = (
- event.shift_pressed or
- event.alt_pressed or
- event.ctrl_pressed
- )
-
- return has_modifier
-
-
-func _event_is_double_click(event: InputEvent) -> bool:
- var is_double_click: bool
-
- if event is InputEventMouseButton:
- is_double_click = event.double_click
-
- return is_double_click
-
-
-func _event_mouse_btn_is_valid(event: InputEvent) -> bool:
- var mouse_btn_is_valid: bool = true
-
- if event is InputEventMouseButton:
- mouse_btn_is_valid = (event.button_index >= 0 and event.button_index <= 9)
-
- return mouse_btn_is_valid
-
-
-### Input Listening
-
-func _set_btn_text_or_icon(event: InputEvent) -> void:
- if (
- use_icons and
- (type == ggsInputHelper.InputType.MOUSE or
- type == ggsInputHelper.InputType.GP_BTN or
- type == ggsInputHelper.InputType.GP_MOTION)
- ):
- ListenBtn.icon = input_helper.get_event_as_icon(event, src.icon_db)
-
- if ListenBtn.icon == null:
- ListenBtn.text = input_helper.get_event_as_text(event)
- else:
- ListenBtn.text = ""
-
- return
-
- ListenBtn.icon = null
- ListenBtn.text = input_helper.get_event_as_text(event)
-
-
-func _start_listening() -> void:
- ListenBtn.text = btn_listening
- ListenBtn.icon = null
- title = title_listening
-
- OkBtn.release_focus()
- OkBtn.disabled = true
- OkBtn.focus_mode = Control.FOCUS_NONE
-
- ListenBtn.release_focus()
- ListenBtn.disabled = true
- ListenBtn.focus_mode = Control.FOCUS_NONE
-
- CancelBtn.release_focus()
-
- if show_progress_bar:
- ListenProgress.show()
-
- set_process_input(true)
- set_process(true)
- MaxListenTimer.start()
-
-
-func _stop_listening(timed_out: bool = false) -> void:
- title = title_confirm
-
- ListenBtn.focus_mode = Control.FOCUS_ALL
- ListenBtn.disabled = false
- ListenBtn.grab_focus()
-
- if timed_out:
- ListenBtn.text = timeout_text
- ListenBtn.icon = null
-
- if not timed_out:
- OkBtn.focus_mode = Control.FOCUS_ALL
- OkBtn.disabled = false
- OkBtn.grab_focus()
-
- ListenProgress.hide()
- AlreadyExistsLabel.hide()
-
- set_process_input(false)
- set_process(false)
- MaxListenTimer.stop()
-
-
-func _on_ListenBtn_pressed() -> void:
- _start_listening()
- GGS.play_sfx(GGS.SFX.INTERACT)
-
-
-func _on_ListenTimer_timeout() -> void:
- _stop_listening()
-
-
-func _on_MaxListenTimer_timeout() -> void:
- _stop_listening(true)
-
-
-### Window
-
-func _on_visibility_changed() -> void:
- if visible:
- OkBtn.release_focus()
- chosen_input = null
- _start_listening()
-
-
-func _on_confirmed() -> void:
- input_selected.emit(chosen_input)
- GGS.play_sfx(GGS.SFX.INTERACT)
-
-
-### SFX
-
-func _on_AnyBtn_mouse_entered(Btn: Button) -> void:
- GGS.play_sfx(GGS.SFX.MOUSE_OVER)
-
- if src.grab_focus_on_mouse_over:
- Btn.grab_focus()
-
-
-func _on_AnyBtn_focus_entered() -> void:
- GGS.play_sfx(GGS.SFX.FOCUS)
-
-
-func _on_CancelBtn_pressed() -> void:
- GGS.play_sfx(GGS.SFX.INTERACT)
diff --git a/_premade/components/_misc_components/input_confirm_window/input_confirm_window.tscn b/_premade/components/_misc_components/input_confirm_window/input_confirm_window.tscn
deleted file mode 100644
index e2951400..00000000
--- a/_premade/components/_misc_components/input_confirm_window/input_confirm_window.tscn
+++ /dev/null
@@ -1,43 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://b1btmq8y3gexs"]
-
-[ext_resource type="Script" path="res://game_settings/components/_misc_components/input_confirm_window/input_confirm_window.gd" id="1_uql0i"]
-
-[node name="InputConfirmWindow" type="ConfirmationDialog"]
-size = Vector2i(300, 118)
-min_size = Vector2i(300, 115)
-ok_button_text = "Confirm"
-dialog_close_on_escape = false
-script = ExtResource("1_uql0i")
-listening_wait_time = 0.2
-
-[node name="MainCtnr" type="VBoxContainer" parent="."]
-offset_left = 8.0
-offset_top = 8.0
-offset_right = 292.0
-offset_bottom = 69.0
-size_flags_horizontal = 3
-theme_override_constants/separation = 0
-
-[node name="ListenBtn" type="Button" parent="MainCtnr"]
-layout_mode = 2
-size_flags_vertical = 3
-text = "ddd"
-icon_alignment = 1
-expand_icon = true
-
-[node name="ListenProgress" type="ProgressBar" parent="MainCtnr"]
-visible = false
-layout_mode = 2
-max_value = 1.0
-show_percentage = false
-
-[node name="AlreadyExistsLabel" type="Label" parent="MainCtnr"]
-visible = false
-layout_mode = 2
-horizontal_alignment = 1
-
-[node name="ListenTimer" type="Timer" parent="."]
-one_shot = true
-
-[node name="MaxListenTimer" type="Timer" parent="."]
-one_shot = true
diff --git a/_premade/components/_shared_scripts/binary_selection.gd b/_premade/components/_shared_scripts/binary_selection.gd
deleted file mode 100644
index 025be13f..00000000
--- a/_premade/components/_shared_scripts/binary_selection.gd
+++ /dev/null
@@ -1,48 +0,0 @@
-@tool
-extends ggsUIComponent
-
-@onready var Btn: Button = $Btn
-
-
-func _ready() -> void:
- compatible_types = [TYPE_BOOL]
- if Engine.is_editor_hint():
- return
-
- super()
- Btn.toggled.connect(_on_Btn_toggled)
- Btn.mouse_entered.connect(_on_Btn_mouse_entered)
- Btn.focus_entered.connect(_on_Btn_focus_entered)
-
-
-func init_value() -> void:
- super()
- Btn.set_pressed_no_signal(setting_value)
-
-
-func _on_Btn_toggled(btn_state: bool) -> void:
- setting_value = btn_state
- GGS.play_sfx(GGS.SFX.INTERACT)
-
- if apply_on_change:
- apply_setting()
-
-
-### Setting
-
-func reset_setting() -> void:
- super()
- Btn.set_pressed_no_signal(setting_value)
-
-
-### SFX
-
-func _on_Btn_mouse_entered() -> void:
- GGS.play_sfx(GGS.SFX.MOUSE_OVER)
-
- if grab_focus_on_mouse_over:
- Btn.grab_focus()
-
-
-func _on_Btn_focus_entered() -> void:
- GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/_premade/components/arrow_list/arrow_list.gd b/_premade/components/arrow_list/arrow_list.gd
deleted file mode 100644
index 8764d260..00000000
--- a/_premade/components/arrow_list/arrow_list.gd
+++ /dev/null
@@ -1,96 +0,0 @@
-@tool
-extends ggsUIComponent
-signal option_selected(option_index: int)
-
-@export_category("ArrowList")
-@export var options: PackedStringArray
-@export var option_ids: PackedInt32Array
-
-@onready var LeftBtn: Button = $HBox/LeftBtn
-@onready var OptionLabel: Label = $HBox/OptionLabel
-@onready var RightBtn: Button = $HBox/RightBtn
-
-
-func _ready() -> void:
- compatible_types = [TYPE_BOOL, TYPE_INT]
- if Engine.is_editor_hint():
- return
-
- super()
- option_selected.connect(_on_option_selected)
- LeftBtn.pressed.connect(_on_LeftBtn_pressed)
- RightBtn.pressed.connect(_on_RightBtn_pressed)
-
- LeftBtn.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(LeftBtn))
- RightBtn.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(RightBtn))
- LeftBtn.focus_entered.connect(_on_AnyBtn_focus_entered)
- RightBtn.focus_entered.connect(_on_AnyBtn_focus_entered)
-
-
-func init_value() -> void:
- super()
-
- if not option_ids.is_empty():
- var option_index: int = option_ids.find(setting_value)
- select(option_index, false)
- else:
- select(setting_value, false)
-
-
-func _on_option_selected(_option_index: int) -> void:
- if apply_on_change:
- apply_setting()
-
-
-### Interaction
-
-func select(index: int, emit_selected: bool = true) -> void:
- index = index % options.size()
-
- OptionLabel.text = options[index]
-
- if not option_ids.is_empty():
- setting_value = option_ids[index]
- else:
- setting_value = index
-
- if emit_selected:
- option_selected.emit(index)
-
-
-func _on_LeftBtn_pressed() -> void:
- if option_ids.is_empty():
- select(setting_value - 1)
- else:
- select(option_ids.find(setting_value) - 1)
-
- GGS.play_sfx(GGS.SFX.INTERACT)
-
-
-func _on_RightBtn_pressed() -> void:
- if option_ids.is_empty():
- select(setting_value + 1)
- else:
- select(option_ids.find(setting_value) + 1)
-
- GGS.play_sfx(GGS.SFX.INTERACT)
-
-
-### Setting
-
-func reset_setting() -> void:
- select(setting.default)
- apply_setting()
-
-
-### SFX
-
-func _on_AnyBtn_mouse_entered(Btn: Button) -> void:
- GGS.play_sfx(GGS.SFX.MOUSE_OVER)
-
- if grab_focus_on_mouse_over:
- Btn.grab_focus()
-
-
-func _on_AnyBtn_focus_entered() -> void:
- GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/_premade/components/input_btn/input_btn.gd b/_premade/components/input_btn/input_btn.gd
deleted file mode 100644
index 959f30fc..00000000
--- a/_premade/components/input_btn/input_btn.gd
+++ /dev/null
@@ -1,113 +0,0 @@
-@tool
-extends ggsUIComponent
-
-@export var ICW: ConfirmationDialog
-@export var accept_modifiers: bool
-@export var accept_mouse: bool
-@export var accept_axis: bool
-
-@export_group("Icon")
-@export var use_icons: bool
-@export var icon_db: ggsIconDB
-
-var type: ggsInputHelper.InputType = ggsInputHelper.InputType.INVALID
-var input_helper: ggsInputHelper = ggsInputHelper.new()
-
-@onready var Btn: Button = $Btn
-
-
-func _ready() -> void:
- compatible_types = [TYPE_ARRAY]
- if Engine.is_editor_hint():
- return
-
- super()
- Btn.pressed.connect(_on_Btn_pressed)
- ICW.input_selected.connect(_on_ICW_input_selected)
- Input.joy_connection_changed.connect(_on_Input_joy_connection_changed)
-
- Btn.mouse_entered.connect(_on_Btn_mouse_entered)
- Btn.focus_entered.connect(_on_Btn_focus_entered)
-
-
-func init_value() -> void:
- super()
- var event: InputEvent = input_helper.create_event_from_type(setting_value[0])
-
- type = input_helper.get_event_type(event)
-
- input_helper.set_event_id(event, setting_value[1])
- _set_btn_text_or_icon(event)
-
-
-func _on_Btn_pressed() -> void:
- ICW.src = self
- ICW.type = type
- ICW.accept_mouse = accept_mouse
- ICW.accept_modifiers = accept_modifiers
- ICW.accept_axis = accept_axis
- ICW.use_icons = use_icons
- ICW.popup_centered()
-
- GGS.play_sfx(GGS.SFX.FOCUS)
-
-
-func _on_ICW_input_selected(event: InputEvent) -> void:
- if ICW.src != self:
- return
-
- setting_value = [input_helper.get_event_type(event), input_helper.get_event_id(event)]
- _set_btn_text_or_icon(event)
-
- if apply_on_change:
- apply_setting()
-
-
-### Button Text or Icon
-
-func _set_btn_text_or_icon(event: InputEvent) -> void:
- if (
- use_icons and
- (type == ggsInputHelper.InputType.MOUSE or
- type == ggsInputHelper.InputType.GP_BTN or
- type == ggsInputHelper.InputType.GP_MOTION)
- ):
- Btn.icon = input_helper.get_event_as_icon(event, icon_db)
-
- if Btn.icon == null:
- Btn.text = input_helper.get_event_as_text(event)
- else:
- Btn.text = ""
-
- return
-
- Btn.icon = null
- Btn.text = input_helper.get_event_as_text(event)
-
-
-func _on_Input_joy_connection_changed(_device: int, _connected: bool) -> void:
- var event: InputEvent = input_helper.create_event_from_type(setting_value[0])
- input_helper.set_event_id(event, setting_value[1])
- _set_btn_text_or_icon(event)
-
-
-### Setting
-
-func reset_setting() -> void:
- super()
- var event: InputEvent = input_helper.create_event_from_type(setting_value[0])
- input_helper.set_event_id(event, setting_value[1])
- _set_btn_text_or_icon(event)
-
-
-### SFX
-
-func _on_Btn_mouse_entered() -> void:
- GGS.play_sfx(GGS.SFX.MOUSE_OVER)
-
- if grab_focus_on_mouse_over:
- Btn.grab_focus()
-
-
-func _on_Btn_focus_entered() -> void:
- GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/_premade/components/option_list/option_list.gd b/_premade/components/option_list/option_list.gd
deleted file mode 100644
index 13c09997..00000000
--- a/_premade/components/option_list/option_list.gd
+++ /dev/null
@@ -1,68 +0,0 @@
-@tool
-extends ggsUIComponent
-
-@export var use_ids: bool = false
-
-@onready var Btn: OptionButton = $Btn
-
-
-func _ready() -> void:
- compatible_types = [TYPE_BOOL, TYPE_INT]
- if Engine.is_editor_hint():
- return
-
- super()
- Btn.item_selected.connect(_on_Btn_item_selected)
-
- Btn.pressed.connect(_on_Btn_pressed)
- Btn.mouse_entered.connect(_on_Btn_mouse_entered)
- Btn.focus_entered.connect(_on_Btn_focus_entered)
- Btn.item_focused.connect(_on_Btn_item_focused)
-
-
-func init_value() -> void:
- super()
-
- if use_ids:
- Btn.select(Btn.get_item_index(setting_value))
- else:
- Btn.select(setting_value)
-
-
-func _on_Btn_item_selected(item_index: int) -> void:
- GGS.play_sfx(GGS.SFX.INTERACT)
-
- if use_ids:
- setting_value = Btn.get_item_id(item_index)
- else:
- setting_value = item_index
- if apply_on_change:
- apply_setting()
-
-
-### Setting
-
-func reset_setting() -> void:
- super()
- Btn.select(setting_value)
-
-
-### SFX
-
-func _on_Btn_pressed() -> void:
- GGS.play_sfx(GGS.SFX.FOCUS)
-
-
-func _on_Btn_mouse_entered() -> void:
- GGS.play_sfx(GGS.SFX.MOUSE_OVER)
-
- if grab_focus_on_mouse_over:
- Btn.grab_focus()
-
-
-func _on_Btn_focus_entered() -> void:
- GGS.play_sfx(GGS.SFX.FOCUS)
-
-
-func _on_Btn_item_focused(_index: int) -> void:
- GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/_premade/components/radio_list/radio_list.gd b/_premade/components/radio_list/radio_list.gd
deleted file mode 100644
index 9550d7fa..00000000
--- a/_premade/components/radio_list/radio_list.gd
+++ /dev/null
@@ -1,88 +0,0 @@
-@tool
-extends ggsUIComponent
-
-enum Lists {HLIST, VLIST}
-
-@export var option_ids: PackedInt32Array
-@export var active_list: Lists = Lists.HLIST
-
-var ActiveList: BoxContainer
-
-@onready var HList: HBoxContainer = $HList
-@onready var VList: VBoxContainer = $VList
-@onready var btngrp: ButtonGroup = ButtonGroup.new()
-
-
-func _ready() -> void:
- compatible_types = [TYPE_BOOL, TYPE_INT]
- if Engine.is_editor_hint():
- return
-
- @warning_ignore("incompatible_ternary")
- ActiveList = HList if active_list == Lists.HLIST else VList
-
- super()
- btngrp.pressed.connect(_on_pressed)
-
- for child in ActiveList.get_children():
- child.button_group = btngrp
-
- child.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(child))
- child.focus_entered.connect(_on_AnyBtn_focus_entered)
-
-
-func init_value() -> void:
- super()
-
- if not option_ids.is_empty():
- _set_button_pressed(option_ids.find(setting_value), true)
- else:
- _set_button_pressed(setting_value, true)
-
-
-func _set_button_pressed(btn_index: int, pressed: bool) -> void:
- ActiveList.get_child(btn_index).button_pressed = pressed
-
-
-func _get_child_index(target_child: BaseButton) -> int:
- var i: int = 0
- for child in ActiveList.get_children():
- if child == target_child:
- return i
-
- i += 1
-
- return -1
-
-
-func _on_pressed(button: BaseButton) -> void:
- GGS.play_sfx(GGS.SFX.INTERACT)
-
- var child_index: int = _get_child_index(button)
- if not option_ids.is_empty():
- setting_value = option_ids[child_index]
- else:
- setting_value = child_index
-
- if apply_on_change:
- apply_setting()
-
-
-### Setting
-
-func reset_setting() -> void:
- super()
- _set_button_pressed(setting_value, true)
-
-
-### SFX
-
-func _on_AnyBtn_mouse_entered(Btn: Button) -> void:
- GGS.play_sfx(GGS.SFX.MOUSE_OVER)
-
- if grab_focus_on_mouse_over:
- Btn.grab_focus()
-
-
-func _on_AnyBtn_focus_entered() -> void:
- GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/_premade/components/slider/slider.gd b/_premade/components/slider/slider.gd
deleted file mode 100644
index 49f38f3d..00000000
--- a/_premade/components/slider/slider.gd
+++ /dev/null
@@ -1,47 +0,0 @@
-@tool
-extends ggsUIComponent
-
-@onready var slider: HSlider = $Slider
-
-
-func _ready() -> void:
- compatible_types = [TYPE_INT, TYPE_FLOAT]
- if Engine.is_editor_hint():
- return
-
- super()
- slider.value_changed.connect(_on_Slider_value_changed)
- slider.mouse_entered.connect(_on_Slider_mouse_entered)
- slider.focus_entered.connect(_on_Slider_focus_entered)
-
-
-func init_value() -> void:
- super()
- slider.set_value_no_signal(setting_value)
-
-
-func _on_Slider_value_changed(new_value: float) -> void:
- setting_value = new_value
-
- if apply_on_change:
- apply_setting()
-
-
-### Setting
-
-func reset_setting() -> void:
- super()
- slider.value = setting_value
-
-
-### SFX
-
-func _on_Slider_mouse_entered() -> void:
- GGS.play_sfx(GGS.SFX.MOUSE_OVER)
-
- if grab_focus_on_mouse_over:
- slider.grab_focus()
-
-
-func _on_Slider_focus_entered() -> void:
- GGS.play_sfx(GGS.SFX.FOCUS)
diff --git a/_premade/components/spinbox/spinbox.gd b/_premade/components/spinbox/spinbox.gd
deleted file mode 100644
index fa013a6a..00000000
--- a/_premade/components/spinbox/spinbox.gd
+++ /dev/null
@@ -1,36 +0,0 @@
-@tool
-extends ggsUIComponent
-
-@onready var spin_box: SpinBox = $SpinBox
-@onready var Field: LineEdit = spin_box.get_line_edit()
-
-
-func _ready() -> void:
- compatible_types = [TYPE_INT, TYPE_FLOAT]
- if Engine.is_editor_hint():
- return
-
- super()
- spin_box.value_changed.connect(_on_SpinBox_value_changed)
- Field.context_menu_enabled = false
-
-
-func init_value() -> void:
- super()
- spin_box.set_value_no_signal(setting_value)
- Field.text = str(setting_value)
-
-
-func _on_SpinBox_value_changed(new_value: float) -> void:
- setting_value = new_value
- GGS.play_sfx(GGS.SFX.INTERACT)
- if apply_on_change:
- apply_setting()
-
-
-### Setting
-
-func reset_setting() -> void:
- super()
- spin_box.value = setting_value
- Field.text = str(setting_value)
diff --git a/_premade/components/switch/switch.tscn b/_premade/components/switch/switch.tscn
deleted file mode 100644
index e79faa18..00000000
--- a/_premade/components/switch/switch.tscn
+++ /dev/null
@@ -1,14 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://cha8xesfthpfk"]
-
-[ext_resource type="Script" path="res://game_settings/components/_shared_scripts/binary_selection.gd" id="1_tff36"]
-
-[node name="Switch" type="MarginContainer"]
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-script = ExtResource("1_tff36")
-
-[node name="Btn" type="CheckButton" parent="."]
-layout_mode = 2
diff --git a/_premade/components/text_field/text_field.gd b/_premade/components/text_field/text_field.gd
deleted file mode 100644
index e6657f18..00000000
--- a/_premade/components/text_field/text_field.gd
+++ /dev/null
@@ -1,32 +0,0 @@
-@tool
-extends ggsUIComponent
-
-@onready var TextField: LineEdit = $TextField
-
-
-func _ready() -> void:
- compatible_types = [TYPE_STRING]
- if Engine.is_editor_hint():
- return
-
- super()
- TextField.text_submitted.connect(_on_TextField_text_submitted)
-
-
-func init_value() -> void:
- super()
- TextField.text = setting_value
-
-
-func _on_TextField_text_submitted(submitted_text: String) -> void:
- setting_value = submitted_text
- GGS.play_sfx(GGS.SFX.INTERACT)
- if apply_on_change:
- apply_setting()
-
-
-### Setting
-
-func reset_setting() -> void:
- super()
- TextField.text = setting_value
diff --git a/_premade/readme.txt b/_premade/readme.txt
deleted file mode 100644
index 72f8bba6..00000000
--- a/_premade/readme.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Remember to move both templates and components folders to your game settings directory.
-
-Default structure:
-res://
- game_settings
- -> components
- settings
- -> templates
\ No newline at end of file
diff --git a/_premade/templates/audio/audio_mute.gd b/_premade/templates/audio/audio_mute.gd
deleted file mode 100644
index f37b25f1..00000000
--- a/_premade/templates/audio/audio_mute.gd
+++ /dev/null
@@ -1,41 +0,0 @@
-@tool
-extends ggsSetting
-
-var audio_bus: String = "None"
-
-
-func _init() -> void:
- value_type = TYPE_BOOL
- default = false
-
-
-func apply(value: bool) -> void:
- if audio_bus == "None":
- printerr("GGS - Apply Setting (audio_mute.gd): No audio bus is selected.")
- return
-
- var bus_index: int = AudioServer.get_bus_index(audio_bus)
- AudioServer.set_bus_mute(bus_index, value)
-
-
-### Bus Name
-
-func _get_property_list() -> Array:
- var hint_string: String = ",".join(_get_audio_buses())
- return [{
- "name": "audio_bus",
- "type": TYPE_STRING,
- "usage": PROPERTY_USAGE_DEFAULT,
- "hint": PROPERTY_HINT_ENUM,
- "hint_string": hint_string,
- }]
-
-
-func _get_audio_buses() -> PackedStringArray:
- var buses: PackedStringArray = ["None"]
- for bus_index in range(AudioServer.bus_count):
- var bus: String = AudioServer.get_bus_name(bus_index)
- buses.append(bus)
-
- return buses
-
diff --git a/_premade/templates/audio/audio_volume.gd b/_premade/templates/audio/audio_volume.gd
deleted file mode 100644
index 5049bcb4..00000000
--- a/_premade/templates/audio/audio_volume.gd
+++ /dev/null
@@ -1,44 +0,0 @@
-@tool
-extends ggsSetting
-
-var audio_bus: String = "None"
-
-
-func _init() -> void:
- value_type = TYPE_FLOAT
- value_hint = PROPERTY_HINT_RANGE
- value_hint_string = "0,100"
- default = 80.0
-
-
-func apply(value: float) -> void:
- if audio_bus == "None":
- printerr("GGS - Apply Setting (audio_volume.gd): No audio bus is selected.")
- return
-
- var bus_index: int = AudioServer.get_bus_index(audio_bus)
- var volume_db: float = linear_to_db(value/100)
- AudioServer.set_bus_volume_db(bus_index, volume_db)
-
-
-### Bus Name
-
-func _get_property_list() -> Array:
- var hint_string: String = ",".join(_get_audio_buses())
- return [{
- "name": "audio_bus",
- "type": TYPE_STRING,
- "usage": PROPERTY_USAGE_DEFAULT,
- "hint": PROPERTY_HINT_ENUM,
- "hint_string": hint_string,
- }]
-
-
-func _get_audio_buses() -> PackedStringArray:
- var buses: PackedStringArray = ["None"]
- for bus_index in range(AudioServer.bus_count):
- var bus: String = AudioServer.get_bus_name(bus_index)
- buses.append(bus)
-
- return buses
-
diff --git a/_premade/templates/display/display_fullscreen.gd b/_premade/templates/display/display_fullscreen.gd
deleted file mode 100644
index d6e1af17..00000000
--- a/_premade/templates/display/display_fullscreen.gd
+++ /dev/null
@@ -1,23 +0,0 @@
-@tool
-extends ggsSetting
-
-@export var size_setting: ggsSetting
-
-
-func _init() -> void:
- value_type = TYPE_BOOL
- default = false
-
-
-func apply(value: bool) -> void:
- var window_mode: DisplayServer.WindowMode
- match value:
- true:
- window_mode = DisplayServer.WINDOW_MODE_FULLSCREEN
- false:
- window_mode = DisplayServer.WINDOW_MODE_WINDOWED
-
- DisplayServer.window_set_mode(window_mode)
-
- if size_setting != null:
- size_setting.apply(size_setting.current)
diff --git a/_premade/templates/display/display_size.gd b/_premade/templates/display/display_size.gd
deleted file mode 100644
index 65f5be1d..00000000
--- a/_premade/templates/display/display_size.gd
+++ /dev/null
@@ -1,37 +0,0 @@
-@tool
-extends ggsSetting
-
-@export var sizes: Array[Vector2]: set = set_sizes
-
-
-func _init() -> void:
- value_type = TYPE_INT
- value_hint = PROPERTY_HINT_ENUM
- value_hint_string = ",".join(_get_sizes_strings())
-
-
-func apply(value: int) -> void:
- var size: Vector2 = sizes[value]
- size = ggsUtils.window_clamp_to_screen(size)
-
- DisplayServer.window_set_size(size)
- ggsUtils.center_window()
-
-
-### Sizes
-
-func set_sizes(value: Array[Vector2]) -> void:
- sizes = value
-
- if Engine.is_editor_hint():
- value_hint_string = ",".join(_get_sizes_strings())
- ggsUtils.get_editor_interface().call_deferred("inspect_object", self)
-
-
-func _get_sizes_strings() -> PackedStringArray:
- var sizes_strings: PackedStringArray
- for size in sizes:
- var formatted_size: String = str(size).trim_prefix("(").trim_suffix(")").replace(",", " x")
- sizes_strings.append(formatted_size)
-
- return sizes_strings
diff --git a/_premade/templates/input.gd b/_premade/templates/input.gd
deleted file mode 100644
index 3f45285b..00000000
--- a/_premade/templates/input.gd
+++ /dev/null
@@ -1,96 +0,0 @@
-@tool
-extends ggsSetting
-class_name ggsInputSetting
-
-var action: String
-var event_index: int
-var type: ggsInputHelper.InputType = ggsInputHelper.InputType.INVALID
-var default_as_event: InputEvent: set = set_default_as_event
-var current_as_event: InputEvent: set = set_current_as_event
-var input_helper: ggsInputHelper = ggsInputHelper.new()
-
-
-func _init() -> void:
- read_only_values = true
- value_type = TYPE_ARRAY
- default = [-1, -1]
-
-
-func _get_property_list() -> Array:
- var read_only: int = PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_READ_ONLY
- var allowed_event: String = _get_allowed_event_types()
-
- var properties: Array
- properties.append_array([
- {"name": "action", "type": TYPE_STRING, "usage": read_only},
- {"name": "event_index", "type": TYPE_INT, "usage": read_only},
- {"name": "type", "type": TYPE_INT, "usage": PROPERTY_USAGE_STORAGE, "hint": PROPERTY_HINT_ENUM, "hint_string": "None,Keyboard,Mouse,Gamepad Button,Gamepad Motion"},
- {"name": "default_as_event", "type": TYPE_OBJECT, "usage": read_only, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": allowed_event},
- {"name": "current_as_event", "type": TYPE_OBJECT, "usage": read_only if type == input_helper.InputType.INVALID else PROPERTY_USAGE_DEFAULT, "hint": PROPERTY_HINT_RESOURCE_TYPE, "hint_string": allowed_event},
- ])
-
- return properties
-
-
-func update_current_as_event() -> void:
- var event: InputEvent = input_helper.create_event_from_type(current[0])
- input_helper.set_event_id(event, current[1])
- current_as_event = event
-
-
-func _get_allowed_event_types() -> String:
- if type == input_helper.InputType.KEYBOARD or type == input_helper.InputType.MOUSE:
- return "InputEventKey,InputEventMouseButton"
-
- if type == input_helper.InputType.GP_BTN or type == input_helper.InputType.GP_MOTION:
- return "InputEventJoypadButton,InputEventJoypadMotion"
-
- return ""
-
-
-### Updating Current and Default
-
-func set_default_as_event(value: InputEvent) -> void:
- default_as_event = value
-
- if not Engine.is_editor_hint():
- return
-
- type = input_helper.get_event_type(value)
- default = [type, input_helper.get_event_id(value)]
- ggsUtils.get_editor_interface().inspect_object.call_deferred(self)
-
-
-func set_current_as_event(value: InputEvent) -> void:
- current_as_event = value
-
- if not Engine.is_editor_hint():
- return
-
- type = input_helper.get_event_type(current_as_event)
- current = [type, input_helper.get_event_id(value)]
- if value != null:
- value.changed.connect(_on_current_event_changed)
-
-
-func _on_current_event_changed() -> void:
- current = [type, input_helper.get_event_id(current_as_event)]
-
-
-### Applying
-
-func apply(value: Array) -> void:
- if value.is_empty() or value[0] == -1 or value[1] == -1:
- return
-
- var event: InputEvent = input_helper.create_event_from_type(value[0])
- input_helper.set_event_id(event, value[1])
-
- var action_events: Array[InputEvent] = InputMap.action_get_events(action)
- action_events.remove_at(event_index)
- action_events.insert(event_index, event)
-
- InputMap.action_erase_events(action)
- for _event_ in action_events:
- InputMap.action_add_event(action, _event_)
-
diff --git a/about.txt b/about.txt
new file mode 100644
index 00000000..d9f9593e
--- /dev/null
+++ b/about.txt
@@ -0,0 +1,18 @@
+*--------------------------------*
+| |
+| Godot Game Settings - v3.2.0 |
+| |
+*--------------------------------*
+Documentation:
+ https://punchableplushie.github.io/godot-game-settings-docs/
+*--------------------------------*
+Github Repository:
+ https://github.com/PunchablePlushie/godot-game-settings
+*--------------------------------*
+Changelog:
+- Made compatible with Godot 4.3.
+- The plugin no longer features an editor. All operations are done through Godot editor itself.
+- Several code improvements, including using doc comments to generate documentation inside the editor.
+- Unique icons for components, making them easier to distinguish when making a setting menu.
+- Small improvements to the custom property inspectors.
+- New icon.
diff --git a/assets/add.svg b/assets/add.svg
deleted file mode 100644
index afad08a2..00000000
--- a/assets/add.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/add.svg.import b/assets/add.svg.import
deleted file mode 100644
index 7bfee0c0..00000000
--- a/assets/add.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://by345a10evjm8"
-path="res://.godot/imported/add.svg-cc4a8e36f6ce6a04a3c9cc98b73e4df8.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/add.svg"
-dest_files=["res://.godot/imported/add.svg-cc4a8e36f6ce6a04a3c9cc98b73e4df8.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/assets/bug.svg b/assets/bug.svg
deleted file mode 100644
index 769fada0..00000000
--- a/assets/bug.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/bug.svg.import b/assets/bug.svg.import
deleted file mode 100644
index f85c4d81..00000000
--- a/assets/bug.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bt7gdorkvo4an"
-path="res://.godot/imported/bug.svg-f98ad47dc3f3571a377a4a231005fffe.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/bug.svg"
-dest_files=["res://.godot/imported/bug.svg-f98ad47dc3f3571a377a4a231005fffe.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/assets/check_all.svg b/assets/check_all.svg
deleted file mode 100644
index b022f934..00000000
--- a/assets/check_all.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/check_all.svg.import b/assets/check_all.svg.import
deleted file mode 100644
index a780f868..00000000
--- a/assets/check_all.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bttv2hpecd38m"
-path="res://.godot/imported/check_all.svg-9b872310d9fb707e5903a11e61ac9a87.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/check_all.svg"
-dest_files=["res://.godot/imported/check_all.svg-9b872310d9fb707e5903a11e61ac9a87.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/assets/close.svg b/assets/close.svg
deleted file mode 100644
index be1c1dce..00000000
--- a/assets/close.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/close.svg.import b/assets/close.svg.import
deleted file mode 100644
index 6f59e8ce..00000000
--- a/assets/close.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cflcng660hsp0"
-path="res://.godot/imported/close.svg-6b4a6b89f4446e3757436ab1e2e33be6.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/close.svg"
-dest_files=["res://.godot/imported/close.svg-6b4a6b89f4446e3757436ab1e2e33be6.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/assets/collapse_all.svg b/assets/collapse_all.svg
deleted file mode 100644
index bff3eca8..00000000
--- a/assets/collapse_all.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/collapse_all.svg.import b/assets/collapse_all.svg.import
deleted file mode 100644
index 2a5329ce..00000000
--- a/assets/collapse_all.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://l0mve5lc0okm"
-path="res://.godot/imported/collapse_all.svg-84b31d2383c45ad2c7425908d0a5bd5b.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/collapse_all.svg"
-dest_files=["res://.godot/imported/collapse_all.svg-84b31d2383c45ad2c7425908d0a5bd5b.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/assets/delete.svg b/assets/delete.svg
deleted file mode 100644
index 5bcdf8e5..00000000
--- a/assets/delete.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/delete.svg.import b/assets/delete.svg.import
deleted file mode 100644
index b703175d..00000000
--- a/assets/delete.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bn0d5k8dd06qr"
-path="res://.godot/imported/delete.svg-6f3953bc0542e18a1d77b52528ff86cf.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/delete.svg"
-dest_files=["res://.godot/imported/delete.svg-6f3953bc0542e18a1d77b52528ff86cf.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/assets/docs.svg b/assets/docs.svg
deleted file mode 100644
index 20256038..00000000
--- a/assets/docs.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/docs.svg.import b/assets/docs.svg.import
deleted file mode 100644
index 00ea2d62..00000000
--- a/assets/docs.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cdxv6r8uy2me5"
-path="res://.godot/imported/docs.svg-0b7d65f3eeee9d1934d1922c3c815f4e.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/docs.svg"
-dest_files=["res://.godot/imported/docs.svg-0b7d65f3eeee9d1934d1922c3c815f4e.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/assets/expand_all.svg b/assets/expand_all.svg
deleted file mode 100644
index 1b0a9512..00000000
--- a/assets/expand_all.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/expand_all.svg.import b/assets/expand_all.svg.import
deleted file mode 100644
index 575b82e8..00000000
--- a/assets/expand_all.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://caajrkkuvle0e"
-path="res://.godot/imported/expand_all.svg-04baf0245d861ddcbc4e38a80edbda26.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/expand_all.svg"
-dest_files=["res://.godot/imported/expand_all.svg-04baf0245d861ddcbc4e38a80edbda26.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/assets/feedback.svg b/assets/feedback.svg
deleted file mode 100644
index 3e8598af..00000000
--- a/assets/feedback.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/feedback.svg.import b/assets/feedback.svg.import
deleted file mode 100644
index a9c3446b..00000000
--- a/assets/feedback.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c5a5taq8d2n0v"
-path="res://.godot/imported/feedback.svg-ef17e3f0b77f89dfe039a2ae2bdb59db.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/feedback.svg"
-dest_files=["res://.godot/imported/feedback.svg-ef17e3f0b77f89dfe039a2ae2bdb59db.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/assets/file_dialog.svg b/assets/file_dialog.svg
deleted file mode 100644
index c1e54795..00000000
--- a/assets/file_dialog.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/file_dialog.svg.import b/assets/file_dialog.svg.import
deleted file mode 100644
index fa3282b1..00000000
--- a/assets/file_dialog.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://badl61ealw70o"
-path="res://.godot/imported/file_dialog.svg-9fb726e239e3a68babea68c94f0fb435.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/file_dialog.svg"
-dest_files=["res://.godot/imported/file_dialog.svg-9fb726e239e3a68babea68c94f0fb435.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/assets/icon_mini.svg b/assets/icon_mini.svg
deleted file mode 100644
index 2f41debb..00000000
--- a/assets/icon_mini.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/icon_mini.svg.import b/assets/icon_mini.svg.import
deleted file mode 100644
index 635fad16..00000000
--- a/assets/icon_mini.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bk0u7p6a1apta"
-path="res://.godot/imported/icon_mini.svg-5e00867268e00b8e3e5eaa22b6fe9735.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/icon_mini.svg"
-dest_files=["res://.godot/imported/icon_mini.svg-5e00867268e00b8e3e5eaa22b6fe9735.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/assets/icon_mono.svg b/assets/icon_mono.svg
deleted file mode 100644
index 5abf9a7b..00000000
--- a/assets/icon_mono.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/icon_mono.svg.import b/assets/icon_mono.svg.import
deleted file mode 100644
index 106b6453..00000000
--- a/assets/icon_mono.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://b8o243gwa707v"
-path="res://.godot/imported/icon_mono.svg-44d29ea722636fe5e654f2982a3e46a7.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/icon_mono.svg"
-dest_files=["res://.godot/imported/icon_mono.svg-44d29ea722636fe5e654f2982a3e46a7.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/assets/reload.svg b/assets/reload.svg
deleted file mode 100644
index 1200df1d..00000000
--- a/assets/reload.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/reload.svg.import b/assets/reload.svg.import
deleted file mode 100644
index a9e84e5a..00000000
--- a/assets/reload.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://ve54bl3r7ljc"
-path="res://.godot/imported/reload.svg-e5d4e094fabdbb8dce0284d7c068bbf7.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/reload.svg"
-dest_files=["res://.godot/imported/reload.svg-e5d4e094fabdbb8dce0284d7c068bbf7.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/assets/rename.svg b/assets/rename.svg
deleted file mode 100644
index bd6dad20..00000000
--- a/assets/rename.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/rename.svg.import b/assets/rename.svg.import
deleted file mode 100644
index 8bc50d71..00000000
--- a/assets/rename.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://c2t5bnnw5wntg"
-path="res://.godot/imported/rename.svg-6a8295895275642ac274032accd0e496.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/rename.svg"
-dest_files=["res://.godot/imported/rename.svg-6a8295895275642ac274032accd0e496.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/assets/save_file.svg b/assets/save_file.svg
deleted file mode 100644
index d3c01ca4..00000000
--- a/assets/save_file.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/save_file.svg.import b/assets/save_file.svg.import
deleted file mode 100644
index d25db386..00000000
--- a/assets/save_file.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://bx8yoim3ur6h"
-path="res://.godot/imported/save_file.svg-c3285e886b3ea7d7c8d043d4932fe121.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/save_file.svg"
-dest_files=["res://.godot/imported/save_file.svg-c3285e886b3ea7d7c8d043d4932fe121.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/assets/search.svg.import b/assets/search.svg.import
deleted file mode 100644
index 2605b1a3..00000000
--- a/assets/search.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://dbervsl0o0ifw"
-path="res://.godot/imported/search.svg-49c012ff581540a89f79d42c8fa61d3e.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/search.svg"
-dest_files=["res://.godot/imported/search.svg-49c012ff581540a89f79d42c8fa61d3e.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/assets/show_in_filesystem.svg b/assets/show_in_filesystem.svg
deleted file mode 100644
index a5e1c2f8..00000000
--- a/assets/show_in_filesystem.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/show_in_filesystem.svg.import b/assets/show_in_filesystem.svg.import
deleted file mode 100644
index 661085cc..00000000
--- a/assets/show_in_filesystem.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://buvhmwckm6s2e"
-path="res://.godot/imported/show_in_filesystem.svg-d8323cbcf62adb9529b12d5317dfd9e0.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/show_in_filesystem.svg"
-dest_files=["res://.godot/imported/show_in_filesystem.svg-d8323cbcf62adb9529b12d5317dfd9e0.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/assets/theme.svg b/assets/theme.svg
deleted file mode 100644
index c684aed0..00000000
--- a/assets/theme.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/theme.svg.import b/assets/theme.svg.import
deleted file mode 100644
index 8b580bf7..00000000
--- a/assets/theme.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://cltge6ak5rw2e"
-path="res://.godot/imported/theme.svg-e66649e0a1572635d9bbe372771a00be.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/theme.svg"
-dest_files=["res://.godot/imported/theme.svg-e66649e0a1572635d9bbe372771a00be.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/assets/uncheck_all.svg b/assets/uncheck_all.svg
deleted file mode 100644
index 9809dad2..00000000
--- a/assets/uncheck_all.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/assets/uncheck_all.svg.import b/assets/uncheck_all.svg.import
deleted file mode 100644
index 5de9cb8b..00000000
--- a/assets/uncheck_all.svg.import
+++ /dev/null
@@ -1,37 +0,0 @@
-[remap]
-
-importer="texture"
-type="CompressedTexture2D"
-uid="uid://romr61n4g5y5"
-path="res://.godot/imported/uncheck_all.svg-abca75613ca5bd818fad7ad47e045d69.ctex"
-metadata={
-"vram_texture": false
-}
-
-[deps]
-
-source_file="res://addons/ggs/assets/uncheck_all.svg"
-dest_files=["res://.godot/imported/uncheck_all.svg-abca75613ca5bd818fad7ad47e045d69.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/classes/ggs_input_helper.gd b/classes/ggs_input_helper.gd
deleted file mode 100644
index 1240ead9..00000000
--- a/classes/ggs_input_helper.gd
+++ /dev/null
@@ -1,241 +0,0 @@
-@tool
-extends RefCounted
-class_name ggsInputHelper
-
-enum InputType {INVALID, KEYBOARD, MOUSE, GP_BTN, GP_MOTION}
-
-var joy_name_abbr: Dictionary = {
- "XInput Gamepad": "xbox",
- "Xbox Series Controller": "xbox",
- "Sony DualSense": "ps",
- "PS5 Controller": "ps",
- "PS4 Controller": "ps",
- "Switch": "switch",
-}
-
-var labels: Dictionary = {
- "mouse": [
- "LMB", "RMB", "MMB", "MW Up", "MW Down", "MW Left", "MW Right", "MB1", "MB2"
- ],
-
- "xbox": [
- "A", "B", "X", "Y", "Back", "Home", "Start", "L", "R", "LB", "RB",
- "DPad Up", "DPad Down", "DPad Left", "DPad Right", "Share"
- ],
-
- "ps": [
- "Cross", "Circle", "Square", "Triangle", "Select", "PS", "Start",
- "L3", "R3", "L1", "R1", "DPad Up", "DPad Down", "DPad Left",
- "DPad Right", "Microphone"
- ],
-
- "switch": [
- "B", "A", "Y", "X", "Minus", "", "Plus", "", "", "", "",
- "DPad Up", "DPad Down", "DPad Left", "DPad Right", "Capture"
- ],
-
- "other": [
- "A", "B", "X", "Y", "Back", "Home", "Start", "L", "R", "LB", "RB",
- "DPad Up", "DPad Down", "DPad Left", "DPad Right", "Share",
- "Paddle 1", "Paddle 2", "Paddle 3", "Paddle 4", "Touch"
- ],
-
- "motion": [
- {"-": "LStick Left", "+": "LStick Right"},
- {"-": "LStick Up", "+": "LStick Down"},
- {"-": "RStick Left", "+": "RStick Right"},
- {"-": "RStick Up", "+": "RStick Down"},
- {"+": "Left Trigger"},
- {"+": "Right Trigger"}
- ],
-}
-
-
-func get_event_id(event: InputEvent) -> int:
- if event is InputEventKey:
- if event.physical_keycode == 0:
- return -1
-
- return event.physical_keycode | event.get_modifiers_mask()
-
- if event is InputEventMouseButton:
- return event.button_index | event.get_modifiers_mask()
-
- if event is InputEventJoypadButton:
- return event.button_index
-
- if event is InputEventJoypadMotion:
- return event.axis
-
- return -1
-
-
-func set_event_id(event: InputEvent, id: int) -> void:
- if event is InputEventKey:
- event.physical_keycode = id & ~(KEY_MASK_SHIFT | KEY_MASK_CTRL | KEY_MASK_ALT)
- _set_event_modifiers(event, id)
-
- if event is InputEventMouseButton:
- event.button_index = id & ~(KEY_MASK_SHIFT | KEY_MASK_CTRL | KEY_MASK_ALT)
- _set_event_modifiers(event, id)
-
- if event is InputEventJoypadButton:
- event.button_index = id
-
- if event is InputEventJoypadMotion:
- event.axis = id
-
-
-func get_event_type(event: InputEvent) -> InputType:
- if event is InputEventKey:
- return InputType.KEYBOARD
-
- if event is InputEventMouseButton:
- return InputType.MOUSE
-
- if event is InputEventJoypadButton:
- return InputType.GP_BTN
-
- if event is InputEventJoypadMotion:
- return InputType.GP_MOTION
-
- return InputType.INVALID
-
-
-func create_event_from_type(type: InputType) -> InputEvent:
- match type:
- InputType.KEYBOARD:
- return InputEventKey.new()
- InputType.MOUSE:
- return InputEventMouseButton.new()
- InputType.GP_BTN:
- return InputEventJoypadButton.new()
- InputType.GP_MOTION:
- return InputEventJoypadMotion.new()
- _:
- return null
-
-
-func input_already_exists(event: InputEvent, self_action: String) -> Array:
- for action in InputMap.get_actions():
- if action.begins_with("ui_"):
- continue
-
- if action == self_action:
- continue
-
- if InputMap.action_has_event(action, event):
- return [true, action]
-
- return [false, ""]
-
-
-func _set_event_modifiers(event: InputEventWithModifiers, modifier_mask: int) -> void:
- event.shift_pressed = bool(modifier_mask & KEY_MASK_SHIFT)
- event.ctrl_pressed = bool(modifier_mask & KEY_MASK_CTRL)
- event.alt_pressed = bool(modifier_mask & KEY_MASK_ALT)
-
-
-### Events as Text
-
-func get_event_as_text(event: InputEvent) -> String:
- if get_event_id(event) == -1:
- return "INVALID"
-
- if event is InputEventKey:
- return OS.get_keycode_string(event.get_physical_keycode_with_modifiers())
-
- if event is InputEventMouseButton:
- return _get_mouse_event_as_text(event)
-
- if event is InputEventJoypadButton:
- return _get_gp_btn_event_as_text(event)
-
- if event is InputEventJoypadMotion:
- return _get_gp_motion_event_as_text(event)
-
- return ""
-
-
-func _get_modifiers_as_string(event: InputEventWithModifiers) -> String:
- var modifiers: PackedStringArray
- if event.shift_pressed:
- modifiers.append("Shift")
-
- if event.ctrl_pressed:
- modifiers.append("Ctrl")
-
- if event.alt_pressed:
- modifiers.append("Alt")
-
- var modifiers_string: String = "+".join(modifiers)
- return modifiers_string
-
-
-func _get_joy_name_abbr(name: String) -> String:
- if joy_name_abbr.has(name):
- return joy_name_abbr[name]
- else:
- return "other"
-
-
-func _get_mouse_event_as_text(event: InputEventMouseButton) -> String:
- var modifiers: String = _get_modifiers_as_string(event)
- var btn: String = labels["mouse"][event.button_index - 1]
- var result: String = "%s"%btn if modifiers.is_empty() else "%s+%s"%[modifiers, btn]
- return result
-
-
-func _get_gp_btn_event_as_text(event: InputEventJoypadButton) -> String:
- var device_name: String = Input.get_joy_name(event.device)
- device_name = _get_joy_name_abbr(device_name)
- return labels[device_name][event.button_index]
-
-
-func _get_gp_motion_event_as_text(event: InputEventJoypadMotion) -> String:
- var axis_value: String = "-" if event.axis_value < 0 else "+"
- return labels["motion"][event.axis][axis_value]
-
-
-### Events as Icons
-
-func get_event_as_icon(event: InputEvent, icon_db: ggsIconDB) -> Texture2D:
- if event is InputEventMouseButton:
- return _get_mouse_event_as_icon(event, icon_db)
-
- if event is InputEventJoypadButton:
- return _get_gp_btn_event_as_icon(event, icon_db)
-
- if event is InputEventJoypadMotion:
- return _get_gp_motion_event_as_icon(event, icon_db)
-
- return null
-
-
-func _get_mouse_event_as_icon(event: InputEventMouse, icon_db: ggsIconDB) -> Texture2D:
- var button_index: int = event.button_index
- var icon: Texture2D = icon_db.get_mouse_button_texture(button_index)
-
- return icon
-
-
-func _get_gp_btn_event_as_icon(event: InputEventJoypadButton, icon_db: ggsIconDB) -> Texture2D:
- var device_name: String = Input.get_joy_name(event.device)
- device_name = _get_joy_name_abbr(device_name)
-
- var button_index: int = event.button_index
- var icon: Texture2D = icon_db.get_gp_button_texture(device_name, button_index)
-
- return icon
-
-
-func _get_gp_motion_event_as_icon(event: InputEventJoypadMotion, icon_db: ggsIconDB) -> Texture2D:
- var device_name: String = Input.get_joy_name(event.device)
- device_name = _get_joy_name_abbr(device_name)
-
- var axis: int = event.axis
- var axis_dir: String = "-" if event.axis_value < 1 else "+"
- var icon: Texture2D = icon_db.get_gp_motion_texture(device_name, axis, axis_dir)
-
- return icon
-
diff --git a/classes/ggs_inspector_plugin.gd b/classes/ggs_inspector_plugin.gd
deleted file mode 100644
index 312b5919..00000000
--- a/classes/ggs_inspector_plugin.gd
+++ /dev/null
@@ -1,18 +0,0 @@
-@tool
-extends EditorInspectorPlugin
-class_name ggsInspectorPlugin
-
-var input_selector_scn: PackedScene = preload("res://addons/ggs/editor/input_selector/input_selector.tscn")
-
-
-func _can_handle(object: Object) -> bool:
- return object is ggsInputSetting
-
-
-func _parse_category(object: Object, category: String) -> void:
- if category != "input.gd":
- return
-
- var InputSelector: Control = input_selector_scn.instantiate()
- InputSelector.inspected_obj = object as ggsInputSetting
- add_custom_control(InputSelector)
diff --git a/classes/ggs_save_file.gd b/classes/ggs_save_file.gd
deleted file mode 100644
index 4db6430d..00000000
--- a/classes/ggs_save_file.gd
+++ /dev/null
@@ -1,17 +0,0 @@
-@tool
-extends ConfigFile
-class_name ggsSaveFile
-
-var path: String = ggsUtils.get_plugin_data().dir_save_file
-
-
-func _init() -> void:
- if not FileAccess.file_exists(path):
- save(path)
-
- self.load(path)
-
-
-func set_key(section: String, key: String, value: Variant) -> void:
- set_value(section, key, value)
- save(path)
diff --git a/classes/ggs_ui_component.gd b/classes/ggs_ui_component.gd
deleted file mode 100644
index 7c84d059..00000000
--- a/classes/ggs_ui_component.gd
+++ /dev/null
@@ -1,66 +0,0 @@
-@tool
-extends MarginContainer
-class_name ggsUIComponent
-
-const WARNING_NO_SETTING: String = "No setting is assigned."
-const WARNING_DELETED_SETTING: String = "The assigned setting was deleted or is invalid."
-const WARNING_SETTING_NOT_IN_DIR: String = "The assigned setting is not in the settings directory."
-const WARNING_INCOMPATIBLE_SETTING: String = "The value type of the assigned setting is not compatible with this component."
-
-@export_category("GGS UI Component")
-@export var setting: ggsSetting: set = set_setting
-@export var apply_on_change: bool
-@export var grab_focus_on_mouse_over: bool
-
-var setting_value: Variant
-var compatible_types: Array[Variant.Type] = []
-
-
-func _ready() -> void:
- init_value()
-
-
-func _get_configuration_warnings() -> PackedStringArray:
- if setting == null:
- return PackedStringArray([WARNING_NO_SETTING])
-
- if setting.resource_path.is_empty():
- return PackedStringArray([WARNING_DELETED_SETTING])
-
- if not setting.resource_path.begins_with(ggsUtils.get_plugin_data().dir_settings):
- return PackedStringArray([WARNING_SETTING_NOT_IN_DIR])
-
- if (
- not compatible_types.is_empty() and
- not compatible_types.has(setting.value_type)
- ):
- return PackedStringArray([WARNING_INCOMPATIBLE_SETTING])
-
-
- return PackedStringArray()
-
-
-func set_setting(value: ggsSetting) -> void:
- setting = value
- update_configuration_warnings()
-
-
-func init_value() -> void:
- if setting != null:
- setting_value = setting.current
-
-
-func apply_setting() -> void:
- setting.current = setting_value #!1
- setting.apply(setting_value)
-
-
-func reset_setting() -> void:
- setting_value = setting.default
- apply_setting()
-
-
-#1 Note that during runtime, the setting resource itself is not actually changed
- # since all resources are read-only during runtime. However, the setter
- # function (set_setting) of the resource is still executed.
- # View ggs_setting.gd/set_setting() for more info.
diff --git a/classes/ggs_utils.gd b/classes/ggs_utils.gd
deleted file mode 100644
index 7e24a078..00000000
--- a/classes/ggs_utils.gd
+++ /dev/null
@@ -1,83 +0,0 @@
-@tool
-extends RefCounted
-class_name ggsUtils
-
-#!1
-static func get_editor_interface():
- return Engine.get_singleton("ggsEI")
-
-
-static func get_resource_file_system():
- return get_editor_interface().get_resource_filesystem()
-
-
-static func get_file_system_dock():
- return get_editor_interface().get_file_system_dock()
-
-
-static func get_plugin_data() -> ggsPluginData:
- return load("res://addons/ggs/plugin_data.tres")
-
-
-static func get_enum_string(target_enum: String) -> String:
- var types: PackedStringArray = [
- "Nil","Bool","Int","Float","String","Vector2","Vector2i","Rect2",
- "Rect2i","Vector3","Vector3i","Transform2D","Vector4","Vector4i","Plane",
- "Quaternion","AABB","Basis","Transform3D","Projection","Color",
- "StringName","NodePath","RID","Object","Callable","Signal","Dictionary",
- "Array","PackedByteArray","PackedInt32Array","PackedInt64Array",
- "PackedFloat32Array","PackedFloat64Array","PackedStringArray",
- "PackedVector2Array","PackedVector3Array","PackedColorArray"
- ]
-
- var property_hints: PackedStringArray = [
- "None","Range","Enum","Enum Suggestion","Exp Easing","Link","Flags",
- "Layers 2D Render","Layers 2D Physics","Layers 2D Navigation",
- "Layers 3D Render","Layers 3D Physics","Layers 3D Navigation",
- "File","Dir","Global File","Global Dir","Resource Type","Multiline Text",
- "Expression","Placeholder Text","Color No Alpha","Object ID","Type String",
- "Node Path To Edited Node","Object Too Big","Node Path Valid Types",
- "Save File","Global Save File","Int is Object ID","Int is Pointer",
- "Array Type","Locale ID","Localizable String","Node Type",
- "Hide Quaternion Edit","Password"
- ]
-
- var enum_string: String
- match target_enum:
- "Variant.Type":
- enum_string = ",".join(types)
- "PropertyHint":
- enum_string = ",".join(property_hints)
-
- return enum_string
-
-
-### Dir Paths
-
-static func path_is_in_dir_settings(path: String) -> bool:
- var dir_settings: String = ggsUtils.get_plugin_data().dir_settings
- return path.begins_with(dir_settings)
-
-
-### Window
-
-static func window_clamp_to_screen(size: Vector2) -> Vector2:
- var screen_size: Rect2i = DisplayServer.screen_get_usable_rect()
- size.x = min(size.x, screen_size.size.x)
- size.y = min(size.y, screen_size.size.y)
-
- return size
-
-
-static func center_window() -> void:
- var screen_id: int = DisplayServer.window_get_current_screen()
- var display_size: Vector2i = DisplayServer.screen_get_size(screen_id)
- var window_size: Vector2i = DisplayServer.window_get_size()
- var origin: Vector2i = DisplayServer.screen_get_position(screen_id)
- var target_pos: Vector2 = origin + (display_size / 2) - (window_size / 2)
- DisplayServer.window_set_position(target_pos)
-
-
-### Comments
-# !1: Specifying return types for the editor interface methods causes
-# issues when the game is exported.
diff --git a/classes/global/ggs.gd b/classes/global/ggs.gd
deleted file mode 100644
index 8e047e03..00000000
--- a/classes/global/ggs.gd
+++ /dev/null
@@ -1,229 +0,0 @@
-@tool
-extends Node
-
-enum Progress {SAVE_FILE_CURRENT, SAVE_FILE_DEFAULT, ADD_SETTINGS}
-enum SFX {MOUSE_OVER, FOCUS, INTERACT}
-
-signal active_category_changed()
-signal active_setting_changed()
-signal dir_settings_change_occured()
-signal progress_started(type: Progress)
-signal progress_advanced(progress: float)
-signal progress_ended()
-
-var active_category: String: set = set_active_category
-var active_setting: ggsSetting: set = set_active_setting
-
-var thread_current: Thread = Thread.new()
-var thread_default: Thread = Thread.new()
-var semaphore_current: Semaphore = Semaphore.new()
-var semaphore_default: Semaphore = Semaphore.new()
-var terminate_current: bool = false
-var terminate_default: bool = false
-var settings_cache: Array[ggsSetting] #?1
-
-var FSD #!1
-
-@onready var MouseOverSFX: AudioStreamPlayer = $MouseOverSFX
-@onready var FocusSFX: AudioStreamPlayer = $FocusSFX
-@onready var InteractSFX: AudioStreamPlayer = $InteractSFX
-
-
-func _ready() -> void:
- thread_current.start(_update_save_file)
-
- if Engine.is_editor_hint():
- FSD = ggsUtils.get_file_system_dock()
- FSD.files_moved.connect(_on_FSD_item_moved)
- FSD.file_removed.connect(_on_FSD_item_removed)
- FSD.folder_moved.connect(_on_FSD_item_moved)
- FSD.folder_removed.connect(_on_FSD_item_removed)
-
- request_update_save_file()
- thread_default.start(_update_save_file_default)
-
- if not Engine.is_editor_hint():
- terminate_current = true
- semaphore_current.post()
- thread_current.wait_to_finish()
- _apply_settings()
-
-
-func _exit_tree() -> void:
- terminate_current = true
- semaphore_current.post()
- thread_current.wait_to_finish()
-
- if Engine.is_editor_hint() and thread_default.is_started():
- terminate_default = true
- semaphore_default.post()
- thread_default.wait_to_finish()
-
-
-func set_active_category(value: String) -> void:
- active_category = value
- active_category_changed.emit()
- active_setting = null
-
-
-func set_active_setting(value: ggsSetting) -> void:
- active_setting = value
- active_setting_changed.emit()
-
-
-func request_update_save_file() -> void:
- semaphore_current.post()
-
-
-func request_update_save_file_default() -> void:
- semaphore_default.post()
-
-
-func _update_save_file() -> void:
- while (true):
- semaphore_current.wait()
-
- call_thread_safe("emit_signal", "progress_started", Progress.SAVE_FILE_CURRENT)
-
- var save_file: ggsSaveFile = ggsSaveFile.new()
- var fresh_save: ConfigFile = ConfigFile.new()
-
- var all_settings: PackedStringArray = get_all_settings()
- var step: float = float(0)
- var total: float = float(all_settings.size())
- var progress: float
- for setting_path in all_settings:
- var setting: ggsSetting = load(setting_path)
-
- if save_file.has_section_key(setting.category, setting.name):
- var value: Variant = save_file.get_value(setting.category, setting.name)
- fresh_save.set_value(setting.category, setting.name, value)
- else:
- fresh_save.set_value(setting.category, setting.name, setting.default)
-
- step += 1
- progress = (step / total) * 100
- call_thread_safe("emit_signal", "progress_advanced", progress)
-
- if not settings_cache.has(setting):
- settings_cache.append(setting)
-
- fresh_save.save(ggsUtils.get_plugin_data().dir_save_file)
- call_thread_safe("emit_signal", "progress_ended")
-
- if terminate_current:
- break
-
-
-func _update_save_file_default() -> void:
- while (true):
- semaphore_default.wait()
-
- call_thread_safe("emit_signal", "progress_started", Progress.SAVE_FILE_DEFAULT)
-
- var save_file: ggsSaveFile = ggsSaveFile.new()
- save_file.clear()
-
- var all_settings: PackedStringArray = get_all_settings()
- var step: float = float(0)
- var total: float = float(all_settings.size())
- var progress: float
- for setting_path in all_settings:
- var setting: ggsSetting = load(setting_path)
- save_file.set_value(setting.category, setting.name, setting.default)
-
- step += 1
- progress = (step / total) * 100
- call_thread_safe("emit_signal", "progress_advanced", progress)
-
- save_file.save(save_file.path)
- call_thread_safe("emit_signal", "progress_ended")
-
- if terminate_default:
- break
-
-
-func _on_FSD_item_moved(old: String, new: String) -> void:
- if ggsUtils.path_is_in_dir_settings(old) or ggsUtils.path_is_in_dir_settings(new):
- dir_settings_change_occured.emit()
-
-
-func _on_FSD_item_removed(item: String) -> void:
- if ggsUtils.path_is_in_dir_settings(item):
- dir_settings_change_occured.emit()
-
-
-### Game Init
-
-func get_all_settings() -> PackedStringArray:
- var all_settings: PackedStringArray
-
- var path: String = ggsUtils.get_plugin_data().dir_settings
- var dir: DirAccess = DirAccess.open(path)
- var categories: PackedStringArray = dir.get_directories()
- for category in categories:
- if category.begins_with("_"):
- continue
-
- dir.change_dir(path.path_join(category))
- var settings: PackedStringArray = _get_settings_in_dir(dir)
- all_settings.append_array(settings)
-
- var groups: PackedStringArray = dir.get_directories()
- for group in groups:
- dir.change_dir(path.path_join(category).path_join(group))
- var subsettings: PackedStringArray = _get_settings_in_dir(dir)
- all_settings.append_array(subsettings)
-
- return all_settings
-
-
-func _get_settings_in_dir(dir: DirAccess) -> PackedStringArray:
- var result: PackedStringArray
-
- var settings: PackedStringArray = dir.get_files()
- for setting in settings:
- if setting.ends_with(".gd"):
- continue
-
- result.append(dir.get_current_dir().path_join(setting))
-
- return result
-
-
-func _apply_settings() -> void:
- var all_settings: PackedStringArray = get_all_settings()
- for setting_path in all_settings:
- var setting: ggsSetting = load(setting_path)
- var value: Variant = ggsSaveFile.new().get_value(setting.category, setting.name)
- setting.apply(value)
-
-
-### SFX
-
-func play_sfx(sfx: SFX) -> void:
- var target_player: AudioStreamPlayer
- match sfx:
- SFX.MOUSE_OVER:
- target_player = MouseOverSFX
- SFX.FOCUS:
- target_player = FocusSFX
- SFX.INTERACT:
- target_player = InteractSFX
- _:
- printerr("GGS - Play SFX: The target SFX does not exist.")
- return
-
- if target_player.stream != null:
- target_player.play()
-
-
-### Comments
-# ?1: The variable `settings_cache` itself is not actually being used in
-# the code. It's there to keep the references to the loaded settings
-# alive.
-# Godot caches loaded resources of the tree under the hood.
-# View `youtube.com/watch?v=3r7IohvVnw8` for more info.
-
-# !1: Specifying return types for the editor interface methods causes
-# issues when the game is exported.
diff --git a/classes/global/ggs.tscn b/classes/global/ggs.tscn
deleted file mode 100644
index 88b3bb85..00000000
--- a/classes/global/ggs.tscn
+++ /dev/null
@@ -1,12 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://esw7j7or7gpd"]
-
-[ext_resource type="Script" path="res://addons/ggs/classes/global/ggs.gd" id="1_6v3cu"]
-
-[node name="GGS" type="Node"]
-script = ExtResource("1_6v3cu")
-
-[node name="MouseOverSFX" type="AudioStreamPlayer" parent="."]
-
-[node name="FocusSFX" type="AudioStreamPlayer" parent="."]
-
-[node name="InteractSFX" type="AudioStreamPlayer" parent="."]
diff --git a/classes/resources/ggs_icon_db.gd b/classes/resources/ggs_icon_db.gd
deleted file mode 100644
index 0d6b3062..00000000
--- a/classes/resources/ggs_icon_db.gd
+++ /dev/null
@@ -1,193 +0,0 @@
-@tool
-extends Resource
-class_name ggsIconDB
-
-var property_map: Dictionary = {
- "mouse_button": [
- "lmb", "rmb", "mmb", "mw_up", "mw_down", "mw_left", "mw_right", "mb1", "mb2"
- ],
-
- "gp_button": [
- "bot", "right", "left", "top",
- "back", "guide", "start",
- "left_stick", "right_stick",
- "left_shoulder", "right_shoulder",
- "dup", "ddown", "dleft", "dright",
- "misc", "pad1", "pad2", "pad3", "pad4",
- "touch"
- ],
-
- "gp_motion": [
- {"-": "ls_left", "+": "ls_right"},
- {"-": "ls_down", "+": "ls_up"},
- {"-": "rs_left", "+": "rs_right"},
- {"-": "rs_down", "+": "rs_up"},
- {"+": "left_trigger"},
- {"+": "right_trigger"},
- ],
-}
-
-
-@export_category("Icon Database")
-@export_group("Mouse", "mouse_")
-@export var mouse_lmb: Texture2D
-@export var mouse_rmb: Texture2D
-@export var mouse_mmb: Texture2D
-@export var mouse_mw_up: Texture2D
-@export var mouse_mw_down: Texture2D
-@export var mouse_mw_left: Texture2D
-@export var mouse_mw_right: Texture2D
-@export var mouse_mb1: Texture2D
-@export var mouse_mb2: Texture2D
-
-@export_group("XBox", "xbox_")
-@export_subgroup("XBox Motions", "xbox_")
-@export var xbox_ls_left: Texture2D
-@export var xbox_ls_right: Texture2D
-@export var xbox_ls_up: Texture2D
-@export var xbox_ls_down: Texture2D
-@export var xbox_rs_left: Texture2D
-@export var xbox_rs_right: Texture2D
-@export var xbox_rs_up: Texture2D
-@export var xbox_rs_down: Texture2D
-@export var xbox_left_trigger: Texture2D
-@export var xbox_right_trigger: Texture2D
-@export_subgroup("XBox Buttons", "xbox_")
-@export var xbox_bot: Texture2D
-@export var xbox_right: Texture2D
-@export var xbox_left: Texture2D
-@export var xbox_top: Texture2D
-@export var xbox_back: Texture2D
-@export var xbox_guide: Texture2D
-@export var xbox_start: Texture2D
-@export var xbox_left_stick: Texture2D
-@export var xbox_right_stick: Texture2D
-@export var xbox_left_shoulder: Texture2D
-@export var xbox_right_shoulder: Texture2D
-@export var xbox_dup: Texture2D
-@export var xbox_ddown: Texture2D
-@export var xbox_dleft: Texture2D
-@export var xbox_dright: Texture2D
-@export var xbox_misc: Texture2D
-@export var xbox_pad1: Texture2D
-@export var xbox_pad2: Texture2D
-@export var xbox_pad3: Texture2D
-@export var xbox_pad4: Texture2D
-@export var xbox_touch: Texture2D
-
-@export_group("Playstation", "ps_")
-@export_subgroup("PS Motions", "ps_")
-@export var ps_ls_left: Texture2D
-@export var ps_ls_right: Texture2D
-@export var ps_ls_up: Texture2D
-@export var ps_ls_down: Texture2D
-@export var ps_rs_left: Texture2D
-@export var ps_rs_right: Texture2D
-@export var ps_rs_up: Texture2D
-@export var ps_rs_down: Texture2D
-@export var ps_left_trigger: Texture2D
-@export var ps_right_trigger: Texture2D
-@export_subgroup("PS Buttons", "ps_")
-@export var ps_bot: Texture2D
-@export var ps_right: Texture2D
-@export var ps_left: Texture2D
-@export var ps_top: Texture2D
-@export var ps_back: Texture2D
-@export var ps_guide: Texture2D
-@export var ps_start: Texture2D
-@export var ps_left_stick: Texture2D
-@export var ps_right_stick: Texture2D
-@export var ps_left_shoulder: Texture2D
-@export var ps_right_shoulder: Texture2D
-@export var ps_dup: Texture2D
-@export var ps_ddown: Texture2D
-@export var ps_dleft: Texture2D
-@export var ps_dright: Texture2D
-@export var ps_misc: Texture2D
-@export var ps_pad1: Texture2D
-@export var ps_pad2: Texture2D
-@export var ps_pad3: Texture2D
-@export var ps_pad4: Texture2D
-@export var ps_touch: Texture2D
-
-@export_group("Switch", "switch_")
-@export_subgroup("Switch Motions", "switch_")
-@export var switch_ls_left: Texture2D
-@export var switch_ls_right: Texture2D
-@export var switch_ls_up: Texture2D
-@export var switch_ls_down: Texture2D
-@export var switch_rs_left: Texture2D
-@export var switch_rs_right: Texture2D
-@export var switch_rs_up: Texture2D
-@export var switch_rs_down: Texture2D
-@export var switch_left_trigger: Texture2D
-@export var switch_right_trigger: Texture2D
-@export_subgroup("Switch Buttons", "switch_")
-@export var switch_bot: Texture2D
-@export var switch_right: Texture2D
-@export var switch_left: Texture2D
-@export var switch_top: Texture2D
-@export var switch_back: Texture2D
-@export var switch_guide: Texture2D
-@export var switch_start: Texture2D
-@export var switch_left_stick: Texture2D
-@export var switch_right_stick: Texture2D
-@export var switch_left_shoulder: Texture2D
-@export var switch_right_shoulder: Texture2D
-@export var switch_dup: Texture2D
-@export var switch_ddown: Texture2D
-@export var switch_dleft: Texture2D
-@export var switch_dright: Texture2D
-@export var switch_misc: Texture2D
-@export var switch_pad1: Texture2D
-@export var switch_pad2: Texture2D
-@export var switch_pad3: Texture2D
-@export var switch_pad4: Texture2D
-@export var switch_touch: Texture2D
-
-@export_group("Other", "other_")
-@export_subgroup("Other Motions", "other_")
-@export var other_ls_left: Texture2D
-@export var other_ls_right: Texture2D
-@export var other_ls_up: Texture2D
-@export var other_ls_down: Texture2D
-@export var other_rs_left: Texture2D
-@export var other_rs_right: Texture2D
-@export var other_rs_up: Texture2D
-@export var other_rs_down: Texture2D
-@export var other_left_trigger: Texture2D
-@export var other_right_trigger: Texture2D
-@export_subgroup("Other Buttons", "other_")
-@export var other_bot: Texture2D
-@export var other_right: Texture2D
-@export var other_left: Texture2D
-@export var other_top: Texture2D
-@export var other_back: Texture2D
-@export var other_guide: Texture2D
-@export var other_start: Texture2D
-@export var other_left_stick: Texture2D
-@export var other_right_stick: Texture2D
-@export var other_left_shoulder: Texture2D
-@export var other_right_shoulder: Texture2D
-@export var other_dup: Texture2D
-@export var other_ddown: Texture2D
-@export var other_dleft: Texture2D
-@export var other_dright: Texture2D
-@export var other_misc: Texture2D
-@export var other_pad1: Texture2D
-@export var other_pad2: Texture2D
-@export var other_pad3: Texture2D
-@export var other_pad4: Texture2D
-@export var other_touch: Texture2D
-
-
-func get_mouse_button_texture(button_index: int) -> Texture2D:
- return get("mouse_%s"%property_map["mouse_button"][button_index - 1])
-
-
-func get_gp_button_texture(category: String, button_index: int) -> Texture2D:
- return get("%s_%s"%[category, property_map["gp_button"][button_index]])
-
-
-func get_gp_motion_texture(category: String, axis: int, axis_dir: String) -> Texture2D:
- return get("%s_%s"%[category, property_map["gp_motion"][axis][axis_dir]])
diff --git a/classes/resources/ggs_plugin_data.gd b/classes/resources/ggs_plugin_data.gd
deleted file mode 100644
index 692e485a..00000000
--- a/classes/resources/ggs_plugin_data.gd
+++ /dev/null
@@ -1,75 +0,0 @@
-@tool
-extends Resource
-class_name ggsPluginData
-
-const APPLY_ON_CHANGED_ALL_DEFAULT: bool = true
-const GRAB_FOCUS_ON_MOUSE_OVER_ALL: bool = true
-const DIR_SETTINGS_DEFAULT: String = "res://game_settings/settings"
-const DIR_TEMPLATES_DEFAULT: String = "res://game_settings/templates"
-const DIR_COMPONENTS_DEFAULT: String = "res://game_settings/components"
-const DIR_SAVE_FILE_DEFAULT: String = "user://settings.cfg"
-const SPLIT_OFFSET_0_DEFAULT: int = -315
-const SPLIT_OFFSET_1_DEFAULT: int = 615
-
-@export_category("GGS Plugin Data")
-@export var recent_settings: Array[String]
-@export var apply_on_changed_all: bool = APPLY_ON_CHANGED_ALL_DEFAULT
-@export var grab_focus_on_mouse_over_all: bool = GRAB_FOCUS_ON_MOUSE_OVER_ALL
-@export_group("Directories", "dir_")
-@export_dir var dir_settings: String = DIR_SETTINGS_DEFAULT
-@export_dir var dir_templates: String = DIR_TEMPLATES_DEFAULT
-@export_dir var dir_components: String = DIR_COMPONENTS_DEFAULT
-@export var dir_save_file: String = DIR_SAVE_FILE_DEFAULT
-@export_group("Split Offset", "split_offset_")
-@export var split_offset_0: int = SPLIT_OFFSET_0_DEFAULT
-@export var split_offset_1: int = SPLIT_OFFSET_1_DEFAULT
-
-
-func set_property(property: String, value: Variant) -> void:
- set(property, value)
- save()
-
-
-func save() -> void:
- ResourceSaver.save(self)
-
-
-func reset() -> void:
- recent_settings.clear()
- apply_on_changed_all = APPLY_ON_CHANGED_ALL_DEFAULT
- grab_focus_on_mouse_over_all = GRAB_FOCUS_ON_MOUSE_OVER_ALL
- dir_settings = DIR_SETTINGS_DEFAULT
- dir_templates = DIR_TEMPLATES_DEFAULT
- dir_components = DIR_COMPONENTS_DEFAULT
- dir_save_file = DIR_SAVE_FILE_DEFAULT
- split_offset_0 = SPLIT_OFFSET_0_DEFAULT
- split_offset_1 = SPLIT_OFFSET_1_DEFAULT
-
- save()
-
-
-### Recent Settings
-
-func add_recent_setting(setting: String) -> void:
- if recent_settings.has(setting):
- _bring_to_front(setting)
- else:
- recent_settings.push_front(setting)
-
- _limit_size()
- save()
-
-
-func _bring_to_front(element: String) -> void:
- recent_settings.erase(element)
- recent_settings.push_front(element)
-
-
-func _limit_size() -> void:
- if recent_settings.size() > 10:
- recent_settings.pop_back()
-
-
-func clear_recent_settings() -> void:
- recent_settings.clear()
- save()
diff --git a/classes/resources/ggs_setting.gd b/classes/resources/ggs_setting.gd
deleted file mode 100644
index 23db642c..00000000
--- a/classes/resources/ggs_setting.gd
+++ /dev/null
@@ -1,98 +0,0 @@
-@tool
-extends Resource
-class_name ggsSetting
-
-var current: Variant: set = set_current, get = get_current
-var default: Variant
-var value_type: Variant.Type
-var value_hint: PropertyHint
-var value_hint_string: String
-var name: String: get = get_name
-var category: String: get = get_category
-var read_only_values: bool = false
-
-
-func _get_property_list() -> Array:
- var read_only: PropertyUsageFlags = PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_READ_ONLY
- var current_default_usage: PropertyUsageFlags = read_only if read_only_values else PROPERTY_USAGE_DEFAULT
- var enum_string_types: String = ggsUtils.get_enum_string("Variant.Type")
- var enum_string_property_hints: String = ggsUtils.get_enum_string("PropertyHint")
-
- var properties: Array
- properties.append_array([
- {"name": "Game Setting", "type": TYPE_NIL, "usage": PROPERTY_USAGE_CATEGORY},
- {"name": "current", "type": value_type, "usage": current_default_usage, "hint": value_hint, "hint_string": value_hint_string},
- {"name": "default", "type": value_type, "usage": current_default_usage, "hint": value_hint, "hint_string": value_hint_string},
- {"name": "Internal", "type": TYPE_NIL, "usage": PROPERTY_USAGE_GROUP},
- {"name": "name", "type": TYPE_STRING, "usage": read_only},
- {"name": "category", "type": TYPE_STRING, "usage": read_only},
- {"name": "value_type", "type": TYPE_INT, "usage": PROPERTY_USAGE_DEFAULT, "hint": PROPERTY_HINT_ENUM, "hint_string": enum_string_types},
- {"name": "value_hint", "type": TYPE_INT, "usage": PROPERTY_USAGE_DEFAULT, "hint": PROPERTY_HINT_ENUM, "hint_string": enum_string_property_hints},
- {"name": "value_hint_string", "type": TYPE_STRING, "usage": PROPERTY_USAGE_DEFAULT},
- ])
-
- return properties
-
-
-func _get(property: StringName) -> Variant:
- if property == "resource_name":
- resource_name = name
- return resource_name
-
- return null
-
-
-func set_current(value: Variant) -> void:
- current = value
-
- if not category.is_empty() or not name.is_empty():
- ggsSaveFile.new().set_key(category, name, value)
-
-
-func get_current() -> Variant:
- var save_file: ggsSaveFile = ggsSaveFile.new()
- if save_file.has_section_key(category, name):
- return save_file.get_value(category, name)
- else:
- return default
-
-
-func get_name() -> String:
- var path_dict: Dictionary = _get_path_dict()
- var group: String = ""
-
- if path_dict["group"].is_empty():
- return path_dict["name"]
- else:
- return "%s_%s"%[path_dict["group"], path_dict["name"]]
-
-
-func get_category() -> String:
- return _get_path_dict()["category"]
-
-
-func _get_path_dict() -> Dictionary:
- var result: Dictionary = {
- "category": "",
- "group": "",
- "name": "",
- }
-
- if not ggsUtils.path_is_in_dir_settings(resource_path):
- return result
-
- var dir_settings: String = ggsUtils.get_plugin_data().dir_settings
- var base_path: String = resource_path.trim_prefix(dir_settings)
- var path_components: PackedStringArray = base_path.split("/", false)
-
- if path_components.size() < 2 or path_components.size() > 3:
- return result
-
- result["category"] = path_components[0]
- if path_components.size() == 3:
- result["group"] = path_components[1]
- result["name"] = path_components[2].get_basename()
- else:
- result["name"] = path_components[1].get_basename()
-
- return result
diff --git a/_premade/components/_misc_components/apply_btn/apply_btn.gd b/components/apply_btn/component_apply_btn.gd
similarity index 52%
rename from _premade/components/_misc_components/apply_btn/apply_btn.gd
rename to components/apply_btn/component_apply_btn.gd
index d3cf764d..ca42347c 100644
--- a/_premade/components/_misc_components/apply_btn/apply_btn.gd
+++ b/components/apply_btn/component_apply_btn.gd
@@ -1,6 +1,12 @@
+@icon("res://addons/ggs/plugin/assets/apply_btn.svg")
extends Button
+## Node group associated with the button. When pressed, the button calls
+## [method ggsComponent.apply_setting] on all nodes in this node group.
@export var group: String
+
+## If true, the main control(s) of the component will grab focus when
+## mouse enters it.
@export var grab_focus_on_mouse_over: bool
@@ -12,15 +18,15 @@ func _ready() -> void:
func _on_pressed() -> void:
get_tree().call_group(group, "apply_setting")
- GGS.play_sfx(GGS.SFX.INTERACT)
+ GGS.Audio.Interact.play()
func _on_mouse_entered() -> void:
- GGS.play_sfx(GGS.SFX.MOUSE_OVER)
+ GGS.Audio.MouseEntered.play()
if grab_focus_on_mouse_over:
grab_focus()
func _on_focus_entered() -> void:
- GGS.play_sfx(GGS.SFX.FOCUS)
+ GGS.Audio.FocusEntered.play()
diff --git a/components/apply_btn/component_apply_btn.tscn b/components/apply_btn/component_apply_btn.tscn
new file mode 100644
index 00000000..bcab3caf
--- /dev/null
+++ b/components/apply_btn/component_apply_btn.tscn
@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=3 uid="uid://cww37aayk8gj6"]
+
+[ext_resource type="Script" path="res://addons/ggs/components/apply_btn/component_apply_btn.gd" id="1_dk1tm"]
+
+[node name="ApplyBtn" type="Button"]
+anchors_preset = 15
+anchor_right = 1.0
+anchor_bottom = 1.0
+grow_horizontal = 2
+grow_vertical = 2
+script = ExtResource("1_dk1tm")
diff --git a/components/arrow_list/component_arrow_list.gd b/components/arrow_list/component_arrow_list.gd
new file mode 100644
index 00000000..3e89f9f6
--- /dev/null
+++ b/components/arrow_list/component_arrow_list.gd
@@ -0,0 +1,103 @@
+@tool
+@icon("res://addons/ggs/plugin/assets/arrow_list.svg")
+extends ggsComponent
+
+signal option_selected(option_index: int)
+
+## Options of the list. Note that the option index or id is saved, not its
+## string label.
+@export var options: PackedStringArray
+
+## If not empty, IDs in this list are used instead of indices when saving
+## option list items. This array must be the same size as [member options].
+@export var option_ids: PackedInt32Array
+
+@onready var _LeftBtn: Button = $HBox/LeftBtn
+@onready var _OptionLabel: Label = $HBox/OptionLabel
+@onready var _RightBtn: Button = $HBox/RightBtn
+
+
+func _ready() -> void:
+ compatible_types = [TYPE_BOOL, TYPE_INT]
+ if Engine.is_editor_hint():
+ return
+
+ if (
+ not option_ids.is_empty()
+ and option_ids.size() != options.size()
+ ):
+ printerr("GGS - Option List (%s): `option_ids` and `options` are not the same size."%name)
+ return
+
+ _init_value()
+ option_selected.connect(_on_option_selected)
+ _LeftBtn.pressed.connect(_on_LeftBtn_pressed)
+ _RightBtn.pressed.connect(_on_RightBtn_pressed)
+
+ _LeftBtn.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(_LeftBtn))
+ _RightBtn.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(_RightBtn))
+ _LeftBtn.focus_entered.connect(_on_AnyBtn_focus_entered)
+ _RightBtn.focus_entered.connect(_on_AnyBtn_focus_entered)
+
+
+func reset_setting() -> void:
+ _select(setting.default)
+ apply_setting()
+
+
+func _init_value() -> void:
+ value = GGS.get_value(setting)
+
+ if not option_ids.is_empty():
+ var option_idx: int = option_ids.find(value)
+ _select(option_idx, false)
+ else:
+ _select(value, false)
+
+
+func _select(index: int, emit_selected: bool = true) -> void:
+ index = index % options.size()
+
+ _OptionLabel.text = options[index]
+
+ if not option_ids.is_empty():
+ value = option_ids[index]
+ else:
+ value = index
+
+ if emit_selected:
+ option_selected.emit(index)
+
+
+func _on_option_selected(_option_index: int) -> void:
+ if apply_on_changed:
+ apply_setting()
+
+
+func _on_LeftBtn_pressed() -> void:
+ if option_ids.is_empty():
+ _select(value - 1)
+ else:
+ _select(option_ids.find(value) - 1)
+
+ GGS.Audio.Interact.play()
+
+
+func _on_RightBtn_pressed() -> void:
+ if option_ids.is_empty():
+ _select(value + 1)
+ else:
+ _select(option_ids.find(value) + 1)
+
+ GGS.Audio.Interact.play()
+
+
+func _on_AnyBtn_mouse_entered(Btn: Button) -> void:
+ GGS.Audio.MouseEntered.play()
+
+ if grab_focus_on_mouse_over:
+ Btn.grab_focus()
+
+
+func _on_AnyBtn_focus_entered() -> void:
+ GGS.Audio.FocusEntered.play()
diff --git a/_premade/components/arrow_list/arrow_list.tscn b/components/arrow_list/component_arrow_list.tscn
similarity index 82%
rename from _premade/components/arrow_list/arrow_list.tscn
rename to components/arrow_list/component_arrow_list.tscn
index 70391680..e68e61b7 100644
--- a/_premade/components/arrow_list/arrow_list.tscn
+++ b/components/arrow_list/component_arrow_list.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://1qpe22ky2s6y"]
-[ext_resource type="Script" path="res://game_settings/components/arrow_list/arrow_list.gd" id="1_cifu3"]
+[ext_resource type="Script" path="res://addons/ggs/components/arrow_list/component_arrow_list.gd" id="1_cifu3"]
[node name="ArrowList" type="MarginContainer"]
offset_left = 143.0
diff --git a/components/checkbox/component_checkbox.gd b/components/checkbox/component_checkbox.gd
new file mode 100644
index 00000000..2ce56ba6
--- /dev/null
+++ b/components/checkbox/component_checkbox.gd
@@ -0,0 +1,45 @@
+@tool
+@icon("res://addons/ggs/plugin/assets/checkbox.svg")
+extends ggsComponent
+
+@onready var _Btn: Button = $Btn
+
+
+func _ready() -> void:
+ compatible_types = [TYPE_BOOL]
+ if Engine.is_editor_hint():
+ return
+
+ init_value()
+ _Btn.toggled.connect(_on_Btn_toggled)
+ _Btn.mouse_entered.connect(_on_Btn_mouse_entered)
+ _Btn.focus_entered.connect(_on_Btn_focus_entered)
+
+
+func init_value() -> void:
+ value = GGS.get_value(setting)
+ _Btn.set_pressed_no_signal(value)
+
+
+func reset_setting() -> void:
+ super()
+ _Btn.set_pressed_no_signal(value)
+
+
+func _on_Btn_toggled(btn_state: bool) -> void:
+ value = btn_state
+ GGS.Audio.Interact.play()
+
+ if apply_on_changed:
+ apply_setting()
+
+
+func _on_Btn_mouse_entered() -> void:
+ GGS.Audio.MouseEntered.play()
+
+ if grab_focus_on_mouse_over:
+ _Btn.grab_focus()
+
+
+func _on_Btn_focus_entered() -> void:
+ GGS.Audio.FocusEntered.play()
diff --git a/_premade/components/checkbox/checkbox.tscn b/components/checkbox/component_checkbox.tscn
similarity index 58%
rename from _premade/components/checkbox/checkbox.tscn
rename to components/checkbox/component_checkbox.tscn
index fb2ba938..1666c331 100644
--- a/_premade/components/checkbox/checkbox.tscn
+++ b/components/checkbox/component_checkbox.tscn
@@ -1,11 +1,11 @@
[gd_scene load_steps=2 format=3 uid="uid://bhkyf3l4ee800"]
-[ext_resource type="Script" path="res://game_settings/components/_shared_scripts/binary_selection.gd" id="1_8vlbr"]
+[ext_resource type="Script" path="res://addons/ggs/components/checkbox/component_checkbox.gd" id="1_wjrcm"]
[node name="Checkbox" type="MarginContainer"]
offset_right = 40.0
offset_bottom = 40.0
-script = ExtResource("1_8vlbr")
+script = ExtResource("1_wjrcm")
[node name="Btn" type="CheckBox" parent="."]
layout_mode = 2
diff --git a/components/input_btn/component_input_btn.gd b/components/input_btn/component_input_btn.gd
new file mode 100644
index 00000000..b456a954
--- /dev/null
+++ b/components/input_btn/component_input_btn.gd
@@ -0,0 +1,226 @@
+@tool
+@icon("res://addons/ggs/plugin/assets/input.svg")
+extends ggsComponent
+
+enum State {NORMAL, LISTENING}
+enum AcceptedTypes {
+ KEYBOARD = 1 << 0,
+ MOUSE = 1 << 1,
+ JOYPAD_BUTTON = 1 << 2,
+ JOYPAD_AXIS = 1 << 3,
+}
+
+const TEXT_ANIM: PackedStringArray = [".", "..", "...", "."]
+
+## Types of input this component listens to.
+@export_flags("Keyboard", "Mouse", "Joypad Button", "Joypad Axis")
+var _accepted_types: int = 1
+
+## Whether modifiers such as shift or ctrl should be accepted. Only relevant
+## for keyboard and mouse events.
+@export var _accept_modifiers: bool
+
+@export_group("Icon")
+## Whether the component should show use glyphs to show mouse and joypad
+## events. Uses a glyph database.
+@export var _use_glyph: bool
+
+## The glyph database used to display inputs.
+@export var _glyph: ggsGlyphDB
+
+var _input_helper: ggsInputHelper = ggsInputHelper.new()
+var _state: State = State.NORMAL: set = _set_state
+var _new_event: InputEvent
+var _tween: Tween
+var _anim_frame: int: set = _set_anim_frame
+
+@onready var _Btn: Button = $Btn
+@onready var _ListenTime: Timer = $ListenTime
+@onready var _AcceptDelay: Timer = $AcceptDelay
+
+
+func _ready() -> void:
+ compatible_types = [TYPE_ARRAY]
+ if Engine.is_editor_hint():
+ return
+
+ _Btn.toggled.connect(_on_Btn_toggled)
+ _Btn.mouse_entered.connect(_on_Btn_mouse_entered)
+ _Btn.focus_entered.connect(_on_Btn_focus_entered)
+
+ _ListenTime.timeout.connect(_on_ListenTime_timeout)
+ _AcceptDelay.timeout.connect(_on_AcceptDelay_timeout)
+
+ Input.joy_connection_changed.connect(_on_Input_joy_connection_changed)
+
+ init_value()
+ _ListenTime.wait_time = GGS.listen_time
+ _AcceptDelay.wait_time = GGS.accept_delay
+
+
+func _input(event: InputEvent) -> void:
+ if _state != State.LISTENING:
+ return
+
+ if not _event_is_acceptable(event):
+ return
+
+ _new_event = event
+ accept_event()
+ _AcceptDelay.start()
+
+
+func _set_state(value: State) -> void:
+ _state = value
+
+ match value:
+ State.NORMAL:
+ _Btn.set_pressed_no_signal(false)
+ _tween.kill()
+ _update_btn_display()
+ State.LISTENING:
+ _Btn.icon = null
+ _tween = create_tween()
+ _tween.bind_node(self)
+ _tween.set_loops()
+ _tween.tween_property(
+ self,
+ "_anim_frame",
+ TEXT_ANIM.size() - 1,
+ GGS.anim_speed
+ ).from(0)
+
+
+func _set_anim_frame(value: int) -> void:
+ _anim_frame = value
+ _Btn.text = TEXT_ANIM[value]
+
+
+func init_value() -> void:
+ value = GGS.get_value(setting)
+ _update_btn_display()
+
+
+func reset_setting() -> void:
+ super()
+ _update_btn_display()
+
+
+func _event_is_acceptable(event: InputEvent) -> bool:
+ if (
+ event is not InputEventKey
+ and event is not InputEventMouseButton
+ and event is not InputEventJoypadButton
+ and event is not InputEventJoypadMotion
+ ):
+ return false
+
+ if not event.is_pressed():
+ return false
+
+ if event.is_echo():
+ return false
+
+ if (
+ event is InputEventMouse
+ and event.double_click
+ ):
+ return false
+
+ if (
+ event is InputEventWithModifiers
+ and not _accept_modifiers
+ and (event.shift_pressed or event.ctrl_pressed or event.alt_pressed)
+ ):
+ return false
+
+ if (
+ event is InputEventKey
+ and not (_accepted_types & AcceptedTypes.KEYBOARD)
+ ):
+ return false
+
+ if (
+ event is InputEventMouseButton
+ and not (_accepted_types & AcceptedTypes.MOUSE)
+ ):
+ return false
+
+ if (
+ event is InputEventJoypadButton
+ and not (_accepted_types & AcceptedTypes.JOYPAD_BUTTON)
+ ):
+ return false
+
+ if (
+ event is InputEventJoypadMotion
+ and not (_accepted_types & AcceptedTypes.JOYPAD_AXIS)
+ ):
+ return false
+
+ return true
+
+
+
+func _accepted_type_has_glyph() -> bool:
+ return (
+ _accepted_types & AcceptedTypes.MOUSE
+ or _accepted_types & AcceptedTypes.JOYPAD_BUTTON
+ or _accepted_types & AcceptedTypes.JOYPAD_AXIS
+ )
+
+
+func _update_btn_display() -> void:
+ var event: InputEvent = _input_helper.deserialize_event(value)
+
+ if (
+ _use_glyph
+ and _accepted_type_has_glyph()
+ ):
+ _Btn.icon = _input_helper.event_get_glyph(event, _glyph)
+ if _Btn.icon == null:
+ _Btn.text = _input_helper.event_get_text(event)
+ else:
+ _Btn.text = ""
+
+ return
+
+ _Btn.icon = null
+ _Btn.text = _input_helper.event_get_text(event)
+
+
+func _on_Btn_toggled(toggled_on: bool) -> void:
+ if toggled_on:
+ GGS.Audio.Interact.play()
+ _state = State.LISTENING
+ _ListenTime.start()
+
+
+func _on_ListenTime_timeout() -> void:
+ _state = State.NORMAL
+
+
+func _on_AcceptDelay_timeout() -> void:
+ _state = State.NORMAL
+
+ value = _input_helper.serialize_event(_new_event)
+ if apply_on_changed:
+ apply_setting()
+
+ _new_event = null
+ _update_btn_display()
+ GGS.Audio.InputAccepted.play()
+
+
+func _on_Btn_mouse_entered() -> void:
+ GGS.Audio.MouseEntered.play()
+ if grab_focus_on_mouse_over:
+ _Btn.grab_focus()
+
+
+func _on_Btn_focus_entered() -> void:
+ GGS.Audio.FocusEntered.play()
+
+
+func _on_Input_joy_connection_changed(_device: int, _connected: bool) -> void:
+ _update_btn_display()
diff --git a/_premade/components/input_btn/input_btn.tscn b/components/input_btn/component_input_btn.tscn
similarity index 55%
rename from _premade/components/input_btn/input_btn.tscn
rename to components/input_btn/component_input_btn.tscn
index 1f52cf86..26fa377c 100644
--- a/_premade/components/input_btn/input_btn.tscn
+++ b/components/input_btn/component_input_btn.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://dm1av7skxvp1j"]
-[ext_resource type="Script" path="res://game_settings/components/input_btn/input_btn.gd" id="1_roqsf"]
+[ext_resource type="Script" path="res://addons/ggs/components/input_btn/component_input_btn.gd" id="1_crgnj"]
[node name="InputBtn" type="MarginContainer"]
anchors_preset = 15
@@ -8,11 +8,18 @@ anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
-script = ExtResource("1_roqsf")
+script = ExtResource("1_crgnj")
[node name="Btn" type="Button" parent="."]
custom_minimum_size = Vector2(100, 0)
layout_mode = 2
+toggle_mode = true
text_overrun_behavior = 3
clip_text = true
icon_alignment = 1
+
+[node name="ListenTime" type="Timer" parent="."]
+one_shot = true
+
+[node name="AcceptDelay" type="Timer" parent="."]
+one_shot = true
diff --git a/components/option_list/component_option_list.gd b/components/option_list/component_option_list.gd
new file mode 100644
index 00000000..b6a54b23
--- /dev/null
+++ b/components/option_list/component_option_list.gd
@@ -0,0 +1,67 @@
+@tool
+@icon("res://addons/ggs/plugin/assets/option_list.svg")
+extends ggsComponent
+
+## If true, the component will use the item IDs instead of their index as
+## the setting value.
+@export var _use_ids: bool = false
+
+@onready var _Btn: OptionButton = $Btn
+
+
+func _ready() -> void:
+ compatible_types = [TYPE_BOOL, TYPE_INT]
+ if Engine.is_editor_hint():
+ return
+
+ init_value()
+ _Btn.item_selected.connect(_on_Btn_item_selected)
+
+ _Btn.pressed.connect(_on_Btn_pressed)
+ _Btn.mouse_entered.connect(_on_Btn_mouse_entered)
+ _Btn.focus_entered.connect(_on_Btn_focus_entered)
+ _Btn.item_focused.connect(_on_Btn_item_focused)
+
+
+func init_value() -> void:
+ value = GGS.get_value(setting)
+
+ if _use_ids:
+ _Btn.select(_Btn.get_item_index(value))
+ else:
+ _Btn.select(value)
+
+
+func reset_setting() -> void:
+ super()
+ _Btn.select(value)
+
+
+func _on_Btn_item_selected(item_index: int) -> void:
+ GGS.Audio.Interact.play()
+
+ if _use_ids:
+ value = _Btn.get_item_id(item_index)
+ else:
+ value = item_index
+ if apply_on_changed:
+ apply_setting()
+
+
+func _on_Btn_pressed() -> void:
+ GGS.Audio.FocusEntered.play()
+
+
+func _on_Btn_mouse_entered() -> void:
+ GGS.Audio.MouseEntered.play()
+
+ if grab_focus_on_mouse_over:
+ _Btn.grab_focus()
+
+
+func _on_Btn_focus_entered() -> void:
+ GGS.Audio.FocusEntered.play()
+
+
+func _on_Btn_item_focused(_index: int) -> void:
+ GGS.Audio.FocusEntered.play()
diff --git a/_premade/components/option_list/option_list.tscn b/components/option_list/component_option_list.tscn
similarity index 68%
rename from _premade/components/option_list/option_list.tscn
rename to components/option_list/component_option_list.tscn
index 7bf0c1a3..be26a7a9 100644
--- a/_premade/components/option_list/option_list.tscn
+++ b/components/option_list/component_option_list.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://b7m6l0lvojrsj"]
-[ext_resource type="Script" path="res://game_settings/components/option_list/option_list.gd" id="1_5yk06"]
+[ext_resource type="Script" path="res://addons/ggs/components/option_list/component_option_list.gd" id="1_5yk06"]
[node name="OptionList" type="MarginContainer"]
offset_right = 40.0
diff --git a/components/radio_list/component_radio_list.gd b/components/radio_list/component_radio_list.gd
new file mode 100644
index 00000000..9319d118
--- /dev/null
+++ b/components/radio_list/component_radio_list.gd
@@ -0,0 +1,91 @@
+@tool
+@icon("res://addons/ggs/plugin/assets/radio_list.svg")
+extends ggsComponent
+
+enum Lists {HLIST, VLIST}
+
+## If not empty, IDs in this list are used instead of indices when saving
+## list items. This array must be the same size as the number of children
+## in the active list.
+@export var option_ids: PackedInt32Array
+
+## The children of the active list will be used as the list items.
+@export var active_list: Lists = Lists.HLIST
+
+var _ActiveList: BoxContainer
+
+@onready var _HList: HBoxContainer = $HList
+@onready var _VList: VBoxContainer = $VList
+@onready var _btngrp: ButtonGroup = ButtonGroup.new()
+
+
+func _ready() -> void:
+ compatible_types = [TYPE_BOOL, TYPE_INT]
+ if Engine.is_editor_hint():
+ return
+
+ if active_list == Lists.HLIST:
+ _ActiveList = _HList
+ else:
+ _ActiveList = _VList
+
+ init_value()
+ _btngrp.pressed.connect(_on_BtnGroup_pressed)
+
+ for child: Button in _ActiveList.get_children():
+ child.button_group = _btngrp
+
+ child.mouse_entered.connect(_on_AnyBtn_mouse_entered.bind(child))
+ child.focus_entered.connect(_on_AnyBtn_focus_entered)
+
+
+func init_value() -> void:
+ value = GGS.get_value(setting)
+ if not option_ids.is_empty():
+ _set_button_pressed(option_ids.find(value), true)
+ else:
+ _set_button_pressed(value, true)
+
+
+func reset_setting() -> void:
+ super()
+ _set_button_pressed(value, true)
+
+
+func _set_button_pressed(btn_index: int, pressed: bool) -> void:
+ _ActiveList.get_child(btn_index).set_pressed_no_signal(pressed)
+
+
+func _get_child_index(target_child: BaseButton) -> int:
+ var i: int = 0
+ for child: Button in _ActiveList.get_children():
+ if child == target_child:
+ return i
+
+ i += 1
+
+ return -1
+
+
+func _on_BtnGroup_pressed(button: BaseButton) -> void:
+ GGS.Audio.Interact.play()
+
+ var child_index: int = _get_child_index(button)
+ if not option_ids.is_empty():
+ value = option_ids[child_index]
+ else:
+ value = child_index
+
+ if apply_on_changed:
+ apply_setting()
+
+
+func _on_AnyBtn_mouse_entered(Btn: Button) -> void:
+ GGS.Audio.MouseEntered.play()
+
+ if grab_focus_on_mouse_over:
+ Btn.grab_focus()
+
+
+func _on_AnyBtn_focus_entered() -> void:
+ GGS.Audio.FocusEntered.play()
diff --git a/_premade/components/radio_list/radio_list.tscn b/components/radio_list/component_radio_list.tscn
similarity index 74%
rename from _premade/components/radio_list/radio_list.tscn
rename to components/radio_list/component_radio_list.tscn
index 2e446b6f..a98c996a 100644
--- a/_premade/components/radio_list/radio_list.tscn
+++ b/components/radio_list/component_radio_list.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://c11tbsolk6dnu"]
-[ext_resource type="Script" path="res://game_settings/components/radio_list/radio_list.gd" id="1_47eay"]
+[ext_resource type="Script" path="res://addons/ggs/components/radio_list/component_radio_list.gd" id="1_47eay"]
[node name="RadioList" type="MarginContainer"]
offset_bottom = 648.0
diff --git a/_premade/components/_misc_components/reset_btn/reset_btn.gd b/components/reset_btn/component_reset_btn.gd
similarity index 52%
rename from _premade/components/_misc_components/reset_btn/reset_btn.gd
rename to components/reset_btn/component_reset_btn.gd
index 563c6d48..5a5f81fd 100644
--- a/_premade/components/_misc_components/reset_btn/reset_btn.gd
+++ b/components/reset_btn/component_reset_btn.gd
@@ -1,6 +1,12 @@
+@icon("res://addons/ggs/plugin/assets/reset_btn.svg")
extends Button
+## Node group associated with the button. When pressed, the button calls
+## [method ggsComponent.reset_setting] on all nodes in this node group.
@export var group: String
+
+## If true, the main control(s) of the component will grab focus when
+## mouse enters it.
@export var grab_focus_on_mouse_over: bool
@@ -12,15 +18,15 @@ func _ready() -> void:
func _on_pressed() -> void:
get_tree().call_group(group, "reset_setting")
- GGS.play_sfx(GGS.SFX.INTERACT)
+ GGS.Audio.Interact.play()
func _on_mouse_entered() -> void:
- GGS.play_sfx(GGS.SFX.MOUSE_OVER)
+ GGS.Audio.MouseEntered.play()
if grab_focus_on_mouse_over:
grab_focus()
func _on_focus_entered() -> void:
- GGS.play_sfx(GGS.SFX.FOCUS)
+ GGS.Audio.FocusEntered.play()
diff --git a/_premade/components/_misc_components/reset_btn/reset_btn.tscn b/components/reset_btn/component_reset_btn.tscn
similarity index 62%
rename from _premade/components/_misc_components/reset_btn/reset_btn.tscn
rename to components/reset_btn/component_reset_btn.tscn
index 77db991a..c214bddf 100644
--- a/_premade/components/_misc_components/reset_btn/reset_btn.tscn
+++ b/components/reset_btn/component_reset_btn.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3]
-[ext_resource type="Script" path="res://game_settings/components/_misc_components/reset_btn/reset_btn.gd" id="1_pchyd"]
+[ext_resource type="Script" path="res://addons/ggs/components/reset_btn/component_reset_btn.gd" id="1_pchyd"]
[node name="ResetBtn" type="Button"]
anchors_preset = 15
diff --git a/components/slider/component_slider.gd b/components/slider/component_slider.gd
new file mode 100644
index 00000000..da10ae5a
--- /dev/null
+++ b/components/slider/component_slider.gd
@@ -0,0 +1,44 @@
+@tool
+@icon("res://addons/ggs/plugin/assets/slider.svg")
+extends ggsComponent
+
+@onready var _Slider: HSlider = $Slider
+
+
+func _ready() -> void:
+ compatible_types = [TYPE_INT, TYPE_FLOAT]
+ if Engine.is_editor_hint():
+ return
+
+ init_value()
+ _Slider.value_changed.connect(_on_Slider_value_changed)
+ _Slider.mouse_entered.connect(_on_Slider_mouse_entered)
+ _Slider.focus_entered.connect(_on_Slider_focus_entered)
+
+
+func init_value() -> void:
+ value = GGS.get_value(setting)
+ _Slider.set_value_no_signal(value)
+
+
+func reset_setting() -> void:
+ super()
+ _Slider.value = value
+
+
+func _on_Slider_value_changed(new_value: float) -> void:
+ value = new_value
+
+ if apply_on_changed:
+ apply_setting()
+
+
+func _on_Slider_mouse_entered() -> void:
+ GGS.Audio.MouseEntered.play()
+
+ if grab_focus_on_mouse_over:
+ _Slider.grab_focus()
+
+
+func _on_Slider_focus_entered() -> void:
+ GGS.Audio.FocusEntered.play()
diff --git a/_premade/components/slider/slider.tscn b/components/slider/component_slider.tscn
similarity index 76%
rename from _premade/components/slider/slider.tscn
rename to components/slider/component_slider.tscn
index 205870fc..a052b9e6 100644
--- a/_premade/components/slider/slider.tscn
+++ b/components/slider/component_slider.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://ds06mwhee8ygm"]
-[ext_resource type="Script" path="res://game_settings/components/slider/slider.gd" id="1_4rmgf"]
+[ext_resource type="Script" path="res://addons/ggs/components/slider/component_slider.gd" id="1_4rmgf"]
[node name="Slider" type="MarginContainer"]
offset_right = 40.0
diff --git a/components/spinbox/component_spinbox.gd b/components/spinbox/component_spinbox.gd
new file mode 100644
index 00000000..db8eee4c
--- /dev/null
+++ b/components/spinbox/component_spinbox.gd
@@ -0,0 +1,36 @@
+@tool
+@icon("res://addons/ggs/plugin/assets/spinbox.svg")
+extends ggsComponent
+
+@onready var _SpinBox: SpinBox = $SpinBox
+@onready var _Field: LineEdit = _SpinBox.get_line_edit()
+
+
+func _ready() -> void:
+ compatible_types = [TYPE_INT, TYPE_FLOAT]
+ if Engine.is_editor_hint():
+ return
+
+ init_value()
+ _SpinBox.value_changed.connect(_on_SpinBox_value_changed)
+ _Field.context_menu_enabled = false
+
+
+func init_value() -> void:
+ value = GGS.get_value(setting)
+ _SpinBox.set_value_no_signal(value)
+ _Field.text = str(value)
+
+
+func reset_setting() -> void:
+ super()
+ _SpinBox.value = value
+ _Field.text = str(value)
+
+
+func _on_SpinBox_value_changed(new_value: float) -> void:
+ value = new_value
+ GGS.Audio.Interact.play()
+
+ if apply_on_changed:
+ apply_setting()
diff --git a/_premade/components/spinbox/spinbox.tscn b/components/spinbox/component_spinbox.tscn
similarity index 69%
rename from _premade/components/spinbox/spinbox.tscn
rename to components/spinbox/component_spinbox.tscn
index 92d12b13..7724161a 100644
--- a/_premade/components/spinbox/spinbox.tscn
+++ b/components/spinbox/component_spinbox.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://bqi00h7i7sg3u"]
-[ext_resource type="Script" path="res://game_settings/components/spinbox/spinbox.gd" id="1_ovbvt"]
+[ext_resource type="Script" path="res://addons/ggs/components/spinbox/component_spinbox.gd" id="1_ovbvt"]
[node name="SpinBox" type="MarginContainer"]
offset_right = 40.0
diff --git a/components/switch/component_switch.gd b/components/switch/component_switch.gd
new file mode 100644
index 00000000..ec4b3ee9
--- /dev/null
+++ b/components/switch/component_switch.gd
@@ -0,0 +1,51 @@
+@tool
+@icon("res://addons/ggs/plugin/assets/switch.svg")
+extends ggsComponent
+
+@onready var _Btn: CheckButton = $Btn
+
+
+func _init() -> void:
+ compatible_types = [TYPE_BOOL]
+
+
+func _ready() -> void:
+ if Engine.is_editor_hint():
+ return
+
+ if not validate_setting():
+ return
+
+ init_value()
+ _Btn.toggled.connect(_on_Btn_toggled)
+ _Btn.mouse_entered.connect(_on_Btn_mouse_entered)
+ _Btn.focus_entered.connect(_on_Btn_focus_entered)
+
+
+func init_value() -> void:
+ value = GGS.get_value(setting)
+ _Btn.set_pressed_no_signal(value)
+
+
+func reset_setting() -> void:
+ super()
+ _Btn.set_pressed_no_signal(value)
+
+
+func _on_Btn_toggled(toggled_on: bool) -> void:
+ value = toggled_on
+ GGS.Audio.Interact.play()
+
+ if apply_on_changed:
+ apply_setting()
+
+
+func _on_Btn_mouse_entered() -> void:
+ GGS.Audio.MouseEntered.play()
+
+ if grab_focus_on_mouse_over:
+ _Btn.grab_focus()
+
+
+func _on_Btn_focus_entered() -> void:
+ GGS.Audio.FocusEntered.play()
diff --git a/components/switch/component_switch.tscn b/components/switch/component_switch.tscn
new file mode 100644
index 00000000..eaab2117
--- /dev/null
+++ b/components/switch/component_switch.tscn
@@ -0,0 +1,11 @@
+[gd_scene load_steps=2 format=3 uid="uid://cha8xesfthpfk"]
+
+[ext_resource type="Script" path="res://addons/ggs/components/switch/component_switch.gd" id="1_s7nl3"]
+
+[node name="Switch" type="MarginContainer"]
+offset_right = 40.0
+offset_bottom = 40.0
+script = ExtResource("1_s7nl3")
+
+[node name="Btn" type="CheckButton" parent="."]
+layout_mode = 2
diff --git a/components/text_field/component_text_field.gd b/components/text_field/component_text_field.gd
new file mode 100644
index 00000000..3f486d13
--- /dev/null
+++ b/components/text_field/component_text_field.gd
@@ -0,0 +1,32 @@
+@tool
+@icon("res://addons/ggs/plugin/assets/text_field.svg")
+extends ggsComponent
+
+@onready var _TextField: LineEdit = $TextField
+
+
+func _ready() -> void:
+ compatible_types = [TYPE_STRING]
+ if Engine.is_editor_hint():
+ return
+
+ init_value()
+ _TextField.text_submitted.connect(_on_TextField_text_submitted)
+
+
+func init_value() -> void:
+ value = GGS.get_value(setting)
+ _TextField.text = value
+
+
+func reset_setting() -> void:
+ super()
+ _TextField.text = value
+
+
+func _on_TextField_text_submitted(submitted_text: String) -> void:
+ value = submitted_text
+ GGS.Audio.Interact.play()
+
+ if apply_on_changed:
+ apply_setting()
diff --git a/_premade/components/text_field/text_field.tscn b/components/text_field/component_text_field.tscn
similarity index 76%
rename from _premade/components/text_field/text_field.tscn
rename to components/text_field/component_text_field.tscn
index 38f49c7d..806025cf 100644
--- a/_premade/components/text_field/text_field.tscn
+++ b/components/text_field/component_text_field.tscn
@@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://di8r6amxunq7q"]
-[ext_resource type="Script" path="res://game_settings/components/text_field/text_field.gd" id="1_u6s1s"]
+[ext_resource type="Script" path="res://addons/ggs/components/text_field/component_text_field.gd" id="1_u6s1s"]
[node name="TextField" type="MarginContainer"]
offset_right = 40.0
diff --git a/components/toggle_btn/component_toggle_btn.gd b/components/toggle_btn/component_toggle_btn.gd
new file mode 100644
index 00000000..a4feb7b2
--- /dev/null
+++ b/components/toggle_btn/component_toggle_btn.gd
@@ -0,0 +1,51 @@
+@tool
+@icon("res://addons/ggs/plugin/assets/toggle_btn.svg")
+extends ggsComponent
+
+@onready var _Btn: CheckButton = $Btn
+
+
+func _init() -> void:
+ compatible_types = [TYPE_BOOL]
+
+
+func _ready() -> void:
+ if Engine.is_editor_hint():
+ return
+
+ if not validate_setting():
+ return
+
+ init_value()
+ _Btn.toggled.connect(_on_Btn_toggled)
+ _Btn.mouse_entered.connect(_on_Btn_mouse_entered)
+ _Btn.focus_entered.connect(_on_Btn_focus_entered)
+
+
+func init_value() -> void:
+ value = GGS.get_value(setting)
+ _Btn.set_pressed_no_signal(value)
+
+
+func reset_setting() -> void:
+ super()
+ _Btn.set_pressed_no_signal(value)
+
+
+func _on_Btn_toggled(toggled_on: bool) -> void:
+ value = toggled_on
+ GGS.Audio.Interact.play()
+
+ if apply_on_changed:
+ apply_setting()
+
+
+func _on_Btn_mouse_entered() -> void:
+ GGS.Audio.MouseEntered.play()
+
+ if grab_focus_on_mouse_over:
+ _Btn.grab_focus()
+
+
+func _on_Btn_focus_entered() -> void:
+ GGS.Audio.FocusEntered.play()
diff --git a/_premade/components/toggle_btn/toggle_btn.tscn b/components/toggle_btn/component_toggle_btn.tscn
similarity index 60%
rename from _premade/components/toggle_btn/toggle_btn.tscn
rename to components/toggle_btn/component_toggle_btn.tscn
index 738b3967..b4d8d439 100644
--- a/_premade/components/toggle_btn/toggle_btn.tscn
+++ b/components/toggle_btn/component_toggle_btn.tscn
@@ -1,11 +1,11 @@
[gd_scene load_steps=2 format=3 uid="uid://d10row618jwcs"]
-[ext_resource type="Script" path="res://game_settings/components/_shared_scripts/binary_selection.gd" id="1_j77ap"]
+[ext_resource type="Script" path="res://addons/ggs/components/toggle_btn/component_toggle_btn.gd" id="1_m2okj"]
[node name="ToggleBtn" type="MarginContainer"]
offset_right = 40.0
offset_bottom = 40.0
-script = ExtResource("1_j77ap")
+script = ExtResource("1_m2okj")
[node name="Btn" type="Button" parent="."]
layout_mode = 2
diff --git a/docs/changelog.md b/docs/changelog.md
deleted file mode 100644
index 9972949c..00000000
--- a/docs/changelog.md
+++ /dev/null
@@ -1,65 +0,0 @@
-## 3.1.0
-This version completely reworks how the categories and settings are stored, and adds several QoL features to the plugin.
-
-### General
-* Categories and Settings are now saved on the disc instead of being subresources of the plugin data. This allows more flexibility when handling them such as moving, renaming, and deleting.
-* Icon and description support for settings and components have been removed. While this was a "cool" feature, it didn't add anything significant and just added to the code bloat since I don't think people would actually spend time designing icons and writing descriptions for their own custom settings.
-* The plugin now applies settings (executes their logic) using a separate thread instead of doing it on the main thread.
-* The preferences window now includes a button for updating the plugin theme to reflect the theme of your own Godot editor.
-* The preferences window has been slightly redesigned for clarity.
-* A "Send Feedback" button has been added which takes you to a Google survey where you can provide feedback regarding the plugin. You can still request features and QoL changes using issues on GitHub.
-* Options were added to the Save File menu that allow you to remake the save file from either `current` or `default` values.
-
-### Settings
-* The settings panel UI has been reworked.
-* You can now group settings in a category for organization. Additionally, you can add settings to multiple groups at the same time, speeding up the process of adding settings to a category.
-* The way custom settings are created and added has been slightly changed and streamlined.
-* The predefined settings (previously in the settings directory) are now considered to be templates.
-* The templates directory (previously the settings directory) now supports tree walking. You can now organize your templates in folders.
----
-* The input setting has been reworked to use `InputEvent` resources instead of clunky strings.
-* The input setting now supports multiple inputs of the same type for each action (i. e. you can have more than one keyboard or gamepad event for an action).
-
-### Components
-* All list components now support using item IDs instead of indices.
-* The input button now supports icons for mouse events.
-* UI components now warn the user when they don't have a setting or their setting is invalid.
-* You can now set up sound effects for UI components.
-
-
-# Previous Versions
-
-
-3.0 Changelog
-
-## 3.0.3
-* Fixed category selection bug in Godot 4.1
-
-## 3.0.2
-* Fixed an issue where the game would crash if the user attempted to rebind input using mice with more than five keys.
-* Fixed an issue where rebinding left and right arrow keys would rebind to the gamepad left button and right button instead.
-
-## 3.0.1
-* Centering the window (part of the fullscreen toggle process) now works properly on setups with multiple displays.
-
-## 3.0.0
-GGS has been completely reworked so it can provide a much better experience for the users. The new version is compatible with Godot 4 only.
-
-### General
-* GGS is now a bottom panel plugin instead of a main screen one.
-* The entire UI has been redesigned to make it easier and more intuitive to work with.
-* Save data is handled via config files instead of JSON files.
-* The way settings are created and handled has been completely reworked.
-* The way UI components are added and handled has been completely reworked.
-
-### Settings
-* Users should now have more freedom and flexibility when creating custom settings.
-* Keyboard Input and Gamepad Input settings have been merged into a single setting. The setting functionality has been improved.
-
-### UI Components
-* Users can now create their own custom UI components.
-* Keyboard Input and Gamepad Input components have been merged into a single component. The component functionality has been improved.
-* New UI components have been added: Apply Button, Radio List, Toggle Button, CheckBox
-
-
-
diff --git a/docs/components/apply_button.md b/docs/components/apply_button.md
deleted file mode 100644
index c9b1b2d6..00000000
--- a/docs/components/apply_button.md
+++ /dev/null
@@ -1,6 +0,0 @@
-Calls `apply_setting()` on all UI components in a specific node group. Must be instantiated directly from the scene tree.
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| group | The name of the target node group. | `String` |
diff --git a/docs/components/arrow_list.md b/docs/components/arrow_list.md
deleted file mode 100644
index 1d4a6533..00000000
--- a/docs/components/arrow_list.md
+++ /dev/null
@@ -1,23 +0,0 @@
-A list that allows cycling through options using two arrows on the left and right.
-
-Handles integer and boolean values.
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| options | The list of options. | `PackedStringArray` |
-| option_ids | The list of option IDs. | `PackedInt32Array` |
-
-## option_ids
-This is the list of IDs associated with each option. Each item in this array corresponds to the item with the same index in the `options` array. If this property is set, the component returns the item ID instead of its index. If you don't want to use IDs, simply leave this as empty.
-
-Example:
-
-Let's say your setting sets the number of power-ups the player character starts with.
-```gdscript
-option = ["low", "medium", "high"]
-option_ids = [5, 10, 20]
-```
-
-> [!NOTE]
-> If you want to use item IDs, both `options` and `option_ids` must be the same size.
diff --git a/docs/components/binary_selection.md b/docs/components/binary_selection.md
deleted file mode 100644
index a4d12b13..00000000
--- a/docs/components/binary_selection.md
+++ /dev/null
@@ -1,3 +0,0 @@
-Multiple components that all do the same thing. Checkbox, Switch, and Toggle Button are all binary selection components that allow the user to choose between a On/Off state.
-
-Handles boolean values.
diff --git a/docs/components/components.md b/docs/components/components.md
deleted file mode 100644
index 621cfd32..00000000
--- a/docs/components/components.md
+++ /dev/null
@@ -1,33 +0,0 @@
-UI components are nodes that can be added to your settings menu and allow players to change a setting.
-
-# Properties
-All components have several properties that are shared among them.
-| Property | Description | Type |
-| :---: | --- | :---: |
-| setting | The setting that's assigned to the component. The setting's value type must be compatible with the types the component handles. | `ggsSetting` |
-| apply_on_changed | Whether the component should apply the setting when the player interacts with it. If false, you should apply the settings with an [Apply Button](apply_button.md) component. | `Bool`|
-| grab_focus_on_mouse_over | Whether the component should grab focus on mouseover. Useful if your game supports both keyboard and mouse. | `Bool` |
-
-# Setting Sound Effects
-You can set sound effects to be played when the player mouses over the components, interacts with them, or the components grab focus.
-
-First, you should open the `ggs.tscn` scene. To do so:
-* Open the scene via the Preferences in the GGS editor.
-* Open the scene using the *Quick Open Scene...* option in Godot editor.
-* Manually open the scene. The scene is located at `res://addons/ggs/classes/global/ggs.tscn`
-
-This scene is the same scene that's added to the autoload list. Once the scene is open, assign an audio stream to each of the available audio stream players under the root `GGS` node.
-
-# Predefined Components
-GGS comes with the following predefined components:
-* [Binary Selection](binary_selection.md)
-* [Arrow List](arrow_list.md)
-* [Option List](option_list.md)
-* [Radio List](radio_list.md)
-* [Slider](slider.md)
-* [SpinBox](spinbox.md)
-* [Text Field](text_field.md)
-* [Input Button](input_button.md)
-* [Input Confirm Window](input_confirm_window.md)
-* [Apply Button](apply_button.md)
-* [Reset Button](reset_button.md)
diff --git a/docs/components/input_button.md b/docs/components/input_button.md
deleted file mode 100644
index 007bb954..00000000
--- a/docs/components/input_button.md
+++ /dev/null
@@ -1,18 +0,0 @@
-Displays the assigned [Input Confirm Window](input_confirm_window.md) when pressed and rebinds the input if the window is confirmed.
-
-Handles array values.
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| ICW | The path to the **Input Confirm Window**. Required. | `ConfirmationDialog` |
-| accept_modifiers | Whether the Input Confirm Window should accept events with modifiers (e.g. Shift+D, Alt+M, etc.) | `bool` |
-| accept_mouse | Whether the Input Confirm Window should accept mouse events. | `bool` |
-| accept_axis | Whether the Input Confirm Window should accept gamepad axis inputs (e.g. left stick left, right stick up, etc.) | `bool` |
-| use_icons | Whether the button should display icons instead of text for mouse and gamepad inputs. | `bool` |
-| icon_db | The database for the mouse and gamepad icons. | `ggsIconDB` |
-
-## Working with ggsIconDB
-This is a custom resource that can be used to assign textures to each gamepad and mouse input. It is highly recommended to create and save this on disk and use `AtlasTexture`s when setting the individual textures. If no texture is available for an input, the button will show it as text instead.
-
-The button shows text or icon that corresponds to the currently connected gamepad device. If no gamepad is connected (or the connected gamepad is not recognized), it uses the "other" text or icons.
diff --git a/docs/components/input_confirm_window.md b/docs/components/input_confirm_window.md
deleted file mode 100644
index 3d48f1c9..00000000
--- a/docs/components/input_confirm_window.md
+++ /dev/null
@@ -1,14 +0,0 @@
-A confirmation dialog that allows the user to choose an input. Required component for [Input Button](input_button.md) to function. Must be instantiated in the scene tree directly and one instance is enough. You don't have to instantiate it for every Input Button component you have.
-
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| listening_wait_time | The time it takes for the input to be accepted when an input is received. | `float` |
-| listening_max_time | The maximum time the window will listen for an input before it stops. | `float` |
-| show_progress_bar | Whether to show the bar under the listen button when an input is received. | `bool` |
-| btn_listening | Text displayed on the listen button when the window is currently listening for input. | `String` |
-| title_listening | Window title when it's currently listening for input. | `String` |
-| title_confirm | Window title when it's not listening for input and is awaiting confirmation or cancellation. | `String` |
-| timeout_text | Text displayed on the listen button when listening times out. | `String` |
-| already_exists_msg | Text displayed below the listen button when the received input already exists. You can use `{action}` as a placeholder for the action that has the conflicting input event | `String` |
diff --git a/docs/components/option_list.md b/docs/components/option_list.md
deleted file mode 100644
index 564c57ec..00000000
--- a/docs/components/option_list.md
+++ /dev/null
@@ -1,8 +0,0 @@
-A drop-down menu that allows the selection of one option. Define options by editing the **Items** of the child OptionButton via the Inspector.
-
-Handles integer and boolean values.
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| use_ids | Whether the component should use the item ID instead of its index when selected. | `bool` |
diff --git a/docs/components/radio_list.md b/docs/components/radio_list.md
deleted file mode 100644
index 636f9190..00000000
--- a/docs/components/radio_list.md
+++ /dev/null
@@ -1,18 +0,0 @@
-A group of buttons. Only one button can be selected at any time.
-
-Handles integer and boolean values.
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| option_ids | The list of option IDs. | `PackedInt32Array` |
-| active_list | The `BoxContainer` that will be used. | `PackedInt32Array` |
-
-## Adding Options
-You can add `Button`s or `CheckButton`s to the active list. All buttons must have `toggle_mode` enabled. The index of the button node in the active list is the index of the option (e.g. the first button returns `0`, the second one returns `1`, and so on) unless `option_ids` is not empty.
-
-## option_ids
-This is the list of IDs associated with each option. Each item in this array corresponds to the button node with the same index in the active list. If this property is set, the component returns the item ID instead of its index. If you don't want to use IDs, simply leave this as empty.
-
-> [!NOTE]
-> If you want to use item IDs, both `option_ids` and the number of button nodes in the active list must be the same size.
diff --git a/docs/components/reset_button.md b/docs/components/reset_button.md
deleted file mode 100644
index 62fe26c8..00000000
--- a/docs/components/reset_button.md
+++ /dev/null
@@ -1,6 +0,0 @@
-Calls `reset_setting()` on all UI components in a specific node group. Must be instantiated directly from the scene tree.
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| group | The name of the target node group. | `String` |
diff --git a/docs/components/slider.md b/docs/components/slider.md
deleted file mode 100644
index 40a68866..00000000
--- a/docs/components/slider.md
+++ /dev/null
@@ -1,3 +0,0 @@
-A slider for choosing a number between a certain range. Edit the child `HSlider` to set range, step, etc.
-
-Handles integer and float values.
diff --git a/docs/components/spinbox.md b/docs/components/spinbox.md
deleted file mode 100644
index e1cffe4c..00000000
--- a/docs/components/spinbox.md
+++ /dev/null
@@ -1,3 +0,0 @@
-A text field that only accepts numbers. Edit the child `SpinBox` to set range, step, etc.
-
-Handles integer and float values.
diff --git a/docs/components/text_field.md b/docs/components/text_field.md
deleted file mode 100644
index 86bbcb16..00000000
--- a/docs/components/text_field.md
+++ /dev/null
@@ -1,3 +0,0 @@
-A simple text field.
-
-Handles string values.
diff --git a/docs/custom_components.md b/docs/custom_components.md
deleted file mode 100644
index 2403695b..00000000
--- a/docs/custom_components.md
+++ /dev/null
@@ -1,86 +0,0 @@
-You can create your own custom UI components and use them just like the predefined components. UI Components use a property named `setting_value` to keep track of their current value. For example, for a simple Toggle Button, this `setting_value` can either be `true` or `false` and it corresponds to the button pressed state.
-
-When the user interacts with the component (in our example, toggles the button), the `setting_value` is updated with the new value (in our example, the new button pressed state). Then, if `apply_on_changed` is enabled, the setting is applied.
-
-# Creating the Component Files
-All components are located in your components directory (default: `game_settings/components`).
-1. Create a new folder in this directory and give it an appropriate name. You can tell GGS to ignore the folder if you start the name with an underscore (e.g. `_ignore_this`).
-2. Create a scene in the folder. This scene *cannot* be in a subfolder and *must* be named the same thing as the folder. For example, if the folder is named `my_component`, the scene must be named `my_component.tscn`. The scripts or other secondary scenes can be in any directory (even outside of this folder) but the main scene must be a direct file of the folder.
-3. The scene root *must* be a `MarginContainer`. You can add any other nodes you want to this root.
-4. After creating your component, restart the plugin so you can see it in the components list.
-
-# Adding a Script
-Now, you can add a script to your root `MarginContainer` node. This script:
-* Must be a `@tool` script.
-* Must extend `ggsUIComponent`.
-* When overriding the following methods, you must first call the parent method using `super()`:
- * `_ready()`
- * `init_value()`
- * `reset_setting()`
-* When the user interacts with the component (such as toggling a button, changing a slider value, etc.), the following piece should be used:
-```gdscript
-setting_value = new_value
-if apply_on_change:
- apply_setting()
-```
-* When overriding the `_ready()` method, you should add the following piece to the beginning before anything else:
-```gdscript
-compatible_types = []
-if Engine.is_editor_hint():
- return
-```
-You should set `compatible_types` to contain the types that this component can handle. For example, if your component can handle integer and boolean values, it should be:
-```gdscript
-compatible_types = [TYPE_BOOL, TYPE_INT]
-```
-
-The `Engine.is_editor_hint()` check is used to prevent the nodes from running their setting-related code (getting its value, applying its logic, etc.) in the Godot editor. The components are `@tool` scripts so they can send configuration warnings to the user (usually when something is wrong with the assigned setting).
-
-
-# Class Methods
-## init_value()
-Loads `setting_value` from the assigned `setting`. Additionally, all code related to initializing the component state should go here. Example:
-```gdscript
-func init_value() -> void:
- super()
- Btn.set_pressed_no_signal(setting_value)
-```
-Remember, using `super()` when overriding this method is required because the `init_value()` of the base `ggsUIComponent` class must also be executed for the component to work properly.
-
-## apply_setting()
-Saves the setting value to the save file and executes the setting logic. You don't generally need to override this, simply call it when you want the component to apply the setting. Always use the `if apply_on_changed` check before using it otherwise the `apply_on_changed` property won't have any effect.
-
-This method is also called when a relevant **Apply Button** is pressed.
-
-## reset_setting()
-Resets the setting value back to its default and executes the setting logic. You should override this and update your component state in it. Remember to use `super()`. This method is called when a relevant **Reset Button* is pressed.
-
------
-
-Here's a simple example of a toggle button component:
-```gdscript
-extends ggsUIComponent
-
-@onready var Btn: Button = $Btn
-
-
-func _ready() -> void:
- super()
- Btn.toggled.connect(_on_Btn_toggled)
-
-
-func init_value() -> void:
- super()
- Btn.set_pressed_no_signal(setting_value)
-
-
-func _on_Btn_toggled(btn_state: bool) -> void:
- setting_value = btn_state
- if apply_on_change:
- apply_setting()
-
-
-func reset_setting() -> void:
- super()
- Btn.set_pressed_no_signal(setting_value)
-```
diff --git a/docs/custom_settings.md b/docs/custom_settings.md
deleted file mode 100644
index 40ebf9a7..00000000
--- a/docs/custom_settings.md
+++ /dev/null
@@ -1,51 +0,0 @@
-You can create your own custom settings and templates in GGS.
-
-# Setting up a Custom Setting
-When you add a setting via the *New Setting...* field, you create a blank setting with no logic or properties. In order to use it, you need to set up it properly.
-
-## The `value_type`
-To start, select your newly created blank setting. You may notice that the `current` and `default` values are `null`. This is because the `value_type` property has not been set. Open the `Internals` group and choose an appropriate value type for your setting from the drop-down menu. You can optionally choose `value_hint` and `value_hint_string`. These are used to customize the export behavior of the `current` and `default` values.
-
-For example, if your `value_type` is `float`, you can set `value_hint` to be `Range`. And set `value_hint_string` to be `0,100`. This will export `default` and `current` properties as a range between `0` and `100`. For more information, view `_get_property_list()` and `Property.Hint` constants in the Godot docs.
-
-Once you've set the `value_type` select the setting again to reinspect it. Now you can see the `default` and `current` value are exported correctly.
-
-## The Logic
-To write the logic for your setting, you need to edit its script. You can do so by:
-* Either open the `script` property in the Inspector. Under the `RefCounted` category.
-* Directly open the script in the file system.
-
-As you can see, there are a few prerequisites for the script. The script *must*:
-* Be a `@tool` script.
-* Extend `ggsSetting`.
-* Have a method called `apply()`.
-
-The `apply()` method is where your logic should go. It must take a value (the same type defined in `value_type`).
-
-Here's a simple example of a VSync setting:
-
-```gdscript
-@tool
-extends ggsSetting
-
-
-func apply(value: bool) -> void:
- var vsync_mode: DisplayServer.VSyncMode
- match value:
- true:
- vsync_mode = DisplayServer.VSYNC_ENABLED
- false:
- vsync_mode = DisplayServer.VSYNC_DISABLED
-
- DisplayServer.window_set_vsync_mode(vsync_mode)
-```
-
-That's the core of what you need to do. You can define variables, other methods, etc. in the script.
-
-# Templates
-Creating a template is essentially the same as setting up the script of a blank setting. To start, create a script in your templates directory. The script must fulfill all three conditions explained previously but it has one additional condition:
-* The script must override the `_init()` method and set `value_type` and `default` in there. You can also set `value_hint` and `value_hint_string` if applicable.
-
-That's the only additional criterion you have to keep in mind. Everything else is the same as mentioned previously.
-
-Check out some of the predefined templates to see a few examples of what you can do.
diff --git a/docs/getting_started.md b/docs/getting_started.md
deleted file mode 100644
index ff730051..00000000
--- a/docs/getting_started.md
+++ /dev/null
@@ -1,120 +0,0 @@
-This guide will show you how to create a basic settings menu with the predefined settings and components that come with GGS.
-
-# Installation
-You can install the plugin through various ways, including:
-* Install the plugin through the Asset Library inside the Godot editor.
-* Clone the repository with Git.
-* Download the latest release.
-* Download the `main` branch directly with [DownGit](https://minhaskamal.github.io/DownGit/#/home) or similar tools.
-* Add the `main` branch as a Git Submodule. [Learn more about Git Submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules).
-
-> [!IMPORTANT]
-> No matter how you download the `main` branch (via releases, DownGit, or as a Git submodule), you should copy the contents of the *_premade* folder and paste them into your own game settings directory. You can change these directories in Preferences.
-> Example:
-> ```
-> res://
-> â”” game_settings
-> â”” components
-> â”” settings
-> â”” templates
-> ```
-
-> [!NOTE]
-> The plugin may not work as expected when added to a project at first. Enable the plugin through the Project Settings then restart the Godot editor. [More information](troubleshoot.md#can't-use-the-plugin-after-installation).
-
-# Change Project Settings
-For the settings to work on an exported build, you must disable `convert_text_resources_to_binary` option in the project settings. You can find this option in the *Editor/Export* section (`editor/export/convert_text_resources_to_binary`).
-
-
-# GGS Editor
-When enabled, GGS adds a bottom panel editor to Godot named "Game Settings". The editor is divided into 3 panels:
-* The categories panel on the left.
-* The settings panel in the center.
-* The components panel on the right.
-
-# Categories
-To add settings, you should first add categories. To do so, simply enter a valid name in the *New Category...* field at the top of the categories panel and press ENTER.
-A valid category name is:
-1. A valid file name (does not have unsupported special characters such as `@`, `?`, `!`, etc., and does not start or end with trailing space).
-2. Does not start with an underscore (`_`) or a dot (`.`). Underscores are used to tell GGS to ignore a directory. Dots do the same but for Godot's file system.
-3. While not necessary, I recommend using snake_case to follow Godot's recommended styling guidelines.
-
-After doing that, you may notice a folder is added to the settings directory (`res://game_settings/settings` by default) in the file system. All folders that are *direct* children of the settings directory will be considered categories. If you want GGS to ignore a folder, add an underline to the beginning of its name (e.g. `_ignore_this`).
-
-## Renaming Categories
-
-To rename a category, simply rename its folder from the Godot file system.
-
-## Deleting Categories
-
-To delete a category, simply delete its folder from the Godot file system. Depending on your system settings, this will either permanently delete the folder or move it to the recycle bin.
-
-> [!WARNING]
-> Do not rename or delete files and folders from your OS file system in general. This can cause issues with references in Godot. Use Godot's own file system to do so.
-
-# Settings
-Settings are resources that contain the logic and properties of a game setting. For example, the audio volume setting contains the name of an audio bus, the current and default values for it, and how Godot is supposed to change the volume of said bus.
-
-There are two methods of adding settings: Adding blank settings and adding settings from a template.
-
-## Adding Blank Settings
-This method is useful when you want to create a single unique setting. For example, if you want to add a difficulty option, you can use this method as a game usually has only one difficulty option.
-
-To add a blank setting with no properties and logic, use the *New Setting...* field at the top of the settings panel. Enter a valid name (the validation is the same as category names) and press ENTER to add a new setting to the currently selected category. If one or more groups are selected, a setting is added to each selected group.
-
-When you create a setting via this method, GGS creates a new `ggsSetting` resource and saves it on your disc inside the category folder. It then duplicates the blank template script and assigns it to said resource.
-
-> [!NOTE]
-> You can edit this blank template script from preferences.
-
-## Adding Settings from Templates
-There are times when a type of setting must be used multiple times. The easiest example is an input setting. A game usually has multiple inputs and you need a setting resource for each individual input. The logic behind *how* an input should be changed is the same among all of them. The only thing that changes is the input action they should change (in other words, a property).
-
-This is where templates come into play. You can add settings from templates to create multiple settings with the same logic and properties that can be changed via the inspector.
-
-To add a setting from a template, use the `+` button. This will open a window that shows all the available templates located in the templates directory (`res://game_settings/templates` by default). Simply double-click a template, give the setting a valid name, and press ENTER or press the *Add* button.
-
-This method is essentially the same as the first one when it comes to the actual creation process, except that instead of assigning a blank script to the resource, it assigns the specific template script that you selected.
-
-## Inspecting Settings
-To inspect a setting, click on it in the settings panel. This will show its `current` and `default` values along with any additional properties it might have in the Godot Inspector. You can also view its script all the way down via the `script` property under `RefCounted`.
-
-The properties inside the `Internal` group are internal properties used by GGS to handle the setting. These are explained further in [Creating Custom Settings](custom_settings.md).
-
-You can also right-click on a setting to highlight in the Godot file system.
-
-## Groups
-As implied previously, you can add settings to groups. Groups can help you add settings faster and tidy up your category.
-
-To add a group, enter a valid name in the *New Group...* field and press ENTER.
-
-To add settings to a group, click on it to select it. When adding settings via any of the aforementioned methods, GGS will add a setting to every selected group. Do note that adding settings to a high number of groups can take a few moments. Godot will be unresponsive during this time.
-
-## Deleting and Renaming
-You can rename, delete, or move settings and groups in the file system similar to categories.
-
-## Custom Settings
-To learn how you can set up your own custom settings and templates, view [Creating Custom Settings](custom_settings.md).
-
-For more info on the predefined settings, visit [Settings](settings/settings.md).
-
-
-# UI Components
-The UI components are what the user can interact with to change a setting. They're located at `game_settings/components`. You can assign a setting to each component. When the component is interacted with, it'll update the save file with the new value and execute the logic of its assigned setting.
-
-Each component has an `apply_on_changed` property. If set to `true`, the component will apply the setting (update save file + execute setting logic) when the user interacts with it. If false, you need to use an **Apply Button** to apply the setting and save changes.
-
-To add a new component, select a setting and a *single* node in the scene tree of your target scene. Then, simply double-click a component in the component list to instantiate a component of that type.
-
-Each component can only handle a specific type of data. An **Arrow List** for example, can only handle integers while a **Slider** can only handle floats.
-
-It is possible to use certain components with multiple types. For instance, you can use an **Arrow List** for a setting that accepts boolean values if you configure the arrow list to have only 2 items: The first one being the "false" or "disabled" option and the second one being the "true" or "enabled" option.
-
-## Custom Components
-To learn how you can create your own custom components, view [Creating Custom Components](custom_components.md).
-
-For more info on the predefined components, visit [Components](components/components.md).
-
----
-
-Feel free to open an issue to ask for help, report a bug, or suggest additional features or QoL enhancements.
diff --git a/docs/home.md b/docs/home.md
deleted file mode 100644
index 9aaf8a72..00000000
--- a/docs/home.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Welcome to GGS Documentation
-You can find all the information you need to use GGS in here. If this is your first time using GGS, consider starting with [Getting Started](getting_started.md).
-
-View [Settings](settings/settings.md) or [Components](components/components.md) if you have questions regarding a specific predefined setting or component.
-
-Visit [Troubleshoot](troubleshoot.md) if there's a general issue with the plugin (such as error messages).
diff --git a/docs/settings/audio_mute.md b/docs/settings/audio_mute.md
deleted file mode 100644
index c83ad189..00000000
--- a/docs/settings/audio_mute.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Sets the mute state of a specific audio bus.
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| default/current | The default and current values of the setting. | `bool` |
-| audio_bus | The audio bus that this setting will affect. | `String` |
diff --git a/docs/settings/audio_volume.md b/docs/settings/audio_volume.md
deleted file mode 100644
index 1b39872f..00000000
--- a/docs/settings/audio_volume.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Sets the volume of a specific audio bus.
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| default/current | The default and current values of the setting. | `float`: 0 to 100 |
-| audio_bus | The audio bus that this setting will affect. | `String` |
diff --git a/docs/settings/display_fullscreen.md b/docs/settings/display_fullscreen.md
deleted file mode 100644
index 9652a9ff..00000000
--- a/docs/settings/display_fullscreen.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Toggles the fullscreen state of the game window.
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| default/current | The default and current values of the setting. | `bool` |
-| size_setting | Name of the setting responsible for resizing the window (e.g. window size, window scale, etc.). If nothing is selected, the window size will not be updated when the fullscreen state is turned off. This is particularly important when the user changes the window size *while* the game is in fullscreen. | `ggsSetting` |
diff --git a/docs/settings/display_scale.md b/docs/settings/display_scale.md
deleted file mode 100644
index 9e3761d2..00000000
--- a/docs/settings/display_scale.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Sets the window size by multiplying its width and height by a certain value.
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| default/current | Index or ID of a list item. Invalid until the `scales` property is set. | `int` |
-| scales | The list of available sizes. When setting up a UI component, the order of list items must match the order of items in this property unless you're using item IDs. If using item IDs, each item ID must point to a valid index in this array. | `Array[float]` |
diff --git a/docs/settings/display_size.md b/docs/settings/display_size.md
deleted file mode 100644
index 190c2dbe..00000000
--- a/docs/settings/display_size.md
+++ /dev/null
@@ -1,7 +0,0 @@
-Sets the window size by setting its width and height to certain values.
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| default/current | Index or ID of a list item. Invalid until the `sizes` property is set. | `int` |
-| sizes | The list of available sizes. When setting up a UI component, the order of list items must match the order of items in this property unless you're using item IDs. If using item IDs, each item ID must point to a valid index in this array. | `Array[Vector2]` |
diff --git a/docs/settings/input.md b/docs/settings/input.md
deleted file mode 100644
index 115da248..00000000
--- a/docs/settings/input.md
+++ /dev/null
@@ -1,37 +0,0 @@
-Sets an input event of a specific input action (i.e. rebinds an input).
-
-# Properties
-| Property | Description | Type |
-| :---: | --- | :---: |
-| default/current | An array that stores the input type and id. The array structure is `[type, id]`. | `Array[int]`: Read-Only |
-| action | The input action that holds the target input event. | `String`: Read-Only |
-| event_index | The index of the target input event inside the input action. | `int`: Read-Only |
-| default_as_event | The default value (an Array) as an `InputEvent`. | `InputEvent`: Read-Only |
-| current_as_event | The current value (an Array) as an `InputEvent`. | `InputEvent` |
-
-## Type and ID
-Type is the type of input event such as `InputEventKey` or `InputEventJoypadMotion`. GGS uses this to create the correct type of input event when loading the setting.
-
-ID refers to the property that stores what the actual input is. For each event type, it's as followed:
-* **InputEventKey**: `physical_keycode`
-* **InputEventMouseButton** & **InputEventJoypadButton**: `button_index`
-* **InputEventJoypadMotion**: `axis`
-
-## default_as_event
-As mentioned, it shows the default value as an appropriate `InputEvent`. This is always the same as the input event defined in the Input Map.
-
-> [!WARNING]
-> The `default_as_event` property is read-only. However, you can still technically change it by using the "Configure" button when expanding the resource. Do not do this. If you want to change the default value, use the "Select Input" button at the top instead.
-
-## current_as_event
-It shows the current value as an appropriate `InputEvent`. You can easily change this by expanding the resource and using the "Configure" button. You can also clear it and add another type of `InputEvent` (e.g. if it's an `InputEventKey`, you can clear that and create an `InputEventMouseButton` instead).
-
-Unlike other current/default values of other settings, the `current_as_event` property is not updated from the save file every tick as this would prevent the user from changing the resource. Instead, it's updated every time the setting is inspected. So if the `current_as_event` does not reflect what the actual `current` value is, simply re-inspect the setting.
-
-> [!NOTE]
-> The type of `InputEvent` you can create when setting `current_as_event` depends on the type of `default_as_event`. If the default is keyboard or mouse, then you can only create `InputEventKey` and `InputEventMouseButton`. If it's one of the gamepad events, you can only create a gamepad event.
-
-> [!WARNING]
-> When configuring an `InputEventKey`, use "physical keycode". GGS does not accept "keycode" and "key label".
-
-
diff --git a/docs/settings/settings.md b/docs/settings/settings.md
deleted file mode 100644
index b3b6c45e..00000000
--- a/docs/settings/settings.md
+++ /dev/null
@@ -1,7 +0,0 @@
-GGS comes with the following predefined settings:
-* [Audio Mute](audio_mute.md)
-* [Audio Volume](audio_volume.md)
-* [Display Fullscreen](display_fullscreen.md)
-* [Display Scale](display_scale.md)
-* [Display Size](display_size.md)
-* [Input](input_setting.md)
diff --git a/docs/troubleshoot.md b/docs/troubleshoot.md
deleted file mode 100644
index c4d14043..00000000
--- a/docs/troubleshoot.md
+++ /dev/null
@@ -1,21 +0,0 @@
-## Can't use the plugin after installation
-When you first install the plugin, Godot might output the following error:
-```
-Parse Error: Identifier "GGS" not declared in the current scope.
-```
-This means that the GGS singleton doesn't exist. When the plugin is first added, Godot tries to parse its scripts and since the singleton doesn't exist at that point (since the plugin is not enabled yet), it'll throw that error. The plugin will not function properly even after you add the singleton to the project. To fix it:
-1. Make sure the singleton is added to the autoload list (Project Settings → Autoload) and it's enabled.
-2. Reload the project.
-
-Note that the plugin adds the singleton automatically when enabled. If for some reason it doesn't, you can find the script at the following path:
-```
-res://addons/ggs/classes/global/ggs.tscn
-```
-Simply add that *scene* (not the script) to the autoload list, **name it GGS**, and reload the project.
-
-
-## Setting type error
-```
-Invalid type in function 'apply' in base 'Resource ()'. Cannot convert argument 1 from to .
-```
-When launching the game, you may encounter the above error, which leads to `ggs_globals.gd`. If so, check your setting scripts. Make sure the type the `apply()` method receives is correct. For example, your `apply()` method might expect a `bool` value but it's receiving a `String`.
diff --git a/editor/_theme/ggs_theme.gd b/editor/_theme/ggs_theme.gd
deleted file mode 100644
index 05151ad5..00000000
--- a/editor/_theme/ggs_theme.gd
+++ /dev/null
@@ -1,38 +0,0 @@
-@tool
-extends Theme
-
-const SETTING_LIST_MARGIN: int = 10
-
-var editor_theme: Theme
-
-
-func update() -> void:
- editor_theme = ggsUtils.get_editor_interface().get_base_control().theme
- _set_window_bg()
- _set_setting_list_bg()
- _set_setting_item_bg()
- ResourceSaver.save(self, resource_path)
-
-
-func _set_setting_list_bg() -> void:
- var default: StyleBoxFlat = editor_theme.get_stylebox("panel", "ItemList")
-
- var new_stylebox: StyleBoxFlat = default.duplicate()
- new_stylebox.set_content_margin_all(SETTING_LIST_MARGIN)
- set_stylebox("panel", "SettingListBG", new_stylebox)
-
-
-func _set_setting_item_bg() -> void:
- var default: StyleBoxFlat = editor_theme.get_stylebox("panel", "AcceptDialog")
-
- var new_stylebox: StyleBoxFlat = default.duplicate()
- new_stylebox.set_content_margin_all(SETTING_LIST_MARGIN)
- new_stylebox.set_corner_radius_all(3)
- set_stylebox("panel", "SettingItemBG", new_stylebox)
-
-
-func _set_window_bg() -> void:
- var default: StyleBoxFlat = editor_theme.get_stylebox("panel", "AcceptDialog")
-
- var new_stylebox: StyleBoxFlat = default.duplicate()
- set_stylebox("panel", "PrefWindowBG", new_stylebox)
diff --git a/editor/_theme/ggs_theme.tres b/editor/_theme/ggs_theme.tres
deleted file mode 100644
index 0b159d64..00000000
--- a/editor/_theme/ggs_theme.tres
+++ /dev/null
@@ -1,55 +0,0 @@
-[gd_resource type="Theme" load_steps=5 format=3 uid="uid://c4pwg7lhukqb8"]
-
-[ext_resource type="Script" path="res://addons/ggs/editor/_theme/ggs_theme.gd" id="1_3cm4d"]
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wolqy"]
-content_margin_left = 4.0
-content_margin_top = 4.0
-content_margin_right = 4.0
-content_margin_bottom = 4.0
-bg_color = Color(0.211765, 0.211765, 0.211765, 1)
-border_color = Color(0.211765, 0.211765, 0.211765, 1)
-corner_radius_bottom_right = 3
-corner_radius_bottom_left = 3
-corner_detail = 3
-expand_margin_bottom = 2.0
-anti_aliasing = false
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_l5a6g"]
-content_margin_left = 10.0
-content_margin_top = 10.0
-content_margin_right = 10.0
-content_margin_bottom = 10.0
-bg_color = Color(0.211765, 0.211765, 0.211765, 1)
-border_color = Color(0.211765, 0.211765, 0.211765, 1)
-corner_radius_top_left = 3
-corner_radius_top_right = 3
-corner_radius_bottom_right = 3
-corner_radius_bottom_left = 3
-corner_detail = 3
-expand_margin_bottom = 2.0
-anti_aliasing = false
-
-[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_g1mf3"]
-content_margin_left = 10.0
-content_margin_top = 10.0
-content_margin_right = 10.0
-content_margin_bottom = 10.0
-bg_color = Color(0.148235, 0.148235, 0.148235, 1)
-border_color = Color(0.084706, 0.084706, 0.084706, 1)
-corner_radius_top_left = 3
-corner_radius_top_right = 3
-corner_radius_bottom_right = 3
-corner_radius_bottom_left = 3
-corner_detail = 3
-anti_aliasing = false
-
-[resource]
-ItemList/colors/guide_color = Color(0.701961, 0.701961, 0.701961, 0)
-ItemList/constants/v_separation = 6
-PrefWindowBG/styles/panel = SubResource("StyleBoxFlat_wolqy")
-SettingItemBG/base_type = &"PanelContainer"
-SettingItemBG/styles/panel = SubResource("StyleBoxFlat_l5a6g")
-SettingListBG/base_type = &"PanelContainer"
-SettingListBG/styles/panel = SubResource("StyleBoxFlat_g1mf3")
-script = ExtResource("1_3cm4d")
diff --git a/editor/add_setting_window/add_setting_window.gd b/editor/add_setting_window/add_setting_window.gd
deleted file mode 100644
index 01e9aac3..00000000
--- a/editor/add_setting_window/add_setting_window.gd
+++ /dev/null
@@ -1,166 +0,0 @@
-@tool
-extends ConfirmationDialog
-signal template_selected(template_path: String, setting_name: String)
-
-@onready var SettingList: ItemList = %SettingList
-@onready var FilterField: LineEdit = %FilterField
-@onready var RecentList: ItemList = %RecentList
-@onready var ClearRecentBtn: Button = %ClearRecentBtn
-@onready var NameField: LineEdit = %NameField
-@onready var OkBtn: Button = get_ok_button()
-
-
-func _ready() -> void:
- about_to_popup.connect(_on_about_to_popup)
- visibility_changed.connect(_on_visibility_changed)
- confirmed.connect(_on_confirmed)
-
- SettingList.item_selected.connect(_on_AnyList_item_selected.bind(SettingList))
- SettingList.item_activated.connect(_on_AnyList_item_activated.bind(SettingList))
- RecentList.item_selected.connect(_on_AnyList_item_selected.bind(RecentList))
- RecentList.item_activated.connect(_on_AnyList_item_activated.bind(RecentList))
-
- FilterField.text_changed.connect(_on_FilterField_text_changed)
- ClearRecentBtn.pressed.connect(_on_ClearRecentBtn_pressed)
- NameField.text_submitted.connect(_on_NameField_text_submitted)
-
-
-func _confirm() -> void:
- var selected_item_index: int
- var selected_item_meta: String
-
- if SettingList.is_anything_selected():
- selected_item_index = SettingList.get_selected_items()[0]
- selected_item_meta = SettingList.get_item_metadata(selected_item_index)
-
- if RecentList.is_anything_selected():
- selected_item_index = RecentList.get_selected_items()[0]
- selected_item_meta = RecentList.get_item_metadata(selected_item_index)
-
- template_selected.emit(selected_item_meta, NameField.text)
- ggsUtils.get_plugin_data().add_recent_setting(selected_item_meta)
-
-
-func _on_about_to_popup() -> void:
- OkBtn.disabled = true
- NameField.editable = true
- NameField.clear()
- FilterField.clear()
- _load_settings()
- _load_recent()
-
-
-func _on_visibility_changed() -> void:
- if visible == true:
- FilterField.grab_focus()
-
-
-func _on_confirmed() -> void:
- _confirm()
-
-
-func _on_NameField_text_submitted(_submitted_text: String) -> void:
- _confirm()
- hide()
-
-
-### Lists (General)
-
-func _deselect_other_list(list: ItemList) -> void:
- if list == SettingList:
- RecentList.deselect_all()
- else:
- SettingList.deselect_all()
-
-
-func _on_AnyList_item_selected(index: int, list: ItemList) -> void:
- OkBtn.disabled = true
- NameField.editable = false
- _deselect_other_list(list)
-
-
-func _on_AnyList_item_activated(index: int, list: ItemList) -> void:
- OkBtn.disabled = false
- NameField.editable = true
- NameField.grab_focus()
-
-
-### Setting List
-
-func _load_settings() -> void:
- SettingList.clear()
-
- var template_list: PackedStringArray = _get_all_settings()
- for template in template_list:
- var item_index: int = SettingList.add_item(template.get_file().get_basename())
- SettingList.set_item_metadata(item_index, template)
- SettingList.set_item_tooltip(item_index, template)
-
-
-func _get_all_settings() -> PackedStringArray:
- var all_settings: PackedStringArray
- var path: String = ggsUtils.get_plugin_data().dir_templates
-
- var dir: DirAccess = DirAccess.open(path)
- var templates: PackedStringArray = dir.get_files()
- for template in templates:
- template = dir.get_current_dir().path_join(template)
- all_settings.append(template)
-
- _get_settings_in_dir(dir, all_settings)
-
- return all_settings
-
-
-func _get_settings_in_dir(dir: DirAccess, all_settings: PackedStringArray) -> void:
- var base_dir: String = dir.get_current_dir()
- var subdirs: PackedStringArray = dir.get_directories()
- for subdir in subdirs:
- if subdir.begins_with("_"):
- continue
-
- dir.change_dir(base_dir.path_join(subdir))
- var templates: PackedStringArray = dir.get_files()
- for template in templates:
- template = dir.get_current_dir().path_join(template)
- all_settings.append(template)
-
- _get_settings_in_dir(dir, all_settings)
-
-
-func _filter_setting_list(filter: String) -> void:
- var to_remove: Array[int]
- _load_settings()
-
- for item_index in range(SettingList.item_count):
- var item_text: String = SettingList.get_item_text(item_index).to_lower()
-
- if not item_text.begins_with(filter.to_lower()):
- to_remove.push_front(item_index)
-
- for item_index in to_remove:
- SettingList.remove_item(item_index)
-
- SettingList.sort_items_by_text()
-
-
-func _on_FilterField_text_changed(new_text: String) -> void:
- _filter_setting_list(new_text)
- NameField.editable = false
-
-
-### Recent List
-
-func _load_recent() -> void:
- RecentList.clear()
-
- var list: Array[String] = ggsUtils.get_plugin_data().recent_settings
- for item in list:
- var item_index: int = RecentList.add_item(item.get_file().get_basename())
- RecentList.set_item_metadata(item_index, item)
- RecentList.set_item_tooltip(item_index, item)
-
-
-func _on_ClearRecentBtn_pressed() -> void:
- ggsUtils.get_plugin_data().clear_recent_settings()
- RecentList.clear()
diff --git a/editor/add_setting_window/add_setting_window.tscn b/editor/add_setting_window/add_setting_window.tscn
deleted file mode 100644
index fc89378c..00000000
--- a/editor/add_setting_window/add_setting_window.tscn
+++ /dev/null
@@ -1,91 +0,0 @@
-[gd_scene load_steps=4 format=3 uid="uid://111vt7wxn7lx"]
-
-[ext_resource type="Script" path="res://addons/ggs/editor/add_setting_window/add_setting_window.gd" id="1_338sp"]
-[ext_resource type="Texture2D" uid="uid://dbervsl0o0ifw" path="res://addons/ggs/assets/search.svg" id="1_th7u7"]
-[ext_resource type="Texture2D" uid="uid://bn0d5k8dd06qr" path="res://addons/ggs/assets/delete.svg" id="2_7ec7g"]
-
-[node name="AddSettingWindow" type="ConfirmationDialog"]
-title = "Add Setting from Template"
-size = Vector2i(550, 460)
-min_size = Vector2i(500, 450)
-ok_button_text = "Add"
-script = ExtResource("1_338sp")
-
-[node name="MainCtnr" type="VBoxContainer" parent="."]
-offset_left = 8.0
-offset_top = 8.0
-offset_right = 542.0
-offset_bottom = 411.0
-
-[node name="HBox" type="HBoxContainer" parent="MainCtnr"]
-layout_mode = 2
-size_flags_vertical = 3
-
-[node name="LeftCtnr" type="VBoxContainer" parent="MainCtnr/HBox"]
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_stretch_ratio = 0.66
-
-[node name="TopBar" type="HBoxContainer" parent="MainCtnr/HBox/LeftCtnr"]
-layout_mode = 2
-
-[node name="RecentLabel" type="Label" parent="MainCtnr/HBox/LeftCtnr/TopBar"]
-layout_mode = 2
-size_flags_vertical = 0
-text = "Recent:"
-
-[node name="ClearRecentBtn" type="Button" parent="MainCtnr/HBox/LeftCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 10
-tooltip_text = "Clear Recent"
-icon = ExtResource("2_7ec7g")
-flat = true
-
-[node name="RecentList" type="ItemList" parent="MainCtnr/HBox/LeftCtnr"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_vertical = 3
-size_flags_stretch_ratio = 0.66
-
-[node name="RightCtnr" type="VBoxContainer" parent="MainCtnr/HBox"]
-layout_mode = 2
-size_flags_horizontal = 3
-
-[node name="TopBar" type="HBoxContainer" parent="MainCtnr/HBox/RightCtnr"]
-layout_mode = 2
-size_flags_vertical = 0
-
-[node name="AllLabel" type="Label" parent="MainCtnr/HBox/RightCtnr/TopBar"]
-layout_mode = 2
-text = "All Items:"
-
-[node name="FilterField" type="LineEdit" parent="MainCtnr/HBox/RightCtnr/TopBar"]
-unique_name_in_owner = true
-custom_minimum_size = Vector2(200, 0)
-layout_mode = 2
-size_flags_horizontal = 10
-placeholder_text = "Filter Items..."
-clear_button_enabled = true
-right_icon = ExtResource("1_th7u7")
-
-[node name="SettingList" type="ItemList" parent="MainCtnr/HBox/RightCtnr"]
-unique_name_in_owner = true
-custom_minimum_size = Vector2(0, 200)
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_vertical = 3
-
-[node name="NameCtnr" type="HBoxContainer" parent="MainCtnr"]
-layout_mode = 2
-theme_override_constants/separation = 5
-
-[node name="NameLabel" type="Label" parent="MainCtnr/NameCtnr"]
-layout_mode = 2
-text = "Name:"
-
-[node name="NameField" type="LineEdit" parent="MainCtnr/NameCtnr"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_vertical = 8
diff --git a/editor/category_panel/category_list.gd b/editor/category_panel/category_list.gd
deleted file mode 100644
index 2a411c33..00000000
--- a/editor/category_panel/category_list.gd
+++ /dev/null
@@ -1,54 +0,0 @@
-@tool
-extends ItemList
-
-@onready var FSD: FileSystemDock = ggsUtils.get_file_system_dock()
-
-
-func _ready() -> void:
- item_activated.connect(_on_item_activated)
- item_selected.connect(_on_item_selected)
-
- GGS.dir_settings_change_occured.connect(_on_Global_dir_settings_change_occured)
-
- load_list()
-
-
-func load_list() -> void:
- clear()
-
- var categories: PackedStringArray = _load_categories_from_filesystem()
- for category in categories:
- add_item(category)
-
- GGS.active_category = ""
-
-
-func _update_from_file_system() -> void:
- load_list()
-
-
-func _on_item_selected(item_index: int) -> void:
- var item_text: String = get_item_text(item_index)
- GGS.active_category = item_text
-
-
-func _on_item_activated(item_index: int) -> void:
- var item_text: String = get_item_text(item_index)
- var path: String = ggsUtils.get_plugin_data().dir_settings.path_join(item_text)
- ggsUtils.get_editor_interface().select_file(path)
-
-
-func _on_Global_dir_settings_change_occured() -> void:
- _update_from_file_system()
-
-
-### Load Categories
-
-func _load_categories_from_filesystem() -> PackedStringArray:
- var dir: DirAccess = DirAccess.open(ggsUtils.get_plugin_data().dir_settings)
- var list: Array = Array(dir.get_directories()).filter(_remove_underscored)
- return PackedStringArray(list)
-
-
-func _remove_underscored(element: String) -> bool:
- return not element.begins_with("_")
diff --git a/editor/category_panel/category_panel.gd b/editor/category_panel/category_panel.gd
deleted file mode 100644
index b45cddfa..00000000
--- a/editor/category_panel/category_panel.gd
+++ /dev/null
@@ -1,49 +0,0 @@
-@tool
-extends Control
-
-@export var Notification: AcceptDialog
-
-@onready var NCF: LineEdit = %NewCatField
-@onready var ReloadBtn: Button = %ReloadBtn
-@onready var List: ItemList = %CategoryList
-
-
-func _ready() -> void:
- NCF.text_submitted.connect(_on_NCF_text_submitted)
- ReloadBtn.pressed.connect(_on_ReloadBtn_pressed)
-
-
-### Category Creation
-
-func _create_category(cat_name: String) -> void:
- var dir: DirAccess = DirAccess.open(ggsUtils.get_plugin_data().dir_settings)
- dir.make_dir(cat_name)
-
- NCF.clear()
-
-
-func _on_NCF_text_submitted(submitted_text: String) -> void:
- if (
- not submitted_text.is_valid_filename() or
- submitted_text.begins_with("_") or
- submitted_text.begins_with(".")
- ):
- Notification.purpose = Notification.Purpose.INVALID
- Notification.popup_centered()
- return
-
- var dir: DirAccess = DirAccess.open(ggsUtils.get_plugin_data().dir_settings)
- if dir.dir_exists(submitted_text):
- Notification.purpose = Notification.Purpose.ALREADY_EXISTS
- Notification.popup_centered()
- return
-
- _create_category(submitted_text)
- ggsUtils.get_resource_file_system().scan()
- List.load_list()
-
-
-### Reload Btn
-
-func _on_ReloadBtn_pressed() -> void:
- List.load_list()
diff --git a/editor/category_panel/category_panel.tscn b/editor/category_panel/category_panel.tscn
deleted file mode 100644
index bb569bfc..00000000
--- a/editor/category_panel/category_panel.tscn
+++ /dev/null
@@ -1,51 +0,0 @@
-[gd_scene load_steps=4 format=3 uid="uid://bkp77x1seytg7"]
-
-[ext_resource type="Script" path="res://addons/ggs/editor/category_panel/category_panel.gd" id="1_yu7o4"]
-[ext_resource type="Texture2D" uid="uid://ve54bl3r7ljc" path="res://addons/ggs/assets/reload.svg" id="2_so3ov"]
-[ext_resource type="Script" path="res://addons/ggs/editor/category_panel/category_list.gd" id="4_xqs08"]
-
-[node name="CategoryPanel" type="Control"]
-custom_minimum_size = Vector2(160, 0)
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-script = ExtResource("1_yu7o4")
-
-[node name="MainCtnr" type="VBoxContainer" parent="."]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-
-[node name="TopBar" type="HBoxContainer" parent="MainCtnr"]
-layout_mode = 2
-
-[node name="NewCatField" type="LineEdit" parent="MainCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-placeholder_text = "New Category..."
-clear_button_enabled = true
-
-[node name="VSep" type="VSeparator" parent="MainCtnr/TopBar"]
-layout_mode = 2
-
-[node name="ReloadBtn" type="Button" parent="MainCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-tooltip_text = "Reload List"
-icon = ExtResource("2_so3ov")
-flat = true
-icon_alignment = 1
-
-[node name="CategoryList" type="ItemList" parent="MainCtnr"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_vertical = 3
-allow_reselect = true
-script = ExtResource("4_xqs08")
diff --git a/editor/component_panel/component_panel.gd b/editor/component_panel/component_panel.gd
deleted file mode 100644
index 94779c3a..00000000
--- a/editor/component_panel/component_panel.gd
+++ /dev/null
@@ -1,91 +0,0 @@
-@tool
-extends Control
-
-@onready var GroupField: LineEdit = %GroupField
-@onready var ASI: LineEdit = %ActiveSettingIndicator
-@onready var CASBtn: Button = %ClearActiveSettingBtn
-@onready var List: ItemList = %ComponentList
-
-
-func _ready() -> void:
- List.item_activated.connect(_on_List_item_activated)
-
- CASBtn.pressed.connect(_on_CASBtn_pressed)
- GGS.active_setting_changed.connect(_on_Global_active_setting_changed)
-
- _load_list()
-
-
-func _on_CASBtn_pressed() -> void:
- GGS.active_setting = null
-
-
-func _on_Global_active_setting_changed() -> void:
- ASI.text = GGS.active_setting.name if GGS.active_setting else ""
-
-
-### List Init
-
-func _load_list() -> void:
- List.clear()
-
- var comp_list: Array[Dictionary] = _get_comp_list()
- for component in comp_list:
- var text: String = component["name"]
- var meta: String = component["scene"]
-
- var item_index: int = List.add_item(text)
- List.set_item_metadata(item_index, meta)
-
- List.sort_items_by_text()
-
-
-func _get_comp_list() -> Array[Dictionary]:
- var comp_list: Array[Dictionary]
-
- var data: ggsPluginData = ggsUtils.get_plugin_data()
- var components: PackedStringArray = DirAccess.get_directories_at(data.dir_components)
- for component in components:
- if component.begins_with("_"):
- continue
-
- var info: Dictionary
- var path: String = data.dir_components.path_join(component)
-
- info["name"] = component.capitalize()
- info["scene"] = path.path_join("%s.tscn"%component)
-
- comp_list.append(info)
-
- return comp_list
-
-
-### Component Instantiation
-
-func _on_List_item_activated(item_index: int) -> void:
- var EI: EditorInterface = ggsUtils.get_editor_interface()
- var ES: EditorSelection = EI.get_selection()
- var selected_nodes: Array[Node] = ES.get_selected_nodes()
-
- if selected_nodes.size() != 1:
- printerr("GGS - Instantiate Component: Exactly one item in the scene tree must be selected to instantiate a component.")
- return
-
- var item_meta: String = List.get_item_metadata(item_index)
- var SelectedNode: Node = selected_nodes[0]
- var ESR: Node = EI.get_edited_scene_root()
-
- var comp_scene: PackedScene = load(item_meta)
- var Component: Control = comp_scene.instantiate()
- Component.setting = GGS.active_setting
- Component.apply_on_change = ggsUtils.get_plugin_data().apply_on_changed_all
- Component.grab_focus_on_mouse_over = ggsUtils.get_plugin_data().grab_focus_on_mouse_over_all
-
- SelectedNode.add_child(Component, true)
- SelectedNode.set_editable_instance(Component, true)
- Component.owner = ESR
-
- if not GroupField.text.strip_edges().is_empty():
- Component.add_to_group(GroupField.text.strip_edges(), true)
-
- EI.save_scene()
diff --git a/editor/component_panel/component_panel.tscn b/editor/component_panel/component_panel.tscn
deleted file mode 100644
index 5ec9ccab..00000000
--- a/editor/component_panel/component_panel.tscn
+++ /dev/null
@@ -1,73 +0,0 @@
-[gd_scene load_steps=3 format=3 uid="uid://cfr2j0ekmm5bm"]
-
-[ext_resource type="Script" path="res://addons/ggs/editor/component_panel/component_panel.gd" id="1_3cgut"]
-[ext_resource type="Texture2D" uid="uid://cflcng660hsp0" path="res://addons/ggs/assets/close.svg" id="3_wh32e"]
-
-[node name="ComponentPanel" type="Control"]
-custom_minimum_size = Vector2(170, 0)
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-script = ExtResource("1_3cgut")
-
-[node name="MainCtnr" type="VBoxContainer" parent="."]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-
-[node name="TopBar" type="HBoxContainer" parent="MainCtnr"]
-layout_mode = 2
-
-[node name="GroupField" type="LineEdit" parent="MainCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-tooltip_text = "Node Group
-If not empty, newly created components are added to this node group."
-placeholder_text = "Node Group"
-clear_button_enabled = true
-
-[node name="ActiveSettingCtnr" type="HBoxContainer" parent="MainCtnr"]
-layout_mode = 2
-
-[node name="ActiveSettingIndicator" type="LineEdit" parent="MainCtnr/ActiveSettingCtnr"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-tooltip_text = "Active Setting
-If not empty, the setting displayed here will be assigned to the components you add."
-focus_mode = 0
-placeholder_text = "No Active Setting"
-editable = false
-
-[node name="ClearActiveSettingBtn" type="Button" parent="MainCtnr/ActiveSettingCtnr"]
-unique_name_in_owner = true
-layout_mode = 2
-tooltip_text = "Clear Active Setting"
-icon = ExtResource("3_wh32e")
-flat = true
-
-[node name="ComponentList" type="ItemList" parent="MainCtnr"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_vertical = 3
-allow_reselect = true
-item_count = 10
-max_columns = 2
-same_column_width = true
-item_0/text = "Arrow List"
-item_1/text = "Checkbox"
-item_2/text = "Input Btn"
-item_3/text = "Option List"
-item_4/text = "Radio List"
-item_5/text = "Slider"
-item_6/text = "Spinbox"
-item_7/text = "Switch"
-item_8/text = "Text Field"
-item_9/text = "Toggle Btn"
diff --git a/editor/input_selector/input_list.gd b/editor/input_selector/input_list.gd
deleted file mode 100644
index f65e2c06..00000000
--- a/editor/input_selector/input_list.gd
+++ /dev/null
@@ -1,52 +0,0 @@
-@tool
-extends Tree
-
-var root: TreeItem
-
-
-func load_list() -> void:
- clear()
- root = create_item()
-
- var input_map: Dictionary = _get_input_map()
- for action in input_map.keys():
- var action_item: TreeItem = _create_item(root, action)
-
- var index: int = 0
- for event in input_map[action]:
- _create_item(action_item, event.as_text(), {"event": event, "index": index})
- index += 1
-
-
-func set_collapsed_all(collapsed: bool) -> void:
- var items: Array[TreeItem] = root.get_children()
- for item in items:
- item.set_collapsed_recursive(collapsed)
-
-
-func _get_input_map() -> Dictionary:
- var input_map: Dictionary
-
- var project_file: ConfigFile = ConfigFile.new()
- project_file.load("res://project.godot")
-
- var actions: PackedStringArray = project_file.get_section_keys("input")
- for action in actions:
- var action_properties: Dictionary = project_file.get_value("input", action)
- var action_events: Array = action_properties["events"]
-
- input_map[action] = action_events
-
- return input_map
-
-
-func _create_item(parent: TreeItem, text: String, meta: Dictionary = {}) -> TreeItem:
- var created_item: TreeItem = create_item(parent)
- created_item.set_text(0, text)
-
- if meta.is_empty():
- created_item.set_selectable(0, false)
- else:
- created_item.set_metadata(0, meta)
-
- return created_item
diff --git a/editor/input_selector/input_selector.gd b/editor/input_selector/input_selector.gd
deleted file mode 100644
index 943c6a3e..00000000
--- a/editor/input_selector/input_selector.gd
+++ /dev/null
@@ -1,93 +0,0 @@
-@tool
-extends MarginContainer
-
-var inspected_obj: ggsInputSetting
-
-@onready var SelectBtn: Button = %SelectBtn
-
-@onready var SIW: ConfirmationDialog = %SelectInputWindow
-@onready var SearchField: LineEdit = %SearchField
-@onready var CollapseAllBtn: Button = %CollapseAllBtn
-@onready var ExpandAllBtn: Button = %ExpandAllBtn
-@onready var List: Tree = %InputList
-
-@onready var OkBtn: Button = SIW.get_ok_button()
-
-
-func _ready() -> void:
- SelectBtn.pressed.connect(_on_SelectBtn_pressed)
-
- SIW.about_to_popup.connect(_on_SIW_about_to_popup)
- SIW.confirmed.connect(_on_SIW_confirmed)
- SearchField.text_changed.connect(_on_SearchField_text_changed)
- CollapseAllBtn.pressed.connect(_on_CollapseAllBtn_pressed)
- ExpandAllBtn.pressed.connect(_on_ExpandAllBtn_pressed)
-
- List.item_selected.connect(_on_List_item_selected)
- List.item_activated.connect(_on_List_item_activated)
-
-
-func _on_SelectBtn_pressed() -> void:
- SIW.popup_centered()
-
-
-func _on_SIW_about_to_popup() -> void:
- List.load_list()
- OkBtn.disabled = true
- SearchField.clear()
- List.set_collapsed_all(true)
-
-
-func _on_List_item_selected() -> void:
- var selected_item: TreeItem = List.get_selected()
- OkBtn.disabled = false
-
-
-### Item Selection
-
-func _confirm(item: TreeItem) -> void:
- inspected_obj.action = item.get_parent().get_text(0)
- inspected_obj.event_index = item.get_metadata(0)["index"]
- inspected_obj.default_as_event = item.get_metadata(0)["event"]
- inspected_obj.current_as_event = item.get_metadata(0)["event"].duplicate()
-
-
-func _on_SIW_confirmed() -> void:
- var selected_item: TreeItem = List.get_selected()
- _confirm(selected_item)
-
-
-func _on_List_item_activated() -> void:
- var selected_item: TreeItem = List.get_selected()
- _confirm(selected_item)
- SIW.visible = false
-
-
-### List Filtering
-
-func _filter_list(filter: String) -> void:
- List.load_list()
- OkBtn.disabled = true
-
- filter = filter.to_lower()
- var items: Array[TreeItem] = List.root.get_children()
- for item in items:
- var item_name: String = item.get_text(0).to_lower()
- if item_name.begins_with(filter):
- continue
-
- item.free()
-
-
-func _on_SearchField_text_changed(new_text: String) -> void:
- _filter_list(new_text)
-
-
-### Collapse/Expand Buttons
-
-func _on_CollapseAllBtn_pressed() -> void:
- List.set_collapsed_all(true)
-
-
-func _on_ExpandAllBtn_pressed() -> void:
- List.set_collapsed_all(false)
diff --git a/editor/input_selector/input_selector.tscn b/editor/input_selector/input_selector.tscn
deleted file mode 100644
index 08270406..00000000
--- a/editor/input_selector/input_selector.tscn
+++ /dev/null
@@ -1,72 +0,0 @@
-[gd_scene load_steps=6 format=3 uid="uid://bqymtf8fuyj54"]
-
-[ext_resource type="Script" path="res://addons/ggs/editor/input_selector/input_selector.gd" id="1_qjksw"]
-[ext_resource type="Texture2D" uid="uid://dbervsl0o0ifw" path="res://addons/ggs/assets/search.svg" id="2_cgd6a"]
-[ext_resource type="Script" path="res://addons/ggs/editor/input_selector/input_list.gd" id="3_jsbwa"]
-[ext_resource type="Texture2D" uid="uid://l0mve5lc0okm" path="res://addons/ggs/assets/collapse_all.svg" id="3_mxhgu"]
-[ext_resource type="Texture2D" uid="uid://caajrkkuvle0e" path="res://addons/ggs/assets/expand_all.svg" id="4_3d11l"]
-
-[node name="Margin" type="MarginContainer"]
-offset_right = 100.0
-theme_override_constants/margin_top = 5
-theme_override_constants/margin_bottom = 5
-script = ExtResource("1_qjksw")
-
-[node name="InputSelector" type="VBoxContainer" parent="."]
-layout_mode = 2
-
-[node name="SelectBtn" type="Button" parent="InputSelector"]
-unique_name_in_owner = true
-layout_mode = 2
-text = "Select Input"
-
-[node name="VSeparator" type="HSeparator" parent="InputSelector"]
-layout_mode = 2
-theme_override_constants/separation = 0
-
-[node name="SelectInputWindow" type="ConfirmationDialog" parent="."]
-unique_name_in_owner = true
-title = "Select Input"
-size = Vector2i(700, 500)
-min_size = Vector2i(700, 500)
-ok_button_text = "Select"
-
-[node name="MainCtnr" type="VBoxContainer" parent="SelectInputWindow"]
-offset_left = 8.0
-offset_top = 8.0
-offset_right = 692.0
-offset_bottom = 451.0
-size_flags_horizontal = 3
-size_flags_vertical = 3
-
-[node name="TopBar" type="HBoxContainer" parent="SelectInputWindow/MainCtnr"]
-layout_mode = 2
-
-[node name="SearchField" type="LineEdit" parent="SelectInputWindow/MainCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-placeholder_text = "Filter Actions"
-clear_button_enabled = true
-right_icon = ExtResource("2_cgd6a")
-
-[node name="CollapseAllBtn" type="Button" parent="SelectInputWindow/MainCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-tooltip_text = "Collapse All"
-icon = ExtResource("3_mxhgu")
-flat = true
-
-[node name="ExpandAllBtn" type="Button" parent="SelectInputWindow/MainCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-tooltip_text = "Expand All"
-icon = ExtResource("4_3d11l")
-flat = true
-
-[node name="InputList" type="Tree" parent="SelectInputWindow/MainCtnr"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_vertical = 3
-hide_root = true
-script = ExtResource("3_jsbwa")
diff --git a/editor/main_panel/bug_btn.gd b/editor/main_panel/bug_btn.gd
deleted file mode 100644
index 9bb6ec70..00000000
--- a/editor/main_panel/bug_btn.gd
+++ /dev/null
@@ -1,12 +0,0 @@
-@tool
-extends Button
-
-const URI: String = "https://github.com/PunchablePlushie/godot-game-settings/issues"
-
-
-func _ready() -> void:
- pressed.connect(_on_pressed)
-
-
-func _on_pressed() -> void:
- OS.shell_open(URI)
diff --git a/editor/main_panel/docs_btn.gd b/editor/main_panel/docs_btn.gd
deleted file mode 100644
index 41aabc02..00000000
--- a/editor/main_panel/docs_btn.gd
+++ /dev/null
@@ -1,12 +0,0 @@
-@tool
-extends Button
-
-const URI: String = "https://github.com/PunchablePlushie/godot-game-settings/tree/main/docs/home.md"
-
-
-func _ready() -> void:
- pressed.connect(_on_pressed)
-
-
-func _on_pressed() -> void:
- OS.shell_open(URI)
diff --git a/editor/main_panel/feedback_btn.gd b/editor/main_panel/feedback_btn.gd
deleted file mode 100644
index f9ab016f..00000000
--- a/editor/main_panel/feedback_btn.gd
+++ /dev/null
@@ -1,12 +0,0 @@
-@tool
-extends Button
-
-const URI: String = "https://forms.gle/c8XQzKHEqeMqxJ3Z9"
-
-
-func _ready() -> void:
- pressed.connect(_on_pressed)
-
-
-func _on_pressed() -> void:
- OS.shell_open(URI)
diff --git a/editor/main_panel/main_panel.tscn b/editor/main_panel/main_panel.tscn
deleted file mode 100644
index 94d9ad6c..00000000
--- a/editor/main_panel/main_panel.tscn
+++ /dev/null
@@ -1,178 +0,0 @@
-[gd_scene load_steps=20 format=3 uid="uid://buovvisskoqxh"]
-
-[ext_resource type="Theme" uid="uid://c4pwg7lhukqb8" path="res://addons/ggs/editor/_theme/ggs_theme.tres" id="1_w3bfk"]
-[ext_resource type="PackedScene" uid="uid://bkp77x1seytg7" path="res://addons/ggs/editor/category_panel/category_panel.tscn" id="4_4p007"]
-[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/split_containers.gd" id="4_mplwh"]
-[ext_resource type="PackedScene" uid="uid://cfr2j0ekmm5bm" path="res://addons/ggs/editor/component_panel/component_panel.tscn" id="5_7xo6y"]
-[ext_resource type="PackedScene" uid="uid://vt5mwwxhtu3x" path="res://addons/ggs/editor/setting_panel/setting_panel.tscn" id="6_rabjj"]
-[ext_resource type="Texture2D" uid="uid://b8o243gwa707v" path="res://addons/ggs/assets/icon_mono.svg" id="6_t7de8"]
-[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/save_file_menu.gd" id="7_guojl"]
-[ext_resource type="Texture2D" uid="uid://bx8yoim3ur6h" path="res://addons/ggs/assets/save_file.svg" id="8_3r2nn"]
-[ext_resource type="Texture2D" uid="uid://cdxv6r8uy2me5" path="res://addons/ggs/assets/docs.svg" id="8_mdi0r"]
-[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/pref_btn.gd" id="9_oodag"]
-[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/docs_btn.gd" id="9_qwavr"]
-[ext_resource type="PackedScene" uid="uid://c42mh74d7l2rt" path="res://addons/ggs/editor/pref_window/pref_window.tscn" id="10_ir36c"]
-[ext_resource type="Texture2D" uid="uid://bt7gdorkvo4an" path="res://addons/ggs/assets/bug.svg" id="10_rly1w"]
-[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/bug_btn.gd" id="11_2ygfj"]
-[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/feedback_btn.gd" id="15_0jgkh"]
-[ext_resource type="Texture2D" uid="uid://c5a5taq8d2n0v" path="res://addons/ggs/assets/feedback.svg" id="16_abywd"]
-[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/progress_overlay.gd" id="16_hfs01"]
-[ext_resource type="Script" path="res://addons/ggs/editor/main_panel/notification.gd" id="18_ky7ax"]
-
-[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_jbg8d"]
-
-[node name="MainPanel" type="Control"]
-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
-theme = ExtResource("1_w3bfk")
-
-[node name="MainCtnr" type="HBoxContainer" parent="."]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-
-[node name="HSplit_0" type="HSplitContainer" parent="MainCtnr"]
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_vertical = 3
-split_offset = -315
-script = ExtResource("4_mplwh")
-
-[node name="CategoryPanel" parent="MainCtnr/HSplit_0" node_paths=PackedStringArray("Notification") instance=ExtResource("4_4p007")]
-layout_mode = 2
-size_flags_horizontal = 3
-Notification = NodePath("../../../Notification")
-
-[node name="HSplit_1" type="HSplitContainer" parent="MainCtnr/HSplit_0"]
-layout_mode = 2
-size_flags_horizontal = 3
-split_offset = 615
-script = ExtResource("4_mplwh")
-
-[node name="SettingPanel" parent="MainCtnr/HSplit_0/HSplit_1" node_paths=PackedStringArray("Notification") instance=ExtResource("6_rabjj")]
-layout_mode = 2
-Notification = NodePath("../../../../Notification")
-
-[node name="ComponentPanel" parent="MainCtnr/HSplit_0/HSplit_1" instance=ExtResource("5_7xo6y")]
-layout_mode = 2
-
-[node name="VSeparator" type="VSeparator" parent="MainCtnr"]
-layout_mode = 2
-
-[node name="BtnCtnr" type="VBoxContainer" parent="MainCtnr"]
-layout_mode = 2
-size_flags_horizontal = 8
-
-[node name="TopCtnr" type="VBoxContainer" parent="MainCtnr/BtnCtnr"]
-layout_mode = 2
-
-[node name="SaveFileMenu" type="MenuButton" parent="MainCtnr/BtnCtnr/TopCtnr"]
-layout_mode = 2
-tooltip_text = "Save File"
-icon = ExtResource("8_3r2nn")
-item_count = 4
-popup/item_0/text = "Open Save File"
-popup/item_0/id = 0
-popup/item_1/text = ""
-popup/item_1/id = 999
-popup/item_1/separator = true
-popup/item_2/text = "Remake from Current"
-popup/item_2/id = 1
-popup/item_3/text = "Remake from Default"
-popup/item_3/id = 2
-script = ExtResource("7_guojl")
-
-[node name="PrefBtn" type="Button" parent="MainCtnr/BtnCtnr/TopCtnr"]
-layout_mode = 2
-size_flags_vertical = 10
-tooltip_text = "Preferences"
-icon = ExtResource("6_t7de8")
-flat = true
-script = ExtResource("9_oodag")
-
-[node name="BotCtnr" type="VBoxContainer" parent="MainCtnr/BtnCtnr"]
-layout_mode = 2
-size_flags_vertical = 10
-
-[node name="DocsBtn" type="Button" parent="MainCtnr/BtnCtnr/BotCtnr"]
-layout_mode = 2
-size_flags_vertical = 10
-tooltip_text = "View Documentation"
-icon = ExtResource("8_mdi0r")
-flat = true
-script = ExtResource("9_qwavr")
-
-[node name="BugBtn" type="Button" parent="MainCtnr/BtnCtnr/BotCtnr"]
-layout_mode = 2
-size_flags_vertical = 10
-tooltip_text = "Report an Issue"
-icon = ExtResource("10_rly1w")
-flat = true
-script = ExtResource("11_2ygfj")
-
-[node name="FeedbackBtn" type="Button" parent="MainCtnr/BtnCtnr/BotCtnr"]
-layout_mode = 2
-tooltip_text = "Send Feedback"
-icon = ExtResource("16_abywd")
-flat = true
-script = ExtResource("15_0jgkh")
-
-[node name="ProgressOverlay" type="PanelContainer" parent="."]
-visible = false
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-mouse_default_cursor_shape = 4
-theme_override_styles/panel = SubResource("StyleBoxEmpty_jbg8d")
-script = ExtResource("16_hfs01")
-label_save_file_current = "Remaking Save File from Current Values"
-label_save_file_default = "Remaking Save File from Default Values"
-label_add_multiple_settings = "Adding Setting(s)"
-
-[node name="ProgBG" type="ColorRect" parent="ProgressOverlay"]
-layout_mode = 2
-color = Color(0, 0, 0, 0.784314)
-
-[node name="Center" type="CenterContainer" parent="ProgressOverlay"]
-layout_mode = 2
-
-[node name="VBox" type="VBoxContainer" parent="ProgressOverlay/Center"]
-layout_mode = 2
-
-[node name="ProgLabel" type="Label" parent="ProgressOverlay/Center/VBox"]
-unique_name_in_owner = true
-layout_mode = 2
-text = "Remaking Save File from Default Values"
-
-[node name="ProgBar" type="ProgressBar" parent="ProgressOverlay/Center/VBox"]
-unique_name_in_owner = true
-custom_minimum_size = Vector2(250, 0)
-layout_mode = 2
-mouse_default_cursor_shape = 4
-
-[node name="PrefWindow" parent="." instance=ExtResource("10_ir36c")]
-unique_name_in_owner = true
-
-[node name="Notification" type="AcceptDialog" parent="."]
-size = Vector2i(687, 100)
-unresizable = true
-max_size = Vector2i(700, 16384)
-dialog_autowrap = true
-script = ExtResource("18_ky7ax")
-title_invalid = "Invalid Item Name"
-title_already_exists = "Item Already Exists"
-msg_invalid = "The item name must be a valid file name and cannot start with an underscore (\"_\") or dot (\".\")."
-msg_already_exists = "An item with this name already exists."
diff --git a/editor/main_panel/notification.gd b/editor/main_panel/notification.gd
deleted file mode 100644
index 92674294..00000000
--- a/editor/main_panel/notification.gd
+++ /dev/null
@@ -1,26 +0,0 @@
-@tool
-extends AcceptDialog
-
-enum Purpose {INVALID, ALREADY_EXISTS}
-
-@export_group("Title", "title_")
-@export var title_invalid: String
-@export var title_already_exists: String
-@export_group("Message", "msg_")
-@export_multiline var msg_invalid: String
-@export_multiline var msg_already_exists: String
-
-
-var purpose: int : set = set_purpose
-
-
-func set_purpose(value: int) -> void:
- purpose = value
-
- match value:
- Purpose.INVALID:
- title = title_invalid
- dialog_text = msg_invalid
- Purpose.ALREADY_EXISTS:
- title = title_already_exists
- dialog_text = msg_already_exists
diff --git a/editor/main_panel/pref_btn.gd b/editor/main_panel/pref_btn.gd
deleted file mode 100644
index 336a0da0..00000000
--- a/editor/main_panel/pref_btn.gd
+++ /dev/null
@@ -1,12 +0,0 @@
-@tool
-extends Button
-
-@onready var PrefWindow: Window = %PrefWindow
-
-
-func _ready() -> void:
- pressed.connect(_on_pressed)
-
-
-func _on_pressed() -> void:
- PrefWindow.popup_centered(PrefWindow.min_size)
diff --git a/editor/main_panel/progress_overlay.gd b/editor/main_panel/progress_overlay.gd
deleted file mode 100644
index 1c6a38d9..00000000
--- a/editor/main_panel/progress_overlay.gd
+++ /dev/null
@@ -1,48 +0,0 @@
-@tool
-extends PanelContainer
-
-@export_multiline var label_save_file_current: String
-@export_multiline var label_save_file_default: String
-@export_multiline var label_add_multiple_settings: String
-
-var type: int
-
-@onready var ProgLabel: Label = %ProgLabel
-@onready var ProgBar: ProgressBar = %ProgBar
-
-
-func _ready() -> void:
- GGS.progress_started.connect(_on_Global_progress_started)
- GGS.progress_advanced.connect(_on_Global_progress_advanced)
- GGS.progress_ended.connect(_on_Global_progress_ended)
-
- visible = false
- ProgBar.value = 0
-
-
-func _on_Global_progress_started(progress_type: int) -> void:
- visible = true
- ProgBar.visible = true
- type = progress_type
-
- match type:
- GGS.Progress.SAVE_FILE_CURRENT:
- ProgLabel.text = label_save_file_current
- GGS.Progress.SAVE_FILE_DEFAULT:
- ProgLabel.text = label_save_file_default
- GGS.Progress.ADD_SETTINGS:
- ProgLabel.text = label_add_multiple_settings
- ProgBar.visible = false
-
-
-
-func _on_Global_progress_ended() -> void:
- # A small delay to make sure progress_ended happens after progress_started
- await get_tree().create_timer(0.01).timeout
-
- visible = false
- ProgBar.value = 0
-
-
-func _on_Global_progress_advanced(progress: float) -> void:
- ProgBar.value = progress
diff --git a/editor/main_panel/save_file_menu.gd b/editor/main_panel/save_file_menu.gd
deleted file mode 100644
index 2a10139f..00000000
--- a/editor/main_panel/save_file_menu.gd
+++ /dev/null
@@ -1,28 +0,0 @@
-@tool
-extends MenuButton
-
-enum MenuItems {OPEN, REMAKE_CURRENT, REMAKE_DEFAULT}
-
-var Menu: PopupMenu = get_popup()
-
-
-func _ready() -> void:
- Menu.id_pressed.connect(_on_Menu_id_pressed)
-
-
-func _open_save_file() -> void:
- var data: ggsPluginData = ggsUtils.get_plugin_data()
- var path: String = ProjectSettings.globalize_path(data.dir_save_file)
- var err: Error = OS.shell_open(path)
- if err != OK:
- printerr("GGS - Open Save File: An error has occured while opening the file. Code: %s"%[error_string(err)])
-
-
-func _on_Menu_id_pressed(id: int) -> void:
- match id:
- MenuItems.OPEN:
- _open_save_file()
- MenuItems.REMAKE_CURRENT:
- GGS.request_update_save_file()
- MenuItems.REMAKE_DEFAULT:
- GGS.request_update_save_file_default()
diff --git a/editor/main_panel/split_containers.gd b/editor/main_panel/split_containers.gd
deleted file mode 100644
index d87e4219..00000000
--- a/editor/main_panel/split_containers.gd
+++ /dev/null
@@ -1,24 +0,0 @@
-@tool
-extends HSplitContainer
-
-@onready var property: String = _get_property()
-
-
-func _ready() -> void:
- dragged.connect(_on_dragged)
-
- var data: ggsPluginData = ggsUtils.get_plugin_data()
- split_offset = data.get(property)
-
-
-### Private
-func _get_property() -> StringName:
- return "split_offset_%s"%name.split("_")[1]
-
-
-### Signals
-func _on_dragged(offset: int) -> void:
- clamp_split_offset()
-
- var data: ggsPluginData = ggsUtils.get_plugin_data()
- data.set_property(property, offset)
diff --git a/editor/main_panel/update_theme_btn.gd b/editor/main_panel/update_theme_btn.gd
deleted file mode 100644
index 32e736d6..00000000
--- a/editor/main_panel/update_theme_btn.gd
+++ /dev/null
@@ -1,12 +0,0 @@
-@tool
-extends Button
-
-@onready var ggs_theme: Theme = preload("res://addons/ggs/editor/_theme/ggs_theme.tres")
-
-
-func _ready() -> void:
- pressed.connect(_on_pressed)
-
-
-func _on_pressed() -> void:
- ggs_theme.update()
diff --git a/editor/pref_window/pref_window.gd b/editor/pref_window/pref_window.gd
deleted file mode 100644
index 92a41831..00000000
--- a/editor/pref_window/pref_window.gd
+++ /dev/null
@@ -1,177 +0,0 @@
-@tool
-extends Window
-
-enum DirTarget {SETTINGS, COMPONENTS, TEMPLATES}
-enum ConfirmPurpose {RESET, OK}
-
-const THEME: Theme = preload("res://addons/ggs/editor/_theme/ggs_theme.tres")
-const TEMPLATE: Script = preload("res://addons/ggs/template.gd")
-const GGS_SCENE: String = "res://addons/ggs/classes/global/ggs.tscn"
-
-@export_multiline var reset_text: String
-@export_multiline var ok_text: String
-
-@onready var OkBtn: Button = %OkBtn
-@onready var CancelBtn: Button = %CancelBtn
-
-@onready var SDF: LineEdit = %SettingDirField
-@onready var CDF: LineEdit = %CompDirField
-@onready var TDF: LineEdit = %TemplatesDirField
-@onready var SFNF: LineEdit = %SaveFileNameField
-@onready var SFEF: LineEdit = %SaveFileExtensionField
-
-@onready var SDB: Button = %SettingDirBtn
-@onready var CDB: Button = %CompDirBtn
-@onready var TDB: Button = %TemplatesDirBtn
-@onready var DSW: FileDialog = $DirSelectionWindow
-
-@onready var ApplyOnChanged: CheckBox = %ApplyOnChanged
-@onready var GrabFocusOnMouseOver: CheckBox = %GrabFocusOnMouseOver
-@onready var SetSFXBtn: Button = %SetSFXBtn
-
-@onready var UpdateThemeBtn: Button = %UpdateThemeBtn
-@onready var BaseTemplateBtn: Button = %BaseTemplateBtn
-@onready var ResetBtn: Button = %ResetBtn
-@onready var CRW: ConfirmationDialog = $ConfirmWindow
-
-@onready var VersionBtn: Button = %VersionBtn
-@onready var ChangelogBtn: Button = %ChangelogBtn
-
-
-func _ready() -> void:
- about_to_popup.connect(_on_about_to_popup)
- close_requested.connect(_on_close_requested)
- CancelBtn.pressed.connect(_on_close_requested)
- OkBtn.pressed.connect(_on_OkBtn_pressed)
-
- SDB.pressed.connect(_on_AnyDirectoryBtn_pressed.bind(SDB))
- CDB.pressed.connect(_on_AnyDirectoryBtn_pressed.bind(CDB))
- TDB.pressed.connect(_on_AnyDirectoryBtn_pressed.bind(TDB))
- DSW.dir_selected.connect(_on_DSW_dir_selected)
-
- UpdateThemeBtn.pressed.connect(_on_UpdateThemeBtn_pressed)
- BaseTemplateBtn.pressed.connect(_on_BaseTemplateBtn_pressed)
- ResetBtn.pressed.connect(_on_ResetBtn_pressed)
- CRW.confirmed.connect(_on_CRW_confirmed)
-
- SetSFXBtn.pressed.connect(_on_SetSFXBtn_pressed)
-
- VersionBtn.pressed.connect(_on_VersionBtn_pressed)
- ChangelogBtn.pressed.connect(_on_ChangelogBtn_pressed)
-
- hide()
-
-
-### Info Buttons
-
-func _on_VersionBtn_pressed() -> void:
- var URI: String = "https://github.com/PunchablePlushie/godot-game-settings/releases"
- OS.shell_open(URI)
-
-
-func _on_ChangelogBtn_pressed() -> void:
- var URI: String = "https://github.com/PunchablePlushie/godot-game-settings/tree/main/docs/changelog.md"
- OS.shell_open(URI)
-
-
-### Fields
-
-func _init_values() -> void:
- var data: ggsPluginData = ggsUtils.get_plugin_data()
- SDF.text = data.dir_settings
- CDF.text = data.dir_components
- TDF.text = data.dir_templates
- ApplyOnChanged.button_pressed = data.apply_on_changed_all
- GrabFocusOnMouseOver.button_pressed = data.grab_focus_on_mouse_over_all
-
- var value: String = data.dir_save_file
- SFNF.text = value.get_file().get_basename()
- SFEF.text = value.get_extension()
-
-
-func _on_AnyDirectoryBtn_pressed(src: Button) -> void:
- var target: String
-
- match src:
- SDB:
- DSW.set_meta("target", DirTarget.SETTINGS)
- CDB:
- DSW.set_meta("target", DirTarget.COMPONENTS)
- TDB:
- DSW.set_meta("target", DirTarget.TEMPLATES)
-
- DSW.invalidate()
- DSW.popup_centered()
-
-
-func _on_DSW_dir_selected(dir: String) -> void:
- var target_field: LineEdit
- match DSW.get_meta("target"):
- DirTarget.SETTINGS:
- target_field = SDF
- DirTarget.COMPONENTS:
- target_field = CDF
- DirTarget.TEMPLATES:
- target_field = TDF
-
- target_field.text = dir
-
-
-### Buttons
-
-func _on_SetSFXBtn_pressed() -> void:
- ggsUtils.get_editor_interface().open_scene_from_path(GGS_SCENE)
- hide()
-
-
-func _on_UpdateThemeBtn_pressed() -> void:
- THEME.update()
-
-
-func _on_BaseTemplateBtn_pressed() -> void:
- ggsUtils.get_editor_interface().inspect_object(TEMPLATE)
- hide()
-
-
-func _on_ResetBtn_pressed() -> void:
- CRW.dialog_text = reset_text
- CRW.set_meta("purpose", ConfirmPurpose.RESET)
- CRW.popup_centered()
-
-
-func _on_OkBtn_pressed() -> void:
- CRW.dialog_text = ok_text
- CRW.set_meta("purpose", ConfirmPurpose.OK)
- CRW.popup_centered()
-
-
-func _on_CRW_confirmed() -> void:
- match CRW.get_meta("purpose"):
- ConfirmPurpose.RESET:
- ggsUtils.get_plugin_data().reset()
-
- hide()
- ggsUtils.get_editor_interface().set_plugin_enabled("ggs", false)
- ConfirmPurpose.OK:
- var data: ggsPluginData = ggsUtils.get_plugin_data()
- data.set_property("dir_settings", SDF.text)
- data.set_property("dir_components", CDF.text)
- data.set_property("dir_templates", TDF.text)
- data.set_property("apply_on_changed_all", ApplyOnChanged.button_pressed)
- data.set_property("grab_focus_on_mouse_over_all", GrabFocusOnMouseOver.button_pressed)
-
- var value: String = "user://%s.%s"%[SFNF.text, SFEF.text]
- data.set_property("dir_save_file", value)
-
- hide()
- ggsUtils.get_editor_interface().set_plugin_enabled("ggs", false)
-
-
-### Window Functionalities
-
-func _on_about_to_popup() -> void:
- _init_values()
-
-
-func _on_close_requested() -> void:
- hide()
diff --git a/editor/pref_window/pref_window.tscn b/editor/pref_window/pref_window.tscn
deleted file mode 100644
index 73876675..00000000
--- a/editor/pref_window/pref_window.tscn
+++ /dev/null
@@ -1,300 +0,0 @@
-[gd_scene load_steps=5 format=3 uid="uid://c42mh74d7l2rt"]
-
-[ext_resource type="Script" path="res://addons/ggs/editor/pref_window/pref_window.gd" id="1_ihv6i"]
-[ext_resource type="Texture2D" uid="uid://badl61ealw70o" path="res://addons/ggs/assets/file_dialog.svg" id="2_qx4su"]
-[ext_resource type="Texture2D" uid="uid://bk0u7p6a1apta" path="res://addons/ggs/assets/icon_mini.svg" id="3_ggsp5"]
-
-[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_ki5am"]
-
-[node name="PrefWindow" type="Window"]
-title = "GGS Preferences"
-position = Vector2i(0, 36)
-size = Vector2i(650, 500)
-visible = false
-wrap_controls = true
-exclusive = true
-min_size = Vector2i(650, 500)
-script = ExtResource("1_ihv6i")
-reset_text = "Are you sure you want to reset settings?
-A plugin restart is required and the plugin will be disabled automatically if confirmed."
-ok_text = "Confirm changes?
-A plugin restart is required and the plugin will be disabled automatically if confirmed."
-
-[node name="BgPanel" type="PanelContainer" parent="."]
-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
-theme_type_variation = &"PrefWindowBG"
-
-[node name="Margin" type="MarginContainer" parent="BgPanel"]
-layout_mode = 2
-theme_override_constants/margin_left = 5
-theme_override_constants/margin_top = 5
-theme_override_constants/margin_right = 5
-theme_override_constants/margin_bottom = 5
-
-[node name="MainCtnr" type="VBoxContainer" parent="BgPanel/Margin"]
-layout_mode = 2
-
-[node name="ScrollCtnr" type="ScrollContainer" parent="BgPanel/Margin/MainCtnr"]
-layout_mode = 2
-size_flags_vertical = 3
-follow_focus = true
-horizontal_scroll_mode = 0
-
-[node name="SettingsCtnr" type="VBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr"]
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_vertical = 3
-
-[node name="DirectoriesSection" type="VBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr"]
-custom_minimum_size = Vector2(0, 150)
-layout_mode = 2
-
-[node name="SectionLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection"]
-layout_mode = 2
-text = "Directories"
-horizontal_alignment = 1
-
-[node name="HSep" type="HSeparator" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection"]
-layout_mode = 2
-
-[node name="SettingsDir" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection"]
-layout_mode = 2
-
-[node name="SettingDirLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SettingsDir"]
-custom_minimum_size = Vector2(180, 0)
-layout_mode = 2
-text = "Settings:"
-
-[node name="SettingDirField" type="LineEdit" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SettingsDir"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-caret_blink = true
-caret_blink_interval = 0.5
-
-[node name="SettingDirBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SettingsDir"]
-unique_name_in_owner = true
-layout_mode = 2
-icon = ExtResource("2_qx4su")
-
-[node name="ComponentDir" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection"]
-layout_mode = 2
-
-[node name="CompDirLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/ComponentDir"]
-custom_minimum_size = Vector2(180, 0)
-layout_mode = 2
-text = "Components:"
-
-[node name="CompDirField" type="LineEdit" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/ComponentDir"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-caret_blink = true
-caret_blink_interval = 0.5
-
-[node name="CompDirBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/ComponentDir"]
-unique_name_in_owner = true
-layout_mode = 2
-icon = ExtResource("2_qx4su")
-
-[node name="TemplatesDir" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection"]
-layout_mode = 2
-
-[node name="TemplatesDirLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/TemplatesDir"]
-custom_minimum_size = Vector2(180, 0)
-layout_mode = 2
-text = "Templates:"
-
-[node name="TemplatesDirField" type="LineEdit" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/TemplatesDir"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-caret_blink = true
-caret_blink_interval = 0.5
-
-[node name="TemplatesDirBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/TemplatesDir"]
-unique_name_in_owner = true
-layout_mode = 2
-icon = ExtResource("2_qx4su")
-
-[node name="SaveFileDir" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection"]
-layout_mode = 2
-size_flags_vertical = 8
-
-[node name="SaveFileDirLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SaveFileDir"]
-custom_minimum_size = Vector2(180, 0)
-layout_mode = 2
-text = "Save File:"
-
-[node name="HBox" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SaveFileDir"]
-layout_mode = 2
-size_flags_horizontal = 3
-
-[node name="SaveFileBaseDirLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SaveFileDir/HBox"]
-layout_mode = 2
-size_flags_horizontal = 0
-text = "user://"
-
-[node name="SaveFileNameField" type="LineEdit" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SaveFileDir/HBox"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-placeholder_text = "file_name"
-
-[node name="SaveFileDotLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SaveFileDir/HBox"]
-layout_mode = 2
-size_flags_horizontal = 0
-text = "."
-
-[node name="SaveFileExtensionField" type="LineEdit" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/DirectoriesSection/SaveFileDir/HBox"]
-unique_name_in_owner = true
-custom_minimum_size = Vector2(100, 0)
-layout_mode = 2
-placeholder_text = "extension"
-
-[node name="ComponentsSection" type="VBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr"]
-layout_mode = 2
-
-[node name="HSep0" type="HSeparator" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/ComponentsSection"]
-layout_mode = 2
-
-[node name="SectionLabel" type="Label" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/ComponentsSection"]
-layout_mode = 2
-text = "Components"
-horizontal_alignment = 1
-
-[node name="HSep1" type="HSeparator" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/ComponentsSection"]
-layout_mode = 2
-
-[node name="ApplyOnChanged" type="CheckBox" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/ComponentsSection"]
-unique_name_in_owner = true
-layout_mode = 2
-text = "Set apply_on_changed to true by default."
-
-[node name="GrabFocusOnMouseOver" type="CheckBox" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/ComponentsSection"]
-unique_name_in_owner = true
-layout_mode = 2
-text = "Set grab_focus_on_mouse_over to true by default."
-
-[node name="SetSFXBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/ComponentsSection"]
-unique_name_in_owner = true
-layout_mode = 2
-text = "Set Component Sound Effects"
-
-[node name="MiscSection" type="VBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr"]
-layout_mode = 2
-size_flags_vertical = 0
-
-[node name="HSep" type="HSeparator" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/MiscSection"]
-layout_mode = 2
-
-[node name="HBox" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/MiscSection"]
-layout_mode = 2
-
-[node name="UpdateThemeBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/MiscSection/HBox"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-tooltip_text = "Update the GGS editor theme to match your current Godot editor theme."
-text = "Update Theme"
-
-[node name="BaseTemplateBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/MiscSection/HBox"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-text = "Edit Base Template"
-
-[node name="ResetBtn" type="Button" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr/MiscSection/HBox"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_vertical = 10
-text = "Reset"
-
-[node name="HSep" type="HSeparator" parent="BgPanel/Margin/MainCtnr/ScrollCtnr/SettingsCtnr"]
-layout_mode = 2
-
-[node name="FooterCtnr" type="VBoxContainer" parent="BgPanel/Margin/MainCtnr"]
-layout_mode = 2
-size_flags_vertical = 8
-
-[node name="HSep0" type="HSeparator" parent="BgPanel/Margin/MainCtnr/FooterCtnr"]
-layout_mode = 2
-
-[node name="DisclaimerLabel" type="Label" parent="BgPanel/Margin/MainCtnr/FooterCtnr"]
-custom_minimum_size = Vector2(0, 21)
-layout_mode = 2
-size_flags_vertical = 8
-theme_override_styles/normal = SubResource("StyleBoxEmpty_ki5am")
-text = "※ All changes take effect after a plugin restart."
-
-[node name="HSep1" type="HSeparator" parent="BgPanel/Margin/MainCtnr/FooterCtnr"]
-layout_mode = 2
-
-[node name="HBox" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/FooterCtnr"]
-layout_mode = 2
-
-[node name="InfoCtnr" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox"]
-layout_mode = 2
-size_flags_horizontal = 0
-theme_override_constants/separation = 2
-
-[node name="PluginInfo" type="Button" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox/InfoCtnr"]
-layout_mode = 2
-size_flags_horizontal = 3
-focus_mode = 0
-mouse_filter = 2
-theme_override_constants/h_separation = 5
-text = "Godot Game Settings"
-icon = ExtResource("3_ggsp5")
-flat = true
-alignment = 0
-
-[node name="VersionBtn" type="Button" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox/InfoCtnr"]
-unique_name_in_owner = true
-layout_mode = 2
-tooltip_text = "View Release"
-text = "3.1.0"
-
-[node name="ChangelogBtn" type="Button" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox/InfoCtnr"]
-unique_name_in_owner = true
-layout_mode = 2
-tooltip_text = "View Changelog"
-text = "Changelog"
-
-[node name="BtnCtnr" type="HBoxContainer" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox"]
-layout_mode = 2
-size_flags_horizontal = 10
-
-[node name="OkBtn" type="Button" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox/BtnCtnr"]
-unique_name_in_owner = true
-custom_minimum_size = Vector2(50, 0)
-layout_mode = 2
-size_flags_horizontal = 10
-text = "OK"
-
-[node name="CancelBtn" type="Button" parent="BgPanel/Margin/MainCtnr/FooterCtnr/HBox/BtnCtnr"]
-unique_name_in_owner = true
-custom_minimum_size = Vector2(50, 0)
-layout_mode = 2
-size_flags_horizontal = 10
-text = "Cancel
-"
-
-[node name="DirSelectionWindow" type="FileDialog" parent="."]
-title = "Open a Directory"
-size = Vector2i(600, 500)
-min_size = Vector2i(600, 500)
-ok_button_text = "Select Current Folder"
-file_mode = 2
-metadata/target = 0
-
-[node name="ConfirmWindow" type="ConfirmationDialog" parent="."]
-size = Vector2i(497, 135)
-metadata/purpose = 0
diff --git a/editor/setting_panel/groupless.gd b/editor/setting_panel/groupless.gd
deleted file mode 100644
index 0ebf3a38..00000000
--- a/editor/setting_panel/groupless.gd
+++ /dev/null
@@ -1,14 +0,0 @@
-@tool
-extends PanelContainer
-
-@onready var MainCtnr: HFlowContainer = $MainCtnr
-
-
-func clear() -> void:
- var children: Array[Node] = MainCtnr.get_children()
- for child in children:
- child.queue_free()
-
-
-func add_item(item: Button) -> void:
- MainCtnr.add_child(item)
diff --git a/editor/setting_panel/setting_group/setting_group.gd b/editor/setting_panel/setting_group/setting_group.gd
deleted file mode 100644
index ea2b583a..00000000
--- a/editor/setting_panel/setting_group/setting_group.gd
+++ /dev/null
@@ -1,24 +0,0 @@
-@tool
-extends PanelContainer
-class_name ggsSettingGroup
-
-var path: String
-
-@onready var GroupName: CheckBox = $MainCtnr/GroupName
-@onready var ItemCtnr: HFlowContainer = $MainCtnr/ItemCtnr
-
-
-func add_item(item: Button) -> void:
- ItemCtnr.add_child(item)
-
-
-func set_group_name(group_name: String) -> void:
- GroupName.text = group_name
-
-
-func set_checked(checked: bool) -> void:
- GroupName.button_pressed = checked
-
-
-func get_checked() -> bool:
- return GroupName.button_pressed
diff --git a/editor/setting_panel/setting_group/setting_group.tscn b/editor/setting_panel/setting_group/setting_group.tscn
deleted file mode 100644
index bbce967f..00000000
--- a/editor/setting_panel/setting_group/setting_group.tscn
+++ /dev/null
@@ -1,22 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://d2qf13e27gjdi"]
-
-[ext_resource type="Script" path="res://addons/ggs/editor/setting_panel/setting_group/setting_group.gd" id="1_yot62"]
-
-[node name="SettingGroup" type="PanelContainer"]
-custom_minimum_size = Vector2(150, 0)
-size_flags_horizontal = 3
-theme_type_variation = &"SettingItemBG"
-script = ExtResource("1_yot62")
-
-[node name="MainCtnr" type="VBoxContainer" parent="."]
-layout_mode = 2
-
-[node name="GroupName" type="CheckBox" parent="MainCtnr"]
-layout_mode = 2
-text_overrun_behavior = 3
-
-[node name="HSep" type="HSeparator" parent="MainCtnr"]
-layout_mode = 2
-
-[node name="ItemCtnr" type="HFlowContainer" parent="MainCtnr"]
-layout_mode = 2
diff --git a/editor/setting_panel/setting_item/setting_item.gd b/editor/setting_panel/setting_item/setting_item.gd
deleted file mode 100644
index 9bf71346..00000000
--- a/editor/setting_panel/setting_item/setting_item.gd
+++ /dev/null
@@ -1,39 +0,0 @@
-@tool
-extends Button
-class_name ggsSettingItem
-
-var path: String
-var btn_group: ButtonGroup
-
-
-func _ready() -> void:
- toggled.connect(_on_toggled)
- gui_input.connect(_on_gui_input)
-
- button_group = btn_group
-
-
-func _on_toggled(button_state: bool) -> void:
- if button_state == false:
- return
-
- if not FileAccess.file_exists(path):
- printerr("GGS - Inspect Setting: The setting resource (%s.tres) could not be found."%text)
- ggsUtils.get_editor_interface().inspect_object(null)
- return
-
- var setting_res: ggsSetting = load(path)
-
- if setting_res is ggsInputSetting:
- setting_res.update_current_as_event()
-
- GGS.active_setting = setting_res
- ggsUtils.get_editor_interface().inspect_object(setting_res)
-
-
-func _on_gui_input(event: InputEvent) -> void:
- if (
- event is InputEventMouseButton and
- event.button_index == MOUSE_BUTTON_RIGHT
- ):
- ggsUtils.get_editor_interface().select_file(path)
diff --git a/editor/setting_panel/setting_item/setting_item.tscn b/editor/setting_panel/setting_item/setting_item.tscn
deleted file mode 100644
index 43cbf91b..00000000
--- a/editor/setting_panel/setting_item/setting_item.tscn
+++ /dev/null
@@ -1,7 +0,0 @@
-[gd_scene load_steps=2 format=3 uid="uid://urg2uin42f3w"]
-
-[ext_resource type="Script" path="res://addons/ggs/editor/setting_panel/setting_item/setting_item.gd" id="1_pwscl"]
-
-[node name="SettingItem" type="Button"]
-toggle_mode = true
-script = ExtResource("1_pwscl")
diff --git a/editor/setting_panel/setting_list.gd b/editor/setting_panel/setting_list.gd
deleted file mode 100644
index 04d918ae..00000000
--- a/editor/setting_panel/setting_list.gd
+++ /dev/null
@@ -1,123 +0,0 @@
-@tool
-extends ScrollContainer
-
-const setting_item_scn: PackedScene = preload("./setting_item/setting_item.tscn")
-const setting_group_scn: PackedScene = preload("./setting_group/setting_group.tscn")
-
-var cur_path: String
-var btn_group: ButtonGroup = ButtonGroup.new()
-
-@onready var MainCtnr: HFlowContainer = $PanelCtnr/MainCtnr
-@onready var GrouplessCtnr: PanelContainer = $PanelCtnr/MainCtnr/GroupLess
-
-
-func _ready() -> void:
- GGS.active_category_changed.connect(_on_Global_active_category_changed)
-
-
-func load_list() -> void:
- _clear()
-
- var item_list: Dictionary = _get_item_list()
- var base_dir: String = ggsUtils.get_plugin_data().dir_settings.path_join(GGS.active_category)
-
- GrouplessCtnr.visible = !item_list["settings"].is_empty()
- for setting in item_list["settings"]:
- if setting.ends_with(".gd"):
- continue
-
- var setting_name: String = setting.get_basename()
- cur_path = base_dir.path_join(setting)
- _add_item(setting_name, GrouplessCtnr, cur_path)
-
- for group in item_list["groups"]:
- cur_path = base_dir.path_join(group)
- var parent: ggsSettingGroup = _add_group(group, cur_path)
-
- var dir: DirAccess = DirAccess.open(cur_path)
- var settings: PackedStringArray = dir.get_files()
- for setting in settings:
- if setting.ends_with(".gd"):
- continue
-
- var setting_name: String = setting.get_basename()
- cur_path = dir.get_current_dir().path_join(setting)
- _add_item(setting_name, parent, cur_path)
-
-
-func get_selected_groups() -> Array[Node]:
- var result: Array[Node]
-
- var child_count: int = MainCtnr.get_child_count()
- for child_index in range(child_count):
- if child_index == 0:
- continue
-
- var child: ggsSettingGroup = MainCtnr.get_child(child_index)
- var group_is_checked: bool = child.get_checked()
- if group_is_checked:
- result.append(child)
-
- return result
-
-
-func set_checked_all(checked: bool) -> void:
- var child_count: int = MainCtnr.get_child_count()
- for child_index in range(child_count):
- if child_index == 0:
- continue
-
- MainCtnr.get_child(child_index).set_checked(checked)
-
-
-func _clear() -> void:
- btn_group = ButtonGroup.new()
- GrouplessCtnr.visible = false
- GGS.active_setting = null
-
- var child_count: int = MainCtnr.get_child_count()
- for child_index in range(child_count):
- if child_index == 0:
- MainCtnr.get_child(child_index).clear()
- continue
-
- MainCtnr.get_child(child_index).queue_free()
-
-
-func _add_item(setting: String, parent: PanelContainer, path: String) -> void:
- var NewItem: ggsSettingItem = setting_item_scn.instantiate()
- NewItem.text = setting
- NewItem.path = path
- NewItem.btn_group = btn_group
-
- parent.add_item(NewItem)
-
-
-func _add_group(group: String, path: String) -> ggsSettingGroup:
- var NewGroup: ggsSettingGroup = setting_group_scn.instantiate()
- NewGroup.path = path
-
- MainCtnr.add_child(NewGroup)
- NewGroup.set_group_name(group)
- return NewGroup
-
-
-func _on_Global_active_category_changed() -> void:
- if GGS.active_category.is_empty():
- _clear()
- else:
- load_list()
-
-
-### Get Item List
-
-func _get_item_list() -> Dictionary:
- cur_path = ggsUtils.get_plugin_data().dir_settings.path_join(GGS.active_category)
- var dir: DirAccess = DirAccess.open(cur_path)
- var settings: PackedStringArray = dir.get_files()
- var groups: Array = Array(dir.get_directories()).filter(_remove_underscored)
- return {"settings": settings, "groups": groups}
-
-
-func _remove_underscored(element: String) -> bool:
- return not element.begins_with("_")
diff --git a/editor/setting_panel/setting_panel.gd b/editor/setting_panel/setting_panel.gd
deleted file mode 100644
index 57a2e3b1..00000000
--- a/editor/setting_panel/setting_panel.gd
+++ /dev/null
@@ -1,179 +0,0 @@
-@tool
-extends Control
-
-const TEMPLATE_SCRIPT: GDScript = preload("res://addons/ggs/template.gd")
-
-@export var Notification: AcceptDialog
-
-@onready var AddBtn: Button = %AddBtn
-@onready var NSF: LineEdit = %NewSettingField
-@onready var NGF: LineEdit = %NewGroupField
-@onready var CheckAllBtn: Button = %CheckAllBtn
-@onready var UncheckAllBtn: Button = %UncheckAllBtn
-@onready var ReloadBtn: Button = %ReloadBtn
-@onready var List: ScrollContainer = %SettingList
-@onready var ASW: ConfirmationDialog = $AddSettingWindow
-
-
-func _ready() -> void:
- AddBtn.pressed.connect(_on_AddBtn_pressed)
- ASW.template_selected.connect(_on_ASW_template_selected)
-
- NSF.text_submitted.connect(_on_NSF_text_submitted)
- NGF.text_submitted.connect(_on_NGF_text_submitted)
- CheckAllBtn.pressed.connect(_on_CheckAllBtn_pressed)
- UncheckAllBtn.pressed.connect(_on_UncheckAllBtn_pressed)
- ReloadBtn.pressed.connect(_on_ReloadBtn_pressed)
-
- GGS.active_category_changed.connect(_on_Global_active_category_changed)
- GGS.active_setting_changed.connect(_on_Global_active_setting_changed)
-
- AddBtn.disabled = true
- NSF.editable = false
- NGF.editable = false
- CheckAllBtn.disabled = true
- UncheckAllBtn.disabled = true
- ReloadBtn.disabled = true
-
-
-func _set_topbar_disabled(disabled: bool) -> void:
- AddBtn.disabled = disabled
- NSF.editable = !disabled
- NGF.editable = !disabled
- CheckAllBtn.disabled = disabled
- UncheckAllBtn.disabled = disabled
- ReloadBtn.disabled = disabled
-
-
-func _on_Global_active_category_changed() -> void:
- _set_topbar_disabled(GGS.active_category.is_empty())
-
-
-func _on_Global_active_setting_changed() -> void:
- var active_list_item: Button = List.btn_group.get_pressed_button()
- if GGS.active_setting == null and active_list_item != null:
- active_list_item.button_pressed = false
-
-
-### Setting Creation
-
-func _create_setting(item_name: String, template_path: String = "") -> void:
- GGS.progress_started.emit(GGS.Progress.ADD_SETTINGS)
-
- # A tiny delay so the progress_started signal can travel properly
- await get_tree().create_timer(0.05).timeout
-
- if (
- not item_name.is_valid_filename() or
- item_name.begins_with("_") or
- item_name.begins_with(".")
- ):
- Notification.purpose = Notification.Purpose.INVALID
- Notification.popup_centered()
- GGS.progress_ended.emit()
- return
-
- var paths: PackedStringArray
- var selected_groups: Array[Node] = List.get_selected_groups()
- if selected_groups.is_empty():
- var category_path: String = ggsUtils.get_plugin_data().dir_settings.path_join(GGS.active_category)
- paths.append(category_path)
- else:
- for group in selected_groups:
- paths.append(group.path)
-
- var dir: DirAccess = DirAccess.open("res://")
- for path in paths:
- dir.change_dir(path)
-
- if paths.size() == 1:
- if dir.file_exists("%s.tres"%item_name):
- Notification.purpose = Notification.Purpose.ALREADY_EXISTS
- Notification.popup_centered()
- GGS.progress_ended.emit()
- return
- else:
- if dir.file_exists("%s.tres"%item_name):
- printerr("GGS - Add Setting to Multiple Groups: An item with this name already exists. Ignoring <%s>."%path.get_file())
- continue
-
- var script: Script
- var script_path: String
- if template_path.is_empty():
- script = TEMPLATE_SCRIPT.duplicate()
- script_path = "%s/%s.gd"%[dir.get_current_dir(), item_name]
- ResourceSaver.save(script, script_path)
- script = load(script_path)
- else:
- script = load(template_path)
-
- var resource: ggsSetting = ggsSetting.new()
- var res_path: String = "%s/%s.tres"%[dir.get_current_dir(), item_name]
- resource.set_script(script)
- ResourceSaver.save(resource, res_path)
-
- NSF.clear()
- ggsUtils.get_resource_file_system().scan()
- List.load_list()
- GGS.progress_ended.emit()
-
-
-func _on_NSF_text_submitted(submitted_text: String) -> void:
- _create_setting(submitted_text)
-
-
-### Group Creation
-
-func _create_group(group_name: String) -> void:
- if (
- not group_name.is_valid_filename() or
- group_name.begins_with("_") or
- group_name.begins_with(".")
- ):
- Notification.purpose = Notification.Purpose.INVALID
- Notification.popup_centered()
- return
-
- var path: String = ggsUtils.get_plugin_data().dir_settings.path_join(GGS.active_category)
- var dir: DirAccess = DirAccess.open(path)
- if dir.dir_exists(group_name):
- Notification.purpose = Notification.Purpose.ALREADY_EXISTS
- Notification.popup_centered()
- return
-
- dir.make_dir(group_name)
-
- NGF.clear()
- ggsUtils.get_resource_file_system().scan()
- List.load_list()
-
-
-func _on_NGF_text_submitted(submitted_text: String) -> void:
- _create_group(submitted_text)
-
-
-### Setting from Template
-
-func _on_AddBtn_pressed() -> void:
- ASW.popup_centered()
-
-
-func _on_ASW_template_selected(template: String, setting_name: String) -> void:
- _create_setting(setting_name, template)
-
-
-### Check/Uncheck Btns
-
-func _on_CheckAllBtn_pressed() -> void:
- List.set_checked_all(true)
-
-
-func _on_UncheckAllBtn_pressed() -> void:
- List.set_checked_all(false)
-
-
-### Reload Btn
-
-func _on_ReloadBtn_pressed() -> void:
- List.load_list()
-
diff --git a/editor/setting_panel/setting_panel.tscn b/editor/setting_panel/setting_panel.tscn
deleted file mode 100644
index 9d49ce7d..00000000
--- a/editor/setting_panel/setting_panel.tscn
+++ /dev/null
@@ -1,114 +0,0 @@
-[gd_scene load_steps=9 format=3 uid="uid://vt5mwwxhtu3x"]
-
-[ext_resource type="Script" path="res://addons/ggs/editor/setting_panel/setting_panel.gd" id="1_2wlv0"]
-[ext_resource type="Texture2D" uid="uid://bttv2hpecd38m" path="res://addons/ggs/assets/check_all.svg" id="3_bh7l7"]
-[ext_resource type="Texture2D" uid="uid://by345a10evjm8" path="res://addons/ggs/assets/add.svg" id="3_tdauq"]
-[ext_resource type="Script" path="res://addons/ggs/editor/setting_panel/setting_list.gd" id="4_htr8u"]
-[ext_resource type="Texture2D" uid="uid://ve54bl3r7ljc" path="res://addons/ggs/assets/reload.svg" id="4_j6whk"]
-[ext_resource type="Texture2D" uid="uid://romr61n4g5y5" path="res://addons/ggs/assets/uncheck_all.svg" id="4_q4gh6"]
-[ext_resource type="Script" path="res://addons/ggs/editor/setting_panel/groupless.gd" id="7_l1jd4"]
-[ext_resource type="PackedScene" uid="uid://111vt7wxn7lx" path="res://addons/ggs/editor/add_setting_window/add_setting_window.tscn" id="7_o4e63"]
-
-[node name="SettingPanel" type="Control"]
-custom_minimum_size = Vector2(342, 0)
-layout_mode = 3
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-script = ExtResource("1_2wlv0")
-
-[node name="MainCtnr" type="VBoxContainer" parent="."]
-layout_mode = 1
-anchors_preset = 15
-anchor_right = 1.0
-anchor_bottom = 1.0
-grow_horizontal = 2
-grow_vertical = 2
-
-[node name="TopBar" type="HBoxContainer" parent="MainCtnr"]
-layout_mode = 2
-
-[node name="AddBtn" type="Button" parent="MainCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-tooltip_text = "Add Setting from Template"
-disabled = true
-icon = ExtResource("3_tdauq")
-flat = true
-
-[node name="NewSettingField" type="LineEdit" parent="MainCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-placeholder_text = "New Setting..."
-editable = false
-clear_button_enabled = true
-
-[node name="NewGroupField" type="LineEdit" parent="MainCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_horizontal = 3
-placeholder_text = "New Group..."
-editable = false
-clear_button_enabled = true
-
-[node name="VSep" type="VSeparator" parent="MainCtnr/TopBar"]
-layout_mode = 2
-
-[node name="CheckAllBtn" type="Button" parent="MainCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-tooltip_text = "Check All"
-disabled = true
-icon = ExtResource("3_bh7l7")
-flat = true
-
-[node name="UncheckAllBtn" type="Button" parent="MainCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-tooltip_text = "Uncheck All"
-disabled = true
-icon = ExtResource("4_q4gh6")
-flat = true
-
-[node name="ReloadBtn" type="Button" parent="MainCtnr/TopBar"]
-unique_name_in_owner = true
-layout_mode = 2
-tooltip_text = "Reload List"
-disabled = true
-icon = ExtResource("4_j6whk")
-flat = true
-
-[node name="SettingList" type="ScrollContainer" parent="MainCtnr"]
-unique_name_in_owner = true
-layout_mode = 2
-size_flags_vertical = 3
-horizontal_scroll_mode = 0
-script = ExtResource("4_htr8u")
-
-[node name="PanelCtnr" type="PanelContainer" parent="MainCtnr/SettingList"]
-layout_mode = 2
-size_flags_horizontal = 3
-size_flags_vertical = 3
-theme_type_variation = &"SettingListBG"
-
-[node name="MainCtnr" type="HFlowContainer" parent="MainCtnr/SettingList/PanelCtnr"]
-layout_mode = 2
-size_flags_vertical = 3
-theme_override_constants/h_separation = 10
-theme_override_constants/v_separation = 10
-
-[node name="GroupLess" type="PanelContainer" parent="MainCtnr/SettingList/PanelCtnr/MainCtnr"]
-visible = false
-custom_minimum_size = Vector2(150, 0)
-layout_mode = 2
-size_flags_horizontal = 3
-theme_type_variation = &"SettingItemBG"
-script = ExtResource("7_l1jd4")
-
-[node name="MainCtnr" type="HFlowContainer" parent="MainCtnr/SettingList/PanelCtnr/MainCtnr/GroupLess"]
-layout_mode = 2
-
-[node name="AddSettingWindow" parent="." instance=ExtResource("7_o4e63")]
diff --git a/plugin.cfg b/plugin.cfg
index a8666943..a9abe5f6 100644
--- a/plugin.cfg
+++ b/plugin.cfg
@@ -1,7 +1,7 @@
[plugin]
name="Godot Game Settings"
-description="Create and manage game settings."
+description="Create and manage game settings in Godot Engine."
author="PunchablePlushie"
-version="3.1.0"
+version="3.2.0"
script="plugin.gd"
diff --git a/plugin.gd b/plugin.gd
index 64a78bbf..ab4f0a6b 100644
--- a/plugin.gd
+++ b/plugin.gd
@@ -1,49 +1,21 @@
@tool
extends EditorPlugin
-var main_panel_scn: PackedScene = preload("./editor/main_panel/main_panel.tscn")
-var inspector_plugin: EditorInspectorPlugin = ggsInspectorPlugin.new()
-var MainPanel: Control
+const SINGLETON_NAME: String = "GGS"
+const SINGLETON_PATH: String = "res://addons/ggs/plugin/singleton/ggs.tscn"
+
+var _InspectorPlugin: EditorInspectorPlugin = ggsInspectorPlugin.new()
func _enter_tree() -> void:
- _add_editor_interface_singleton()
- _add_plugin_singleton()
- _add_editor()
- add_inspector_plugin(inspector_plugin)
+ _add_singleton()
+ add_inspector_plugin(_InspectorPlugin)
func _exit_tree() -> void:
- _remove_editor_interface_singleton()
- _remove_editor()
- remove_inspector_plugin(inspector_plugin)
-
-
-### Singletons
-
-func _add_editor_interface_singleton() -> void:
- if not Engine.has_singleton("ggsEI"):
- Engine.register_singleton("ggsEI", get_editor_interface())
-
-
-func _remove_editor_interface_singleton() -> void:
- if Engine.has_singleton("ggsEI"):
- Engine.unregister_singleton("ggsEI")
-
-
-func _add_plugin_singleton() -> void:
- if not ProjectSettings.has_setting("autoload/GGS"):
- add_autoload_singleton("GGS", "res://addons/ggs/classes/global/ggs.tscn")
-
-
-### Main Editor
-
-func _add_editor() -> void:
- MainPanel = main_panel_scn.instantiate()
- add_control_to_bottom_panel(MainPanel, "Game Settings")
+ remove_inspector_plugin(_InspectorPlugin)
-func _remove_editor() -> void:
- if MainPanel:
- remove_control_from_bottom_panel(MainPanel)
- MainPanel.queue_free()
+func _add_singleton() -> void:
+ if not ProjectSettings.has_setting("autoload/" + SINGLETON_NAME):
+ add_autoload_singleton(SINGLETON_NAME, SINGLETON_PATH)
diff --git a/plugin/assets/apply_btn.svg b/plugin/assets/apply_btn.svg
new file mode 100644
index 00000000..b581c592
--- /dev/null
+++ b/plugin/assets/apply_btn.svg
@@ -0,0 +1,19 @@
+
+
+
+
diff --git a/plugin/assets/arrow_list.svg b/plugin/assets/arrow_list.svg
new file mode 100644
index 00000000..1265d597
--- /dev/null
+++ b/plugin/assets/arrow_list.svg
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/plugin/assets/base_node.svg b/plugin/assets/base_node.svg
new file mode 100644
index 00000000..27f83d95
--- /dev/null
+++ b/plugin/assets/base_node.svg
@@ -0,0 +1,22 @@
+
+
+
+
diff --git a/plugin/assets/checkbox.svg b/plugin/assets/checkbox.svg
new file mode 100644
index 00000000..3885ba39
--- /dev/null
+++ b/plugin/assets/checkbox.svg
@@ -0,0 +1,23 @@
+
+
+
+
diff --git a/plugin/assets/input.svg b/plugin/assets/input.svg
new file mode 100644
index 00000000..1e2eb88f
--- /dev/null
+++ b/plugin/assets/input.svg
@@ -0,0 +1,40 @@
+
+
+
+
diff --git a/plugin/assets/option_list.svg b/plugin/assets/option_list.svg
new file mode 100644
index 00000000..bf54eb1f
--- /dev/null
+++ b/plugin/assets/option_list.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/plugin/assets/radio_list.svg b/plugin/assets/radio_list.svg
new file mode 100644
index 00000000..d591b48b
--- /dev/null
+++ b/plugin/assets/radio_list.svg
@@ -0,0 +1,24 @@
+
+
+
+
diff --git a/plugin/assets/reset_btn.svg b/plugin/assets/reset_btn.svg
new file mode 100644
index 00000000..49636d2c
--- /dev/null
+++ b/plugin/assets/reset_btn.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/assets/search.svg b/plugin/assets/search.svg
similarity index 100%
rename from assets/search.svg
rename to plugin/assets/search.svg
diff --git a/plugin/assets/slider.svg b/plugin/assets/slider.svg
new file mode 100644
index 00000000..07389822
--- /dev/null
+++ b/plugin/assets/slider.svg
@@ -0,0 +1,31 @@
+
+
+
+
diff --git a/plugin/assets/spinbox.svg b/plugin/assets/spinbox.svg
new file mode 100644
index 00000000..d5861efe
--- /dev/null
+++ b/plugin/assets/spinbox.svg
@@ -0,0 +1,25 @@
+
+
+
+
diff --git a/plugin/assets/switch.svg b/plugin/assets/switch.svg
new file mode 100644
index 00000000..383cb64a
--- /dev/null
+++ b/plugin/assets/switch.svg
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/plugin/assets/text_field.svg b/plugin/assets/text_field.svg
new file mode 100644
index 00000000..97ff4dc2
--- /dev/null
+++ b/plugin/assets/text_field.svg
@@ -0,0 +1,22 @@
+
+
+
+
diff --git a/plugin/assets/toggle_btn.svg b/plugin/assets/toggle_btn.svg
new file mode 100644
index 00000000..86ce8f3d
--- /dev/null
+++ b/plugin/assets/toggle_btn.svg
@@ -0,0 +1,26 @@
+
+
+
+
diff --git a/plugin/classes/ggs_component.gd b/plugin/classes/ggs_component.gd
new file mode 100644
index 00000000..69458afb
--- /dev/null
+++ b/plugin/classes/ggs_component.gd
@@ -0,0 +1,96 @@
+@tool
+@icon("res://addons/ggs/plugin/assets/base_node.svg")
+extends MarginContainer
+class_name ggsComponent
+## Base class for a GGS UI component. Components are user interface nodes
+## that allow the user to change the value of a specific setting.
+
+const WARNING_NO_SETTING: String = "No setting is assigned."
+const WARNING_INVALID: String = "The assigned setting is invalid. Make sure it's in the settings directory and is saved on disc."
+const WARNING_EMPTY_KEY: String = "Setting key is empty and won't be saved to or loaded from the file."
+const WARNING_INCOMPATIBLE_SETTING: String = "The value type of the assigned setting is not compatible with this component."
+
+## The setting this component will handle. The setting's
+## [member ggsSetting.value_type] must be in the [member compatible_types]
+## of this component.
+@export var setting: ggsSetting: set = _set_setting
+
+## If true, the setting is applied when the component is interacted with.
+## Otherwise, an ApplyBtn is needed.
+@export var apply_on_changed: bool
+
+## If true, the main control(s) of the component will grab focus when
+## mouse enters it.
+@export var grab_focus_on_mouse_over: bool = true
+
+## The current value of the setting associated with this component.
+var value: Variant
+
+## [enum Variant.Type]s that this component accepts. The [member value_type]
+## of any [ggsSetting] assigned to this component must be in this array.
+var compatible_types: Array[Variant.Type] = []
+
+
+func _get_configuration_warnings() -> PackedStringArray:
+ if setting == null:
+ return [WARNING_NO_SETTING]
+
+ var warnings: PackedStringArray
+ if (
+ setting.resource_path.is_empty()
+ or not setting.resource_path.begins_with(GGS.settings_dir)
+ ):
+ warnings.append(WARNING_INVALID)
+
+ if setting.key.is_empty():
+ warnings.append(WARNING_EMPTY_KEY)
+
+ if (
+ not compatible_types.is_empty()
+ and not compatible_types.has(setting.value_type)
+ ):
+ warnings.append(WARNING_INCOMPATIBLE_SETTING)
+
+ return warnings
+
+
+func _set_setting(value: ggsSetting) -> void:
+ if (
+ setting != null
+ and setting.changed.is_connected(_on_setting_resource_changed)
+ ):
+ setting.changed.disconnect(_on_setting_resource_changed)
+
+ setting = value
+ update_configuration_warnings()
+
+ if setting != null:
+ setting.changed.connect(_on_setting_resource_changed)
+
+
+## Saves the setting value to the save file and applies it to the game.
+func apply_setting() -> void:
+ GGS.set_value(setting, value)
+ setting.apply(value)
+
+
+## Saves the default value of the setting to the save file and applies it
+## to the game, effectively reseting it.[br]
+## [settingResetBtn] calls this method to reset the associated settings.
+func reset_setting() -> void:
+ GGS.set_value(setting, setting.default)
+ setting.apply(value)
+
+
+## Validates if the assigned [member setting] is valid and can be used with
+## no issues.
+func validate_setting() -> bool:
+ if setting == null:
+ printerr("GGS - Get Setting Value (%s) - No setting is assigned."%name)
+ return false
+
+ return true
+
+
+func _on_setting_resource_changed() -> void:
+ update_configuration_warnings()
diff --git a/plugin/classes/ggs_glyph_db.gd b/plugin/classes/ggs_glyph_db.gd
new file mode 100644
index 00000000..850af31f
--- /dev/null
+++ b/plugin/classes/ggs_glyph_db.gd
@@ -0,0 +1,206 @@
+@tool
+extends Resource
+class_name ggsGlyphDB
+## Stores varius textures used to display an input as a glyph. View
+## [method ggsInputHelper.event_get_glyph] for more info.
+
+const MOUSE: Dictionary = {
+ MOUSE_BUTTON_LEFT: "left",
+ MOUSE_BUTTON_RIGHT: "right",
+ MOUSE_BUTTON_MIDDLE: "middle",
+ MOUSE_BUTTON_WHEEL_UP: "wheel_up",
+ MOUSE_BUTTON_WHEEL_DOWN: "wheel_down",
+ MOUSE_BUTTON_WHEEL_LEFT: "wheel_left",
+ MOUSE_BUTTON_WHEEL_RIGHT: "wheel_right",
+ MOUSE_BUTTON_XBUTTON1: "extra_1",
+ MOUSE_BUTTON_XBUTTON2: "extra_2",
+}
+
+const JOYPAD_BUTTON: Dictionary = {
+ JOY_BUTTON_A: "bottom",
+ JOY_BUTTON_B: "right",
+ JOY_BUTTON_X: "left",
+ JOY_BUTTON_Y: "top",
+ JOY_BUTTON_BACK: "back",
+ JOY_BUTTON_GUIDE: "guide",
+ JOY_BUTTON_START: "start",
+ JOY_BUTTON_LEFT_STICK: "left_stick",
+ JOY_BUTTON_RIGHT_STICK: "right_stick",
+ JOY_BUTTON_LEFT_SHOULDER: "left_shoulder",
+ JOY_BUTTON_RIGHT_SHOULDER: "right_shoulder",
+ JOY_BUTTON_DPAD_UP: "dpad_up",
+ JOY_BUTTON_DPAD_DOWN: "dpad_down",
+ JOY_BUTTON_DPAD_LEFT: "dpad_left",
+ JOY_BUTTON_DPAD_RIGHT: "dpad_right",
+ JOY_BUTTON_MISC1: "misc",
+ JOY_BUTTON_PADDLE1: "pad1",
+ JOY_BUTTON_PADDLE2: "pad2",
+ JOY_BUTTON_PADDLE3: "pad3",
+ JOY_BUTTON_PADDLE4: "pad4",
+ JOY_BUTTON_TOUCHPAD: "touch"
+}
+
+const JOYPAD_AXIS: Dictionary = {
+ ggsInputHelper.Axis.LS_LEFT: "lstick_left",
+ ggsInputHelper.Axis.LS_RIGHT: "lstick_right",
+ ggsInputHelper.Axis.LS_UP: "lstick_up",
+ ggsInputHelper.Axis.LS_DOWN: "lstick_down",
+ ggsInputHelper.Axis.RS_LEFT: "rstick_left",
+ ggsInputHelper.Axis.RS_RIGHT: "rstick_right",
+ ggsInputHelper.Axis.RS_UP: "rstick_up",
+ ggsInputHelper.Axis.RS_DOWN: "rstick_down",
+ ggsInputHelper.Axis.LT: "left_trigger",
+ ggsInputHelper.Axis.RT: "right_trigger",
+}
+
+@export_group("Mouse", "mouse_")
+@export var mouse_left: Texture2D
+@export var mouse_right: Texture2D
+@export var mouse_middle: Texture2D
+@export var mouse_wheel_up: Texture2D
+@export var mouse_wheel_down: Texture2D
+@export var mouse_wheel_left: Texture2D
+@export var mouse_wheel_right: Texture2D
+@export var mouse_extra_1: Texture2D
+@export var mouse_extra_2: Texture2D
+
+@export_group("XBox", "xbox_")
+@export_subgroup("XBox Buttons", "xbox_")
+@export var xbox_bottom: Texture2D
+@export var xbox_right: Texture2D
+@export var xbox_left: Texture2D
+@export var xbox_top: Texture2D
+@export var xbox_back: Texture2D
+@export var xbox_guide: Texture2D
+@export var xbox_start: Texture2D
+@export var xbox_left_stick: Texture2D
+@export var xbox_right_stick: Texture2D
+@export var xbox_left_shoulder: Texture2D
+@export var xbox_right_shoulder: Texture2D
+@export var xbox_dpad_up: Texture2D
+@export var xbox_dpad_down: Texture2D
+@export var xbox_dpad_left: Texture2D
+@export var xbox_dpad_right: Texture2D
+@export var xbox_misc: Texture2D
+@export var xbox_pad1: Texture2D
+@export var xbox_pad2: Texture2D
+@export var xbox_pad3: Texture2D
+@export var xbox_pad4: Texture2D
+@export var xbox_touch: Texture2D
+@export_subgroup("XBox Motions", "xbox_")
+@export var xbox_lstick_left: Texture2D
+@export var xbox_lstick_right: Texture2D
+@export var xbox_lstick_up: Texture2D
+@export var xbox_lstick_down: Texture2D
+@export var xbox_rstick_left: Texture2D
+@export var xbox_rstick_right: Texture2D
+@export var xbox_rstick_up: Texture2D
+@export var xbox_rstick_down: Texture2D
+@export var xbox_left_trigger: Texture2D
+@export var xbox_right_trigger: Texture2D
+
+@export_group("Playstation", "ps_")
+@export_subgroup("PS Buttons", "ps_")
+@export var ps_bottom: Texture2D
+@export var ps_right: Texture2D
+@export var ps_left: Texture2D
+@export var ps_top: Texture2D
+@export var ps_back: Texture2D
+@export var ps_guide: Texture2D
+@export var ps_start: Texture2D
+@export var ps_left_stick: Texture2D
+@export var ps_right_stick: Texture2D
+@export var ps_left_shoulder: Texture2D
+@export var ps_right_shoulder: Texture2D
+@export var ps_dpad_up: Texture2D
+@export var ps_dpad_down: Texture2D
+@export var ps_dpad_left: Texture2D
+@export var ps_dpad_right: Texture2D
+@export var ps_misc: Texture2D
+@export var ps_pad1: Texture2D
+@export var ps_pad2: Texture2D
+@export var ps_pad3: Texture2D
+@export var ps_pad4: Texture2D
+@export var ps_touch: Texture2D
+@export_subgroup("PS Motions", "ps_")
+@export var ps_lstick_left: Texture2D
+@export var ps_lstick_right: Texture2D
+@export var ps_lstick_up: Texture2D
+@export var ps_lstick_down: Texture2D
+@export var ps_rstick_left: Texture2D
+@export var ps_rstick_right: Texture2D
+@export var ps_rstick_up: Texture2D
+@export var ps_rstick_down: Texture2D
+@export var ps_left_trigger: Texture2D
+@export var ps_right_trigger: Texture2D
+
+
+@export_group("Switch", "switch_")
+@export_subgroup("Switch Buttons", "switch_")
+@export var switch_bottom: Texture2D
+@export var switch_right: Texture2D
+@export var switch_left: Texture2D
+@export var switch_top: Texture2D
+@export var switch_back: Texture2D
+@export var switch_guide: Texture2D
+@export var switch_start: Texture2D
+@export var switch_left_stick: Texture2D
+@export var switch_right_stick: Texture2D
+@export var switch_left_shoulder: Texture2D
+@export var switch_right_shoulder: Texture2D
+@export var switch_dpad_up: Texture2D
+@export var switch_dpad_down: Texture2D
+@export var switch_dpad_left: Texture2D
+@export var switch_dpad_right: Texture2D
+@export var switch_misc: Texture2D
+@export var switch_pad1: Texture2D
+@export var switch_pad2: Texture2D
+@export var switch_pad3: Texture2D
+@export var switch_pad4: Texture2D
+@export var switch_touch: Texture2D
+@export_subgroup("Switch Motions", "switch_")
+@export var switch_lstick_left: Texture2D
+@export var switch_lstick_right: Texture2D
+@export var switch_lstick_up: Texture2D
+@export var switch_lstick_down: Texture2D
+@export var switch_rstick_left: Texture2D
+@export var switch_rstick_right: Texture2D
+@export var switch_rstick_up: Texture2D
+@export var switch_rstick_down: Texture2D
+@export var switch_left_trigger: Texture2D
+@export var switch_right_trigger: Texture2D
+
+@export_group("Other", "other_")
+@export_subgroup("Other Buttons", "other_")
+@export var other_bottom: Texture2D
+@export var other_right: Texture2D
+@export var other_left: Texture2D
+@export var other_top: Texture2D
+@export var other_back: Texture2D
+@export var other_guide: Texture2D
+@export var other_start: Texture2D
+@export var other_left_stick: Texture2D
+@export var other_right_stick: Texture2D
+@export var other_left_shoulder: Texture2D
+@export var other_right_shoulder: Texture2D
+@export var other_dpad_up: Texture2D
+@export var other_dpad_down: Texture2D
+@export var other_dpad_left: Texture2D
+@export var other_dpad_right: Texture2D
+@export var other_misc: Texture2D
+@export var other_pad1: Texture2D
+@export var other_pad2: Texture2D
+@export var other_pad3: Texture2D
+@export var other_pad4: Texture2D
+@export var other_touch: Texture2D
+@export_subgroup("Other Motions", "other_")
+@export var other_lstick_left: Texture2D
+@export var other_lstick_right: Texture2D
+@export var other_lstick_up: Texture2D
+@export var other_lstick_down: Texture2D
+@export var other_rstick_left: Texture2D
+@export var other_rstick_right: Texture2D
+@export var other_rstick_up: Texture2D
+@export var other_rstick_down: Texture2D
+@export var other_left_trigger: Texture2D
+@export var other_right_trigger: Texture2D
diff --git a/plugin/classes/ggs_input_helper.gd b/plugin/classes/ggs_input_helper.gd
new file mode 100644
index 00000000..f1e4dca5
--- /dev/null
+++ b/plugin/classes/ggs_input_helper.gd
@@ -0,0 +1,360 @@
+@tool
+extends RefCounted
+class_name ggsInputHelper
+## Provides input-related methods used throughout GGS.
+
+enum InputType {
+ INVALID,
+ KEYBOARD,
+ MOUSE,
+ JOYPAD_BUTTON,
+ JOYPAD_MOTION,
+}
+
+enum Axis {
+ LS_LEFT, LS_RIGHT, LS_UP, LS_DOWN,
+ RS_LEFT, RS_RIGHT, RS_UP, RS_DOWN,
+ LT, RT
+}
+
+const AXIS_MAP: Dictionary = {
+ JOY_AXIS_LEFT_X: [Axis.LS_RIGHT, Axis.LS_LEFT],
+ JOY_AXIS_LEFT_Y: [Axis.LS_DOWN, Axis.LS_UP],
+ JOY_AXIS_RIGHT_X: [Axis.RS_RIGHT, Axis.RS_LEFT],
+ JOY_AXIS_RIGHT_Y: [Axis.RS_DOWN, Axis.RS_UP],
+ JOY_AXIS_TRIGGER_LEFT: [Axis.LT],
+ JOY_AXIS_TRIGGER_RIGHT: [Axis.RT],
+}
+
+const JOYPAD_DEVICE_ABBREVIATIONS: Dictionary = {
+ "XInput Gamepad": "xbox",
+ "Xbox Series Controller": "xbox",
+ "Sony DualSense": "ps",
+ "PS5 Controller": "ps",
+ "PS4 Controller": "ps",
+ "Switch": "switch",
+}
+
+const TEXT_MOUSE: Dictionary = {
+ MOUSE_BUTTON_LEFT: "LMB",
+ MOUSE_BUTTON_RIGHT: "RMB",
+ MOUSE_BUTTON_MIDDLE: "MMB",
+ MOUSE_BUTTON_WHEEL_UP: "MW Up",
+ MOUSE_BUTTON_WHEEL_DOWN: "MW Down",
+ MOUSE_BUTTON_WHEEL_LEFT: "MW Left",
+ MOUSE_BUTTON_WHEEL_RIGHT: "MW Right",
+ MOUSE_BUTTON_XBUTTON1: "MB1",
+ MOUSE_BUTTON_XBUTTON2: "MB2",
+}
+
+const TEXT_XBOX: Dictionary = {
+ JOY_BUTTON_A: "A",
+ JOY_BUTTON_B: "B",
+ JOY_BUTTON_X: "X",
+ JOY_BUTTON_Y: "Y",
+ JOY_BUTTON_BACK: "Back",
+ JOY_BUTTON_GUIDE: "Home",
+ JOY_BUTTON_START: "Start",
+ JOY_BUTTON_LEFT_STICK: "LS",
+ JOY_BUTTON_RIGHT_STICK: "RS",
+ JOY_BUTTON_LEFT_SHOULDER: "LB",
+ JOY_BUTTON_RIGHT_SHOULDER: "RB",
+ JOY_BUTTON_DPAD_UP: "D-Pad Up",
+ JOY_BUTTON_DPAD_DOWN: "D-Pad Down",
+ JOY_BUTTON_DPAD_LEFT: "D-Pad Left",
+ JOY_BUTTON_DPAD_RIGHT: "D-Pad Right",
+ JOY_BUTTON_MISC1: "Share",
+ JOY_BUTTON_PADDLE1: "PAD1",
+ JOY_BUTTON_PADDLE2: "PAD2",
+ JOY_BUTTON_PADDLE3: "PAD3",
+ JOY_BUTTON_PADDLE4: "PAD4",
+ JOY_BUTTON_TOUCHPAD: "Touchpad",
+}
+
+const TEXT_XBOX_AXIS: Dictionary = {
+ Axis.LS_LEFT: "LStick Left",
+ Axis.LS_RIGHT: "LStick Right",
+ Axis.LS_UP: "LStick Up",
+ Axis.LS_DOWN: "LStick Down",
+ Axis.RS_LEFT: "RStick Left",
+ Axis.RS_RIGHT: "RStick Right",
+ Axis.RS_UP: "RStick Up",
+ Axis.RS_DOWN: "RStick Down",
+ Axis.LT: "LT",
+ Axis.RT: "RT",
+}
+
+const TEXT_PS: Dictionary = {
+ JOY_BUTTON_A: "Cross",
+ JOY_BUTTON_B: "Circle",
+ JOY_BUTTON_X: "Square",
+ JOY_BUTTON_Y: "Triangle",
+ JOY_BUTTON_BACK: "Select",
+ JOY_BUTTON_GUIDE: "PS",
+ JOY_BUTTON_START: "Start",
+ JOY_BUTTON_LEFT_STICK: "L3",
+ JOY_BUTTON_RIGHT_STICK: "R3",
+ JOY_BUTTON_LEFT_SHOULDER: "L1",
+ JOY_BUTTON_RIGHT_SHOULDER: "R1",
+ JOY_BUTTON_DPAD_UP: "D-Pad Up",
+ JOY_BUTTON_DPAD_DOWN: "D-Pad Down",
+ JOY_BUTTON_DPAD_LEFT: "D-Pad Left",
+ JOY_BUTTON_DPAD_RIGHT: "D-Pad Right",
+ JOY_BUTTON_MISC1: "Microphone",
+ JOY_BUTTON_PADDLE1: "PAD1",
+ JOY_BUTTON_PADDLE2: "PAD2",
+ JOY_BUTTON_PADDLE3: "PAD3",
+ JOY_BUTTON_PADDLE4: "PAD4",
+ JOY_BUTTON_TOUCHPAD: "Touchpad",
+}
+
+const TEXT_PS_AXIS: Dictionary = {
+ Axis.LS_LEFT: "LStick Left",
+ Axis.LS_RIGHT: "LStick Right",
+ Axis.LS_UP: "LStick Up",
+ Axis.LS_DOWN: "LStick Down",
+ Axis.RS_LEFT: "RStick Left",
+ Axis.RS_RIGHT: "RStick Right",
+ Axis.RS_UP: "RStick Up",
+ Axis.RS_DOWN: "RStick Down",
+ Axis.LT: "L2",
+ Axis.RT: "R2",
+}
+
+const TEXT_SWITCH: Dictionary = {
+ JOY_BUTTON_A: "B",
+ JOY_BUTTON_B: "A",
+ JOY_BUTTON_X: "Y",
+ JOY_BUTTON_Y: "X",
+ JOY_BUTTON_BACK: "Minus",
+ JOY_BUTTON_GUIDE: "Home",
+ JOY_BUTTON_START: "Plus",
+ JOY_BUTTON_LEFT_STICK: "LS",
+ JOY_BUTTON_RIGHT_STICK: "RS",
+ JOY_BUTTON_LEFT_SHOULDER: "L",
+ JOY_BUTTON_RIGHT_SHOULDER: "R",
+ JOY_BUTTON_DPAD_UP: "D-Pad Up",
+ JOY_BUTTON_DPAD_DOWN: "D-Pad Down",
+ JOY_BUTTON_DPAD_LEFT: "D-Pad Left",
+ JOY_BUTTON_DPAD_RIGHT: "D-Pad Right",
+ JOY_BUTTON_MISC1: "Capture",
+ JOY_BUTTON_PADDLE1: "PAD1",
+ JOY_BUTTON_PADDLE2: "PAD2",
+ JOY_BUTTON_PADDLE3: "PAD3",
+ JOY_BUTTON_PADDLE4: "PAD4",
+ JOY_BUTTON_TOUCHPAD: "Touchpad",
+}
+
+const TEXT_SWITCH_AXIS: Dictionary = {
+ Axis.LS_LEFT: "LStick Left",
+ Axis.LS_RIGHT: "LStick Right",
+ Axis.LS_UP: "LStick Up",
+ Axis.LS_DOWN: "LStick Down",
+ Axis.RS_LEFT: "RStick Left",
+ Axis.RS_RIGHT: "RStick Right",
+ Axis.RS_UP: "RStick Up",
+ Axis.RS_DOWN: "RStick Down",
+ Axis.LT: "ZL",
+ Axis.RT: "ZR",
+}
+
+const TEXT_OTHER: Dictionary = {
+ JOY_BUTTON_A: "A",
+ JOY_BUTTON_B: "B",
+ JOY_BUTTON_X: "X",
+ JOY_BUTTON_Y: "Y",
+ JOY_BUTTON_BACK: "Back",
+ JOY_BUTTON_GUIDE: "Guide",
+ JOY_BUTTON_START: "Start",
+ JOY_BUTTON_LEFT_STICK: "LS",
+ JOY_BUTTON_RIGHT_STICK: "RS",
+ JOY_BUTTON_LEFT_SHOULDER: "L",
+ JOY_BUTTON_RIGHT_SHOULDER: "R",
+ JOY_BUTTON_DPAD_UP: "D-Pad Up",
+ JOY_BUTTON_DPAD_DOWN: "D-Pad Down",
+ JOY_BUTTON_DPAD_LEFT: "D-Pad Left",
+ JOY_BUTTON_DPAD_RIGHT: "D-Pad Right",
+ JOY_BUTTON_MISC1: "MISC1",
+ JOY_BUTTON_PADDLE1: "PAD1",
+ JOY_BUTTON_PADDLE2: "PAD2",
+ JOY_BUTTON_PADDLE3: "PAD3",
+ JOY_BUTTON_PADDLE4: "PAD4",
+ JOY_BUTTON_TOUCHPAD: "Touchpad",
+}
+
+const TEXT_OTHER_AXIS: Dictionary = {
+ Axis.LS_LEFT: "LStick Left",
+ Axis.LS_RIGHT: "LStick Right",
+ Axis.LS_UP: "LStick Up",
+ Axis.LS_DOWN: "LStick Down",
+ Axis.RS_LEFT: "RStick Left",
+ Axis.RS_RIGHT: "RStick Right",
+ Axis.RS_UP: "RStick Up",
+ Axis.RS_DOWN: "RStick Down",
+ Axis.LT: "LT",
+ Axis.RT: "RT",
+}
+
+const MODIFIERS_MASK: int = KEY_MASK_SHIFT | KEY_MASK_CTRL | KEY_MASK_ALT
+
+
+## Retrieves the user-defined input map from the project settings.
+## Unlike [InputMap], it works in the editor as well.
+static func get_input_map() -> Dictionary:
+ var input_map: Dictionary
+
+ var project_file: ConfigFile = ConfigFile.new()
+ project_file.load("res://project.godot")
+
+ var actions: PackedStringArray = project_file.get_section_keys("input")
+ for action: String in actions:
+ var action_properties: Dictionary = project_file.get_value("input", action)
+ var action_events: Array = action_properties["events"]
+
+ input_map[action] = action_events
+
+ return input_map
+
+
+## Serializes the given event by saving its important properties in an array.
+static func serialize_event(event: InputEvent) -> Array:
+ var type: int = -1
+ var id: int = -1
+ var aux: int = -1
+
+ if event is InputEventKey:
+ type = InputType.KEYBOARD
+ id = event.physical_keycode | event.get_modifiers_mask()
+
+ if event is InputEventMouseButton:
+ type = InputType.MOUSE
+ id = event.button_index | event.get_modifiers_mask()
+
+ if event is InputEventJoypadButton:
+ type = InputType.JOYPAD_BUTTON
+ id = event.button_index
+
+ if event is InputEventJoypadMotion:
+ type = InputType.JOYPAD_MOTION
+ id = event.axis
+ aux = 0 if event.axis_value > 0 else 1
+
+ return [type, id, aux]
+
+
+## Recreates the [InputEvent] created via [method serialize_event].
+static func deserialize_event(data: Array) -> InputEvent:
+ var type: int = data[0]
+ var id: int = data[1]
+ var aux: int = data[2]
+
+ var event: InputEvent
+ if type == InputType.KEYBOARD:
+ event = InputEventKey.new()
+ event.physical_keycode = id & ~MODIFIERS_MASK
+ event.shift_pressed = bool(id & KEY_MASK_SHIFT)
+ event.ctrl_pressed = bool(id & KEY_MASK_CTRL)
+ event.alt_pressed = bool(id & KEY_MASK_ALT)
+
+ if type == InputType.MOUSE:
+ event = InputEventMouseButton.new()
+ event.button_index = id & ~MODIFIERS_MASK
+ event.shift_pressed = bool(id & KEY_MASK_SHIFT)
+ event.ctrl_pressed = bool(id & KEY_MASK_CTRL)
+ event.alt_pressed = bool(id & KEY_MASK_ALT)
+
+ if type == InputType.JOYPAD_BUTTON:
+ event = InputEventJoypadButton.new()
+ event.button_index = id
+
+ if type == InputType.JOYPAD_MOTION:
+ event = InputEventJoypadMotion.new()
+ event.axis = id
+ event.axis_value = -1 if aux == 1 else 1
+
+ return event
+
+
+## Returns a string representation of the event. Unlike
+## [method InputEvent.as_text], it returns a shorter string that also
+## changes based on gamepad type. Uses [code]TEXT_*[/code] and
+## [code]TEXT_*_AXIS[/code] constants.
+func event_get_text(event: InputEvent) -> String:
+ var text: String = "INVALID EVENT"
+
+ if event is InputEventKey:
+ var keycode_with_modif: int = event.get_physical_keycode_with_modifiers()
+ text = OS.get_keycode_string(keycode_with_modif)
+
+ if event is InputEventMouse:
+ var modif_text: String = _event_get_modifiers_text(event)
+ var btn_text: String = TEXT_MOUSE[event.button_index]
+ text = btn_text if modif_text.is_empty() else "%s+%s"%[modif_text, btn_text]
+
+ if event is InputEventJoypadButton:
+ var device: String = _joypad_get_device_abbreviated(event)
+ var property: String = "TEXT_%s"%[device.to_upper()]
+ prints(device, property)
+ text = get(property)[event.button_index]
+
+ if event is InputEventJoypadMotion:
+ var device: String = _joypad_get_device_abbreviated(event)
+ var property: String = "TEXT_%s_AXIS"%[device.to_upper()]
+ var axis: Axis = _joypad_get_axis_mapped(event)
+ text = get(property)[axis]
+
+ return text
+
+
+## Returns a [Texture2D] representation of the event. Uses a [ggsGlyphDB]
+## to retreive appropriate textures.
+func event_get_glyph(event: InputEvent, db: ggsGlyphDB) -> Texture2D:
+ var glyph: Texture2D = null
+
+ if event is InputEventMouseButton:
+ var property: String = "mouse_%s"%db.MOUSE[event.button_index]
+ glyph = db.get(property)
+
+ if event is InputEventJoypadButton:
+ var device: String = _joypad_get_device_abbreviated(event)
+ var btn_text: String = db.JOYPAD_BUTTON[event.button_index]
+ var property: String = "%s_%s"%[device, btn_text]
+ glyph = db.get(property)
+
+ if event is InputEventJoypadMotion:
+ var device: String = _joypad_get_device_abbreviated(event)
+ var axis: Axis = _joypad_get_axis_mapped(event)
+ var axis_text: String = db.JOYPAD_AXIS[axis]
+ var property: String = "%s_%s"%[device, axis_text]
+ glyph = db.get(property)
+
+ return glyph
+
+
+func _event_get_modifiers_text(event: InputEventWithModifiers) -> String:
+ var modifiers: PackedStringArray
+ if event.shift_pressed:
+ modifiers.append("Shift")
+
+ if event.ctrl_pressed:
+ modifiers.append("Ctrl")
+
+ if event.alt_pressed:
+ modifiers.append("Alt")
+
+ var modifiers_string: String = "+".join(modifiers)
+ return modifiers_string
+
+
+func _joypad_get_device_abbreviated(event: InputEvent) -> String:
+ var device_name: String = Input.get_joy_name(event.device)
+
+ if JOYPAD_DEVICE_ABBREVIATIONS.has(device_name):
+ return JOYPAD_DEVICE_ABBREVIATIONS[device_name]
+ else:
+ return GGS.default_glyph.strip_edges()
+
+
+func _joypad_get_axis_mapped(event: InputEvent) -> Axis:
+ var idx: int = 1 if event.axis_value < 0 else 0
+ return AXIS_MAP[event.axis][idx]
diff --git a/plugin/classes/ggs_setting.gd b/plugin/classes/ggs_setting.gd
new file mode 100644
index 00000000..1e08409c
--- /dev/null
+++ b/plugin/classes/ggs_setting.gd
@@ -0,0 +1,118 @@
+@tool
+extends Resource
+class_name ggsSetting
+## Base resource for a game setting.
+
+## The default value of the setting.
+var default: Variant = false: set = _set_default
+
+## Section name used to save this setting.
+var section: String = ""
+
+## Key name used to save this setting.
+var key: String: set = _set_key
+
+## The value type this setting accepts when running [method apply].
+## Also determines the type of [param default].[br]
+## See [enum @GlobalScope.Variant.Type] for details.
+var value_type: int = TYPE_BOOL: set = _set_value_type
+# (Static Typing) Type.Variant is not used as it clutters the tooltip.
+
+## Can be used to customize how [param default] is exported and shown in the
+## inspector.[br]
+## See [enum @GlobalScope.PropertyHint] for details.
+var value_hint: int = PROPERTY_HINT_NONE
+# (Static Typing) PropertyHint is not used as it clutters the tooltip.
+
+## Hint string used to provide additional information for certain
+## property hints.[br]
+## See [enum @GlobalScope.PropertyHint] for details.
+var value_hint_string: String = ""
+
+## Any property in this array will be read-only if exported to the
+## inspector via [method Object._get_property_list]. May not work with
+## [annotation @GDScript.@export] annotations.
+
+@export_storage var read_only_properties: PackedStringArray
+
+
+func _get_property_list() -> Array:
+ var properties: Array
+ properties.append_array([
+ {
+ "name": "default",
+ "type": value_type,
+ "usage": get_property_usage("default"),
+ "hint": value_hint,
+ "hint_string": value_hint_string,
+ },
+ {
+ "name": "section",
+ "type": TYPE_STRING,
+ "usage": get_property_usage("section"),
+ },
+ {
+ "name": "key",
+ "type": TYPE_STRING,
+ "usage": get_property_usage("key"),
+ },
+ {
+ "name": "Value Properties",
+ "type": TYPE_NIL,
+ "usage": PROPERTY_USAGE_GROUP,
+ "hint_string": "value_",
+ },
+ {
+ "name": "value_type",
+ "type": TYPE_INT,
+ "usage": get_property_usage("value_type"),
+ },
+ {
+ "name": "value_hint",
+ "type": TYPE_INT,
+ "usage": get_property_usage("value_hint"),
+ },
+ {
+ "name": "value_hint_string",
+ "type": TYPE_STRING,
+ "usage": get_property_usage("value_hint_string"),
+ },
+ ])
+
+ return properties
+
+
+func _set_default(value: Variant) -> void:
+ default = value
+
+ if Engine.is_editor_hint() and not key.is_empty():
+ GGS.set_value(self, value)
+
+
+func _set_value_type(value: Variant.Type) -> void:
+ value_type = value
+ emit_changed()
+
+
+func _set_key(value: String) -> void:
+ key = value
+ resource_name = value
+ emit_changed()
+
+
+## Returns the property usage of [param property]. Used to see if a property
+## is read-only or not. See [member read_only_properties].
+func get_property_usage(property: String) -> PropertyUsageFlags:
+ var usage: PropertyUsageFlags = PROPERTY_USAGE_DEFAULT
+ if read_only_properties.has(property):
+ usage |= PROPERTY_USAGE_READ_ONLY
+
+ return usage
+
+
+# (Static Typing) No type hint for 'value' is provided to prevent error in
+# child scripts that provide type hint when overriding this method.
+## This method is called when GGS tries to apply the setting. In other words,
+## it should contain the setting logic.
+func apply(value) -> void:
+ pass
diff --git a/plugin/classes/ggs_utils.gd b/plugin/classes/ggs_utils.gd
new file mode 100644
index 00000000..918f2560
--- /dev/null
+++ b/plugin/classes/ggs_utils.gd
@@ -0,0 +1,228 @@
+@tool
+extends RefCounted
+class_name ggsUtils
+## Provides utility methods used in GGS.
+
+const ALL_TYPES: Dictionary = {
+ TYPE_BOOL: "bool",
+ TYPE_INT: "int",
+ TYPE_FLOAT: "float",
+ TYPE_STRING: "String",
+ TYPE_VECTOR2: "Vector2",
+ TYPE_VECTOR2I: "Vector2i",
+ TYPE_RECT2: "Rect2",
+ TYPE_RECT2I: "Rect2i",
+ TYPE_VECTOR3: "Vector3",
+ TYPE_VECTOR3I: "Vector3i",
+ TYPE_TRANSFORM2D: "Transform2D",
+ TYPE_VECTOR4: "Vector4",
+ TYPE_VECTOR4I: "Vector4i",
+ TYPE_PLANE: "Plane",
+ TYPE_QUATERNION: "Quaternion",
+ TYPE_AABB: "AABB",
+ TYPE_BASIS: "Basis",
+ TYPE_TRANSFORM3D: "Transform3D",
+ TYPE_PROJECTION: "Projection",
+ TYPE_COLOR: "Color",
+ TYPE_STRING_NAME: "StringName",
+ TYPE_NODE_PATH: "NodePath",
+ TYPE_RID: "RID",
+ TYPE_OBJECT: "Object",
+ TYPE_CALLABLE: "Callable",
+ TYPE_SIGNAL: "Signal",
+ TYPE_DICTIONARY: "Dictionary",
+ TYPE_ARRAY: "Array",
+ TYPE_PACKED_BYTE_ARRAY: "PackedByteArray",
+ TYPE_PACKED_INT32_ARRAY: "PackedInt32Array",
+ TYPE_PACKED_INT64_ARRAY: "PackedInt64Array",
+ TYPE_PACKED_FLOAT32_ARRAY: "PackedFloat32Array",
+ TYPE_PACKED_FLOAT64_ARRAY: "PackedFloat64Array",
+ TYPE_PACKED_STRING_ARRAY: "PackedStringArray",
+ TYPE_PACKED_VECTOR2_ARRAY: "PackedVector2Array",
+ TYPE_PACKED_VECTOR3_ARRAY: "PackedVector3Array",
+ TYPE_PACKED_VECTOR4_ARRAY: "PackedVector4Array",
+ TYPE_PACKED_COLOR_ARRAY: "PackedColorArray",
+}
+
+const ALL_HINTS: Dictionary = {
+ PROPERTY_HINT_NONE: "None",
+ PROPERTY_HINT_RANGE: "Range",
+ PROPERTY_HINT_ENUM: "Enum",
+ PROPERTY_HINT_ENUM_SUGGESTION: "Enum Suggestion",
+ PROPERTY_HINT_EXP_EASING: "Exp Easing",
+ PROPERTY_HINT_LINK: "Link",
+ PROPERTY_HINT_FLAGS: "Flags",
+ PROPERTY_HINT_LAYERS_2D_RENDER: "Layers 2D Render",
+ PROPERTY_HINT_LAYERS_2D_PHYSICS: "Layers 2D Physics",
+ PROPERTY_HINT_LAYERS_2D_NAVIGATION: "Layers 2D Navigation",
+ PROPERTY_HINT_LAYERS_3D_RENDER: "Layers 3D Render",
+ PROPERTY_HINT_LAYERS_3D_PHYSICS: "Layers 3D Physics",
+ PROPERTY_HINT_LAYERS_3D_NAVIGATION: "Layers 3D Navigation",
+ PROPERTY_HINT_LAYERS_AVOIDANCE: "Layers Avoidance",
+ PROPERTY_HINT_FILE: "File",
+ PROPERTY_HINT_DIR: "Dir",
+ PROPERTY_HINT_GLOBAL_FILE: "Global File",
+ PROPERTY_HINT_GLOBAL_DIR: "Global Dir",
+ PROPERTY_HINT_RESOURCE_TYPE: "Resource Type",
+ PROPERTY_HINT_MULTILINE_TEXT: "Multiline Text",
+ PROPERTY_HINT_EXPRESSION: "Expression",
+ PROPERTY_HINT_PLACEHOLDER_TEXT: "Placeholder Text",
+ PROPERTY_HINT_COLOR_NO_ALPHA: "Color No Alpha",
+ PROPERTY_HINT_OBJECT_ID: "Object ID",
+ PROPERTY_HINT_TYPE_STRING: "Type String",
+ PROPERTY_HINT_NODE_PATH_TO_EDITED_NODE: "_NODE_PATH_TO_EDITED_NODE (DEPRECATED)",
+ PROPERTY_HINT_OBJECT_TOO_BIG: "Object too Big",
+ PROPERTY_HINT_NODE_PATH_VALID_TYPES: "NodePath Valid Types",
+ PROPERTY_HINT_SAVE_FILE: "Save File",
+ PROPERTY_HINT_GLOBAL_SAVE_FILE: "Global Save File",
+ PROPERTY_HINT_INT_IS_OBJECTID: "_INT_IS_OBJECTID (DEPRECATED)",
+ PROPERTY_HINT_INT_IS_POINTER: "Int is Pointer",
+ PROPERTY_HINT_ARRAY_TYPE: "Array Type",
+ PROPERTY_HINT_LOCALE_ID: "Locale ID",
+ PROPERTY_HINT_LOCALIZABLE_STRING: "Localizable String",
+ PROPERTY_HINT_NODE_TYPE: "Node Type",
+ PROPERTY_HINT_HIDE_QUATERNION_EDIT: "Hide Quaternion Edit",
+ PROPERTY_HINT_PASSWORD: "Password",
+}
+
+## Used to create the default value of a type when the user changes the
+## [member ggsSetting.value_type] of a [ggsSetting].
+static var TYPE_DEFAULTS: Dictionary = {
+ TYPE_BOOL: false,
+ TYPE_INT: 0,
+ TYPE_FLOAT: 0.0,
+ TYPE_STRING: "",
+ TYPE_VECTOR2: Vector2(),
+ TYPE_VECTOR2I: Vector2i(),
+ TYPE_RECT2: Rect2(),
+ TYPE_RECT2I: Rect2i(),
+ TYPE_VECTOR3: Vector3(),
+ TYPE_VECTOR3I: Vector3i(),
+ TYPE_TRANSFORM2D: Transform2D(),
+ TYPE_VECTOR4: Vector4(),
+ TYPE_VECTOR4I: Vector4i(),
+ TYPE_PLANE: Plane(),
+ TYPE_QUATERNION: Quaternion(),
+ TYPE_AABB: AABB(),
+ TYPE_BASIS: Basis(),
+ TYPE_TRANSFORM3D: Transform3D(),
+ TYPE_PROJECTION: Projection(),
+ TYPE_COLOR: Color(),
+ TYPE_STRING_NAME: StringName(),
+ TYPE_NODE_PATH: NodePath(),
+ TYPE_RID: RID(),
+ TYPE_OBJECT: null,
+ TYPE_CALLABLE: Callable(),
+ TYPE_SIGNAL: Signal(),
+ TYPE_DICTIONARY: Dictionary(),
+ TYPE_ARRAY: Array(),
+ TYPE_PACKED_BYTE_ARRAY: PackedByteArray(),
+ TYPE_PACKED_INT32_ARRAY: PackedInt32Array(),
+ TYPE_PACKED_INT64_ARRAY: PackedInt64Array(),
+ TYPE_PACKED_FLOAT32_ARRAY: PackedFloat32Array(),
+ TYPE_PACKED_FLOAT64_ARRAY: PackedFloat64Array(),
+ TYPE_PACKED_STRING_ARRAY: PackedStringArray(),
+ TYPE_PACKED_VECTOR2_ARRAY: PackedVector2Array(),
+ TYPE_PACKED_VECTOR3_ARRAY: PackedVector3Array(),
+ TYPE_PACKED_VECTOR4_ARRAY: PackedColorArray(),
+ TYPE_PACKED_COLOR_ARRAY: PackedVector4Array(),
+}
+
+## Returns the Editor icon associated with the given [param type].
+static func type_get_icon(type: Variant.Type) -> Texture2D:
+ var BaseControl: Control = EditorInterface.get_base_control()
+ var type_string: String = ALL_TYPES[type]
+ return BaseControl.get_theme_icon(type_string, "EditorIcons")
+
+
+## Returns [PropertyHints] associated with the given [param type].
+static func type_get_compatible_hints(type: Variant.Type) -> PackedStringArray:
+ var result: PackedStringArray
+ var temp: PackedInt32Array
+
+ temp.append(PROPERTY_HINT_NONE)
+ match type:
+ TYPE_FLOAT:
+ temp.append(PROPERTY_HINT_RANGE)
+ temp.append(PROPERTY_HINT_EXP_EASING)
+
+ TYPE_INT:
+ temp.append(PROPERTY_HINT_RANGE)
+ temp.append(PROPERTY_HINT_ENUM)
+ temp.append(PROPERTY_HINT_FLAGS)
+ temp.append(PROPERTY_HINT_LAYERS_2D_RENDER)
+ temp.append(PROPERTY_HINT_LAYERS_2D_PHYSICS)
+ temp.append(PROPERTY_HINT_LAYERS_2D_NAVIGATION)
+ temp.append(PROPERTY_HINT_LAYERS_3D_RENDER)
+ temp.append(PROPERTY_HINT_LAYERS_3D_PHYSICS)
+ temp.append(PROPERTY_HINT_LAYERS_3D_NAVIGATION)
+ temp.append(PROPERTY_HINT_LAYERS_AVOIDANCE)
+ temp.append(PROPERTY_HINT_INT_IS_POINTER)
+
+ TYPE_STRING:
+ temp.append(PROPERTY_HINT_ENUM)
+ temp.append(PROPERTY_HINT_ENUM_SUGGESTION)
+ temp.append(PROPERTY_HINT_FILE)
+ temp.append(PROPERTY_HINT_DIR)
+ temp.append(PROPERTY_HINT_GLOBAL_FILE)
+ temp.append(PROPERTY_HINT_GLOBAL_DIR)
+ temp.append(PROPERTY_HINT_MULTILINE_TEXT)
+ temp.append(PROPERTY_HINT_EXPRESSION)
+ temp.append(PROPERTY_HINT_PLACEHOLDER_TEXT)
+ temp.append(PROPERTY_HINT_TYPE_STRING)
+ temp.append(PROPERTY_HINT_SAVE_FILE)
+ temp.append(PROPERTY_HINT_GLOBAL_SAVE_FILE)
+ temp.append(PROPERTY_HINT_LOCALE_ID)
+ temp.append(PROPERTY_HINT_PASSWORD)
+
+ TYPE_VECTOR2, TYPE_VECTOR2I, TYPE_VECTOR3, TYPE_VECTOR3I, TYPE_VECTOR4, TYPE_VECTOR4I:
+ temp.append(PROPERTY_HINT_LINK)
+
+ TYPE_VECTOR2:
+ temp.append(PROPERTY_HINT_LINK)
+
+ TYPE_OBJECT:
+ temp.append(PROPERTY_HINT_RESOURCE_TYPE)
+ temp.append(PROPERTY_HINT_OBJECT_ID)
+ temp.append(PROPERTY_HINT_OBJECT_TOO_BIG)
+ temp.append(PROPERTY_HINT_NODE_TYPE)
+
+ TYPE_COLOR:
+ temp.append(PROPERTY_HINT_COLOR_NO_ALPHA)
+
+ TYPE_ARRAY:
+ temp.append(PROPERTY_HINT_TYPE_STRING)
+ temp.append(PROPERTY_HINT_ARRAY_TYPE)
+
+ TYPE_NODE_PATH:
+ temp.append(PROPERTY_HINT_NODE_PATH_VALID_TYPES)
+
+ TYPE_DICTIONARY:
+ temp.append(PROPERTY_HINT_LOCALIZABLE_STRING)
+
+ TYPE_QUATERNION:
+ temp.append(PROPERTY_HINT_HIDE_QUATERNION_EDIT)
+
+ for hint: PropertyHint in temp:
+ result.append(ALL_HINTS[hint])
+
+ return result
+
+
+## Clamps game window size to the current screen size. Used when window
+## scale would resize the window to something larger than the user's screen.
+static func window_clamp_to_screen(size: Vector2) -> Vector2:
+ var screen_id: int = DisplayServer.window_get_current_screen()
+ var screen_size: Rect2i = DisplayServer.screen_get_usable_rect(screen_id)
+
+ return size.clamp(size, screen_size.size)
+
+
+## Centers game window on the current screen.
+static func window_center() -> void:
+ var screen_id: int = DisplayServer.window_get_current_screen()
+ var screen_size: Rect2i = DisplayServer.screen_get_usable_rect(screen_id)
+ var window_size: Vector2i = DisplayServer.window_get_size()
+ var origin: Vector2i = DisplayServer.screen_get_position(screen_id)
+ var target_pos: Vector2 = origin + (screen_size.size / 2) - (window_size / 2)
+ DisplayServer.window_set_position(target_pos)
diff --git a/plugin/inspector/base_select_list.gd b/plugin/inspector/base_select_list.gd
new file mode 100644
index 00000000..9a2fb383
--- /dev/null
+++ b/plugin/inspector/base_select_list.gd
@@ -0,0 +1,33 @@
+@tool
+extends ItemList
+class_name ggsBaseSelectList
+
+var base_items: PackedStringArray
+
+
+func _init() -> void:
+ max_columns = 3
+ fixed_column_width = 180
+
+
+func filter(input: String) -> void:
+ clear()
+
+ if input.is_empty():
+ create_from_arr(base_items)
+ return
+
+ var types_filtered: Array = Array(base_items).filter(_filter_method.bind(input))
+ create_from_arr(PackedStringArray(types_filtered))
+
+
+func create_from_arr(arr: PackedStringArray) -> void:
+ clear()
+ for action: String in arr:
+ add_item(action)
+
+
+func _filter_method(element: String, input: String) -> bool:
+ var element_lowered: String = element.to_lower()
+ var input_lowered: String = input.to_lower()
+ return element_lowered.begins_with(input_lowered)
diff --git a/plugin/inspector/base_select_win.gd b/plugin/inspector/base_select_win.gd
new file mode 100644
index 00000000..25ce392e
--- /dev/null
+++ b/plugin/inspector/base_select_win.gd
@@ -0,0 +1,78 @@
+@tool
+extends ConfirmationDialog
+class_name ggsBaseSelectWin
+
+@export_group("Nodes")
+@export var FilterField: LineEdit
+@export var List: ItemList
+
+var field_value_is_valid: bool
+
+@onready var OkBtn: Button = get_ok_button()
+
+
+func _init() -> void:
+ visible = false
+ min_size = Vector2(400, 300)
+ unresizable = true
+
+
+func _ready() -> void:
+ confirmed.connect(_on_confirmed)
+ visibility_changed.connect(_on_visibility_changed)
+
+ FilterField.text_changed.connect(_on_FilterField_text_changed)
+ FilterField.text_submitted.connect(_on_FilterField_text_submitted)
+
+ List.item_selected.connect(_on_List_item_selected)
+ List.item_activated.connect(_on_List_item_activated)
+
+
+func get_selected_item_idx() -> int:
+ var selected_items: PackedInt32Array = List.get_selected_items()
+ print(selected_items)
+ var item_idx: int = 0
+
+ if List.item_count > 1:
+ item_idx = selected_items[0]
+
+ return item_idx
+
+
+func _confirm_selection(selection) -> void:
+ pass
+
+
+func _on_visibility_changed() -> void:
+ if visible:
+ field_value_is_valid = false
+ OkBtn.disabled = true
+ FilterField.clear()
+ FilterField.grab_focus()
+ else:
+ queue_free()
+
+
+func _on_confirmed() -> void:
+ pass
+
+
+# Confirming through filter list #
+func _on_FilterField_text_changed(new_text: String) -> void:
+ List.filter(new_text)
+
+ field_value_is_valid = (List.item_count == 1)
+ OkBtn.disabled = !field_value_is_valid
+
+
+func _on_FilterField_text_submitted(submitted_text: String) -> void:
+ pass
+
+
+# Confirming through list actions #
+func _on_List_item_selected(idx: int) -> void:
+ OkBtn.disabled = false
+
+
+func _on_List_item_activated(index: int) -> void:
+ pass
diff --git a/plugin/inspector/ggs_inspector_plugin.gd b/plugin/inspector/ggs_inspector_plugin.gd
new file mode 100644
index 00000000..8b68a75a
--- /dev/null
+++ b/plugin/inspector/ggs_inspector_plugin.gd
@@ -0,0 +1,38 @@
+@tool
+extends EditorInspectorPlugin
+class_name ggsInspectorPlugin
+
+const TYPE_SELECTOR_SCN: PackedScene = preload("./type_selector/type_selector.tscn")
+const HINT_SELECTOR_SCN: PackedScene = preload("./hint_selector/hint_selector.tscn")
+const HINT_STRING_FIELD_SCN: PackedScene = preload("./hint_string_field/hint_string_field.tscn")
+const INPUT_SELECTOR_SCN: PackedScene = preload("./input_selector/input_selector.tscn")
+
+
+func _can_handle(object: Object) -> bool:
+ return object is ggsSetting
+
+
+func _parse_property(
+ object: Object, type: Variant.Type, name: String,
+ hint_type: PropertyHint, hint_string: String, usage_flags: int,
+ wide: bool) -> bool:
+ if name == "value_type":
+ add_property_editor(name, TYPE_SELECTOR_SCN.instantiate())
+ return true
+
+ if name == "value_hint":
+ add_property_editor(name, HINT_SELECTOR_SCN.instantiate())
+ return true
+
+ if name == "value_hint_string":
+ add_property_editor(name, HINT_STRING_FIELD_SCN.instantiate())
+ return true
+
+ if (
+ object is settingInput
+ and name == "action"
+ ):
+ add_property_editor(name, INPUT_SELECTOR_SCN.instantiate())
+ return true
+
+ return false
diff --git a/plugin/inspector/hint_selector/hint_selector.gd b/plugin/inspector/hint_selector/hint_selector.gd
new file mode 100644
index 00000000..3a4b5f17
--- /dev/null
+++ b/plugin/inspector/hint_selector/hint_selector.gd
@@ -0,0 +1,48 @@
+@tool
+extends EditorProperty
+
+const PROPERTY: StringName = "value_hint"
+
+@export var _window_scn: PackedScene
+@export_group("Nodes")
+@export var _Btn: Button
+@export var _Value: Label
+
+@onready var _obj: ggsSetting = get_edited_object()
+
+
+func _ready() -> void:
+ if read_only:
+ _Btn.disabled = true
+
+ _Btn.pressed.connect(_on_Btn_pressed)
+ _update_controls()
+
+
+func _update_controls() -> void:
+ var hint: PropertyHint = _obj.get(PROPERTY)
+ _Btn.text = ggsUtils.ALL_HINTS[hint]
+ _Btn.tooltip_text = _Btn.text
+ _Value.text = str(hint)
+
+
+func _on_Btn_pressed() -> void:
+ var type: Variant.Type = _obj.get("value_type")
+ var HintWin: ConfirmationDialog = _window_scn.instantiate()
+ var compatible_hints = ggsUtils.type_get_compatible_hints(type)
+ HintWin.hint_confirmed.connect(_on_HintWin_confirmed)
+ HintWin.List.init_list(compatible_hints)
+ add_child(HintWin)
+ HintWin.popup_centered()
+
+
+func _on_HintWin_confirmed(hint: PropertyHint) -> void:
+ _obj.set(PROPERTY, hint)
+ emit_changed(PROPERTY, hint)
+
+ var type: Variant.Type = _obj.get("value_type")
+ _obj.default = ggsUtils.TYPE_DEFAULTS[type]
+ _obj.value_hint_string = "0,1" if (hint == PROPERTY_HINT_RANGE) else ""
+ _obj.notify_property_list_changed()
+
+ _update_controls()
diff --git a/plugin/inspector/hint_selector/hint_selector.tscn b/plugin/inspector/hint_selector/hint_selector.tscn
new file mode 100644
index 00000000..2d2092bb
--- /dev/null
+++ b/plugin/inspector/hint_selector/hint_selector.tscn
@@ -0,0 +1,28 @@
+[gd_scene load_steps=3 format=3 uid="uid://guy0hof7ufw4"]
+
+[ext_resource type="Script" path="res://addons/ggs/plugin/inspector/hint_selector/hint_selector.gd" id="1_mt5sg"]
+[ext_resource type="PackedScene" uid="uid://bmc8dc74pu1ei" path="res://addons/ggs/plugin/inspector/hint_selector/window/hint_select_win.tscn" id="2_7h0xs"]
+
+[node name="HintSelector" type="EditorProperty" node_paths=PackedStringArray("_Btn", "_Value")]
+offset_right = 40.0
+offset_bottom = 40.0
+script = ExtResource("1_mt5sg")
+_window_scn = ExtResource("2_7h0xs")
+_Btn = NodePath("Ctnr/Btn")
+_Value = NodePath("Ctnr/Value")
+
+[node name="Ctnr" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="Btn" type="Button" parent="Ctnr"]
+layout_mode = 2
+size_flags_horizontal = 3
+alignment = 0
+text_overrun_behavior = 3
+clip_text = true
+
+[node name="Value" type="Label" parent="Ctnr"]
+custom_minimum_size = Vector2(25, 0)
+layout_mode = 2
+text = "23"
+horizontal_alignment = 1
diff --git a/plugin/inspector/hint_selector/window/hint_list.gd b/plugin/inspector/hint_selector/window/hint_list.gd
new file mode 100644
index 00000000..ff5500a4
--- /dev/null
+++ b/plugin/inspector/hint_selector/window/hint_list.gd
@@ -0,0 +1,7 @@
+@tool
+extends ggsBaseSelectList
+
+
+func init_list(base_list: PackedStringArray) -> void:
+ base_items = base_list
+ create_from_arr(base_list)
diff --git a/plugin/inspector/hint_selector/window/hint_select_win.gd b/plugin/inspector/hint_selector/window/hint_select_win.gd
new file mode 100644
index 00000000..67dd8131
--- /dev/null
+++ b/plugin/inspector/hint_selector/window/hint_select_win.gd
@@ -0,0 +1,29 @@
+@tool
+extends ggsBaseSelectWin
+
+signal hint_confirmed(hint: PropertyHint)
+
+
+func _confirm_selection(selection: PropertyHint) -> void:
+ hint_confirmed.emit(selection)
+ hide()
+
+
+func _on_confirmed() -> void:
+ var item_idx = get_selected_item_idx()
+ var item: String = List.get_item_text(item_idx)
+ var hint_idx = ggsUtils.ALL_HINTS.find_key(item)
+ _confirm_selection(hint_idx)
+
+
+func _on_FilterField_text_submitted(submitted_text: String) -> void:
+ if field_value_is_valid:
+ var item: String = List.get_item_text(0)
+ var hint_idx: int = ggsUtils.ALL_HINTS.find_key(item)
+ _confirm_selection(hint_idx)
+
+
+func _on_List_item_activated(index: int) -> void:
+ var item: String = List.get_item_text(index)
+ var idx: int = ggsUtils.ALL_HINTS.find_key(item)
+ _confirm_selection(idx)
diff --git a/plugin/inspector/hint_selector/window/hint_select_win.tscn b/plugin/inspector/hint_selector/window/hint_select_win.tscn
new file mode 100644
index 00000000..78575607
--- /dev/null
+++ b/plugin/inspector/hint_selector/window/hint_select_win.tscn
@@ -0,0 +1,567 @@
+[gd_scene load_steps=80 format=3 uid="uid://bmc8dc74pu1ei"]
+
+[ext_resource type="Script" path="res://addons/ggs/plugin/inspector/hint_selector/window/hint_select_win.gd" id="1_134ng"]
+[ext_resource type="Texture2D" uid="uid://dbervsl0o0ifw" path="res://addons/ggs/plugin/assets/search.svg" id="2_udixs"]
+[ext_resource type="Script" path="res://addons/ggs/plugin/inspector/hint_selector/window/hint_list.gd" id="2_us8tf"]
+
+[sub_resource type="Image" id="Image_5oljy"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 231, 225, 225, 225, 135, 255, 255, 255, 5, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 134, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 73, 224, 224, 224, 255, 224, 224, 224, 229, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 230, 224, 224, 224, 255, 224, 224, 224, 73, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 225, 225, 225, 135, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 5, 225, 225, 225, 134, 224, 224, 224, 229, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_yn0lj"]
+image = SubResource("Image_5oljy")
+
+[sub_resource type="Image" id="Image_id27n"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 112, 145, 240, 224, 111, 146, 240, 129, 128, 192, 255, 4, 112, 145, 241, 137, 112, 145, 240, 233, 111, 145, 240, 230, 111, 146, 240, 131, 111, 146, 241, 140, 112, 145, 240, 233, 111, 145, 240, 232, 112, 145, 241, 137, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 112, 145, 240, 224, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 114, 145, 240, 65, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 113, 146, 243, 61, 114, 145, 240, 65, 111, 145, 240, 255, 111, 145, 240, 255, 111, 148, 243, 62, 114, 145, 240, 65, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 114, 145, 240, 67, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 113, 146, 243, 63, 114, 145, 240, 67, 111, 145, 240, 255, 111, 145, 240, 255, 113, 146, 243, 63, 114, 145, 240, 67, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 112, 147, 241, 73, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 221, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 221, 111, 145, 240, 255, 111, 145, 240, 254, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 241, 222, 111, 146, 241, 126, 170, 170, 255, 3, 112, 145, 240, 132, 111, 145, 240, 228, 111, 145, 240, 225, 112, 145, 241, 127, 111, 146, 240, 129, 111, 145, 240, 227, 111, 145, 240, 228, 112, 145, 240, 130, 170, 170, 255, 3, 112, 146, 240, 128, 111, 146, 240, 219, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_0bjsf"]
+image = SubResource("Image_id27n")
+
+[sub_resource type="Image" id="Image_l2qi0"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 231, 91, 187, 240, 135, 102, 204, 255, 5, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 91, 187, 240, 134, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 91, 189, 241, 73, 90, 187, 239, 255, 90, 187, 239, 229, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 188, 239, 230, 90, 187, 239, 255, 91, 189, 241, 73, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 91, 187, 240, 135, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 102, 204, 255, 5, 91, 187, 240, 134, 90, 187, 239, 229, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_h2fir"]
+image = SubResource("Image_l2qi0")
+
+[sub_resource type="Image" id="Image_ovfbh"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 85, 213, 255, 6, 54, 213, 244, 137, 53, 212, 244, 231, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 54, 213, 244, 137, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 231, 53, 212, 244, 255, 53, 213, 245, 72, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 230, 53, 212, 244, 255, 56, 213, 245, 73, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 230, 53, 212, 244, 255, 56, 213, 245, 73, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 135, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 135, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 102, 255, 255, 5, 53, 212, 244, 134, 53, 212, 244, 229, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 102, 255, 255, 5, 53, 212, 244, 134, 53, 212, 244, 229, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_2pnr0"]
+image = SubResource("Image_ovfbh")
+
+[sub_resource type="Image" id="Image_t8aic"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 69, 149, 236, 103, 69, 147, 236, 222, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 73, 150, 237, 56, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 70, 147, 237, 113, 69, 147, 236, 255, 69, 147, 236, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 85, 170, 255, 6, 69, 147, 237, 137, 69, 147, 236, 231, 255, 255, 255, 0, 255, 255, 255, 0, 73, 150, 237, 56, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 222, 70, 147, 238, 101, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 69, 147, 237, 137, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 70, 147, 238, 101, 69, 147, 236, 220, 69, 147, 236, 255, 69, 147, 236, 255, 72, 149, 236, 53, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 231, 69, 147, 236, 255, 71, 149, 238, 72, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 70, 147, 236, 175, 69, 147, 236, 255, 70, 147, 237, 109, 255, 255, 255, 0, 69, 148, 237, 230, 69, 147, 236, 255, 70, 147, 238, 73, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 254, 73, 147, 236, 52, 255, 255, 255, 0, 70, 147, 237, 135, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 220, 70, 148, 237, 98, 255, 255, 255, 0, 255, 255, 255, 0, 102, 153, 255, 5, 70, 147, 236, 134, 69, 147, 236, 229, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_lught"]
+image = SubResource("Image_t8aic")
+
+[sub_resource type="Image" id="Image_er14r"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 171, 247, 255, 205, 169, 247, 233, 202, 163, 246, 157, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 200, 162, 246, 156, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 1, 173, 115, 242, 131, 172, 115, 241, 222, 172, 115, 241, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 198, 159, 246, 85, 205, 171, 247, 255, 204, 168, 247, 232, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 116, 242, 132, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 198, 161, 247, 89, 205, 171, 247, 255, 205, 169, 248, 231, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 224, 172, 115, 241, 255, 173, 115, 243, 62, 255, 255, 255, 0, 255, 255, 255, 0, 200, 160, 248, 96, 204, 168, 246, 238, 205, 171, 247, 255, 205, 171, 247, 255, 200, 163, 245, 153, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 175, 117, 242, 76, 172, 115, 241, 255, 172, 115, 241, 228, 172, 115, 241, 223, 172, 115, 241, 255, 174, 117, 243, 63, 255, 255, 255, 0, 255, 255, 255, 0, 204, 168, 246, 238, 205, 171, 247, 255, 204, 169, 247, 233, 200, 163, 245, 153, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 173, 115, 242, 131, 172, 116, 242, 132, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 229, 173, 115, 242, 131, 204, 153, 255, 5, 255, 255, 255, 1, 172, 115, 242, 129, 172, 115, 242, 220, 172, 115, 241, 255, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_vwtae"]
+image = SubResource("Image_er14r")
+
+[sub_resource type="Image" id="Image_pd58c"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 171, 247, 255, 205, 169, 247, 233, 202, 163, 246, 157, 255, 255, 255, 2, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 200, 162, 246, 156, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 198, 159, 246, 85, 205, 171, 247, 255, 204, 168, 247, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 198, 161, 247, 89, 205, 171, 247, 255, 205, 169, 248, 231, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 200, 160, 248, 96, 204, 168, 246, 238, 205, 171, 247, 255, 205, 171, 247, 255, 200, 163, 245, 153, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 175, 117, 242, 76, 172, 115, 241, 255, 172, 115, 241, 228, 255, 255, 255, 0, 204, 168, 246, 238, 205, 171, 247, 255, 204, 169, 247, 233, 200, 163, 245, 153, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 173, 115, 242, 131, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 229, 173, 115, 242, 131, 204, 153, 255, 5, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_ww0ne"]
+image = SubResource("Image_pd58c")
+
+[sub_resource type="Image" id="Image_u4mp2"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 128, 170, 6, 241, 115, 143, 137, 241, 115, 144, 231, 241, 115, 143, 255, 255, 146, 146, 7, 241, 116, 143, 143, 241, 116, 143, 236, 241, 115, 143, 235, 241, 115, 144, 138, 255, 153, 153, 5, 242, 115, 144, 133, 241, 115, 144, 224, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 137, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 144, 142, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 116, 143, 225, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 144, 231, 241, 115, 143, 255, 241, 117, 145, 72, 255, 255, 255, 0, 241, 115, 143, 237, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 243, 115, 144, 62, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 241, 116, 143, 236, 241, 115, 143, 255, 241, 115, 143, 73, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 230, 241, 115, 143, 255, 243, 117, 146, 63, 255, 255, 255, 0, 241, 115, 143, 230, 241, 115, 143, 255, 241, 115, 143, 73, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 144, 140, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 242, 115, 144, 135, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 242, 115, 144, 135, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 153, 153, 5, 241, 115, 144, 140, 241, 115, 143, 232, 241, 115, 143, 255, 255, 255, 255, 0, 255, 153, 153, 5, 242, 116, 143, 134, 241, 115, 143, 229, 241, 115, 143, 255, 255, 153, 153, 5, 242, 116, 143, 134, 241, 115, 143, 229, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_3jp0h"]
+image = SubResource("Image_u4mp2")
+
+[sub_resource type="Image" id="Image_8skih"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 128, 170, 6, 241, 115, 143, 137, 241, 115, 144, 231, 241, 115, 143, 255, 255, 255, 255, 1, 242, 115, 144, 131, 241, 115, 144, 222, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 144, 138, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 242, 116, 143, 132, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 232, 241, 115, 143, 255, 241, 117, 145, 72, 255, 255, 255, 0, 241, 115, 144, 224, 241, 115, 143, 255, 243, 117, 146, 61, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 223, 241, 115, 143, 255, 243, 117, 146, 63, 255, 255, 255, 0, 241, 115, 143, 230, 241, 115, 143, 255, 241, 115, 143, 73, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 242, 116, 143, 132, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 242, 115, 144, 135, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 242, 115, 144, 129, 242, 115, 143, 220, 241, 115, 143, 255, 255, 153, 153, 5, 242, 116, 143, 134, 241, 115, 143, 229, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_f6fy1"]
+image = SubResource("Image_8skih")
+
+[sub_resource type="Image" id="Image_nry5o"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 1, 222, 103, 240, 131, 222, 102, 241, 222, 222, 102, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 232, 154, 245, 98, 235, 163, 246, 255, 235, 161, 246, 239, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 223, 102, 240, 132, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 233, 153, 244, 158, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 224, 222, 102, 240, 255, 222, 103, 243, 62, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 232, 153, 245, 143, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 104, 242, 76, 222, 102, 240, 255, 222, 102, 240, 228, 222, 102, 241, 223, 222, 102, 240, 255, 223, 105, 243, 63, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 150, 243, 85, 235, 163, 246, 255, 235, 161, 246, 233, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 222, 103, 240, 131, 223, 102, 240, 132, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 235, 153, 247, 87, 235, 163, 246, 255, 234, 160, 245, 226, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 229, 222, 103, 240, 131, 255, 102, 255, 5, 255, 255, 255, 1, 222, 103, 240, 129, 222, 102, 240, 220, 222, 102, 240, 255, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 234, 153, 246, 163, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 161, 245, 230, 232, 155, 244, 155, 255, 170, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_h0eon"]
+image = SubResource("Image_nry5o")
+
+[sub_resource type="Image" id="Image_jljc8"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 154, 245, 98, 235, 163, 246, 255, 235, 161, 246, 239, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 233, 153, 244, 158, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 232, 153, 245, 143, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 104, 242, 76, 222, 102, 240, 255, 222, 102, 240, 228, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 150, 243, 85, 235, 163, 246, 255, 235, 161, 246, 233, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 222, 103, 240, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 153, 247, 87, 235, 163, 246, 255, 234, 160, 245, 226, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 229, 222, 103, 240, 131, 255, 102, 255, 5, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 234, 153, 246, 163, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 161, 245, 230, 232, 155, 244, 155, 255, 170, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_km0y5"]
+image = SubResource("Image_jljc8")
+
+[sub_resource type="Image" id="Image_esweh"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 199, 240, 103, 255, 213, 243, 138, 233, 208, 242, 130, 157, 255, 255, 255, 2, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 240, 186, 236, 65, 173, 192, 241, 71, 36, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 199, 240, 103, 255, 213, 244, 141, 255, 213, 244, 141, 255, 208, 242, 129, 156, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 238, 192, 241, 71, 36, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 207, 240, 126, 85, 213, 244, 141, 255, 211, 243, 137, 232, 185, 236, 65, 255, 185, 236, 65, 255, 186, 240, 69, 33, 186, 236, 65, 187, 185, 236, 65, 255, 185, 236, 66, 170, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 209, 241, 126, 89, 213, 244, 141, 255, 212, 243, 138, 231, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 192, 241, 71, 36, 185, 236, 65, 255, 185, 236, 65, 237, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 210, 245, 128, 96, 211, 244, 138, 238, 213, 244, 141, 255, 213, 244, 141, 255, 209, 244, 130, 153, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 188, 242, 67, 38, 185, 236, 65, 255, 185, 236, 65, 236, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 211, 244, 138, 238, 213, 244, 141, 255, 212, 243, 138, 233, 209, 244, 130, 153, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 192, 241, 71, 36, 185, 236, 65, 192, 185, 236, 65, 255, 185, 236, 65, 167, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 213, 244, 141, 255, 213, 244, 141, 255, 213, 244, 141, 255, 213, 244, 141, 255, 213, 244, 141, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 236, 192, 240, 72, 32, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 213, 244, 141, 255, 213, 244, 141, 255, 213, 244, 141, 255, 213, 244, 141, 255, 213, 244, 141, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 238, 186, 236, 65, 169, 186, 240, 69, 33, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_khm6q"]
+image = SubResource("Image_esweh")
+
+[sub_resource type="Image" id="Image_vw7b7"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 1, 240, 103, 189, 131, 241, 102, 189, 222, 240, 102, 189, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 190, 132, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 224, 240, 102, 189, 255, 243, 103, 189, 62, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 242, 104, 192, 76, 240, 102, 189, 255, 240, 102, 189, 228, 241, 102, 189, 223, 240, 102, 189, 255, 243, 105, 190, 63, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 255, 240, 103, 189, 131, 240, 102, 190, 132, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 190, 229, 240, 103, 189, 131, 255, 102, 204, 5, 255, 255, 255, 1, 240, 103, 190, 129, 240, 102, 189, 220, 240, 102, 189, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_trt31"]
+image = SubResource("Image_vw7b7")
+
+[sub_resource type="Image" id="Image_mm76v"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 242, 104, 192, 76, 240, 102, 189, 255, 240, 102, 189, 228, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 255, 240, 103, 189, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 190, 229, 240, 103, 189, 131, 255, 102, 204, 5, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_gcnvv"]
+image = SubResource("Image_mm76v")
+
+[sub_resource type="Image" id="Image_u4ocb"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 222, 248, 74, 74, 131, 255, 255, 255, 1, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 255, 248, 74, 74, 130, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 248, 74, 74, 65, 247, 73, 73, 255, 247, 73, 73, 220, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 231, 248, 73, 73, 135, 255, 102, 102, 5, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 248, 75, 75, 68, 247, 73, 73, 255, 247, 73, 73, 219, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 255, 248, 74, 74, 134, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 255, 247, 74, 74, 127, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 248, 73, 73, 73, 247, 73, 73, 255, 247, 73, 73, 229, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 247, 74, 74, 221, 247, 74, 74, 127, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 230, 247, 73, 73, 255, 248, 73, 73, 73, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 248, 73, 73, 135, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 102, 102, 5, 248, 74, 74, 134, 247, 73, 73, 229, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_e0uju"]
+image = SubResource("Image_u4ocb")
+
+[sub_resource type="Image" id="Image_hrk5b"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 236, 65, 142, 255, 236, 65, 142, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 236, 65, 142, 255, 236, 65, 142, 255, 255, 255, 255, 0, 255, 255, 255, 1, 236, 66, 142, 131, 236, 65, 142, 222, 236, 65, 142, 255, 244, 141, 187, 255, 244, 141, 187, 255, 255, 255, 255, 0, 244, 141, 187, 255, 244, 142, 188, 254, 236, 66, 142, 142, 236, 65, 142, 233, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 143, 132, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 244, 141, 187, 255, 244, 141, 187, 255, 255, 255, 255, 0, 244, 141, 187, 255, 244, 141, 187, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 222, 236, 65, 142, 255, 236, 66, 145, 65, 236, 65, 142, 255, 244, 141, 187, 255, 244, 141, 187, 255, 255, 255, 255, 0, 244, 141, 187, 255, 244, 141, 187, 255, 236, 65, 142, 255, 239, 66, 144, 62, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 255, 255, 255, 0, 236, 65, 142, 222, 236, 65, 142, 255, 236, 68, 144, 64, 236, 65, 142, 255, 243, 134, 183, 255, 244, 141, 187, 255, 242, 126, 180, 95, 244, 141, 187, 255, 244, 141, 187, 255, 236, 65, 142, 255, 239, 65, 142, 63, 236, 65, 142, 255, 236, 65, 142, 255, 237, 65, 142, 230, 236, 65, 142, 255, 238, 66, 143, 73, 236, 65, 143, 132, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 240, 106, 166, 255, 244, 141, 187, 255, 244, 141, 187, 255, 244, 141, 187, 255, 244, 141, 187, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 237, 66, 142, 135, 236, 65, 142, 255, 236, 65, 142, 255, 255, 255, 255, 1, 236, 65, 142, 129, 236, 65, 143, 220, 236, 65, 142, 255, 236, 67, 143, 255, 243, 129, 180, 162, 243, 138, 186, 240, 244, 141, 187, 255, 244, 141, 187, 255, 237, 65, 142, 137, 237, 65, 142, 230, 236, 65, 142, 255, 236, 65, 142, 255, 255, 102, 153, 5, 236, 66, 143, 134, 236, 65, 143, 229, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 236, 65, 142, 255, 236, 65, 142, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 236, 65, 142, 255, 236, 65, 142, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_s7c65"]
+image = SubResource("Image_hrk5b")
+
+[sub_resource type="Image" id="Image_luv4g"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 128, 128, 6, 238, 87, 120, 134, 238, 86, 119, 219, 238, 86, 119, 255, 238, 86, 119, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 238, 86, 119, 255, 238, 86, 119, 254, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 238, 87, 119, 143, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 238, 86, 119, 255, 238, 86, 119, 252, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 238, 86, 119, 217, 238, 86, 119, 255, 239, 88, 121, 61, 238, 86, 119, 255, 238, 86, 119, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 222, 238, 87, 119, 131, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 238, 86, 119, 228, 238, 86, 119, 255, 239, 89, 121, 63, 238, 86, 119, 255, 238, 86, 119, 255, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 120, 130, 255, 255, 255, 0, 255, 255, 255, 0, 239, 86, 119, 122, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 255, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 238, 86, 119, 255, 238, 86, 119, 255, 240, 86, 122, 65, 238, 86, 119, 255, 238, 86, 119, 220, 255, 153, 153, 5, 242, 122, 148, 150, 243, 124, 150, 238, 242, 126, 151, 255, 242, 126, 151, 255, 238, 86, 119, 255, 238, 86, 119, 255, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 243, 124, 150, 238, 240, 107, 136, 255, 238, 87, 120, 255, 240, 86, 120, 68, 238, 86, 119, 255, 238, 86, 119, 219, 243, 123, 150, 143, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 240, 107, 136, 255, 238, 86, 119, 255, 238, 86, 119, 255, 239, 86, 120, 127, 243, 126, 152, 229, 242, 126, 151, 255, 241, 122, 150, 73, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 242, 123, 149, 77, 242, 126, 151, 255, 241, 121, 147, 255, 238, 86, 119, 221, 239, 86, 120, 127, 255, 255, 255, 0, 242, 125, 151, 230, 242, 126, 151, 255, 242, 122, 150, 75, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 243, 123, 149, 79, 242, 126, 151, 255, 241, 124, 149, 234, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 124, 149, 144, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 241, 122, 147, 146, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 153, 153, 5, 241, 124, 149, 146, 242, 125, 150, 233, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 241, 124, 149, 234, 241, 122, 147, 146, 255, 102, 153, 5, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_lds05"]
+image = SubResource("Image_luv4g")
+
+[sub_resource type="Image" id="Image_o3luw"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 236, 65, 255, 225, 236, 65, 254, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 237, 244, 141, 255, 237, 244, 141, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 236, 65, 255, 225, 236, 65, 252, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 237, 244, 141, 255, 237, 244, 141, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 236, 65, 255, 225, 236, 65, 255, 226, 236, 65, 222, 226, 236, 66, 131, 255, 255, 255, 1, 226, 237, 66, 69, 226, 236, 65, 222, 225, 236, 65, 255, 225, 236, 65, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 237, 66, 69, 226, 236, 65, 222, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 226, 236, 66, 130, 226, 236, 65, 222, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 236, 65, 222, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 227, 238, 66, 73, 225, 236, 65, 255, 225, 236, 65, 220, 226, 236, 65, 222, 225, 236, 65, 255, 225, 236, 66, 221, 225, 237, 67, 68, 255, 255, 255, 0, 237, 244, 141, 255, 237, 244, 141, 255, 226, 236, 65, 222, 225, 236, 65, 255, 225, 236, 66, 221, 225, 237, 67, 68, 225, 236, 65, 255, 225, 236, 65, 255, 225, 239, 67, 76, 225, 236, 65, 255, 225, 236, 65, 219, 225, 237, 67, 68, 225, 236, 65, 220, 225, 236, 65, 255, 225, 236, 65, 219, 255, 255, 255, 0, 237, 244, 141, 255, 237, 244, 141, 255, 225, 237, 67, 68, 225, 236, 65, 220, 225, 236, 65, 255, 225, 236, 65, 219, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 237, 66, 127, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 237, 66, 217, 255, 255, 255, 0, 237, 244, 141, 255, 237, 244, 141, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 237, 66, 217, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 66, 221, 225, 237, 66, 127, 255, 255, 255, 0, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 220, 228, 236, 66, 65, 255, 255, 255, 0, 237, 244, 141, 255, 237, 244, 141, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 220, 228, 236, 66, 65, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_ix2vx"]
+image = SubResource("Image_o3luw")
+
+[sub_resource type="Image" id="Image_t0pfa"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 248, 165, 106, 255, 250, 188, 144, 255, 250, 188, 144, 255, 250, 188, 144, 255, 249, 180, 130, 112, 246, 143, 69, 255, 246, 143, 69, 255, 246, 144, 69, 240, 247, 143, 69, 173, 248, 149, 71, 36, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 248, 165, 106, 255, 250, 188, 144, 255, 250, 188, 144, 255, 250, 188, 144, 255, 251, 181, 130, 110, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 238, 248, 149, 71, 36, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 249, 185, 139, 226, 249, 188, 144, 254, 252, 177, 126, 65, 246, 143, 69, 255, 246, 143, 69, 255, 248, 147, 69, 33, 246, 143, 69, 187, 246, 143, 69, 255, 246, 143, 69, 170, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 255, 255, 255, 0, 250, 183, 135, 176, 250, 188, 144, 255, 249, 185, 138, 210, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 248, 149, 71, 36, 246, 143, 69, 255, 246, 143, 69, 237, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 255, 255, 255, 0, 250, 179, 129, 87, 250, 188, 144, 251, 250, 188, 144, 255, 251, 182, 130, 59, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 249, 148, 74, 38, 246, 143, 69, 255, 246, 143, 69, 236, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 255, 255, 170, 3, 249, 186, 131, 37, 249, 187, 141, 244, 250, 188, 144, 255, 252, 180, 128, 68, 246, 143, 69, 255, 246, 143, 69, 255, 248, 149, 71, 36, 246, 144, 69, 192, 246, 143, 69, 255, 246, 144, 70, 167, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 249, 183, 135, 191, 250, 188, 144, 255, 250, 188, 144, 255, 249, 187, 142, 242, 255, 192, 128, 16, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 236, 248, 144, 72, 32, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 250, 183, 136, 188, 250, 187, 142, 244, 249, 184, 137, 203, 252, 180, 128, 68, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 238, 246, 143, 69, 169, 248, 147, 69, 33, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_1bw4u"]
+image = SubResource("Image_t0pfa")
+
+[sub_resource type="Image" id="Image_2ojw2"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 232, 69, 190, 69, 136, 128, 192, 128, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 70, 189, 70, 65, 68, 189, 68, 255, 71, 190, 71, 228, 131, 212, 131, 164, 141, 215, 141, 240, 143, 215, 143, 255, 68, 191, 68, 75, 68, 189, 68, 228, 68, 189, 68, 255, 68, 189, 68, 227, 70, 189, 70, 73, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 71, 192, 71, 68, 68, 189, 68, 255, 109, 203, 109, 255, 143, 215, 143, 255, 143, 215, 143, 255, 143, 215, 143, 255, 68, 189, 68, 228, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 69, 189, 69, 226, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 137, 213, 137, 255, 143, 215, 143, 255, 129, 211, 129, 93, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 69, 189, 69, 230, 69, 190, 69, 132, 143, 215, 143, 255, 143, 215, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 255, 255, 255, 0, 255, 255, 255, 0, 143, 215, 143, 255, 143, 215, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 227, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 190, 68, 225, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 255, 255, 255, 0, 255, 255, 255, 0, 143, 215, 143, 255, 143, 215, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 70, 189, 70, 73, 69, 189, 69, 226, 68, 189, 68, 255, 68, 190, 68, 225, 69, 190, 69, 70, 70, 192, 70, 76, 68, 189, 68, 255, 68, 190, 68, 229, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 190, 68, 229, 68, 189, 68, 131, 102, 204, 102, 5),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_6d7iq"]
+image = SubResource("Image_2ojw2")
+
+[sub_resource type="Image" id="Image_bi2ry"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 121, 107, 131, 255, 121, 107, 222, 255, 120, 107, 255, 255, 255, 255, 0, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 128, 213, 255, 6, 95, 179, 255, 137, 95, 178, 255, 231, 95, 178, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 108, 132, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 95, 179, 255, 137, 95, 178, 255, 255, 95, 178, 255, 255, 95, 178, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 224, 255, 120, 107, 255, 255, 121, 109, 61, 255, 255, 255, 0, 255, 255, 255, 0, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 95, 178, 255, 231, 95, 178, 255, 255, 96, 181, 255, 72, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 223, 255, 120, 107, 255, 255, 121, 109, 63, 255, 255, 255, 0, 255, 255, 255, 0, 115, 242, 128, 230, 115, 242, 128, 255, 115, 245, 129, 73, 255, 255, 255, 0, 255, 255, 255, 0, 95, 178, 255, 255, 95, 178, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 108, 132, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 115, 242, 128, 135, 115, 242, 128, 255, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 95, 178, 255, 255, 95, 178, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 121, 107, 129, 255, 121, 107, 220, 255, 120, 107, 255, 255, 255, 255, 0, 153, 255, 153, 5, 116, 242, 128, 134, 115, 242, 128, 229, 115, 242, 128, 255, 255, 255, 255, 0, 95, 178, 255, 255, 95, 178, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_lhfpd"]
+image = SubResource("Image_bi2ry")
+
+[sub_resource type="Image" id="Image_eg8ci"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 69, 149, 236, 103, 69, 147, 236, 222, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 144, 190, 244, 255, 144, 190, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 73, 150, 237, 56, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 144, 190, 244, 255, 144, 190, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 70, 147, 237, 113, 69, 147, 236, 255, 69, 147, 236, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 232, 69, 148, 236, 169, 70, 150, 238, 29, 255, 255, 255, 0, 73, 150, 237, 56, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 222, 70, 147, 238, 101, 255, 255, 255, 0, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 238, 70, 150, 238, 29, 255, 255, 255, 0, 70, 147, 238, 101, 69, 147, 236, 220, 69, 147, 236, 255, 69, 147, 236, 255, 72, 149, 236, 53, 144, 190, 244, 255, 144, 190, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 73, 155, 237, 28, 70, 147, 236, 182, 69, 147, 236, 255, 70, 147, 236, 167, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 70, 147, 236, 175, 69, 147, 236, 255, 70, 147, 237, 109, 141, 189, 244, 239, 144, 190, 244, 255, 129, 180, 242, 95, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 73, 155, 237, 28, 69, 147, 236, 255, 69, 148, 237, 230, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 254, 73, 147, 236, 52, 134, 185, 244, 160, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 220, 70, 148, 237, 98, 255, 255, 255, 0, 146, 182, 255, 7, 134, 184, 243, 160, 141, 190, 244, 238, 144, 190, 244, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_xmdsm"]
+image = SubResource("Image_eg8ci")
+
+[sub_resource type="Image" id="Image_mrqhr"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 222, 66, 123, 236, 131, 255, 255, 255, 1, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 254, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 66, 122, 236, 130, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 252, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 66, 122, 236, 65, 65, 122, 236, 255, 65, 122, 236, 220, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 123, 236, 231, 66, 123, 237, 135, 102, 153, 255, 5, 65, 122, 236, 255, 65, 122, 236, 255, 67, 124, 237, 68, 65, 122, 236, 255, 65, 122, 236, 219, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 66, 122, 236, 134, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 66, 122, 237, 127, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 66, 122, 238, 73, 65, 122, 236, 255, 65, 122, 236, 229, 65, 122, 236, 255, 65, 122, 236, 255, 66, 122, 236, 221, 66, 122, 237, 127, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 237, 230, 65, 122, 236, 255, 66, 122, 238, 73, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 66, 123, 237, 135, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 102, 153, 255, 5, 66, 122, 236, 134, 65, 122, 236, 229, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_txme0"]
+image = SubResource("Image_mrqhr")
+
+[sub_resource type="Image" id="Image_l10ju"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 85, 255, 128, 6, 65, 237, 128, 137, 65, 236, 128, 231, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 66, 236, 128, 131, 65, 236, 128, 222, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 66, 237, 128, 138, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 132, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 232, 65, 236, 128, 255, 67, 238, 128, 72, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 224, 65, 236, 128, 255, 66, 239, 128, 62, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 223, 65, 236, 128, 255, 65, 239, 130, 63, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 132, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 1, 65, 236, 128, 129, 65, 236, 128, 220, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_bkoas"]
+image = SubResource("Image_l10ju")
+
+[sub_resource type="Image" id="Image_hegoc"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 224, 224, 224, 99, 224, 224, 224, 213, 224, 224, 224, 212, 224, 224, 224, 97, 255, 255, 255, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 224, 224, 224, 99, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 220, 224, 224, 224, 97, 255, 255, 255, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 224, 224, 224, 99, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 213, 226, 226, 226, 87, 224, 224, 224, 88, 224, 224, 224, 214, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 220, 224, 224, 224, 97, 255, 255, 255, 4, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 199, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 215, 224, 224, 224, 89, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 224, 224, 224, 90, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 194, 255, 255, 255, 0, 255, 255, 255, 4, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 221, 224, 224, 224, 99, 255, 255, 255, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 5, 225, 225, 225, 101, 225, 225, 225, 223, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 3, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 222, 225, 225, 225, 100, 225, 225, 225, 100, 225, 225, 225, 223, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 3, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 2, 226, 226, 226, 87, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 2, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 87, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 1, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 100, 255, 255, 255, 5, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 196, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 223, 225, 225, 225, 101, 255, 255, 255, 5, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 193, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 225, 225, 225, 93, 224, 224, 224, 218, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 223, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 216, 225, 225, 225, 91, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 225, 225, 225, 93, 224, 224, 224, 218, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 216, 225, 225, 225, 91, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 225, 225, 225, 93, 224, 224, 224, 208, 225, 225, 225, 207, 225, 225, 225, 91, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_gb0r2"]
+image = SubResource("Image_hegoc")
+
+[sub_resource type="Image" id="Image_xibi8"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 132, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 224, 224, 224, 145, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 25, 224, 224, 224, 188, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 64, 225, 225, 225, 143, 224, 224, 224, 246, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 222, 226, 226, 226, 52, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 225, 225, 225, 190, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 230, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 188, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 219, 224, 224, 224, 49, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 227, 227, 227, 63, 225, 225, 225, 142, 224, 224, 224, 246, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 223, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 25, 224, 224, 224, 187, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 159, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 224, 224, 224, 145, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 226, 226, 226, 95, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 231, 231, 231, 31, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_4d86u"]
+image = SubResource("Image_xibi8")
+
+[sub_resource type="Image" id="Image_5ttcf"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 121, 108, 154, 255, 128, 128, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 198, 255, 122, 112, 25, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 230, 255, 121, 107, 57, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 249, 255, 120, 107, 102, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 249, 255, 120, 107, 102, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 230, 255, 121, 107, 57, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 197, 255, 122, 112, 25, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 153, 255, 128, 128, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_hsxi0"]
+image = SubResource("Image_5ttcf")
+
+[sub_resource type="Image" id="Image_aghir"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 255, 255, 255, 1, 84, 238, 158, 131, 84, 237, 159, 222, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 84, 238, 158, 131, 84, 237, 159, 222, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 85, 238, 159, 132, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 85, 238, 159, 132, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 159, 222, 84, 237, 158, 255, 88, 239, 159, 61, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 224, 84, 237, 158, 255, 86, 239, 161, 62, 255, 255, 255, 0, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 159, 222, 84, 237, 158, 255, 85, 239, 158, 63, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 223, 84, 237, 158, 255, 85, 239, 158, 63, 255, 255, 255, 0, 255, 255, 255, 0, 84, 237, 158, 230, 84, 237, 158, 255, 84, 238, 161, 73, 85, 238, 159, 132, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 85, 238, 159, 132, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 85, 237, 159, 135, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 1, 85, 238, 158, 129, 84, 237, 158, 220, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 1, 85, 238, 158, 129, 84, 237, 158, 220, 84, 237, 158, 255, 255, 255, 255, 0, 102, 255, 204, 5, 84, 238, 158, 134, 84, 238, 158, 229, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_jsm6x"]
+image = SubResource("Image_aghir")
+
+[sub_resource type="Image" id="Image_02cq7"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 224, 224, 224, 131, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 6, 224, 224, 224, 137, 224, 224, 224, 231, 224, 224, 224, 255, 255, 255, 255, 6, 224, 224, 224, 137, 224, 224, 224, 231, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 132, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 137, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 137, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 224, 224, 224, 224, 255, 226, 226, 226, 61, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 231, 224, 224, 224, 255, 224, 224, 224, 72, 255, 255, 255, 0, 224, 224, 224, 231, 224, 224, 224, 255, 224, 224, 224, 72, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 223, 224, 224, 224, 255, 227, 227, 227, 63, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 132, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 224, 224, 224, 129, 224, 224, 224, 220, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_ael3a"]
+image = SubResource("Image_02cq7")
+
+[sub_resource type="Image" id="Image_mksuq"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 128, 255, 128, 6, 115, 242, 128, 137, 115, 242, 128, 231, 115, 242, 128, 255, 171, 247, 179, 255, 171, 247, 179, 255, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 115, 243, 128, 138, 115, 242, 128, 255, 115, 242, 128, 255, 115, 242, 128, 255, 171, 247, 179, 255, 171, 247, 179, 255, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 115, 242, 128, 232, 115, 242, 128, 255, 117, 245, 128, 72, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 161, 245, 169, 98, 171, 247, 179, 255, 171, 247, 179, 255, 161, 245, 169, 98, 171, 247, 179, 255, 169, 247, 177, 238, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 171, 247, 179, 255, 171, 247, 179, 255, 171, 247, 179, 255, 171, 247, 179, 255, 171, 247, 179, 255, 163, 246, 172, 157, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 169, 247, 178, 240, 171, 247, 179, 255, 171, 247, 179, 255, 169, 248, 178, 238, 163, 246, 172, 157, 192, 255, 192, 8, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_l40an"]
+image = SubResource("Image_mksuq")
+
+[sub_resource type="Image" id="Image_6l870"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 154, 213, 245, 240, 147, 211, 246, 160, 146, 219, 255, 7, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 156, 214, 245, 255, 156, 214, 245, 255, 147, 209, 244, 160, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 142, 210, 245, 95, 156, 214, 245, 255, 154, 214, 246, 238, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 90, 188, 239, 230, 90, 187, 239, 255, 91, 189, 241, 73, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 91, 187, 240, 135, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 102, 204, 255, 5, 91, 187, 240, 134, 90, 187, 239, 229, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_bddj0"]
+image = SubResource("Image_6l870")
+
+[sub_resource type="Image" id="Image_ein6n"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 154, 213, 245, 240, 147, 211, 246, 160, 146, 219, 255, 7, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 156, 214, 245, 255, 156, 214, 245, 255, 147, 209, 244, 160, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 142, 210, 245, 95, 156, 214, 245, 255, 154, 214, 246, 238, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 90, 188, 239, 230, 90, 187, 239, 255, 91, 189, 241, 73, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 91, 187, 240, 135, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 102, 204, 255, 5, 91, 187, 240, 134, 90, 187, 239, 229, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_rdajy"]
+image = SubResource("Image_ein6n")
+
+[sub_resource type="Image" id="Image_k4ab5"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 85, 213, 255, 6, 54, 213, 244, 137, 53, 212, 244, 231, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 213, 244, 138, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 54, 212, 244, 232, 53, 212, 244, 255, 53, 213, 245, 72, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 131, 229, 249, 239, 134, 229, 248, 255, 121, 226, 247, 95, 53, 212, 244, 230, 53, 212, 244, 255, 56, 213, 245, 73, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 121, 227, 249, 160, 134, 229, 248, 255, 134, 229, 248, 255, 53, 212, 244, 135, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 146, 255, 255, 7, 121, 227, 248, 160, 132, 229, 249, 238, 102, 255, 255, 5, 53, 212, 244, 134, 53, 212, 244, 229, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_3qwnr"]
+image = SubResource("Image_k4ab5")
+
+[sub_resource type="Image" id="Image_wk31c"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 85, 213, 255, 6, 54, 213, 244, 137, 53, 212, 244, 231, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 213, 244, 138, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 54, 212, 244, 232, 53, 212, 244, 255, 53, 213, 245, 72, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 131, 229, 249, 239, 134, 229, 248, 255, 121, 226, 247, 95, 53, 212, 244, 230, 53, 212, 244, 255, 56, 213, 245, 73, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 121, 227, 249, 160, 134, 229, 248, 255, 134, 229, 248, 255, 53, 212, 244, 135, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 146, 255, 255, 7, 121, 227, 248, 160, 132, 229, 249, 238, 102, 255, 255, 5, 53, 212, 244, 134, 53, 212, 244, 229, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_g7y72"]
+image = SubResource("Image_wk31c")
+
+[sub_resource type="Image" id="Image_swj4b"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 69, 149, 236, 103, 69, 147, 236, 222, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 144, 190, 244, 255, 144, 190, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 73, 150, 237, 56, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 144, 190, 244, 255, 144, 190, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 70, 147, 237, 113, 69, 147, 236, 255, 70, 148, 236, 171, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 85, 170, 255, 6, 69, 147, 237, 137, 69, 147, 236, 231, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 73, 150, 237, 56, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 222, 70, 147, 238, 101, 255, 255, 255, 0, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 69, 147, 237, 137, 69, 147, 236, 255, 69, 147, 236, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 70, 147, 238, 101, 69, 147, 236, 220, 69, 147, 236, 255, 69, 147, 236, 255, 72, 149, 236, 53, 144, 190, 244, 255, 144, 190, 244, 255, 255, 255, 255, 0, 69, 147, 236, 231, 69, 147, 236, 255, 71, 149, 238, 72, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 70, 147, 236, 175, 69, 147, 236, 255, 70, 147, 237, 109, 141, 189, 244, 239, 144, 190, 244, 255, 129, 180, 242, 95, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 254, 73, 147, 236, 52, 134, 185, 244, 160, 144, 190, 244, 255, 144, 190, 244, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 220, 70, 148, 237, 98, 255, 255, 255, 0, 146, 182, 255, 7, 134, 184, 243, 160, 141, 190, 244, 238, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_d2irc"]
+image = SubResource("Image_swj4b")
+
+[sub_resource type="Image" id="Image_n10tl"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 171, 247, 255, 205, 169, 247, 233, 202, 163, 246, 157, 255, 255, 255, 2, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 200, 162, 246, 156, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 255, 255, 255, 0, 198, 159, 246, 85, 205, 171, 247, 255, 204, 168, 247, 232, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 255, 255, 255, 0, 198, 161, 247, 89, 205, 171, 247, 255, 205, 169, 248, 231, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 175, 117, 242, 76, 172, 115, 241, 255, 172, 115, 241, 228, 200, 160, 248, 96, 204, 168, 246, 238, 205, 171, 247, 255, 205, 171, 247, 255, 200, 163, 245, 153, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 173, 115, 242, 131, 204, 168, 246, 238, 205, 171, 247, 255, 204, 169, 247, 233, 200, 163, 245, 153, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 229, 173, 115, 242, 131, 204, 153, 255, 5, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_jnpfb"]
+image = SubResource("Image_n10tl")
+
+[sub_resource type="Image" id="Image_y7tcd"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 232, 154, 245, 98, 235, 163, 246, 255, 235, 161, 246, 239, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 233, 153, 244, 158, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 232, 153, 245, 143, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 104, 242, 76, 222, 102, 240, 255, 222, 102, 240, 228, 255, 255, 255, 0, 231, 150, 243, 85, 235, 163, 246, 255, 235, 161, 246, 233, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 222, 103, 240, 131, 255, 255, 255, 0, 232, 152, 244, 89, 235, 163, 246, 255, 234, 160, 245, 226, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 229, 222, 103, 240, 131, 255, 102, 255, 5, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 234, 153, 246, 163, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 161, 245, 230, 232, 155, 244, 155, 255, 170, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_la62p"]
+image = SubResource("Image_y7tcd")
+
+[sub_resource type="Image" id="Image_asyy1"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 128, 255, 70, 128, 128, 255, 70, 128, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 128, 255, 69, 255, 128, 255, 69, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 77, 77, 23, 255, 70, 70, 95, 255, 70, 70, 128, 128, 255, 69, 255, 128, 255, 69, 255, 255, 255, 255, 0, 255, 255, 255, 0, 71, 215, 255, 25, 69, 216, 255, 103, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 70, 70, 47, 255, 69, 69, 236, 255, 69, 69, 255, 255, 69, 69, 255, 128, 255, 69, 255, 128, 255, 69, 255, 255, 255, 255, 0, 71, 218, 255, 54, 69, 215, 255, 239, 69, 215, 255, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 70, 70, 190, 255, 69, 69, 255, 255, 70, 70, 182, 255, 70, 70, 128, 128, 255, 69, 255, 128, 255, 69, 255, 255, 255, 255, 0, 69, 215, 255, 198, 69, 215, 255, 255, 69, 216, 255, 187, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 69, 69, 241, 255, 69, 69, 255, 255, 85, 85, 15, 255, 255, 255, 0, 128, 255, 69, 249, 128, 255, 69, 255, 128, 255, 85, 12, 69, 215, 255, 249, 69, 215, 255, 255, 85, 234, 255, 12, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 70, 70, 190, 255, 69, 69, 255, 255, 69, 69, 183, 255, 70, 70, 128, 128, 255, 70, 197, 128, 255, 69, 255, 128, 255, 69, 189, 69, 215, 255, 255, 69, 215, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 72, 72, 46, 255, 69, 69, 235, 255, 69, 69, 255, 255, 69, 69, 255, 128, 255, 73, 52, 128, 255, 69, 238, 128, 255, 69, 255, 69, 215, 255, 255, 69, 215, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 73, 73, 21, 255, 69, 69, 92, 255, 70, 70, 128, 255, 255, 255, 0, 128, 255, 74, 24, 129, 255, 70, 101, 70, 216, 255, 128, 70, 216, 255, 128, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_3mah2"]
+image = SubResource("Image_asyy1")
+
+[node name="HintSelectWin" type="ConfirmationDialog" node_paths=PackedStringArray("FilterField", "List")]
+auto_translate_mode = 1
+title = "Select Property Hint"
+size = Vector2i(600, 300)
+unresizable = true
+min_size = Vector2i(400, 300)
+script = ExtResource("1_134ng")
+FilterField = NodePath("VBox/Filterfield")
+List = NodePath("VBox/List")
+
+[node name="VBox" type="VBoxContainer" parent="."]
+offset_left = 8.0
+offset_top = 8.0
+offset_right = 592.0
+offset_bottom = 251.0
+
+[node name="Filterfield" type="LineEdit" parent="VBox"]
+layout_mode = 2
+placeholder_text = "Filter types..."
+clear_button_enabled = true
+right_icon = ExtResource("2_udixs")
+
+[node name="List" type="ItemList" parent="VBox"]
+layout_mode = 2
+size_flags_vertical = 3
+item_count = 38
+max_columns = 3
+fixed_column_width = 180
+item_0/text = "Nil"
+item_0/icon = SubResource("ImageTexture_yn0lj")
+item_1/text = "bool"
+item_1/icon = SubResource("ImageTexture_0bjsf")
+item_2/text = "int"
+item_2/icon = SubResource("ImageTexture_h2fir")
+item_3/text = "float"
+item_3/icon = SubResource("ImageTexture_2pnr0")
+item_4/text = "String"
+item_4/icon = SubResource("ImageTexture_lught")
+item_5/text = "Vector2"
+item_5/icon = SubResource("ImageTexture_vwtae")
+item_6/text = "Vector2i"
+item_6/icon = SubResource("ImageTexture_ww0ne")
+item_7/text = "Rect2"
+item_7/icon = SubResource("ImageTexture_3jp0h")
+item_8/text = "Rect2i"
+item_8/icon = SubResource("ImageTexture_f6fy1")
+item_9/text = "Vector3"
+item_9/icon = SubResource("ImageTexture_h0eon")
+item_10/text = "Vector3i"
+item_10/icon = SubResource("ImageTexture_km0y5")
+item_11/text = "Transform2D"
+item_11/icon = SubResource("ImageTexture_khm6q")
+item_12/text = "Vector4"
+item_12/icon = SubResource("ImageTexture_trt31")
+item_13/text = "Vector4i"
+item_13/icon = SubResource("ImageTexture_gcnvv")
+item_14/text = "Plane"
+item_14/icon = SubResource("ImageTexture_e0uju")
+item_15/text = "Quaternion"
+item_15/icon = SubResource("ImageTexture_s7c65")
+item_16/text = "AABB"
+item_16/icon = SubResource("ImageTexture_lds05")
+item_17/text = "Basis"
+item_17/icon = SubResource("ImageTexture_ix2vx")
+item_18/text = "Transform3D"
+item_18/icon = SubResource("ImageTexture_1bw4u")
+item_19/text = "Projection"
+item_19/icon = SubResource("ImageTexture_6d7iq")
+item_20/text = "Color"
+item_20/icon = SubResource("ImageTexture_lhfpd")
+item_21/text = "StringName"
+item_21/icon = SubResource("ImageTexture_xmdsm")
+item_22/text = "NodePath"
+item_22/icon = SubResource("ImageTexture_txme0")
+item_23/text = "RID"
+item_23/icon = SubResource("ImageTexture_bkoas")
+item_24/text = "Object"
+item_24/icon = SubResource("ImageTexture_gb0r2")
+item_25/text = "Callable"
+item_25/icon = SubResource("ImageTexture_4d86u")
+item_26/text = "Signal"
+item_26/icon = SubResource("ImageTexture_hsxi0")
+item_27/text = "Dictionary"
+item_27/icon = SubResource("ImageTexture_jsm6x")
+item_28/text = "Array"
+item_28/icon = SubResource("ImageTexture_ael3a")
+item_29/text = "PackedByteArray"
+item_29/icon = SubResource("ImageTexture_l40an")
+item_30/text = "PackedInt32Array"
+item_30/icon = SubResource("ImageTexture_bddj0")
+item_31/text = "PackedInt64Array"
+item_31/icon = SubResource("ImageTexture_rdajy")
+item_32/text = "PackedFloat32Array"
+item_32/icon = SubResource("ImageTexture_3qwnr")
+item_33/text = "PackedFloat64Array"
+item_33/icon = SubResource("ImageTexture_g7y72")
+item_34/text = "PackedStringArray"
+item_34/icon = SubResource("ImageTexture_d2irc")
+item_35/text = "PackedVector2Array"
+item_35/icon = SubResource("ImageTexture_jnpfb")
+item_36/text = "PackedVector3Array"
+item_36/icon = SubResource("ImageTexture_la62p")
+item_37/text = "PackedColorArray"
+item_37/icon = SubResource("ImageTexture_3mah2")
+script = ExtResource("2_us8tf")
diff --git a/plugin/inspector/hint_string_field/hint_string_field.gd b/plugin/inspector/hint_string_field/hint_string_field.gd
new file mode 100644
index 00000000..f03f9386
--- /dev/null
+++ b/plugin/inspector/hint_string_field/hint_string_field.gd
@@ -0,0 +1,23 @@
+@tool
+extends EditorProperty
+
+const PROPERTY: String = "value_hint_string"
+
+@export_group("Nodes")
+@export var _Field: LineEdit
+
+@onready var _obj: ggsSetting = get_edited_object()
+
+
+func _ready() -> void:
+ if read_only:
+ _Field.editable = false
+
+ _Field.text_submitted.connect(_on_Field_text_submitted)
+ _Field.text = _obj.get(PROPERTY)
+
+
+func _on_Field_text_submitted(submitted_text: String) -> void:
+ _obj.set(PROPERTY, submitted_text)
+ emit_changed(PROPERTY, submitted_text)
+ _obj.notify_property_list_changed()
diff --git a/plugin/inspector/hint_string_field/hint_string_field.tscn b/plugin/inspector/hint_string_field/hint_string_field.tscn
new file mode 100644
index 00000000..bea1488d
--- /dev/null
+++ b/plugin/inspector/hint_string_field/hint_string_field.tscn
@@ -0,0 +1,12 @@
+[gd_scene load_steps=2 format=3 uid="uid://df1vnh7mng46r"]
+
+[ext_resource type="Script" path="res://addons/ggs/plugin/inspector/hint_string_field/hint_string_field.gd" id="1_yob8v"]
+
+[node name="HintStringField" type="EditorProperty" node_paths=PackedStringArray("_Field")]
+offset_right = 40.0
+offset_bottom = 40.0
+script = ExtResource("1_yob8v")
+_Field = NodePath("Field")
+
+[node name="Field" type="LineEdit" parent="."]
+layout_mode = 2
diff --git a/plugin/inspector/input_selector/input_selector.gd b/plugin/inspector/input_selector/input_selector.gd
new file mode 100644
index 00000000..2e221fd1
--- /dev/null
+++ b/plugin/inspector/input_selector/input_selector.gd
@@ -0,0 +1,38 @@
+@tool
+extends EditorProperty
+
+const PROPERTY: StringName = "action"
+
+@export var _window_scn: PackedScene
+@export_group("Nodes")
+@export var _Btn: Button
+
+@onready var _obj: settingInput = get_edited_object()
+
+
+func _ready() -> void:
+ _Btn.pressed.connect(_on_Btn_pressed)
+ _update_controls()
+
+
+func _update_controls() -> void:
+ var property_value: String = _obj.get(PROPERTY)
+ _Btn.text = "Select Input" if property_value.is_empty() else property_value
+ _Btn.tooltip_text = _Btn.text
+
+
+func _on_Btn_pressed() -> void:
+ var InputWin: ConfirmationDialog = _window_scn.instantiate()
+ InputWin.input_confirmed.connect(_on_InputWin_confirmed)
+ add_child(InputWin)
+ InputWin.popup_centered()
+
+
+func _on_InputWin_confirmed(action: String) -> void:
+ _obj.set(PROPERTY, action)
+ emit_changed(PROPERTY, action)
+
+ _obj.event_idx = 0
+ _obj.notify_property_list_changed()
+
+ _update_controls()
diff --git a/plugin/inspector/input_selector/input_selector.tscn b/plugin/inspector/input_selector/input_selector.tscn
new file mode 100644
index 00000000..10d9a59b
--- /dev/null
+++ b/plugin/inspector/input_selector/input_selector.tscn
@@ -0,0 +1,14 @@
+[gd_scene load_steps=3 format=3 uid="uid://bqymtf8fuyj54"]
+
+[ext_resource type="Script" path="res://addons/ggs/plugin/inspector/input_selector/input_selector.gd" id="1_qjksw"]
+[ext_resource type="PackedScene" uid="uid://0flqleg5pa66" path="res://addons/ggs/plugin/inspector/input_selector/window/input_select_win.tscn" id="2_3q07s"]
+
+[node name="EditorProperty" type="EditorProperty" node_paths=PackedStringArray("_Btn")]
+offset_right = 8.0
+offset_bottom = 8.0
+script = ExtResource("1_qjksw")
+_window_scn = ExtResource("2_3q07s")
+_Btn = NodePath("Btn")
+
+[node name="Btn" type="Button" parent="."]
+layout_mode = 2
diff --git a/plugin/inspector/input_selector/window/input_list.gd b/plugin/inspector/input_selector/window/input_list.gd
new file mode 100644
index 00000000..576465df
--- /dev/null
+++ b/plugin/inspector/input_selector/window/input_list.gd
@@ -0,0 +1,8 @@
+@tool
+extends ggsBaseSelectList
+
+
+func _ready() -> void:
+ base_items = ggsInputHelper.get_input_map().keys()
+ clear()
+ create_from_arr(base_items)
diff --git a/plugin/inspector/input_selector/window/input_select_win.gd b/plugin/inspector/input_selector/window/input_select_win.gd
new file mode 100644
index 00000000..734c6746
--- /dev/null
+++ b/plugin/inspector/input_selector/window/input_select_win.gd
@@ -0,0 +1,26 @@
+@tool
+extends ggsBaseSelectWin
+
+signal input_confirmed(action: String)
+
+
+func _confirm_selection(selection: String) -> void:
+ input_confirmed.emit(selection)
+ hide()
+
+
+func _on_confirmed() -> void:
+ var item_idx = get_selected_item_idx()
+ var item: String = List.get_item_text(item_idx)
+ _confirm_selection(item)
+
+
+func _on_FilterField_text_submitted(submitted_text: String) -> void:
+ if field_value_is_valid:
+ var item: String = List.get_item_text(0)
+ _confirm_selection(item)
+
+
+func _on_List_item_activated(index: int) -> void:
+ var item: String = List.get_item_text(index)
+ _confirm_selection(item)
diff --git a/plugin/inspector/input_selector/window/input_select_win.tscn b/plugin/inspector/input_selector/window/input_select_win.tscn
new file mode 100644
index 00000000..e3995e33
--- /dev/null
+++ b/plugin/inspector/input_selector/window/input_select_win.tscn
@@ -0,0 +1,43 @@
+[gd_scene load_steps=4 format=3 uid="uid://0flqleg5pa66"]
+
+[ext_resource type="Script" path="res://addons/ggs/plugin/inspector/input_selector/window/input_select_win.gd" id="1_4dvxc"]
+[ext_resource type="Texture2D" uid="uid://dbervsl0o0ifw" path="res://addons/ggs/plugin/assets/search.svg" id="2_lt6gi"]
+[ext_resource type="Script" path="res://addons/ggs/plugin/inspector/input_selector/window/input_list.gd" id="3_pn1tt"]
+
+[node name="InputSelectWin" type="ConfirmationDialog" node_paths=PackedStringArray("FilterField", "List")]
+auto_translate_mode = 1
+title = "Select Input"
+position = Vector2i(0, 36)
+size = Vector2i(600, 300)
+unresizable = true
+min_size = Vector2i(400, 300)
+script = ExtResource("1_4dvxc")
+FilterField = NodePath("VBox/FilterField")
+List = NodePath("VBox/List")
+
+[node name="VBox" type="VBoxContainer" parent="."]
+offset_left = 8.0
+offset_top = 8.0
+offset_right = 592.0
+offset_bottom = 251.0
+size_flags_horizontal = 3
+size_flags_vertical = 3
+
+[node name="FilterField" type="LineEdit" parent="VBox"]
+layout_mode = 2
+size_flags_horizontal = 3
+placeholder_text = "Filter Actions"
+clear_button_enabled = true
+right_icon = ExtResource("2_lt6gi")
+
+[node name="List" type="ItemList" parent="VBox"]
+layout_mode = 2
+size_flags_vertical = 3
+item_count = 4
+max_columns = 3
+fixed_column_width = 180
+item_0/text = "move_right"
+item_1/text = "move_left"
+item_2/text = "move_up"
+item_3/text = "move_down"
+script = ExtResource("3_pn1tt")
diff --git a/plugin/inspector/type_selector/type_selector.gd b/plugin/inspector/type_selector/type_selector.gd
new file mode 100644
index 00000000..80a427df
--- /dev/null
+++ b/plugin/inspector/type_selector/type_selector.gd
@@ -0,0 +1,46 @@
+@tool
+extends EditorProperty
+
+const PROPERTY: StringName = "value_type"
+
+@export var _window_scn: PackedScene
+@export_group("Nodes")
+@export var _Btn: Button
+@export var _Value: Label
+
+@onready var _obj: ggsSetting = get_edited_object()
+
+
+func _ready() -> void:
+ if read_only:
+ _Btn.disabled = true
+
+ _Btn.pressed.connect(_on_Btn_pressed)
+ _update_controls()
+
+
+func _update_controls() -> void:
+ var type: Variant.Type = _obj.get(PROPERTY)
+ _Btn.text = ggsUtils.ALL_TYPES[type]
+ _Btn.icon = ggsUtils.type_get_icon(type)
+ _Btn.tooltip_text = _Btn.text
+ _Value.text = str(type)
+
+
+func _on_Btn_pressed() -> void:
+ var TypeWin: ConfirmationDialog = _window_scn.instantiate()
+ TypeWin.type_confirmed.connect(_on_TypeWin_confirmed)
+ add_child(TypeWin)
+ TypeWin.popup_centered()
+
+
+func _on_TypeWin_confirmed(type: Variant.Type) -> void:
+ _obj.set(PROPERTY, type)
+ emit_changed(PROPERTY, type)
+
+ _obj.default = ggsUtils.TYPE_DEFAULTS[type]
+ _obj.value_hint = PROPERTY_HINT_NONE
+ _obj.value_hint_string = ""
+ _obj.notify_property_list_changed()
+
+ _update_controls()
diff --git a/plugin/inspector/type_selector/type_selector.tscn b/plugin/inspector/type_selector/type_selector.tscn
new file mode 100644
index 00000000..1e70a667
--- /dev/null
+++ b/plugin/inspector/type_selector/type_selector.tscn
@@ -0,0 +1,28 @@
+[gd_scene load_steps=3 format=3 uid="uid://bk1iyx1srawvv"]
+
+[ext_resource type="Script" path="res://addons/ggs/plugin/inspector/type_selector/type_selector.gd" id="1_vlpv0"]
+[ext_resource type="PackedScene" uid="uid://olqgnh0d2kg2" path="res://addons/ggs/plugin/inspector/type_selector/window/type_select_win.tscn" id="2_t4vyx"]
+
+[node name="TypeSelector" type="EditorProperty" node_paths=PackedStringArray("_Btn", "_Value")]
+offset_right = 40.0
+offset_bottom = 40.0
+script = ExtResource("1_vlpv0")
+_window_scn = ExtResource("2_t4vyx")
+_Btn = NodePath("HBox/Btn")
+_Value = NodePath("HBox/Value")
+
+[node name="HBox" type="HBoxContainer" parent="."]
+layout_mode = 2
+
+[node name="Btn" type="Button" parent="HBox"]
+layout_mode = 2
+size_flags_horizontal = 3
+alignment = 0
+text_overrun_behavior = 3
+clip_text = true
+
+[node name="Value" type="Label" parent="HBox"]
+custom_minimum_size = Vector2(25, 0)
+layout_mode = 2
+text = "23"
+horizontal_alignment = 1
diff --git a/plugin/inspector/type_selector/window/type_list.gd b/plugin/inspector/type_selector/window/type_list.gd
new file mode 100644
index 00000000..062e8c19
--- /dev/null
+++ b/plugin/inspector/type_selector/window/type_list.gd
@@ -0,0 +1,15 @@
+@tool
+extends ggsBaseSelectList
+
+
+func _ready() -> void:
+ base_items = ggsUtils.ALL_TYPES.values()
+ clear()
+ create_from_arr(base_items)
+
+
+func create_from_arr(arr: PackedStringArray) -> void:
+ var EditorControl: Control = EditorInterface.get_base_control()
+ for type: String in arr:
+ var icon: Texture2D = EditorControl.get_theme_icon(type, "EditorIcons")
+ add_item(type, icon)
diff --git a/plugin/inspector/type_selector/window/type_select_win.gd b/plugin/inspector/type_selector/window/type_select_win.gd
new file mode 100644
index 00000000..076f4eb3
--- /dev/null
+++ b/plugin/inspector/type_selector/window/type_select_win.gd
@@ -0,0 +1,29 @@
+@tool
+extends ggsBaseSelectWin
+
+signal type_confirmed(type: Variant.Type)
+
+
+func _confirm_selection(selection: Variant.Type) -> void:
+ type_confirmed.emit(selection)
+ hide()
+
+
+func _on_confirmed() -> void:
+ var item_idx = get_selected_item_idx()
+ var item: String = List.get_item_text(item_idx)
+ var hint_idx = ggsUtils.ALL_TYPES.find_key(item)
+ _confirm_selection(hint_idx)
+
+
+func _on_FilterField_text_submitted(submitted_text: String) -> void:
+ if field_value_is_valid:
+ var item: String = List.get_item_text(0)
+ var idx: int = ggsUtils.ALL_TYPES.find_key(item)
+ _confirm_selection(idx)
+
+
+func _on_List_item_activated(index: int) -> void:
+ var item: String = List.get_item_text(index)
+ var idx: int = ggsUtils.ALL_TYPES.find_key(item)
+ _confirm_selection(idx)
diff --git a/plugin/inspector/type_selector/window/type_select_win.tscn b/plugin/inspector/type_selector/window/type_select_win.tscn
new file mode 100644
index 00000000..4ae746f3
--- /dev/null
+++ b/plugin/inspector/type_selector/window/type_select_win.tscn
@@ -0,0 +1,568 @@
+[gd_scene load_steps=80 format=3 uid="uid://olqgnh0d2kg2"]
+
+[ext_resource type="Script" path="res://addons/ggs/plugin/inspector/type_selector/window/type_select_win.gd" id="1_5c22w"]
+[ext_resource type="Texture2D" uid="uid://dbervsl0o0ifw" path="res://addons/ggs/plugin/assets/search.svg" id="2_ukygr"]
+[ext_resource type="Script" path="res://addons/ggs/plugin/inspector/type_selector/window/type_list.gd" id="2_v8p48"]
+
+[sub_resource type="Image" id="Image_gehiu"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 112, 145, 240, 224, 111, 146, 240, 129, 128, 192, 255, 4, 112, 145, 241, 137, 112, 145, 240, 233, 111, 145, 240, 230, 111, 146, 240, 131, 111, 146, 241, 140, 112, 145, 240, 233, 111, 145, 240, 232, 112, 145, 241, 137, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 112, 145, 240, 224, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 114, 145, 240, 65, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 113, 146, 243, 61, 114, 145, 240, 65, 111, 145, 240, 255, 111, 145, 240, 255, 111, 148, 243, 62, 114, 145, 240, 65, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 255, 255, 255, 0, 111, 145, 240, 255, 111, 145, 240, 255, 114, 145, 240, 67, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 113, 146, 243, 63, 114, 145, 240, 67, 111, 145, 240, 255, 111, 145, 240, 255, 113, 146, 243, 63, 114, 145, 240, 67, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 112, 147, 241, 73, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 221, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 240, 221, 111, 145, 240, 255, 111, 145, 240, 254, 111, 145, 240, 255, 111, 145, 240, 255, 111, 145, 241, 222, 111, 146, 241, 126, 170, 170, 255, 3, 112, 145, 240, 132, 111, 145, 240, 228, 111, 145, 240, 225, 112, 145, 241, 127, 111, 146, 240, 129, 111, 145, 240, 227, 111, 145, 240, 228, 112, 145, 240, 130, 170, 170, 255, 3, 112, 146, 240, 128, 111, 146, 240, 219, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_8fe5h"]
+image = SubResource("Image_gehiu")
+
+[sub_resource type="Image" id="Image_cqepl"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 231, 91, 187, 240, 135, 102, 204, 255, 5, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 91, 187, 240, 134, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 91, 189, 241, 73, 90, 187, 239, 255, 90, 187, 239, 229, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 188, 239, 230, 90, 187, 239, 255, 91, 189, 241, 73, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 91, 187, 240, 135, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 102, 204, 255, 5, 91, 187, 240, 134, 90, 187, 239, 229, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_2bgck"]
+image = SubResource("Image_cqepl")
+
+[sub_resource type="Image" id="Image_sq77b"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 85, 213, 255, 6, 54, 213, 244, 137, 53, 212, 244, 231, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 54, 213, 244, 137, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 231, 53, 212, 244, 255, 53, 213, 245, 72, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 230, 53, 212, 244, 255, 56, 213, 245, 73, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 230, 53, 212, 244, 255, 56, 213, 245, 73, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 135, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 53, 212, 244, 135, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 102, 255, 255, 5, 53, 212, 244, 134, 53, 212, 244, 229, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 102, 255, 255, 5, 53, 212, 244, 134, 53, 212, 244, 229, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_546s1"]
+image = SubResource("Image_sq77b")
+
+[sub_resource type="Image" id="Image_4nneq"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 69, 149, 236, 103, 69, 147, 236, 222, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 73, 150, 237, 56, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 70, 147, 237, 113, 69, 147, 236, 255, 69, 147, 236, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 85, 170, 255, 6, 69, 147, 237, 137, 69, 147, 236, 231, 255, 255, 255, 0, 255, 255, 255, 0, 73, 150, 237, 56, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 222, 70, 147, 238, 101, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 69, 147, 237, 137, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 70, 147, 238, 101, 69, 147, 236, 220, 69, 147, 236, 255, 69, 147, 236, 255, 72, 149, 236, 53, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 231, 69, 147, 236, 255, 71, 149, 238, 72, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 70, 147, 236, 175, 69, 147, 236, 255, 70, 147, 237, 109, 255, 255, 255, 0, 69, 148, 237, 230, 69, 147, 236, 255, 70, 147, 238, 73, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 254, 73, 147, 236, 52, 255, 255, 255, 0, 70, 147, 237, 135, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 220, 70, 148, 237, 98, 255, 255, 255, 0, 255, 255, 255, 0, 102, 153, 255, 5, 70, 147, 236, 134, 69, 147, 236, 229, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_eno7g"]
+image = SubResource("Image_4nneq")
+
+[sub_resource type="Image" id="Image_lmbed"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 171, 247, 255, 205, 169, 247, 233, 202, 163, 246, 157, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 200, 162, 246, 156, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 1, 173, 115, 242, 131, 172, 115, 241, 222, 172, 115, 241, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 198, 159, 246, 85, 205, 171, 247, 255, 204, 168, 247, 232, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 116, 242, 132, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 198, 161, 247, 89, 205, 171, 247, 255, 205, 169, 248, 231, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 224, 172, 115, 241, 255, 173, 115, 243, 62, 255, 255, 255, 0, 255, 255, 255, 0, 200, 160, 248, 96, 204, 168, 246, 238, 205, 171, 247, 255, 205, 171, 247, 255, 200, 163, 245, 153, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 175, 117, 242, 76, 172, 115, 241, 255, 172, 115, 241, 228, 172, 115, 241, 223, 172, 115, 241, 255, 174, 117, 243, 63, 255, 255, 255, 0, 255, 255, 255, 0, 204, 168, 246, 238, 205, 171, 247, 255, 204, 169, 247, 233, 200, 163, 245, 153, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 173, 115, 242, 131, 172, 116, 242, 132, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 229, 173, 115, 242, 131, 204, 153, 255, 5, 255, 255, 255, 1, 172, 115, 242, 129, 172, 115, 242, 220, 172, 115, 241, 255, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_8hdr5"]
+image = SubResource("Image_lmbed")
+
+[sub_resource type="Image" id="Image_oetb1"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 171, 247, 255, 205, 169, 247, 233, 202, 163, 246, 157, 255, 255, 255, 2, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 200, 162, 246, 156, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 198, 159, 246, 85, 205, 171, 247, 255, 204, 168, 247, 232, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 198, 161, 247, 89, 205, 171, 247, 255, 205, 169, 248, 231, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 200, 160, 248, 96, 204, 168, 246, 238, 205, 171, 247, 255, 205, 171, 247, 255, 200, 163, 245, 153, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 175, 117, 242, 76, 172, 115, 241, 255, 172, 115, 241, 228, 255, 255, 255, 0, 204, 168, 246, 238, 205, 171, 247, 255, 204, 169, 247, 233, 200, 163, 245, 153, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 173, 115, 242, 131, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 229, 173, 115, 242, 131, 204, 153, 255, 5, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_35ckx"]
+image = SubResource("Image_oetb1")
+
+[sub_resource type="Image" id="Image_86tbp"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 128, 170, 6, 241, 115, 143, 137, 241, 115, 144, 231, 241, 115, 143, 255, 255, 146, 146, 7, 241, 116, 143, 143, 241, 116, 143, 236, 241, 115, 143, 235, 241, 115, 144, 138, 255, 153, 153, 5, 242, 115, 144, 133, 241, 115, 144, 224, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 137, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 144, 142, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 116, 143, 225, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 144, 231, 241, 115, 143, 255, 241, 117, 145, 72, 255, 255, 255, 0, 241, 115, 143, 237, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 243, 115, 144, 62, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 241, 116, 143, 236, 241, 115, 143, 255, 241, 115, 143, 73, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 230, 241, 115, 143, 255, 243, 117, 146, 63, 255, 255, 255, 0, 241, 115, 143, 230, 241, 115, 143, 255, 241, 115, 143, 73, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 144, 140, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 242, 115, 144, 135, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 242, 115, 144, 135, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 153, 153, 5, 241, 115, 144, 140, 241, 115, 143, 232, 241, 115, 143, 255, 255, 255, 255, 0, 255, 153, 153, 5, 242, 116, 143, 134, 241, 115, 143, 229, 241, 115, 143, 255, 255, 153, 153, 5, 242, 116, 143, 134, 241, 115, 143, 229, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_6bytt"]
+image = SubResource("Image_86tbp")
+
+[sub_resource type="Image" id="Image_edoeb"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 128, 170, 6, 241, 115, 143, 137, 241, 115, 144, 231, 241, 115, 143, 255, 255, 255, 255, 1, 242, 115, 144, 131, 241, 115, 144, 222, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 144, 138, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 242, 116, 143, 132, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 232, 241, 115, 143, 255, 241, 117, 145, 72, 255, 255, 255, 0, 241, 115, 144, 224, 241, 115, 143, 255, 243, 117, 146, 61, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 223, 241, 115, 143, 255, 243, 117, 146, 63, 255, 255, 255, 0, 241, 115, 143, 230, 241, 115, 143, 255, 241, 115, 143, 73, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 242, 116, 143, 132, 241, 115, 143, 255, 241, 115, 143, 255, 241, 115, 143, 255, 242, 115, 144, 135, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 241, 115, 143, 255, 241, 115, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 242, 115, 144, 129, 242, 115, 143, 220, 241, 115, 143, 255, 255, 153, 153, 5, 242, 116, 143, 134, 241, 115, 143, 229, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_xs1l5"]
+image = SubResource("Image_edoeb")
+
+[sub_resource type="Image" id="Image_a0bqv"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 1, 222, 103, 240, 131, 222, 102, 241, 222, 222, 102, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 232, 154, 245, 98, 235, 163, 246, 255, 235, 161, 246, 239, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 223, 102, 240, 132, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 233, 153, 244, 158, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 224, 222, 102, 240, 255, 222, 103, 243, 62, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 232, 153, 245, 143, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 104, 242, 76, 222, 102, 240, 255, 222, 102, 240, 228, 222, 102, 241, 223, 222, 102, 240, 255, 223, 105, 243, 63, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 150, 243, 85, 235, 163, 246, 255, 235, 161, 246, 233, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 222, 103, 240, 131, 223, 102, 240, 132, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 235, 153, 247, 87, 235, 163, 246, 255, 234, 160, 245, 226, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 229, 222, 103, 240, 131, 255, 102, 255, 5, 255, 255, 255, 1, 222, 103, 240, 129, 222, 102, 240, 220, 222, 102, 240, 255, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 234, 153, 246, 163, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 161, 245, 230, 232, 155, 244, 155, 255, 170, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_0tyes"]
+image = SubResource("Image_a0bqv")
+
+[sub_resource type="Image" id="Image_h3abw"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 232, 154, 245, 98, 235, 163, 246, 255, 235, 161, 246, 239, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 233, 153, 244, 158, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 232, 153, 245, 143, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 104, 242, 76, 222, 102, 240, 255, 222, 102, 240, 228, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 150, 243, 85, 235, 163, 246, 255, 235, 161, 246, 233, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 222, 103, 240, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 153, 247, 87, 235, 163, 246, 255, 234, 160, 245, 226, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 229, 222, 103, 240, 131, 255, 102, 255, 5, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 234, 153, 246, 163, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 161, 245, 230, 232, 155, 244, 155, 255, 170, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_r4k3o"]
+image = SubResource("Image_h3abw")
+
+[sub_resource type="Image" id="Image_v883a"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 199, 240, 103, 255, 213, 243, 138, 233, 208, 242, 130, 157, 255, 255, 255, 2, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 240, 186, 236, 65, 173, 192, 241, 71, 36, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 199, 240, 103, 255, 213, 244, 141, 255, 213, 244, 141, 255, 208, 242, 129, 156, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 238, 192, 241, 71, 36, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 207, 240, 126, 85, 213, 244, 141, 255, 211, 243, 137, 232, 185, 236, 65, 255, 185, 236, 65, 255, 186, 240, 69, 33, 186, 236, 65, 187, 185, 236, 65, 255, 185, 236, 66, 170, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 209, 241, 126, 89, 213, 244, 141, 255, 212, 243, 138, 231, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 192, 241, 71, 36, 185, 236, 65, 255, 185, 236, 65, 237, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 210, 245, 128, 96, 211, 244, 138, 238, 213, 244, 141, 255, 213, 244, 141, 255, 209, 244, 130, 153, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 188, 242, 67, 38, 185, 236, 65, 255, 185, 236, 65, 236, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 211, 244, 138, 238, 213, 244, 141, 255, 212, 243, 138, 233, 209, 244, 130, 153, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 192, 241, 71, 36, 185, 236, 65, 192, 185, 236, 65, 255, 185, 236, 65, 167, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 213, 244, 141, 255, 213, 244, 141, 255, 213, 244, 141, 255, 213, 244, 141, 255, 213, 244, 141, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 236, 192, 240, 72, 32, 255, 255, 255, 0, 255, 255, 255, 0, 185, 236, 65, 255, 185, 236, 65, 255, 255, 255, 255, 0, 213, 244, 141, 255, 213, 244, 141, 255, 213, 244, 141, 255, 213, 244, 141, 255, 213, 244, 141, 255, 185, 236, 65, 255, 185, 236, 65, 255, 185, 236, 65, 238, 186, 236, 65, 169, 186, 240, 69, 33, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_bqu0u"]
+image = SubResource("Image_v883a")
+
+[sub_resource type="Image" id="Image_50ng0"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 1, 240, 103, 189, 131, 241, 102, 189, 222, 240, 102, 189, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 190, 132, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 224, 240, 102, 189, 255, 243, 103, 189, 62, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 242, 104, 192, 76, 240, 102, 189, 255, 240, 102, 189, 228, 241, 102, 189, 223, 240, 102, 189, 255, 243, 105, 190, 63, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 255, 240, 103, 189, 131, 240, 102, 190, 132, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 190, 229, 240, 103, 189, 131, 255, 102, 204, 5, 255, 255, 255, 1, 240, 103, 190, 129, 240, 102, 189, 220, 240, 102, 189, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_dq4ve"]
+image = SubResource("Image_50ng0")
+
+[sub_resource type="Image" id="Image_fanrm"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 242, 104, 192, 76, 240, 102, 189, 255, 240, 102, 189, 228, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 189, 255, 240, 103, 189, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 240, 102, 189, 255, 240, 102, 189, 255, 240, 102, 190, 229, 240, 103, 189, 131, 255, 102, 204, 5, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 163, 215, 255, 246, 163, 215, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_8fl6y"]
+image = SubResource("Image_fanrm")
+
+[sub_resource type="Image" id="Image_aoh4a"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 222, 248, 74, 74, 131, 255, 255, 255, 1, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 255, 248, 74, 74, 130, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 248, 74, 74, 65, 247, 73, 73, 255, 247, 73, 73, 220, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 231, 248, 73, 73, 135, 255, 102, 102, 5, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 248, 75, 75, 68, 247, 73, 73, 255, 247, 73, 73, 219, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 255, 248, 74, 74, 134, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 255, 247, 73, 73, 255, 247, 74, 74, 127, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 248, 73, 73, 73, 247, 73, 73, 255, 247, 73, 73, 229, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 247, 74, 74, 221, 247, 74, 74, 127, 255, 255, 255, 0, 255, 255, 255, 0, 247, 73, 73, 230, 247, 73, 73, 255, 248, 73, 73, 73, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 248, 73, 73, 135, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 102, 102, 5, 248, 74, 74, 134, 247, 73, 73, 229, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 247, 73, 73, 255, 247, 73, 73, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_d8k2f"]
+image = SubResource("Image_aoh4a")
+
+[sub_resource type="Image" id="Image_h3x1s"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 236, 65, 142, 255, 236, 65, 142, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 236, 65, 142, 255, 236, 65, 142, 255, 255, 255, 255, 0, 255, 255, 255, 1, 236, 66, 142, 131, 236, 65, 142, 222, 236, 65, 142, 255, 244, 141, 187, 255, 244, 141, 187, 255, 255, 255, 255, 0, 244, 141, 187, 255, 244, 142, 188, 254, 236, 66, 142, 142, 236, 65, 142, 233, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 143, 132, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 244, 141, 187, 255, 244, 141, 187, 255, 255, 255, 255, 0, 244, 141, 187, 255, 244, 141, 187, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 222, 236, 65, 142, 255, 236, 66, 145, 65, 236, 65, 142, 255, 244, 141, 187, 255, 244, 141, 187, 255, 255, 255, 255, 0, 244, 141, 187, 255, 244, 141, 187, 255, 236, 65, 142, 255, 239, 66, 144, 62, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 255, 255, 255, 0, 236, 65, 142, 222, 236, 65, 142, 255, 236, 68, 144, 64, 236, 65, 142, 255, 243, 134, 183, 255, 244, 141, 187, 255, 242, 126, 180, 95, 244, 141, 187, 255, 244, 141, 187, 255, 236, 65, 142, 255, 239, 65, 142, 63, 236, 65, 142, 255, 236, 65, 142, 255, 237, 65, 142, 230, 236, 65, 142, 255, 238, 66, 143, 73, 236, 65, 143, 132, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 240, 106, 166, 255, 244, 141, 187, 255, 244, 141, 187, 255, 244, 141, 187, 255, 244, 141, 187, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 236, 65, 142, 255, 237, 66, 142, 135, 236, 65, 142, 255, 236, 65, 142, 255, 255, 255, 255, 1, 236, 65, 142, 129, 236, 65, 143, 220, 236, 65, 142, 255, 236, 67, 143, 255, 243, 129, 180, 162, 243, 138, 186, 240, 244, 141, 187, 255, 244, 141, 187, 255, 237, 65, 142, 137, 237, 65, 142, 230, 236, 65, 142, 255, 236, 65, 142, 255, 255, 102, 153, 5, 236, 66, 143, 134, 236, 65, 143, 229, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 236, 65, 142, 255, 236, 65, 142, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 236, 65, 142, 255, 236, 65, 142, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_1a0j5"]
+image = SubResource("Image_h3x1s")
+
+[sub_resource type="Image" id="Image_fh0md"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 128, 128, 6, 238, 87, 120, 134, 238, 86, 119, 219, 238, 86, 119, 255, 238, 86, 119, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 238, 86, 119, 255, 238, 86, 119, 254, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 238, 87, 119, 143, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 238, 86, 119, 255, 238, 86, 119, 252, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 238, 86, 119, 217, 238, 86, 119, 255, 239, 88, 121, 61, 238, 86, 119, 255, 238, 86, 119, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 222, 238, 87, 119, 131, 255, 255, 255, 1, 255, 255, 255, 0, 255, 255, 255, 0, 238, 86, 119, 228, 238, 86, 119, 255, 239, 89, 121, 63, 238, 86, 119, 255, 238, 86, 119, 255, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 120, 130, 255, 255, 255, 0, 255, 255, 255, 0, 239, 86, 119, 122, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 255, 238, 86, 119, 255, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 238, 86, 119, 255, 238, 86, 119, 255, 240, 86, 122, 65, 238, 86, 119, 255, 238, 86, 119, 220, 255, 153, 153, 5, 242, 122, 148, 150, 243, 124, 150, 238, 242, 126, 151, 255, 242, 126, 151, 255, 238, 86, 119, 255, 238, 86, 119, 255, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 243, 124, 150, 238, 240, 107, 136, 255, 238, 87, 120, 255, 240, 86, 120, 68, 238, 86, 119, 255, 238, 86, 119, 219, 243, 123, 150, 143, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 240, 107, 136, 255, 238, 86, 119, 255, 238, 86, 119, 255, 239, 86, 120, 127, 243, 126, 152, 229, 242, 126, 151, 255, 241, 122, 150, 73, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 242, 123, 149, 77, 242, 126, 151, 255, 241, 121, 147, 255, 238, 86, 119, 221, 239, 86, 120, 127, 255, 255, 255, 0, 242, 125, 151, 230, 242, 126, 151, 255, 242, 122, 150, 75, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 243, 123, 149, 79, 242, 126, 151, 255, 241, 124, 149, 234, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 241, 124, 149, 144, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 242, 126, 151, 255, 241, 122, 147, 146, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 153, 153, 5, 241, 124, 149, 146, 242, 125, 150, 233, 242, 126, 151, 255, 242, 126, 151, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 242, 126, 151, 255, 242, 126, 151, 255, 241, 124, 149, 234, 241, 122, 147, 146, 255, 102, 153, 5, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_og0rx"]
+image = SubResource("Image_fh0md")
+
+[sub_resource type="Image" id="Image_bl8qm"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 236, 65, 255, 225, 236, 65, 254, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 237, 244, 141, 255, 237, 244, 141, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 236, 65, 255, 225, 236, 65, 252, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 237, 244, 141, 255, 237, 244, 141, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 236, 65, 255, 225, 236, 65, 255, 226, 236, 65, 222, 226, 236, 66, 131, 255, 255, 255, 1, 226, 237, 66, 69, 226, 236, 65, 222, 225, 236, 65, 255, 225, 236, 65, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 237, 66, 69, 226, 236, 65, 222, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 226, 236, 66, 130, 226, 236, 65, 222, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 226, 236, 65, 222, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 227, 238, 66, 73, 225, 236, 65, 255, 225, 236, 65, 220, 226, 236, 65, 222, 225, 236, 65, 255, 225, 236, 66, 221, 225, 237, 67, 68, 255, 255, 255, 0, 237, 244, 141, 255, 237, 244, 141, 255, 226, 236, 65, 222, 225, 236, 65, 255, 225, 236, 66, 221, 225, 237, 67, 68, 225, 236, 65, 255, 225, 236, 65, 255, 225, 239, 67, 76, 225, 236, 65, 255, 225, 236, 65, 219, 225, 237, 67, 68, 225, 236, 65, 220, 225, 236, 65, 255, 225, 236, 65, 219, 255, 255, 255, 0, 237, 244, 141, 255, 237, 244, 141, 255, 225, 237, 67, 68, 225, 236, 65, 220, 225, 236, 65, 255, 225, 236, 65, 219, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 237, 66, 127, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 237, 66, 217, 255, 255, 255, 0, 237, 244, 141, 255, 237, 244, 141, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 237, 66, 217, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 66, 221, 225, 237, 66, 127, 255, 255, 255, 0, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 220, 228, 236, 66, 65, 255, 255, 255, 0, 237, 244, 141, 255, 237, 244, 141, 255, 225, 236, 65, 255, 225, 236, 65, 255, 225, 236, 65, 220, 228, 236, 66, 65, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_crft5"]
+image = SubResource("Image_bl8qm")
+
+[sub_resource type="Image" id="Image_kaufr"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 248, 165, 106, 255, 250, 188, 144, 255, 250, 188, 144, 255, 250, 188, 144, 255, 249, 180, 130, 112, 246, 143, 69, 255, 246, 143, 69, 255, 246, 144, 69, 240, 247, 143, 69, 173, 248, 149, 71, 36, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 248, 165, 106, 255, 250, 188, 144, 255, 250, 188, 144, 255, 250, 188, 144, 255, 251, 181, 130, 110, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 238, 248, 149, 71, 36, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 249, 185, 139, 226, 249, 188, 144, 254, 252, 177, 126, 65, 246, 143, 69, 255, 246, 143, 69, 255, 248, 147, 69, 33, 246, 143, 69, 187, 246, 143, 69, 255, 246, 143, 69, 170, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 255, 255, 255, 0, 250, 183, 135, 176, 250, 188, 144, 255, 249, 185, 138, 210, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 248, 149, 71, 36, 246, 143, 69, 255, 246, 143, 69, 237, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 255, 255, 255, 0, 250, 179, 129, 87, 250, 188, 144, 251, 250, 188, 144, 255, 251, 182, 130, 59, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 249, 148, 74, 38, 246, 143, 69, 255, 246, 143, 69, 236, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 255, 255, 170, 3, 249, 186, 131, 37, 249, 187, 141, 244, 250, 188, 144, 255, 252, 180, 128, 68, 246, 143, 69, 255, 246, 143, 69, 255, 248, 149, 71, 36, 246, 144, 69, 192, 246, 143, 69, 255, 246, 144, 70, 167, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 249, 183, 135, 191, 250, 188, 144, 255, 250, 188, 144, 255, 249, 187, 142, 242, 255, 192, 128, 16, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 236, 248, 144, 72, 32, 255, 255, 255, 0, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 255, 255, 255, 0, 250, 183, 136, 188, 250, 187, 142, 244, 249, 184, 137, 203, 252, 180, 128, 68, 255, 255, 255, 0, 246, 143, 69, 255, 246, 143, 69, 255, 246, 143, 69, 238, 246, 143, 69, 169, 248, 147, 69, 33, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_18a8i"]
+image = SubResource("Image_kaufr")
+
+[sub_resource type="Image" id="Image_27lnd"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 232, 69, 190, 69, 136, 128, 192, 128, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 70, 189, 70, 65, 68, 189, 68, 255, 71, 190, 71, 228, 131, 212, 131, 164, 141, 215, 141, 240, 143, 215, 143, 255, 68, 191, 68, 75, 68, 189, 68, 228, 68, 189, 68, 255, 68, 189, 68, 227, 70, 189, 70, 73, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 71, 192, 71, 68, 68, 189, 68, 255, 109, 203, 109, 255, 143, 215, 143, 255, 143, 215, 143, 255, 143, 215, 143, 255, 68, 189, 68, 228, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 69, 189, 69, 226, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 137, 213, 137, 255, 143, 215, 143, 255, 129, 211, 129, 93, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 69, 189, 69, 230, 69, 190, 69, 132, 143, 215, 143, 255, 143, 215, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 255, 255, 255, 0, 255, 255, 255, 0, 143, 215, 143, 255, 143, 215, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 227, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 190, 68, 225, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 255, 255, 255, 0, 255, 255, 255, 0, 143, 215, 143, 255, 143, 215, 143, 255, 255, 255, 255, 0, 255, 255, 255, 0, 70, 189, 70, 73, 69, 189, 69, 226, 68, 189, 68, 255, 68, 190, 68, 225, 69, 190, 69, 70, 70, 192, 70, 76, 68, 189, 68, 255, 68, 190, 68, 229, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 255, 68, 189, 68, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 68, 189, 68, 255, 68, 190, 68, 229, 68, 189, 68, 131, 102, 204, 102, 5),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_mmsid"]
+image = SubResource("Image_27lnd")
+
+[sub_resource type="Image" id="Image_1l0p7"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 121, 107, 131, 255, 121, 107, 222, 255, 120, 107, 255, 255, 255, 255, 0, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 128, 213, 255, 6, 95, 179, 255, 137, 95, 178, 255, 231, 95, 178, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 108, 132, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 95, 179, 255, 137, 95, 178, 255, 255, 95, 178, 255, 255, 95, 178, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 224, 255, 120, 107, 255, 255, 121, 109, 61, 255, 255, 255, 0, 255, 255, 255, 0, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 95, 178, 255, 231, 95, 178, 255, 255, 96, 181, 255, 72, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 223, 255, 120, 107, 255, 255, 121, 109, 63, 255, 255, 255, 0, 255, 255, 255, 0, 115, 242, 128, 230, 115, 242, 128, 255, 115, 245, 129, 73, 255, 255, 255, 0, 255, 255, 255, 0, 95, 178, 255, 255, 95, 178, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 108, 132, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 115, 242, 128, 135, 115, 242, 128, 255, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 95, 178, 255, 255, 95, 178, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 255, 121, 107, 129, 255, 121, 107, 220, 255, 120, 107, 255, 255, 255, 255, 0, 153, 255, 153, 5, 116, 242, 128, 134, 115, 242, 128, 229, 115, 242, 128, 255, 255, 255, 255, 0, 95, 178, 255, 255, 95, 178, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_mbuty"]
+image = SubResource("Image_1l0p7")
+
+[sub_resource type="Image" id="Image_0ydyw"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 69, 149, 236, 103, 69, 147, 236, 222, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 144, 190, 244, 255, 144, 190, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 73, 150, 237, 56, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 144, 190, 244, 255, 144, 190, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 70, 147, 237, 113, 69, 147, 236, 255, 69, 147, 236, 170, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 232, 69, 148, 236, 169, 70, 150, 238, 29, 255, 255, 255, 0, 73, 150, 237, 56, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 222, 70, 147, 238, 101, 255, 255, 255, 0, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 238, 70, 150, 238, 29, 255, 255, 255, 0, 70, 147, 238, 101, 69, 147, 236, 220, 69, 147, 236, 255, 69, 147, 236, 255, 72, 149, 236, 53, 144, 190, 244, 255, 144, 190, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 73, 155, 237, 28, 70, 147, 236, 182, 69, 147, 236, 255, 70, 147, 236, 167, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 70, 147, 236, 175, 69, 147, 236, 255, 70, 147, 237, 109, 141, 189, 244, 239, 144, 190, 244, 255, 129, 180, 242, 95, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 73, 155, 237, 28, 69, 147, 236, 255, 69, 148, 237, 230, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 254, 73, 147, 236, 52, 134, 185, 244, 160, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 220, 70, 148, 237, 98, 255, 255, 255, 0, 146, 182, 255, 7, 134, 184, 243, 160, 141, 190, 244, 238, 144, 190, 244, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_ilh12"]
+image = SubResource("Image_0ydyw")
+
+[sub_resource type="Image" id="Image_isbox"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 222, 66, 123, 236, 131, 255, 255, 255, 1, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 254, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 66, 122, 236, 130, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 252, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 66, 122, 236, 65, 65, 122, 236, 255, 65, 122, 236, 220, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 123, 236, 231, 66, 123, 237, 135, 102, 153, 255, 5, 65, 122, 236, 255, 65, 122, 236, 255, 67, 124, 237, 68, 65, 122, 236, 255, 65, 122, 236, 219, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 66, 122, 236, 134, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 66, 122, 237, 127, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 66, 122, 238, 73, 65, 122, 236, 255, 65, 122, 236, 229, 65, 122, 236, 255, 65, 122, 236, 255, 66, 122, 236, 221, 66, 122, 237, 127, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 237, 230, 65, 122, 236, 255, 66, 122, 238, 73, 255, 255, 255, 0, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 66, 123, 237, 135, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 102, 153, 255, 5, 66, 122, 236, 134, 65, 122, 236, 229, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 65, 122, 236, 255, 65, 122, 236, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_6a0ld"]
+image = SubResource("Image_isbox")
+
+[sub_resource type="Image" id="Image_7clyc"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 85, 255, 128, 6, 65, 237, 128, 137, 65, 236, 128, 231, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 66, 236, 128, 131, 65, 236, 128, 222, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 66, 237, 128, 138, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 132, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 232, 65, 236, 128, 255, 67, 238, 128, 72, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 224, 65, 236, 128, 255, 66, 239, 128, 62, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 223, 65, 236, 128, 255, 65, 239, 130, 63, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 132, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 1, 65, 236, 128, 129, 65, 236, 128, 220, 65, 236, 128, 255, 65, 236, 128, 255, 65, 236, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_vfxby"]
+image = SubResource("Image_7clyc")
+
+[sub_resource type="Image" id="Image_whfn3"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 224, 224, 224, 99, 224, 224, 224, 213, 224, 224, 224, 212, 224, 224, 224, 97, 255, 255, 255, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 224, 224, 224, 99, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 220, 224, 224, 224, 97, 255, 255, 255, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 4, 224, 224, 224, 99, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 213, 226, 226, 226, 87, 224, 224, 224, 88, 224, 224, 224, 214, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 220, 224, 224, 224, 97, 255, 255, 255, 4, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 199, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 215, 224, 224, 224, 89, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 224, 224, 224, 90, 224, 224, 224, 216, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 194, 255, 255, 255, 0, 255, 255, 255, 4, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 221, 224, 224, 224, 99, 255, 255, 255, 4, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 5, 225, 225, 225, 101, 225, 225, 225, 223, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 3, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 222, 225, 225, 225, 100, 225, 225, 225, 100, 225, 225, 225, 223, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 3, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 2, 226, 226, 226, 87, 224, 224, 224, 213, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 2, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 2, 226, 226, 226, 87, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 1, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 100, 255, 255, 255, 5, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 196, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 223, 225, 225, 225, 101, 255, 255, 255, 5, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 193, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 225, 225, 225, 93, 224, 224, 224, 218, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 223, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 216, 225, 225, 225, 91, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 225, 225, 225, 93, 224, 224, 224, 218, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 216, 225, 225, 225, 91, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 225, 225, 225, 93, 224, 224, 224, 208, 225, 225, 225, 207, 225, 225, 225, 91, 255, 255, 255, 2, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_4k4vq"]
+image = SubResource("Image_whfn3")
+
+[sub_resource type="Image" id="Image_6u71v"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 132, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 224, 224, 224, 145, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 25, 224, 224, 224, 188, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 224, 224, 224, 64, 225, 225, 225, 143, 224, 224, 224, 246, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 222, 226, 226, 226, 52, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 225, 225, 225, 190, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 230, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 188, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 219, 224, 224, 224, 49, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 231, 231, 231, 21, 227, 227, 227, 63, 225, 225, 225, 142, 224, 224, 224, 246, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 223, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 25, 224, 224, 224, 187, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 225, 225, 225, 159, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 3, 224, 224, 224, 145, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 226, 226, 226, 95, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 231, 231, 231, 31, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_yi4je"]
+image = SubResource("Image_6u71v")
+
+[sub_resource type="Image" id="Image_vebj2"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 121, 108, 154, 255, 128, 128, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 198, 255, 122, 112, 25, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 230, 255, 121, 107, 57, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 249, 255, 120, 107, 102, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 249, 255, 120, 107, 102, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 230, 255, 121, 107, 57, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 197, 255, 122, 112, 25, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 153, 255, 128, 128, 6, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 120, 107, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 16,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_lep3g"]
+image = SubResource("Image_vebj2")
+
+[sub_resource type="Image" id="Image_rbj60"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 255, 255, 255, 1, 84, 238, 158, 131, 84, 237, 159, 222, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 84, 238, 158, 131, 84, 237, 159, 222, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 85, 238, 159, 132, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 85, 238, 159, 132, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 159, 222, 84, 237, 158, 255, 88, 239, 159, 61, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 224, 84, 237, 158, 255, 86, 239, 161, 62, 255, 255, 255, 0, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 159, 222, 84, 237, 158, 255, 85, 239, 158, 63, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 223, 84, 237, 158, 255, 85, 239, 158, 63, 255, 255, 255, 0, 255, 255, 255, 0, 84, 237, 158, 230, 84, 237, 158, 255, 84, 238, 161, 73, 85, 238, 159, 132, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 85, 238, 159, 132, 84, 237, 158, 255, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 85, 237, 159, 135, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 1, 85, 238, 158, 129, 84, 237, 158, 220, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 0, 84, 237, 158, 255, 84, 237, 158, 255, 255, 255, 255, 1, 85, 238, 158, 129, 84, 237, 158, 220, 84, 237, 158, 255, 255, 255, 255, 0, 102, 255, 204, 5, 84, 238, 158, 134, 84, 238, 158, 229, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_wesdt"]
+image = SubResource("Image_rbj60")
+
+[sub_resource type="Image" id="Image_qjef6"]
+data = {
+"data": PackedByteArray(255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 224, 224, 224, 131, 224, 224, 224, 222, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 6, 224, 224, 224, 137, 224, 224, 224, 231, 224, 224, 224, 255, 255, 255, 255, 6, 224, 224, 224, 137, 224, 224, 224, 231, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 132, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 137, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 137, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 224, 224, 224, 224, 255, 226, 226, 226, 61, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 231, 224, 224, 224, 255, 224, 224, 224, 72, 255, 255, 255, 0, 224, 224, 224, 231, 224, 224, 224, 255, 224, 224, 224, 72, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 225, 225, 225, 223, 224, 224, 224, 255, 227, 227, 227, 63, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 132, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 1, 224, 224, 224, 129, 224, 224, 224, 220, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_dykse"]
+image = SubResource("Image_qjef6")
+
+[sub_resource type="Image" id="Image_leovk"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 128, 255, 128, 6, 115, 242, 128, 137, 115, 242, 128, 231, 115, 242, 128, 255, 171, 247, 179, 255, 171, 247, 179, 255, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 115, 243, 128, 138, 115, 242, 128, 255, 115, 242, 128, 255, 115, 242, 128, 255, 171, 247, 179, 255, 171, 247, 179, 255, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 115, 242, 128, 232, 115, 242, 128, 255, 117, 245, 128, 72, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 161, 245, 169, 98, 171, 247, 179, 255, 171, 247, 179, 255, 161, 245, 169, 98, 171, 247, 179, 255, 169, 247, 177, 238, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 171, 247, 179, 255, 171, 247, 179, 255, 171, 247, 179, 255, 171, 247, 179, 255, 171, 247, 179, 255, 163, 246, 172, 157, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 115, 242, 128, 255, 115, 242, 128, 255, 255, 255, 255, 0, 255, 255, 255, 0, 171, 247, 179, 255, 171, 247, 179, 255, 169, 247, 178, 240, 171, 247, 179, 255, 171, 247, 179, 255, 169, 248, 178, 238, 163, 246, 172, 157, 192, 255, 192, 8, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_2row1"]
+image = SubResource("Image_leovk")
+
+[sub_resource type="Image" id="Image_f8wpq"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 154, 213, 245, 240, 147, 211, 246, 160, 146, 219, 255, 7, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 156, 214, 245, 255, 156, 214, 245, 255, 147, 209, 244, 160, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 142, 210, 245, 95, 156, 214, 245, 255, 154, 214, 246, 238, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 90, 188, 239, 230, 90, 187, 239, 255, 91, 189, 241, 73, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 91, 187, 240, 135, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 102, 204, 255, 5, 91, 187, 240, 134, 90, 187, 239, 229, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_2t3ht"]
+image = SubResource("Image_f8wpq")
+
+[sub_resource type="Image" id="Image_eys74"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 154, 213, 245, 240, 147, 211, 246, 160, 146, 219, 255, 7, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 156, 214, 245, 255, 156, 214, 245, 255, 147, 209, 244, 160, 90, 187, 239, 255, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 142, 210, 245, 95, 156, 214, 245, 255, 154, 214, 246, 238, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 90, 188, 239, 230, 90, 187, 239, 255, 91, 189, 241, 73, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 91, 187, 240, 135, 90, 187, 239, 255, 90, 187, 239, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 90, 187, 239, 255, 90, 187, 239, 255, 156, 214, 245, 255, 156, 214, 245, 255, 255, 255, 255, 0, 156, 214, 245, 255, 156, 214, 245, 255, 102, 204, 255, 5, 91, 187, 240, 134, 90, 187, 239, 229, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_khh0p"]
+image = SubResource("Image_eys74")
+
+[sub_resource type="Image" id="Image_xmq3e"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 85, 213, 255, 6, 54, 213, 244, 137, 53, 212, 244, 231, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 213, 244, 138, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 54, 212, 244, 232, 53, 212, 244, 255, 53, 213, 245, 72, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 131, 229, 249, 239, 134, 229, 248, 255, 121, 226, 247, 95, 53, 212, 244, 230, 53, 212, 244, 255, 56, 213, 245, 73, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 121, 227, 249, 160, 134, 229, 248, 255, 134, 229, 248, 255, 53, 212, 244, 135, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 146, 255, 255, 7, 121, 227, 248, 160, 132, 229, 249, 238, 102, 255, 255, 5, 53, 212, 244, 134, 53, 212, 244, 229, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_vr787"]
+image = SubResource("Image_xmq3e")
+
+[sub_resource type="Image" id="Image_qlfe6"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 85, 213, 255, 6, 54, 213, 244, 137, 53, 212, 244, 231, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 213, 244, 138, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 54, 212, 244, 232, 53, 212, 244, 255, 53, 213, 245, 72, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 134, 229, 248, 255, 134, 229, 248, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 131, 229, 249, 239, 134, 229, 248, 255, 121, 226, 247, 95, 53, 212, 244, 230, 53, 212, 244, 255, 56, 213, 245, 73, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 121, 227, 249, 160, 134, 229, 248, 255, 134, 229, 248, 255, 53, 212, 244, 135, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 53, 212, 244, 255, 53, 212, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 146, 255, 255, 7, 121, 227, 248, 160, 132, 229, 249, 238, 102, 255, 255, 5, 53, 212, 244, 134, 53, 212, 244, 229, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_ox0j0"]
+image = SubResource("Image_qlfe6")
+
+[sub_resource type="Image" id="Image_07nks"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 69, 149, 236, 103, 69, 147, 236, 222, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 144, 190, 244, 255, 144, 190, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 73, 150, 237, 56, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 144, 190, 244, 255, 144, 190, 244, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 70, 147, 237, 113, 69, 147, 236, 255, 70, 148, 236, 171, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 85, 170, 255, 6, 69, 147, 237, 137, 69, 147, 236, 231, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 73, 150, 237, 56, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 222, 70, 147, 238, 101, 255, 255, 255, 0, 144, 190, 244, 255, 144, 190, 244, 255, 144, 190, 244, 255, 69, 147, 237, 137, 69, 147, 236, 255, 69, 147, 236, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 70, 147, 238, 101, 69, 147, 236, 220, 69, 147, 236, 255, 69, 147, 236, 255, 72, 149, 236, 53, 144, 190, 244, 255, 144, 190, 244, 255, 255, 255, 255, 0, 69, 147, 236, 231, 69, 147, 236, 255, 71, 149, 238, 72, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 70, 147, 236, 175, 69, 147, 236, 255, 70, 147, 237, 109, 141, 189, 244, 239, 144, 190, 244, 255, 129, 180, 242, 95, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 254, 73, 147, 236, 52, 134, 185, 244, 160, 144, 190, 244, 255, 144, 190, 244, 255, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 255, 69, 147, 236, 220, 70, 148, 237, 98, 255, 255, 255, 0, 146, 182, 255, 7, 134, 184, 243, 160, 141, 190, 244, 238, 69, 147, 236, 255, 69, 147, 236, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_iwjkm"]
+image = SubResource("Image_07nks")
+
+[sub_resource type="Image" id="Image_yhsxg"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 171, 247, 255, 205, 169, 247, 233, 202, 163, 246, 157, 255, 255, 255, 2, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 200, 162, 246, 156, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 255, 255, 255, 0, 198, 159, 246, 85, 205, 171, 247, 255, 204, 168, 247, 232, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 255, 255, 255, 0, 198, 161, 247, 89, 205, 171, 247, 255, 205, 169, 248, 231, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 175, 117, 242, 76, 172, 115, 241, 255, 172, 115, 241, 228, 200, 160, 248, 96, 204, 168, 246, 238, 205, 171, 247, 255, 205, 171, 247, 255, 200, 163, 245, 153, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 173, 115, 242, 131, 204, 168, 246, 238, 205, 171, 247, 255, 204, 169, 247, 233, 200, 163, 245, 153, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 229, 173, 115, 242, 131, 204, 153, 255, 5, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 205, 171, 247, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_spxnt"]
+image = SubResource("Image_yhsxg")
+
+[sub_resource type="Image" id="Image_3c1wd"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 232, 154, 245, 98, 235, 163, 246, 255, 235, 161, 246, 239, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 233, 153, 244, 158, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 255, 255, 255, 0, 235, 163, 246, 255, 235, 163, 246, 255, 232, 153, 245, 143, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 104, 242, 76, 222, 102, 240, 255, 222, 102, 240, 228, 255, 255, 255, 0, 231, 150, 243, 85, 235, 163, 246, 255, 235, 161, 246, 233, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 255, 222, 103, 240, 131, 255, 255, 255, 0, 232, 152, 244, 89, 235, 163, 246, 255, 234, 160, 245, 226, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 222, 102, 240, 255, 222, 102, 240, 255, 222, 102, 240, 229, 222, 103, 240, 131, 255, 102, 255, 5, 235, 163, 246, 255, 235, 163, 246, 255, 235, 163, 246, 255, 234, 153, 246, 163, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 235, 163, 246, 255, 235, 161, 245, 230, 232, 155, 244, 155, 255, 170, 255, 6, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_ovkyu"]
+image = SubResource("Image_3c1wd")
+
+[sub_resource type="Image" id="Image_fu43n"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 170, 246, 255, 205, 170, 246, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 205, 170, 246, 255, 205, 170, 246, 255, 255, 255, 255, 0, 205, 170, 246, 255, 205, 170, 246, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 205, 170, 246, 255, 205, 170, 246, 255, 255, 255, 255, 0, 205, 170, 246, 255, 205, 170, 246, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 205, 170, 246, 255, 205, 170, 246, 255, 205, 170, 246, 255, 205, 170, 246, 255, 205, 170, 246, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 175, 117, 242, 76, 172, 115, 241, 255, 172, 115, 241, 228, 205, 170, 246, 255, 205, 170, 246, 255, 205, 170, 246, 255, 205, 170, 246, 255, 205, 170, 246, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 255, 173, 115, 242, 131, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 170, 246, 255, 205, 170, 246, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 172, 115, 241, 255, 172, 115, 241, 255, 172, 115, 241, 229, 173, 115, 242, 131, 204, 153, 255, 5, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 170, 246, 255, 205, 170, 246, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 205, 170, 246, 255, 205, 170, 246, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_bw0wv"]
+image = SubResource("Image_fu43n")
+
+[sub_resource type="Image" id="Image_r8wh8"]
+data = {
+"data": PackedByteArray(224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 128, 255, 70, 128, 128, 255, 70, 128, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 128, 255, 69, 255, 128, 255, 69, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 77, 77, 23, 255, 70, 70, 95, 255, 70, 70, 128, 128, 255, 69, 255, 128, 255, 69, 255, 255, 255, 255, 0, 255, 255, 255, 0, 71, 215, 255, 25, 69, 216, 255, 103, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 70, 70, 47, 255, 69, 69, 236, 255, 69, 69, 255, 255, 69, 69, 255, 128, 255, 69, 255, 128, 255, 69, 255, 255, 255, 255, 0, 71, 218, 255, 54, 69, 215, 255, 239, 69, 215, 255, 255, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 70, 70, 190, 255, 69, 69, 255, 255, 70, 70, 182, 255, 70, 70, 128, 128, 255, 69, 255, 128, 255, 69, 255, 255, 255, 255, 0, 69, 215, 255, 198, 69, 215, 255, 255, 69, 216, 255, 187, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 69, 69, 241, 255, 69, 69, 255, 255, 85, 85, 15, 255, 255, 255, 0, 128, 255, 69, 249, 128, 255, 69, 255, 128, 255, 85, 12, 69, 215, 255, 249, 69, 215, 255, 255, 85, 234, 255, 12, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 70, 70, 190, 255, 69, 69, 255, 255, 69, 69, 183, 255, 70, 70, 128, 128, 255, 70, 197, 128, 255, 69, 255, 128, 255, 69, 189, 69, 215, 255, 255, 69, 215, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 72, 72, 46, 255, 69, 69, 235, 255, 69, 69, 255, 255, 69, 69, 255, 128, 255, 73, 52, 128, 255, 69, 238, 128, 255, 69, 255, 69, 215, 255, 255, 69, 215, 255, 255, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 73, 73, 21, 255, 69, 69, 92, 255, 70, 70, 128, 255, 255, 255, 0, 128, 255, 74, 24, 129, 255, 70, 101, 70, 216, 255, 128, 70, 216, 255, 128, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 255, 255, 255, 0, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255, 224, 224, 224, 255),
+"format": "RGBA8",
+"height": 12,
+"mipmaps": false,
+"width": 16
+}
+
+[sub_resource type="ImageTexture" id="ImageTexture_x4na3"]
+image = SubResource("Image_r8wh8")
+
+[node name="TypeSelectWin" type="ConfirmationDialog" node_paths=PackedStringArray("FilterField", "List")]
+auto_translate_mode = 1
+title = "Select Type"
+position = Vector2i(227, 185)
+size = Vector2i(600, 300)
+unresizable = true
+min_size = Vector2i(400, 300)
+script = ExtResource("1_5c22w")
+FilterField = NodePath("VBox/Filterfield")
+List = NodePath("VBox/List")
+
+[node name="VBox" type="VBoxContainer" parent="."]
+offset_left = 8.0
+offset_top = 8.0
+offset_right = 592.0
+offset_bottom = 251.0
+
+[node name="Filterfield" type="LineEdit" parent="VBox"]
+layout_mode = 2
+placeholder_text = "Filter types..."
+clear_button_enabled = true
+right_icon = ExtResource("2_ukygr")
+
+[node name="List" type="ItemList" parent="VBox"]
+layout_mode = 2
+size_flags_vertical = 3
+item_count = 38
+max_columns = 3
+fixed_column_width = 180
+item_0/text = "bool"
+item_0/icon = SubResource("ImageTexture_8fe5h")
+item_1/text = "int"
+item_1/icon = SubResource("ImageTexture_2bgck")
+item_2/text = "float"
+item_2/icon = SubResource("ImageTexture_546s1")
+item_3/text = "String"
+item_3/icon = SubResource("ImageTexture_eno7g")
+item_4/text = "Vector2"
+item_4/icon = SubResource("ImageTexture_8hdr5")
+item_5/text = "Vector2i"
+item_5/icon = SubResource("ImageTexture_35ckx")
+item_6/text = "Rect2"
+item_6/icon = SubResource("ImageTexture_6bytt")
+item_7/text = "Rect2i"
+item_7/icon = SubResource("ImageTexture_xs1l5")
+item_8/text = "Vector3"
+item_8/icon = SubResource("ImageTexture_0tyes")
+item_9/text = "Vector3i"
+item_9/icon = SubResource("ImageTexture_r4k3o")
+item_10/text = "Transform2D"
+item_10/icon = SubResource("ImageTexture_bqu0u")
+item_11/text = "Vector4"
+item_11/icon = SubResource("ImageTexture_dq4ve")
+item_12/text = "Vector4i"
+item_12/icon = SubResource("ImageTexture_8fl6y")
+item_13/text = "Plane"
+item_13/icon = SubResource("ImageTexture_d8k2f")
+item_14/text = "Quaternion"
+item_14/icon = SubResource("ImageTexture_1a0j5")
+item_15/text = "AABB"
+item_15/icon = SubResource("ImageTexture_og0rx")
+item_16/text = "Basis"
+item_16/icon = SubResource("ImageTexture_crft5")
+item_17/text = "Transform3D"
+item_17/icon = SubResource("ImageTexture_18a8i")
+item_18/text = "Projection"
+item_18/icon = SubResource("ImageTexture_mmsid")
+item_19/text = "Color"
+item_19/icon = SubResource("ImageTexture_mbuty")
+item_20/text = "StringName"
+item_20/icon = SubResource("ImageTexture_ilh12")
+item_21/text = "NodePath"
+item_21/icon = SubResource("ImageTexture_6a0ld")
+item_22/text = "RID"
+item_22/icon = SubResource("ImageTexture_vfxby")
+item_23/text = "Object"
+item_23/icon = SubResource("ImageTexture_4k4vq")
+item_24/text = "Callable"
+item_24/icon = SubResource("ImageTexture_yi4je")
+item_25/text = "Signal"
+item_25/icon = SubResource("ImageTexture_lep3g")
+item_26/text = "Dictionary"
+item_26/icon = SubResource("ImageTexture_wesdt")
+item_27/text = "Array"
+item_27/icon = SubResource("ImageTexture_dykse")
+item_28/text = "PackedByteArray"
+item_28/icon = SubResource("ImageTexture_2row1")
+item_29/text = "PackedInt32Array"
+item_29/icon = SubResource("ImageTexture_2t3ht")
+item_30/text = "PackedInt64Array"
+item_30/icon = SubResource("ImageTexture_khh0p")
+item_31/text = "PackedFloat32Array"
+item_31/icon = SubResource("ImageTexture_vr787")
+item_32/text = "PackedFloat64Array"
+item_32/icon = SubResource("ImageTexture_ox0j0")
+item_33/text = "PackedStringArray"
+item_33/icon = SubResource("ImageTexture_iwjkm")
+item_34/text = "PackedVector2Array"
+item_34/icon = SubResource("ImageTexture_spxnt")
+item_35/text = "PackedVector3Array"
+item_35/icon = SubResource("ImageTexture_ovkyu")
+item_36/text = "PackedVector4Array"
+item_36/icon = SubResource("ImageTexture_bw0wv")
+item_37/text = "PackedColorArray"
+item_37/icon = SubResource("ImageTexture_x4na3")
+script = ExtResource("2_v8p48")
diff --git a/plugin/singleton/audio.gd b/plugin/singleton/audio.gd
new file mode 100644
index 00000000..55be5d0c
--- /dev/null
+++ b/plugin/singleton/audio.gd
@@ -0,0 +1,7 @@
+@tool
+extends Node
+
+@onready var Interact: AudioStreamPlayer = $Interact
+@onready var MouseEntered: AudioStreamPlayer = $MouseEntered
+@onready var FocusEntered: AudioStreamPlayer = $FocusEntered
+@onready var InputAccepted: AudioStreamPlayer = $InputAccepted
diff --git a/plugin/singleton/ggs.gd b/plugin/singleton/ggs.gd
new file mode 100644
index 00000000..16308160
--- /dev/null
+++ b/plugin/singleton/ggs.gd
@@ -0,0 +1,155 @@
+@tool
+extends Node
+## The core GGS singleton. Handles everything that needs a persistent
+## and global instance to function.
+
+## Can be used to react to a setting being applied. [param setting] is
+## the [member ggsSetting.key] name of the setting resource this is emitted
+## from.
+signal setting_applied(setting: String, value: Variant)
+
+## Base directory where the save file will be saved.
+const BASE_PATH: String = "user://"
+
+## Name of the config _file that will be used to save and load game settings.
+@export var config_file: String = "settings.cfg"
+
+## Location of your setting resources.
+@export_dir var settings_dir: String = "res://game_settings"
+
+@export_group("Input Preferences")
+## Time the input component listens for input. When this expires, it
+## automatically stops listening for input.
+@export_range(0.001, 4096, 0.001, "exp", "suffix:s")
+var listen_time: float = 3.0
+
+## Delay before accepting the chosen input. Mainly used to give enough time
+## to process modifiers for keyboard and mouse events.[br]
+## If you don't plan to accept modifiers, you can set this to its minimum
+## value.[br]
+## If you do, choosing a number that's too low may prevent the users from
+## inputting a key with modifier.
+@export_range(0.001, 4096, 0.001, "exp", "suffix:s")
+var accept_delay: float = 0.33
+
+## The button text animation speed when an input component is listening for
+## input. A higher value means slower animation.
+@export var anim_speed: float = 1.5
+
+## The default glyph type that should be used when no gamepad device is
+## connected or the device is not recognized.
+@export_custom(PROPERTY_HINT_ENUM, "other,xbox,ps,switch")
+var default_glyph: String = "other"
+
+var _file_path: String
+var _file: ConfigFile = ConfigFile.new()
+var _settings: Array[ggsSetting]
+
+## Used to group and access audio players (e.g. [code]GGS.Audio.Interact[/code])
+@onready var Audio: Node = $Audio
+
+
+func _ready() -> void:
+ if not DirAccess.dir_exists_absolute(settings_dir):
+ DirAccess.make_dir_absolute(settings_dir)
+ EditorInterface.get_resource_filesystem().scan()
+
+ _settings = _get_all_settings()
+ _file_init()
+ _file_clean_up()
+
+ if not Engine.is_editor_hint():
+ _apply_all()
+
+
+## Saves the provided [param value] in the provided [param setting] key of
+## the save file.
+func set_value(setting: ggsSetting, value: Variant) -> void:
+ _file.set_value(setting.section, setting.key, value)
+ _file.save(_file_path)
+
+
+## Loads the current value of the provided [param setting] from the save
+## file. Returns the setting's default if its key doesn't exist.
+func get_value(setting: ggsSetting) -> Variant:
+ return _file.get_value(setting.section, setting.key, setting.default)
+
+
+func _get_all_settings() -> Array[ggsSetting]:
+ var result: Array[ggsSetting]
+ var settings: PackedStringArray = _get_dir_settings(settings_dir)
+ for setting: String in settings:
+ var obj: Resource = load(setting)
+ if obj is not ggsSetting:
+ continue
+
+ result.append(obj)
+
+ return result
+
+
+func _get_dir_settings(path: String) -> PackedStringArray:
+ var result: PackedStringArray
+ var dir_access: DirAccess = DirAccess.open(path)
+
+ for file: String in dir_access.get_files():
+ if file.get_extension() == "gd":
+ continue
+
+ var file_path: String = path.path_join(file)
+ result.append(file_path)
+
+ for dir: String in dir_access.get_directories():
+ var dir_path: String = path.path_join(dir)
+ var dir_settings: PackedStringArray = _get_dir_settings(dir_path)
+ result.append_array(dir_settings)
+
+ return result
+
+
+func _file_init() -> void:
+ _file_path = BASE_PATH.path_join(config_file)
+ if FileAccess.file_exists(_file_path):
+ _file.load(_file_path)
+
+ _file.save(_file_path)
+
+
+# Removes unused keys and adds missing ones to the save file.
+func _file_clean_up() -> void:
+ # 1. Save the current keys in a temp variable for later.
+ var temp: Dictionary
+ for section: String in _file.get_sections():
+ temp[section] = {}
+ for key: String in _file.get_section_keys(section):
+ temp[section][key] = _file.get_value(section, key)
+
+ # 2. Clear the file.
+ _file.clear()
+
+ # 3. Recreate keys from the default value of settings.
+ for setting: ggsSetting in _settings:
+ if setting.key.is_empty():
+ continue
+
+ _file.set_value(setting.section, setting.key, setting.default)
+
+ # 4. If the key exists in this new file, use temp to restore the value
+ # it had before clearing the file.
+ for section: String in temp:
+ if not _file.has_section(section):
+ continue
+
+ for key: String in temp[section]:
+ if not _file.has_section_key(section, key):
+ continue
+
+ _file.set_value(section, key, temp[section][key])
+
+ _file.save(_file_path)
+
+
+func _apply_all() -> void:
+ for setting: ggsSetting in _settings:
+ var value: Variant = get_value(setting)
+ setting.apply(value)
diff --git a/plugin/singleton/ggs.tscn b/plugin/singleton/ggs.tscn
new file mode 100644
index 00000000..9050d018
--- /dev/null
+++ b/plugin/singleton/ggs.tscn
@@ -0,0 +1,19 @@
+[gd_scene load_steps=3 format=3 uid="uid://esw7j7or7gpd"]
+
+[ext_resource type="Script" path="res://addons/ggs/plugin/singleton/ggs.gd" id="1_6v3cu"]
+[ext_resource type="Script" path="res://addons/ggs/plugin/singleton/audio.gd" id="2_ghko5"]
+
+[node name="GGS" type="Node"]
+script = ExtResource("1_6v3cu")
+default_glyph = " xbox"
+
+[node name="Audio" type="Node" parent="."]
+script = ExtResource("2_ghko5")
+
+[node name="Interact" type="AudioStreamPlayer" parent="Audio"]
+
+[node name="MouseEntered" type="AudioStreamPlayer" parent="Audio"]
+
+[node name="FocusEntered" type="AudioStreamPlayer" parent="Audio"]
+
+[node name="InputAccepted" type="AudioStreamPlayer" parent="Audio"]
diff --git a/template.gd b/template.gd
deleted file mode 100644
index fcc0b99d..00000000
--- a/template.gd
+++ /dev/null
@@ -1,6 +0,0 @@
-@tool
-extends ggsSetting
-
-
-func apply(value: Variant) -> void:
- pass
diff --git a/templates/audio/setting_audio_mute.gd b/templates/audio/setting_audio_mute.gd
new file mode 100644
index 00000000..ce5fc603
--- /dev/null
+++ b/templates/audio/setting_audio_mute.gd
@@ -0,0 +1,46 @@
+@tool
+extends ggsSetting
+class_name settingAudioMute
+## Toggles mute state of an audio bus.
+
+## Target audio bus.
+var audio_bus: String = "None"
+
+
+func _init() -> void:
+ value_type = TYPE_BOOL
+ default = false
+ section = "audio"
+ read_only_properties = ["value_type", "value_hint", "value_hint_string"]
+
+
+func _get_property_list() -> Array:
+ var hint_string: String = ",".join(_get_audio_buses())
+ return [
+ {
+ "name": "audio_bus",
+ "type": TYPE_STRING,
+ "usage": get_property_usage("audio_bus"),
+ "hint": PROPERTY_HINT_ENUM,
+ "hint_string": hint_string,
+ }
+ ]
+
+
+func apply(value: bool) -> void:
+ if audio_bus == "None":
+ printerr("GGS - Apply Setting (audio_mute.gd): No audio bus is selected.")
+ return
+
+ var bus_idx: int = AudioServer.get_bus_index(audio_bus)
+ AudioServer.set_bus_mute(bus_idx, value)
+ GGS.setting_applied.emit(key, value)
+
+
+func _get_audio_buses() -> PackedStringArray:
+ var buses: PackedStringArray = ["None"]
+ for bus_idx: int in range(AudioServer.bus_count):
+ var bus: String = AudioServer.get_bus_name(bus_idx)
+ buses.append(bus)
+
+ return buses
diff --git a/templates/audio/setting_audio_volume.gd b/templates/audio/setting_audio_volume.gd
new file mode 100644
index 00000000..6ffa59f5
--- /dev/null
+++ b/templates/audio/setting_audio_volume.gd
@@ -0,0 +1,49 @@
+@tool
+extends ggsSetting
+class_name settingAudioVolume
+## Sets the volume of an audio bus.
+
+## Target audio bus.
+var audio_bus: String = "None"
+
+
+func _init() -> void:
+ value_type = TYPE_FLOAT
+ value_hint = PROPERTY_HINT_RANGE
+ value_hint_string = "0,100"
+ default = 80.0
+ section = "audio"
+ read_only_properties = ["value_type", "value_hint", "value_hint_string"]
+
+
+func _get_property_list() -> Array:
+ var hint_string: String = ",".join(_get_audio_buses())
+ return [
+ {
+ "name": "audio_bus",
+ "type": TYPE_STRING,
+ "usage": get_property_usage("audio_bus"),
+ "hint": PROPERTY_HINT_ENUM,
+ "hint_string": hint_string,
+ }
+ ]
+
+
+func apply(value: float) -> void:
+ if audio_bus == "None":
+ printerr("GGS - Apply Setting (audio_volume.gd): No audio bus is selected.")
+ return
+
+ var bus_idx: int = AudioServer.get_bus_index(audio_bus)
+ var volume_db: float = linear_to_db(value/100)
+ AudioServer.set_bus_volume_db(bus_idx, volume_db)
+ GGS.setting_applied.emit(key, value)
+
+
+func _get_audio_buses() -> PackedStringArray:
+ var buses: PackedStringArray = ["None"]
+ for bus_idx: int in range(AudioServer.bus_count):
+ var bus: String = AudioServer.get_bus_name(bus_idx)
+ buses.append(bus)
+
+ return buses
diff --git a/templates/display/setting_display_fullscreen.gd b/templates/display/setting_display_fullscreen.gd
new file mode 100644
index 00000000..1b89d54c
--- /dev/null
+++ b/templates/display/setting_display_fullscreen.gd
@@ -0,0 +1,32 @@
+@tool
+extends ggsSetting
+class_name settingDisplayFullscreen
+## Toggles window fullscreen mode.
+
+## A setting that can handle window size. Used to set the game window to
+## the correct size after its fullscreen state changes.
+@export var size_setting: ggsSetting
+
+
+func _init() -> void:
+ value_type = TYPE_BOOL
+ default = false
+ section = "display"
+ read_only_properties = ["value_type", "value_hint", "value_hint_string"]
+
+
+func apply(value: bool) -> void:
+ var window_mode: DisplayServer.WindowMode
+ match value:
+ true:
+ window_mode = DisplayServer.WINDOW_MODE_FULLSCREEN
+ false:
+ window_mode = DisplayServer.WINDOW_MODE_WINDOWED
+
+ DisplayServer.window_set_mode(window_mode)
+
+ if size_setting != null:
+ var size_value: String = GGS.get_value(size_setting)
+ size_setting.apply(size_value)
+
+ GGS.setting_applied.emit(key, value)
diff --git a/_premade/templates/display/display_scale.gd b/templates/display/setting_display_scale.gd
similarity index 52%
rename from _premade/templates/display/display_scale.gd
rename to templates/display/setting_display_scale.gd
index 786fa6df..6b2c89e3 100644
--- a/_premade/templates/display/display_scale.gd
+++ b/templates/display/setting_display_scale.gd
@@ -1,13 +1,27 @@
@tool
extends ggsSetting
+class_name settingDisplayScale
+## Sets the window scale. The window will be resized by multiplying its
+## dimensions by a flat number.
-@export var scales: Array[float]: set = set_scales
+## List of available scales.
+@export var scales: Array[float]: set = _set_scales
func _init() -> void:
value_type = TYPE_INT
value_hint = PROPERTY_HINT_ENUM
- value_hint_string = ",".join(_get_scales_strings())
+ default = 0
+ section = "display"
+ read_only_properties = ["value_type", "value_hint", "value_hint_string"]
+
+
+func _set_scales(value: Array[float]) -> void:
+ scales = value
+
+ if Engine.is_editor_hint():
+ value_hint_string = ",".join(_get_scales_strings())
+ notify_property_list_changed()
func apply(value: int) -> void:
@@ -16,24 +30,15 @@ func apply(value: int) -> void:
var base_h: int = ProjectSettings.get_setting("display/window/size/viewport_height")
var size: Vector2 = Vector2(base_w, base_h) * scale
size = ggsUtils.window_clamp_to_screen(size)
-
- DisplayServer.window_set_size(size)
- ggsUtils.center_window()
-
-
-### Scales
-
-func set_scales(value: Array[float]) -> void:
- scales = value
- if Engine.is_editor_hint():
- value_hint_string = ",".join(_get_scales_strings())
- ggsUtils.get_editor_interface().call_deferred("inspect_object", self)
+ DisplayServer.window_set_size(size)
+ ggsUtils.window_center()
+ GGS.setting_applied.emit(key, value)
func _get_scales_strings() -> PackedStringArray:
- var scales_strings: PackedStringArray = []
- for scale in scales:
- scales_strings.append("x%s"%[str(scale)])
+ var result: PackedStringArray = []
+ for scale: float in scales:
+ result.append("x%s"%[scale])
- return scales_strings
+ return result
diff --git a/templates/display/setting_display_size.gd b/templates/display/setting_display_size.gd
new file mode 100644
index 00000000..5477483c
--- /dev/null
+++ b/templates/display/setting_display_size.gd
@@ -0,0 +1,42 @@
+@tool
+extends ggsSetting
+class_name settingDisplaySize
+## Sets the window size. The window will be resized by setting its size
+## to provided values.
+
+## List of available sizes.
+@export var sizes: Array[Vector2]: set = _set_sizes
+
+
+func _init() -> void:
+ value_type = TYPE_INT
+ value_hint = PROPERTY_HINT_ENUM
+ default = 0
+ section = "display"
+ read_only_properties = ["value_type", "value_hint", "value_hint_string"]
+
+
+func _set_sizes(value: Array[Vector2]) -> void:
+ sizes = value
+
+ if Engine.is_editor_hint():
+ value_hint_string = ",".join(_get_sizes_strings())
+ notify_property_list_changed()
+
+
+func apply(value: int) -> void:
+ var size: Vector2 = sizes[value]
+ size = ggsUtils.window_clamp_to_screen(size)
+
+ DisplayServer.window_set_size(size)
+ ggsUtils.window_center()
+ GGS.setting_applied.emit(key, value)
+
+
+func _get_sizes_strings() -> PackedStringArray:
+ var result: PackedStringArray
+ for size: Vector2 in sizes:
+ var formatted_size: String = str(size).trim_prefix("(").trim_suffix(")").replace(",", " x")
+ result.append(formatted_size)
+
+ return result
diff --git a/templates/setting_input.gd b/templates/setting_input.gd
new file mode 100644
index 00000000..ae13a9b2
--- /dev/null
+++ b/templates/setting_input.gd
@@ -0,0 +1,74 @@
+@tool
+extends ggsSetting
+class_name settingInput
+## Changes the input binding of a specific input action defined in the
+## Input Map.
+
+## The target action from the [InputMap].
+var action: String
+
+## The target event of [member action].
+var event_idx: int: set = _set_event_idx
+
+var _input_helper: ggsInputHelper = ggsInputHelper.new()
+
+
+func _init() -> void:
+ value_type = TYPE_ARRAY
+ default = []
+ section = "input"
+ read_only_properties = ["default", "type", "value_type",
+ "value_hint", "value_hint_string"]
+
+
+func _get_property_list() -> Array:
+ return [
+ {
+ "name": "action",
+ "type": TYPE_STRING,
+ "usage": get_property_usage("action"),
+ },
+ {
+ "name": "event_idx",
+ "type": TYPE_INT,
+ "usage": get_property_usage("event_index"),
+ "hint": PROPERTY_HINT_ENUM,
+ "hint_string": ",".join(_action_get_events()),
+ },
+ ]
+
+
+func _set_event_idx(value: int) -> void:
+ event_idx = value
+
+ var input_map: Dictionary = _input_helper.get_input_map()
+ var target_event: InputEvent = input_map[action][event_idx]
+ default = _input_helper.serialize_event(target_event)
+
+
+func apply(value: Array) -> void:
+ var event: InputEvent = _input_helper.deserialize_event(value)
+
+ var new_events: Array[InputEvent] = InputMap.action_get_events(action)
+ new_events.remove_at(event_idx)
+ new_events.insert(event_idx, event)
+
+ InputMap.action_erase_events(action)
+ for input_event: InputEvent in new_events:
+ InputMap.action_add_event(action, input_event)
+
+ GGS.setting_applied.emit(key, value)
+
+
+func _action_get_events() -> PackedStringArray:
+ var input_map: Dictionary = _input_helper.get_input_map()
+
+ var events: PackedStringArray
+ if action.is_empty():
+ return []
+
+ for event: InputEvent in input_map[action]:
+ var event_text: String = _input_helper.event_get_text(event)
+ events.append(event_text)
+
+ return events