19 Commits

Author SHA1 Message Date
6370bfaad7 relics added 2024-04-09 10:16:28 -05:00
39157dded2 started research skills 2024-03-29 10:26:16 -05:00
f57f7f5540 researcher work 2024-03-26 12:21:37 -05:00
82675b6ed2 two buildings working!
created research building base
2024-03-14 07:29:11 -05:00
4f0f97b91d More building work 2024-03-13 09:57:22 -05:00
4718108407 Made particles emit from resource 2024-03-12 10:24:09 -05:00
4b362fabed Added building structure
Created harvester building
added harvester particles
added nearest resource func
2024-03-11 07:57:10 -05:00
d74bfda9a3 Made building consume resources
Now may build more than one if resources allow
building placement is red/green for indicating success
2024-03-10 07:51:41 -05:00
856b6a0400 fixed interaction bar
tweaking resource_manager.gd
2024-03-07 09:48:39 -06:00
ca8cfee1e8 Added basic build menu and placement 2024-03-06 09:26:07 -06:00
abde90e75f Interaction wheel
do interaction
2024-03-01 14:40:50 -06:00
50093e5937 interaction wheel
cancel interaction wheel
2024-02-28 07:12:38 -06:00
f87b1cfa9a Changed resource spawning
added interact functionality
temp added zoom with scroll wheel
2024-02-27 10:22:28 -06:00
5467e044a7 Added player character and initial interaction functionality 2024-02-24 08:37:18 -06:00
78c4291b6a created basic building class
started building groups
temp ui placed
#11 #13 #6
2024-02-09 12:19:22 -06:00
33334f03e8 Added corruption pattern
#11 starting building ui
2024-02-08 11:00:05 -06:00
84de7fa6f1 #2 Collects resources
#8 Generates resources based on resource data
#10 Shows total resources and adjusts for new resources
2024-02-07 09:24:56 -06:00
7c81a2229e refactored cell world building
#8 included resources into cell data
2024-02-06 07:39:44 -06:00
d8184ab48b #8 Generate Resources
#10 Resource UI
2024-02-05 08:53:20 -06:00
126 changed files with 5051 additions and 66 deletions

23
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,23 @@
## Contributing to TODO Manager
Firstly, thank you for being interested in contributing to the Godot TODO Manager plugin!
TODO Manager has benefitted greatly from enthusiastic users who have suggested new features, noticed bugs, and contributed code to the plugin.
### Code Style Guide
For the sake of clarity, TODO Manager takes advantage of GDScripts optional static typing in most circumstances.
In particular, when declaring variables use colons to infer the type where possible:
`todo := "#TODO"`
If the type is not obvious then explicit typing is desirable:
`items : PoolStringArray = todo.split()`
Typed arguments and return values for functions are required:
```
func example(name: String, amount: int) -> Array:
# code
return array_of_names
```
For more info on static typing in Godot please refer to the documentation.
https://docs.godotengine.org/en/stable/getting_started/scripting/gdscript/static_typing.html

21
LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 Peter DV
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

60
README.md Normal file
View File

@@ -0,0 +1,60 @@
### Localised READMEs
- [简体中文](READMECN.md) (Simplified Chinese)
# TODO Manager
![example_image](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/example1.png)
## Simple and flexible
- Supports GDScript, C# and GDNative
- Seamlessly integrated into the Godot dock
- Lenient syntax. Write TODOs that suit your style
- Quickly jump to lines and launch external editors
## Customizable
![settings_example](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/example2.png)
- Add your own RegEx patterns
- Set colours to your liking
## Installation
### Method 1 (Godot Asset Library)
The most simple way to get started using TODO Manager is to use Godot's inbuilt Asset Library to install the plugin into your project.
#### Step 1
Find TODO Manager in the Godot Asset Library.
![AssetLib image](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/Instruct1.png)
#### Step 2
Install the package. You may want to untick the /doc folder at this point as it is not necessary for the functions of the plugin.
![Filestrcture image](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/Instruct3.png)
#### Step 4
Enable the plugin in the project settings.
![Project image](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/Instruct4.png)
### Method 2 (GitHub)
#### Step 1
Click Download ZIP from the 'Code' dropdown.
![GitHub image](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/Instruct5.png)
#### Step 2
- Unzip the file and add it into your project folder. Make sure 'addons' is a subdirectory of res://
- DO NOT change the name of the 'addons' or 'Todo_Manager' folders as this will break the saving and loading of your settings.
#### Step 3
Enable the plugin in the project settings.
![Project image](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/Instruct4.png)

56
READMECN.md Normal file
View File

@@ -0,0 +1,56 @@
# TODO Manager
![example_image](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/example1.png)
## 简单而灵活
- 支持 GDScriptC# 和 GDNative。
- 无缝集成到 Godot dock 栏。
- 宽松的语法用适合你自己的风格写TODOs。
- 快速跳转到某一行并启用外部编辑器。
## 可定制
![settings_example](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/example2.png)
- 添加你自己的正则表达式。
- 设置你喜欢的颜色。
## 安装
### 方法一 (Godot Asset Library)
最简单的使用 TODO Manager 的方法,使用 Godot 内置的资源商店Asset Library来安装这个插件到你的项目。
#### 第一步
在资源商店搜索 TODO Manager。
![AssetLib image](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/Instruct1.png)
#### 第二步
安装下载的插件,你可能需要取消勾选 /doc 文件夹,因为插件的功能不需要。
![Filestrcture image](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/Instruct3.png)
#### 第三步
在项目设置里启用插件。
![Project image](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/Instruct4.png)
### 方法二 (GitHub)
#### 第一步
点击 Download ZIP。
![GitHub image](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/Instruct5.png)
#### 第二步
- 解压文件并且放到你的项目文件夹。确保 “addons” 是 res:// 的子文件夹。
- DO NOT change the name of the 'addons' or 'Todo_Manager' folders as this will break the saving and loading of your settings.
- 不要更改 “addons” 或 “Todo_Manager” 文件夹的名称,因为这会打破预设的保存和加载。
#### 第三步
在项目设置里启用这个插件。
![Project image](https://github.com/OrigamiDev-Pete/TODO_Manager/blob/main/addons/Todo_Manager/doc/images/Instruct4.png)

View File

@@ -0,0 +1,17 @@
@tool
extends HBoxContainer
var colour : Color
var title : String:
set = set_title
var index : int
@onready var colour_picker := $TODOColourPickerButton
func _ready() -> void:
$TODOColourPickerButton.color = colour
$Label.text = title
func set_title(value: String) -> void:
title = value
$Label.text = value

View File

@@ -0,0 +1,44 @@
@tool
extends Panel
signal tree_built # used for debugging
const Todo := preload("res://addons/Todo_Manager/todo_class.gd")
const TodoItem := preload("res://addons/Todo_Manager/todoItem_class.gd")
var _sort_alphabetical := true
@onready var tree := $Tree as Tree
func build_tree(todo_item : TodoItem, patterns : Array, cased_patterns : Array[String]) -> void:
tree.clear()
var root := tree.create_item()
root.set_text(0, "Scripts")
var script := tree.create_item(root)
script.set_text(0, todo_item.get_short_path() + " -------")
script.set_metadata(0, todo_item)
for todo in todo_item.todos:
var item := tree.create_item(script)
var content_header : String = todo.content
if "\n" in todo.content:
content_header = content_header.split("\n")[0] + "..."
item.set_text(0, "(%0) - %1".format([todo.line_number, content_header], "%_"))
item.set_tooltip_text(0, todo.content)
item.set_metadata(0, todo)
for i in range(0, len(cased_patterns)):
if cased_patterns[i] == todo.pattern:
item.set_custom_color(0, patterns[i][1])
emit_signal("tree_built")
func sort_alphabetical(a, b) -> bool:
if a.script_path > b.script_path:
return true
else:
return false
func sort_backwards(a, b) -> bool:
if a.script_path < b.script_path:
return true
else:
return false

297
addons/Todo_Manager/Dock.gd Normal file
View File

@@ -0,0 +1,297 @@
@tool
extends Control
#signal tree_built # used for debugging
enum { CASE_INSENSITIVE, CASE_SENSITIVE }
const Project := preload("res://addons/Todo_Manager/Project.gd")
const Current := preload("res://addons/Todo_Manager/Current.gd")
const Todo := preload("res://addons/Todo_Manager/todo_class.gd")
const TodoItem := preload("res://addons/Todo_Manager/todoItem_class.gd")
const ColourPicker := preload("res://addons/Todo_Manager/UI/ColourPicker.tscn")
const Pattern := preload("res://addons/Todo_Manager/UI/Pattern.tscn")
const DEFAULT_PATTERNS := [["\\bTODO\\b", Color("96f1ad"), CASE_INSENSITIVE], ["\\bHACK\\b", Color("d5bc70"), CASE_INSENSITIVE], ["\\bFIXME\\b", Color("d57070"), CASE_INSENSITIVE]]
const DEFAULT_SCRIPT_COLOUR := Color("ccced3")
const DEFAULT_SCRIPT_NAME := false
const DEFAULT_SORT := true
var plugin : EditorPlugin
var todo_items : Array
var script_colour := Color("ccced3")
var ignore_paths : Array[String] = []
var full_path := false
var auto_refresh := true
var builtin_enabled := false
var _sort_alphabetical := true
var patterns := [["\\bTODO\\b", Color("96f1ad"), CASE_INSENSITIVE], ["\\bHACK\\b", Color("d5bc70"), CASE_INSENSITIVE], ["\\bFIXME\\b", Color("d57070"), CASE_INSENSITIVE]]
@onready var tabs := $VBoxContainer/TabContainer as TabContainer
@onready var project := $VBoxContainer/TabContainer/Project as Project
@onready var current := $VBoxContainer/TabContainer/Current as Current
@onready var project_tree := $VBoxContainer/TabContainer/Project/Tree as Tree
@onready var current_tree := $VBoxContainer/TabContainer/Current/Tree as Tree
@onready var settings_panel := $VBoxContainer/TabContainer/Settings as Panel
@onready var colours_container := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer3/Colours as VBoxContainer
@onready var pattern_container := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4/Patterns as VBoxContainer
@onready var ignore_textbox := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/IgnorePaths/TextEdit as LineEdit
@onready var auto_refresh_button := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns/RefreshCheckButton as CheckButton
func _ready() -> void:
load_config()
populate_settings()
func build_tree() -> void:
if tabs:
match tabs.current_tab:
0:
project.build_tree(todo_items, ignore_paths, patterns, plugin.cased_patterns, _sort_alphabetical, full_path)
create_config_file()
1:
current.build_tree(get_active_script(), patterns, plugin.cased_patterns)
create_config_file()
2:
pass
_:
pass
func get_active_script() -> TodoItem:
var current_script : Script = plugin.get_editor_interface().get_script_editor().get_current_script()
if current_script:
var script_path = current_script.resource_path
for todo_item in todo_items:
if todo_item.script_path == script_path:
return todo_item
# nothing found
var todo_item := TodoItem.new(script_path, [])
return todo_item
else:
# not a script
var todo_item := TodoItem.new("res://Documentation", [])
return todo_item
func go_to_script(script_path: String, line_number : int = 0) -> void:
if plugin.get_editor_interface().get_editor_settings().get_setting("text_editor/external/use_external_editor"):
var exec_path = plugin.get_editor_interface().get_editor_settings().get_setting("text_editor/external/exec_path")
var args := get_exec_flags(exec_path, script_path, line_number)
OS.execute(exec_path, args)
else:
var script := load(script_path)
plugin.get_editor_interface().edit_resource(script)
plugin.get_editor_interface().get_script_editor().goto_line(line_number - 1)
func get_exec_flags(editor_path : String, script_path : String, line_number : int) -> PackedStringArray:
var args : PackedStringArray
var script_global_path = ProjectSettings.globalize_path(script_path)
if editor_path.ends_with("code.cmd") or editor_path.ends_with("code"): ## VS Code
args.append(ProjectSettings.globalize_path("res://"))
args.append("--goto")
args.append(script_global_path + ":" + str(line_number))
elif editor_path.ends_with("rider64.exe") or editor_path.ends_with("rider"): ## Rider
args.append("--line")
args.append(str(line_number))
args.append(script_global_path)
else: ## Atom / Sublime
args.append(script_global_path + ":" + str(line_number))
return args
func sort_alphabetical(a, b) -> bool:
if a.script_path > b.script_path:
return true
else:
return false
func sort_backwards(a, b) -> bool:
if a.script_path < b.script_path:
return true
else:
return false
func populate_settings() -> void:
for i in patterns.size():
## Create Colour Pickers
var colour_picker: Variant = ColourPicker.instantiate()
colour_picker.colour = patterns[i][1]
colour_picker.title = patterns[i][0]
colour_picker.index = i
colours_container.add_child(colour_picker)
colour_picker.colour_picker.color_changed.connect(change_colour.bind(i))
## Create Patterns
var pattern_edit: Variant = Pattern.instantiate()
pattern_edit.text = patterns[i][0]
pattern_edit.index = i
pattern_container.add_child(pattern_edit)
pattern_edit.line_edit.text_changed.connect(change_pattern.bind(i,
colour_picker))
pattern_edit.remove_button.pressed.connect(remove_pattern.bind(i,
pattern_edit, colour_picker))
pattern_edit.case_checkbox.button_pressed = patterns[i][2]
pattern_edit.case_checkbox.toggled.connect(case_sensitive_pattern.bind(i))
var pattern_button := $VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4/Patterns/AddPatternButton
$VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4/Patterns.move_child(pattern_button, 0)
# path filtering
var ignore_paths_field := ignore_textbox
if not ignore_paths_field.is_connected("text_changed", _on_ignore_paths_changed):
ignore_paths_field.connect("text_changed", _on_ignore_paths_changed)
var ignore_paths_text := ""
for path in ignore_paths:
ignore_paths_text += path + ", "
ignore_paths_text = ignore_paths_text.trim_suffix(", ")
ignore_paths_field.text = ignore_paths_text
auto_refresh_button.button_pressed = auto_refresh
func rebuild_settings() -> void:
for node in colours_container.get_children():
node.queue_free()
for node in pattern_container.get_children():
if node is Button:
continue
node.queue_free()
populate_settings()
#### CONFIG FILE ####
func create_config_file() -> void:
var config = ConfigFile.new()
config.set_value("scripts", "full_path", full_path)
config.set_value("scripts", "sort_alphabetical", _sort_alphabetical)
config.set_value("scripts", "script_colour", script_colour)
config.set_value("scripts", "ignore_paths", ignore_paths)
config.set_value("patterns", "patterns", patterns)
config.set_value("config", "auto_refresh", auto_refresh)
config.set_value("config", "builtin_enabled", builtin_enabled)
var err = config.save("res://addons/Todo_Manager/todo.cfg")
func load_config() -> void:
var config := ConfigFile.new()
if config.load("res://addons/Todo_Manager/todo.cfg") == OK:
full_path = config.get_value("scripts", "full_path", DEFAULT_SCRIPT_NAME)
_sort_alphabetical = config.get_value("scripts", "sort_alphabetical", DEFAULT_SORT)
script_colour = config.get_value("scripts", "script_colour", DEFAULT_SCRIPT_COLOUR)
ignore_paths = config.get_value("scripts", "ignore_paths", [] as Array[String])
patterns = config.get_value("patterns", "patterns", DEFAULT_PATTERNS)
auto_refresh = config.get_value("config", "auto_refresh", true)
builtin_enabled = config.get_value("config", "builtin_enabled", false)
else:
create_config_file()
#### Events ####
func _on_SettingsButton_toggled(button_pressed: bool) -> void:
settings_panel.visible = button_pressed
if button_pressed == false:
create_config_file()
# plugin.find_tokens_from_path(plugin.script_cache)
if auto_refresh:
plugin.rescan_files(true)
func _on_Tree_item_activated() -> void:
var item : TreeItem
match tabs.current_tab:
0:
item = project_tree.get_selected()
1:
item = current_tree.get_selected()
if item.get_metadata(0) is Todo:
var todo : Todo = item.get_metadata(0)
call_deferred("go_to_script", todo.script_path, todo.line_number)
else:
var todo_item = item.get_metadata(0)
call_deferred("go_to_script", todo_item.script_path)
func _on_FullPathCheckBox_toggled(button_pressed: bool) -> void:
full_path = button_pressed
func _on_ScriptColourPickerButton_color_changed(color: Color) -> void:
script_colour = color
func _on_RescanButton_pressed() -> void:
plugin.rescan_files(true)
func change_colour(colour: Color, index: int) -> void:
patterns[index][1] = colour
func change_pattern(value: String, index: int, this_colour: Node) -> void:
patterns[index][0] = value
this_colour.title = value
plugin.rescan_files(true)
func remove_pattern(index: int, this: Node, this_colour: Node) -> void:
patterns.remove_at(index)
this.queue_free()
this_colour.queue_free()
plugin.rescan_files(true)
func case_sensitive_pattern(active: bool, index: int) -> void:
if active:
patterns[index][2] = CASE_SENSITIVE
else:
patterns[index][2] = CASE_INSENSITIVE
plugin.rescan_files(true)
func _on_DefaultButton_pressed() -> void:
patterns = DEFAULT_PATTERNS.duplicate(true)
_sort_alphabetical = DEFAULT_SORT
script_colour = DEFAULT_SCRIPT_COLOUR
full_path = DEFAULT_SCRIPT_NAME
rebuild_settings()
plugin.rescan_files(true)
func _on_AlphSortCheckBox_toggled(button_pressed: bool) -> void:
_sort_alphabetical = button_pressed
plugin.rescan_files(true)
func _on_AddPatternButton_pressed() -> void:
patterns.append(["\\bplaceholder\\b", Color.WHITE, CASE_INSENSITIVE])
rebuild_settings()
func _on_RefreshCheckButton_toggled(button_pressed: bool) -> void:
auto_refresh = button_pressed
func _on_Timer_timeout() -> void:
plugin.refresh_lock = false
func _on_ignore_paths_changed(new_text: String) -> void:
var text = ignore_textbox.text
var split: Array = text.split(',')
ignore_paths.clear()
for elem in split:
if elem == " " || elem == "":
continue
ignore_paths.push_front(elem.lstrip(' ').rstrip(' '))
# validate so no empty string slips through (all paths ignored)
var i := 0
for path in ignore_paths:
if (path == "" || path == " "):
ignore_paths.remove_at(i)
i += 1
plugin.rescan_files(true)
func _on_TabContainer_tab_changed(tab: int) -> void:
build_tree()
func _on_BuiltInCheckButton_toggled(button_pressed: bool) -> void:
builtin_enabled = button_pressed
plugin.rescan_files(true)

View File

@@ -0,0 +1,21 @@
@tool
extends HBoxContainer
var text : String : set = set_text
var disabled : bool
var index : int
@onready var line_edit := $LineEdit as LineEdit
@onready var remove_button := $RemoveButton as Button
@onready var case_checkbox := %CaseSensativeCheckbox as CheckBox
func _ready() -> void:
line_edit.text = text
remove_button.disabled = disabled
func set_text(value: String) -> void:
text = value
if line_edit:
line_edit.text = value

View File

@@ -0,0 +1,74 @@
@tool
extends Panel
signal tree_built # used for debugging
const Todo := preload("res://addons/Todo_Manager/todo_class.gd")
var _sort_alphabetical := true
var _full_path := false
@onready var tree := $Tree as Tree
func build_tree(todo_items : Array, ignore_paths : Array, patterns : Array, cased_patterns: Array[String], sort_alphabetical : bool, full_path : bool) -> void:
_full_path = full_path
tree.clear()
if sort_alphabetical:
todo_items.sort_custom(Callable(self, "sort_alphabetical"))
else:
todo_items.sort_custom(Callable(self, "sort_backwards"))
var root := tree.create_item()
root.set_text(0, "Scripts")
for todo_item in todo_items:
var ignore := false
for ignore_path in ignore_paths:
var script_path : String = todo_item.script_path
if script_path.begins_with(ignore_path) or script_path.begins_with("res://" + ignore_path) or script_path.begins_with("res:///" + ignore_path):
ignore = true
break
if ignore:
continue
var script := tree.create_item(root)
if full_path:
script.set_text(0, todo_item.script_path + " -------")
else:
script.set_text(0, todo_item.get_short_path() + " -------")
script.set_metadata(0, todo_item)
for todo in todo_item.todos:
var item := tree.create_item(script)
var content_header : String = todo.content
if "\n" in todo.content:
content_header = content_header.split("\n")[0] + "..."
item.set_text(0, "(%0) - %1".format([todo.line_number, content_header], "%_"))
item.set_tooltip_text(0, todo.content)
item.set_metadata(0, todo)
#print(todo.title)
for i in range(0, len(cased_patterns)):
if cased_patterns[i] == todo.pattern:
item.set_custom_color(0, patterns[i][1])
emit_signal("tree_built")
func sort_alphabetical(a, b) -> bool:
if _full_path:
if a.script_path < b.script_path:
return true
else:
return false
else:
if a.get_short_path() < b.get_short_path():
return true
else:
return false
func sort_backwards(a, b) -> bool:
if _full_path:
if a.script_path > b.script_path:
return true
else:
return false
else:
if a.get_short_path() > b.get_short_path():
return true
else:
return false

View File

@@ -0,0 +1,21 @@
[gd_scene load_steps=2 format=3 uid="uid://bie1xn8v1kd66"]
[ext_resource type="Script" path="res://addons/Todo_Manager/ColourPicker.gd" id="1"]
[node name="TODOColour" type="HBoxContainer"]
offset_right = 105.0
offset_bottom = 31.0
script = ExtResource("1")
metadata/_edit_use_custom_anchors = false
[node name="Label" type="Label" parent="."]
offset_top = 4.0
offset_right = 1.0
offset_bottom = 27.0
[node name="TODOColourPickerButton" type="ColorPickerButton" parent="."]
custom_minimum_size = Vector2(40, 0)
offset_left = 65.0
offset_right = 105.0
offset_bottom = 31.0
size_flags_horizontal = 10

View File

@@ -0,0 +1,316 @@
[gd_scene load_steps=6 format=3 uid="uid://b6k0dtftankcx"]
[ext_resource type="Script" path="res://addons/Todo_Manager/Dock.gd" id="1"]
[ext_resource type="Script" path="res://addons/Todo_Manager/Project.gd" id="2"]
[ext_resource type="Script" path="res://addons/Todo_Manager/Current.gd" id="3"]
[sub_resource type="ButtonGroup" id="ButtonGroup_kqxcu"]
[sub_resource type="ButtonGroup" id="ButtonGroup_kltg3"]
[node name="Dock" type="Control"]
custom_minimum_size = Vector2(0, 200)
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
size_flags_vertical = 3
script = ExtResource("1")
[node name="VBoxContainer" type="VBoxContainer" parent="."]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_top = 4.0
grow_horizontal = 2
grow_vertical = 2
metadata/_edit_layout_mode = 1
[node name="Header" type="HBoxContainer" parent="VBoxContainer"]
visible = false
layout_mode = 2
[node name="HeaderLeft" type="HBoxContainer" parent="VBoxContainer/Header"]
layout_mode = 2
size_flags_horizontal = 3
[node name="Title" type="Label" parent="VBoxContainer/Header/HeaderLeft"]
layout_mode = 2
text = "Todo Dock:"
[node name="HeaderRight" type="HBoxContainer" parent="VBoxContainer/Header"]
layout_mode = 2
size_flags_horizontal = 3
alignment = 2
[node name="SettingsButton" type="Button" parent="VBoxContainer/Header/HeaderRight"]
visible = false
layout_mode = 2
toggle_mode = true
text = "Settings"
[node name="TabContainer" type="TabContainer" parent="VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
[node name="Project" type="Panel" parent="VBoxContainer/TabContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("2")
[node name="Tree" type="Tree" parent="VBoxContainer/TabContainer/Project"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
hide_root = true
[node name="Current" type="Panel" parent="VBoxContainer/TabContainer"]
visible = false
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
script = ExtResource("3")
[node name="Tree" type="Tree" parent="VBoxContainer/TabContainer/Current"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
hide_folding = true
hide_root = true
[node name="Settings" type="Panel" parent="VBoxContainer/TabContainer"]
visible = false
layout_mode = 2
[node name="ScrollContainer" type="ScrollContainer" parent="VBoxContainer/TabContainer/Settings"]
layout_mode = 1
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="MarginContainer" type="MarginContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="Scripts" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/Scripts"]
layout_mode = 2
text = "Scripts:"
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/Scripts"]
layout_mode = 2
size_flags_horizontal = 3
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
size_flags_horizontal = 5
[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer"]
layout_mode = 2
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2"]
layout_mode = 2
[node name="Scripts" type="VBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2"]
layout_mode = 2
[node name="ScriptName" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptName"]
layout_mode = 2
text = "Script Name:"
[node name="FullPathCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptName"]
layout_mode = 2
button_group = SubResource("ButtonGroup_kqxcu")
text = "Full path"
[node name="ShortNameCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptName"]
layout_mode = 2
button_pressed = true
button_group = SubResource("ButtonGroup_kqxcu")
text = "Short name"
[node name="ScriptSort" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptSort"]
layout_mode = 2
text = "Sort Order:"
[node name="AlphSortCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptSort"]
layout_mode = 2
button_pressed = true
button_group = SubResource("ButtonGroup_kltg3")
text = "Alphabetical"
[node name="RAlphSortCheckBox" type="CheckBox" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptSort"]
layout_mode = 2
button_group = SubResource("ButtonGroup_kltg3")
text = "Reverse Alphabetical"
[node name="ScriptColour" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptColour"]
layout_mode = 2
text = "Script Colour:"
[node name="ScriptColourPickerButton" type="ColorPickerButton" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptColour"]
custom_minimum_size = Vector2(40, 0)
layout_mode = 2
color = Color(0.8, 0.807843, 0.827451, 1)
[node name="IgnorePaths" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/IgnorePaths"]
layout_mode = 2
text = "Ignore Paths:"
[node name="TextEdit" type="LineEdit" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/IgnorePaths"]
custom_minimum_size = Vector2(100, 0)
layout_mode = 2
expand_to_text_length = true
[node name="Label3" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/IgnorePaths"]
layout_mode = 2
text = "(Separated by commas)"
[node name="TODOColours" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/TODOColours"]
layout_mode = 2
text = "TODO Colours:"
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/TODOColours"]
layout_mode = 2
size_flags_horizontal = 3
[node name="HBoxContainer3" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer3"]
layout_mode = 2
[node name="Colours" type="VBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer3"]
layout_mode = 2
[node name="Patterns" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/Patterns"]
layout_mode = 2
text = "Patterns:"
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/Patterns"]
layout_mode = 2
size_flags_horizontal = 3
[node name="HBoxContainer4" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4"]
layout_mode = 2
[node name="Patterns" type="VBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4"]
layout_mode = 2
size_flags_horizontal = 3
[node name="AddPatternButton" type="Button" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4/Patterns"]
layout_mode = 2
size_flags_horizontal = 0
text = "Add"
[node name="Config" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/Config"]
layout_mode = 2
text = "Config:"
[node name="HSeparator" type="HSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/Config"]
layout_mode = 2
size_flags_horizontal = 3
[node name="HBoxContainer5" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer"]
layout_mode = 2
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5"]
layout_mode = 2
[node name="Patterns" type="VBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5"]
layout_mode = 2
[node name="RefreshCheckButton" type="CheckButton" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns"]
layout_mode = 2
size_flags_horizontal = 0
button_pressed = true
text = "Auto Refresh"
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns"]
layout_mode = 2
[node name="BuiltInCheckButton" type="CheckButton" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns/HBoxContainer"]
layout_mode = 2
text = "Scan Built-in Scripts"
[node name="Label" type="Label" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns/HBoxContainer"]
layout_mode = 2
text = "Some functionality will not work for built-in scripts"
[node name="DefaultButton" type="Button" parent="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns"]
layout_mode = 2
size_flags_horizontal = 0
text = "Reset to default"
[node name="Timer" type="Timer" parent="."]
one_shot = true
[node name="RescanButton" type="Button" parent="."]
layout_mode = 1
anchors_preset = 1
anchor_left = 1.0
anchor_right = 1.0
offset_left = -102.0
offset_top = 3.0
offset_bottom = 34.0
grow_horizontal = 0
text = "Rescan Files"
flat = true
[connection signal="toggled" from="VBoxContainer/Header/HeaderRight/SettingsButton" to="." method="_on_SettingsButton_toggled"]
[connection signal="tab_changed" from="VBoxContainer/TabContainer" to="." method="_on_TabContainer_tab_changed"]
[connection signal="item_activated" from="VBoxContainer/TabContainer/Project/Tree" to="." method="_on_Tree_item_activated"]
[connection signal="item_activated" from="VBoxContainer/TabContainer/Current/Tree" to="." method="_on_Tree_item_activated"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptName/FullPathCheckBox" to="." method="_on_FullPathCheckBox_toggled"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptSort/AlphSortCheckBox" to="." method="_on_AlphSortCheckBox_toggled"]
[connection signal="color_changed" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/VBoxContainer/HBoxContainer2/Scripts/ScriptColour/ScriptColourPickerButton" to="." method="_on_ScriptColourPickerButton_color_changed"]
[connection signal="pressed" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer4/Patterns/AddPatternButton" to="." method="_on_AddPatternButton_pressed"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns/RefreshCheckButton" to="." method="_on_RefreshCheckButton_toggled"]
[connection signal="toggled" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns/HBoxContainer/BuiltInCheckButton" to="." method="_on_BuiltInCheckButton_toggled"]
[connection signal="pressed" from="VBoxContainer/TabContainer/Settings/ScrollContainer/MarginContainer/VBoxContainer/HBoxContainer5/Patterns/DefaultButton" to="." method="_on_DefaultButton_pressed"]
[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"]
[connection signal="pressed" from="RescanButton" to="." method="_on_RescanButton_pressed"]

View File

@@ -0,0 +1,26 @@
[gd_scene load_steps=2 format=3 uid="uid://bx11sel2q5wli"]
[ext_resource type="Script" path="res://addons/Todo_Manager/Pattern.gd" id="1"]
[node name="Pattern" type="HBoxContainer"]
script = ExtResource("1")
[node name="LineEdit" type="LineEdit" parent="."]
layout_mode = 2
size_flags_horizontal = 0
expand_to_text_length = true
[node name="RemoveButton" type="Button" parent="."]
layout_mode = 2
text = "-"
[node name="MarginContainer" type="MarginContainer" parent="."]
custom_minimum_size = Vector2(20, 0)
layout_mode = 2
size_flags_horizontal = 0
[node name="CaseSensativeCheckbox" type="CheckBox" parent="."]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 0
text = "Case Sensitive"

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bln8vey55n15m"
path="res://.godot/imported/Instruct1.png-698c6faa3ef3ac4960807faa3e028bd6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/Instruct1.png"
dest_files=["res://.godot/imported/Instruct1.png-698c6faa3ef3ac4960807faa3e028bd6.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://upa8qtqi0cld"
path="res://.godot/imported/Instruct2.png-4e8664e49d00a397bbd539f7dee976ff.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/Instruct2.png"
dest_files=["res://.godot/imported/Instruct2.png-4e8664e49d00a397bbd539f7dee976ff.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cyvmd1qj3qh2t"
path="res://.godot/imported/Instruct3.png-3cc62ed99bf29d90b803cb8eb40881e9.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/Instruct3.png"
dest_files=["res://.godot/imported/Instruct3.png-3cc62ed99bf29d90b803cb8eb40881e9.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dbu7e8v7hv8vi"
path="res://.godot/imported/Instruct4.png-bf5aa1cffc066175cecf9281b0774809.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/Instruct4.png"
dest_files=["res://.godot/imported/Instruct4.png-bf5aa1cffc066175cecf9281b0774809.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://c6uwmoqoljngl"
path="res://.godot/imported/Instruct5.png-001538ed8b5682dcf232de08035aab38.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/Instruct5.png"
dest_files=["res://.godot/imported/Instruct5.png-001538ed8b5682dcf232de08035aab38.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dyjx6y8srst1m"
path="res://.godot/imported/TODO_Manager_Logo.png-e07d7ec75201c66b732ef87ec1bece15.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/TODO_Manager_Logo.png"
dest_files=["res://.godot/imported/TODO_Manager_Logo.png-e07d7ec75201c66b732ef87ec1bece15.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dm4238rk6sken"
path="res://.godot/imported/example1.png-6386c332ca46e1e62ea061b956a901cd.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/example1.png"
dest_files=["res://.godot/imported/example1.png-6386c332ca46e1e62ea061b956a901cd.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

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cwjoqo8s6laik"
path="res://.godot/imported/example2.png-2e3a8f9cd1e178daf22b83dc0513f37a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/Todo_Manager/doc/images/example2.png"
dest_files=["res://.godot/imported/example2.png-2e3a8f9cd1e178daf22b83dc0513f37a.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

View File

@@ -0,0 +1,7 @@
[plugin]
name="Todo Manager"
description="Dock for housing TODO messages."
author="Peter de Vroom"
version="2.2.2"
script="plugin.gd"

View File

@@ -0,0 +1,280 @@
@tool
extends EditorPlugin
const DockScene := preload("res://addons/Todo_Manager/UI/Dock.tscn")
const Dock := preload("res://addons/Todo_Manager/Dock.gd")
const Todo := preload("res://addons/Todo_Manager/todo_class.gd")
const TodoItem := preload("res://addons/Todo_Manager/todoItem_class.gd")
var _dockUI : Dock
class TodoCacheValue:
var todos: Array
var last_modified_time: int
func _init(todos: Array, last_modified_time: int):
self.todos = todos
self.last_modified_time = last_modified_time
var todo_cache : Dictionary # { key: script_path, value: TodoCacheValue }
var remove_queue : Array
var combined_pattern : String
var cased_patterns : Array[String]
var refresh_lock := false # makes sure _on_filesystem_changed only triggers once
func _enter_tree() -> void:
_dockUI = DockScene.instantiate() as Control
add_control_to_bottom_panel(_dockUI, "TODO")
get_editor_interface().get_resource_filesystem().connect("filesystem_changed",
_on_filesystem_changed)
get_editor_interface().get_file_system_dock().connect("file_removed", queue_remove)
get_editor_interface().get_script_editor().connect("editor_script_changed",
_on_active_script_changed)
_dockUI.plugin = self
combined_pattern = combine_patterns(_dockUI.patterns)
find_tokens_from_path(find_scripts())
_dockUI.build_tree()
func _exit_tree() -> void:
_dockUI.create_config_file()
remove_control_from_bottom_panel(_dockUI)
_dockUI.free()
func queue_remove(file: String):
for i in _dockUI.todo_items.size() - 1:
if _dockUI.todo_items[i].script_path == file:
_dockUI.todo_items.remove_at(i)
func find_tokens_from_path(scripts: Array[String]) -> void:
for script_path in scripts:
var file := FileAccess.open(script_path, FileAccess.READ)
var contents := file.get_as_text()
find_tokens(contents, script_path)
func find_tokens_from_script(script: Resource) -> void:
find_tokens(script.source_code, script.resource_path)
func find_tokens(text: String, script_path: String) -> void:
var cached_todos = get_cached_todos(script_path)
if cached_todos.size() != 0:
# var i := 0
# for todo_item in _dockUI.todo_items:
# if todo_item.script_path == script_path:
# _dockUI.todo_items.remove_at(i)
# i += 1
var todo_item := TodoItem.new(script_path, cached_todos)
_dockUI.todo_items.append(todo_item)
else:
var regex = RegEx.new()
# if regex.compile("#\\s*\\bTODO\\b.*|#\\s*\\bHACK\\b.*") == OK:
if regex.compile(combined_pattern) == OK:
var result : Array[RegExMatch] = regex.search_all(text)
if result.is_empty():
for i in _dockUI.todo_items.size():
if _dockUI.todo_items[i].script_path == script_path:
_dockUI.todo_items.remove_at(i)
return # No tokens found
var match_found : bool
var i := 0
for todo_item in _dockUI.todo_items:
if todo_item.script_path == script_path:
match_found = true
var updated_todo_item := update_todo_item(todo_item, result, text, script_path)
_dockUI.todo_items.remove_at(i)
_dockUI.todo_items.insert(i, updated_todo_item)
break
i += 1
if !match_found:
_dockUI.todo_items.append(create_todo_item(result, text, script_path))
func create_todo_item(regex_results: Array[RegExMatch], text: String, script_path: String) -> TodoItem:
var todo_item = TodoItem.new(script_path, [])
todo_item.script_path = script_path
var last_line_number := 0
var lines := text.split("\n")
for r in regex_results:
var new_todo : Todo = create_todo(r.get_string(), script_path)
new_todo.line_number = get_line_number(r.get_string(), text, last_line_number)
# GD Multiline comment
var trailing_line := new_todo.line_number
var should_break = false
while trailing_line < lines.size() and lines[trailing_line].dedent().begins_with("#"):
for other_r in regex_results:
if lines[trailing_line] in other_r.get_string():
should_break = true
break
if should_break:
break
new_todo.content += "\n" + lines[trailing_line]
trailing_line += 1
last_line_number = new_todo.line_number
todo_item.todos.append(new_todo)
cache_todos(todo_item.todos, script_path)
return todo_item
func update_todo_item(todo_item: TodoItem, regex_results: Array[RegExMatch], text: String, script_path: String) -> TodoItem:
todo_item.todos.clear()
var lines := text.split("\n")
for r in regex_results:
var new_todo : Todo = create_todo(r.get_string(), script_path)
new_todo.line_number = get_line_number(r.get_string(), text)
# GD Multiline comment
var trailing_line := new_todo.line_number
var should_break = false
while trailing_line < lines.size() and lines[trailing_line].dedent().begins_with("#"):
for other_r in regex_results:
if lines[trailing_line] in other_r.get_string():
should_break = true
break
if should_break:
break
new_todo.content += "\n" + lines[trailing_line]
trailing_line += 1
todo_item.todos.append(new_todo)
return todo_item
func get_line_number(what: String, from: String, start := 0) -> int:
what = what.split('\n')[0] # Match first line of multiline C# comments
var temp_array := from.split('\n')
var lines := Array(temp_array)
var line_number# = lines.find(what) + 1
for i in range(start, lines.size()):
if what in lines[i]:
line_number = i + 1 # +1 to account of 0-based array vs 1-based line numbers
break
else:
line_number = 0 # This is an error
return line_number
func _on_filesystem_changed() -> void:
if !refresh_lock:
if _dockUI.auto_refresh:
refresh_lock = true
_dockUI.get_node("Timer").start()
rescan_files(false)
func find_scripts() -> Array[String]:
var scripts : Array[String]
var directory_queue : Array[String]
var dir := DirAccess.open("res://")
### FIRST PHASE ###
if dir.get_open_error() == OK:
get_dir_contents(dir, scripts, directory_queue)
else:
printerr("TODO_Manager: There was an error during find_scripts() ### First Phase ###")
### SECOND PHASE ###
while not directory_queue.is_empty():
if dir.change_dir(directory_queue[0]) == OK:
get_dir_contents(dir, scripts, directory_queue)
else:
printerr("TODO_Manager: There was an error at: " + directory_queue[0])
directory_queue.pop_front()
return scripts
func cache_todos(todos: Array, script_path: String) -> void:
var last_modified_time = FileAccess.get_modified_time(script_path)
todo_cache[script_path] = TodoCacheValue.new(todos, last_modified_time)
func get_cached_todos(script_path: String) -> Array:
if todo_cache.has(script_path):
var cached_value: TodoCacheValue = todo_cache[script_path]
if cached_value.last_modified_time == FileAccess.get_modified_time(script_path):
return cached_value.todos
return []
func get_dir_contents(dir: DirAccess, scripts: Array[String], directory_queue: Array[String]) -> void:
dir.include_navigational = false
dir.include_hidden = false
dir.list_dir_begin()
var file_name : String = dir.get_next()
while file_name != "":
if dir.current_is_dir():
if file_name == ".import" or file_name == ".mono": # Skip .import folder which should never have scripts
pass
else:
directory_queue.append(dir.get_current_dir() + "/" + file_name)
else:
if file_name.ends_with(".gd") or file_name.ends_with(".cs") \
or file_name.ends_with(".c") or file_name.ends_with(".cpp") or file_name.ends_with(".h") \
or ((file_name.ends_with(".tscn") and _dockUI.builtin_enabled)):
if dir.get_current_dir() == "res://":
scripts.append(dir.get_current_dir() + file_name)
else:
scripts.append(dir.get_current_dir() + "/" + file_name)
file_name = dir.get_next()
func rescan_files(clear_cache: bool) -> void:
_dockUI.todo_items.clear()
if clear_cache:
todo_cache.clear()
combined_pattern = combine_patterns(_dockUI.patterns)
find_tokens_from_path(find_scripts())
_dockUI.build_tree()
func combine_patterns(patterns: Array) -> String:
# Case Sensitivity
cased_patterns = []
for pattern in patterns:
if pattern[2] == _dockUI.CASE_INSENSITIVE:
cased_patterns.append(pattern[0].insert(0, "((?i)") + ")")
else:
cased_patterns.append("(" + pattern[0] + ")")
if patterns.size() == 1:
return cased_patterns[0]
else:
var pattern_string := "((\\/\\*)|(#|\\/\\/))\\s*("
for i in range(patterns.size()):
if i == 0:
pattern_string += cased_patterns[i]
else:
pattern_string += "|" + cased_patterns[i]
pattern_string += ")(?(2)[\\s\\S]*?\\*\\/|.*)"
return pattern_string
func create_todo(todo_string: String, script_path: String) -> Todo:
var todo := Todo.new()
var regex = RegEx.new()
for pattern in cased_patterns:
if regex.compile(pattern) == OK:
var result : RegExMatch = regex.search(todo_string)
if result:
todo.pattern = pattern
todo.title = result.strings[0]
else:
continue
else:
printerr("Error compiling " + pattern)
todo.content = todo_string
todo.script_path = script_path
return todo
func _on_active_script_changed(script) -> void:
if _dockUI:
if _dockUI.tabs.current_tab == 1:
_dockUI.build_tree()

View File

@@ -0,0 +1,15 @@
[scripts]
full_path=false
sort_alphabetical=true
script_colour=Color(0.8, 0.807843, 0.827451, 1)
ignore_paths=Array[String]([])
[patterns]
patterns=[["\\bTODO\\b", Color(0.588235, 0.945098, 0.678431, 1), 0], ["\\bHACK\\b", Color(0.835294, 0.737255, 0.439216, 1), 0], ["\\bFIXME\\b", Color(0.835294, 0.439216, 0.439216, 1), 0]]
[config]
auto_refresh=true
builtin_enabled=false

View File

@@ -0,0 +1,18 @@
@tool
extends RefCounted
var script_path : String
var todos : Array
func _init(script_path: String, todos: Array):
self.script_path = script_path
self.todos = todos
func get_short_path() -> String:
var temp_array := script_path.rsplit('/', false, 1)
var short_path : String
if not temp_array.size() > 1:
short_path = "(!)" + temp_array[0]
else:
short_path = temp_array[1]
return short_path

View File

@@ -0,0 +1,9 @@
@tool
extends RefCounted
var pattern : String
var title : String
var content : String
var script_path : String
var line_number : int

View File

@@ -0,0 +1,44 @@
class_name GDLinterIgnore
extends Resource
@export_group("Name Checks")
@export var _function_name: bool = false
@export var _class_name: bool = false
@export var _sub_class_name: bool = false
@export var _signal_name: bool = false
@export var _class_variable_name: bool = false
@export var _class_load_variable_name: bool = false
@export var _function_variable_name: bool = false
@export var _function_preload_variable_name: bool = false
@export var _function_argument_name: bool = false
@export var _loop_variable_name: bool = false
@export var _enum_name: bool = false
@export var _enum_element_name: bool = false
@export var _constant_name: bool = false
@export var _load_constant_name: bool = false
@export_group("Basic Checks")
@export var _duplicated_load: bool = false
@export var _expression_not_assigned: bool = false
@export var _unnecessary_pass: bool = false
@export var _unused_argument: bool = false
@export var _comparison_with_itself: bool = false
@export_group("Class Checks")
@export var _private_method_call: bool = false
@export var _class_definitions_order: bool = false
@export_group("Design Checks")
@export var _max_public_methods: bool = false
@export var _function_arguments_number: bool = false
@export_group("Format Checks")
@export var _max_file_lines: bool = false
@export var _trailing_whitespace: bool = false
@export var _max_line_length: bool = false
@export var _mixed_tabs_and_spaces: bool = false
@export_group("Misc Checks")
@export var _no_elif_return: bool = false
@export var _no_else_return: bool = false

View File

@@ -0,0 +1,35 @@
[gd_resource type="Resource" script_class="GDLinterIgnore" load_steps=2 format=3 uid="uid://6ip8eigu30by"]
[ext_resource type="Script" path="res://addons/gdLinter/Settings/ignore.gd" id="1_8j37n"]
[resource]
script = ExtResource("1_8j37n")
_function_name = false
_class_name = false
_sub_class_name = false
_signal_name = false
_class_variable_name = false
_class_load_variable_name = false
_function_variable_name = false
_function_preload_variable_name = false
_function_argument_name = false
_loop_variable_name = false
_enum_name = false
_enum_element_name = false
_constant_name = false
_load_constant_name = false
_duplicated_load = false
_expression_not_assigned = false
_unnecessary_pass = false
_unused_argument = false
_comparison_with_itself = false
_private_method_call = false
_class_definitions_order = false
_max_public_methods = false
_function_arguments_number = false
_max_file_lines = false
_trailing_whitespace = false
_max_line_length = false
_mixed_tabs_and_spaces = false
_no_elif_return = false
_no_else_return = false

View File

@@ -0,0 +1,39 @@
@tool
extends MarginContainer
var _owner: GDLinterIgnoreWindow = owner
@onready var duplicated_load: CheckBox = %DuplicatedLoad
@onready var expression_not_assigned: CheckBox = %ExpressionNotAssigned
@onready var unnecessary_pass: CheckBox = %UnnecessaryPass
@onready var unused_argument: CheckBox = %UnusedArgument
@onready var comparision_with_itself: CheckBox = %ComparisionWithItself
func init() -> void:
_owner = owner
duplicated_load.button_pressed = _owner.ignore.get("_duplicated_load")
expression_not_assigned.button_pressed = _owner.ignore.get("_expression_not_assigned")
unnecessary_pass.button_pressed = _owner.ignore.get("_unnecessary_pass")
unused_argument.button_pressed = _owner.ignore.get("_unused_argument")
comparision_with_itself.button_pressed = _owner.ignore.get("_comparison_with_itself")
func _on_duplicated_load_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_duplicated_load", toggled_on)
func _on_expression_not_assigned_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_expression_not_assigned", toggled_on)
func _on_unnecessary_pass_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_unnecessary_pass", toggled_on)
func _on_unused_argument_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_unused_argument", toggled_on)
func _on_comparision_with_itself_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_comparison_with_itself", toggled_on)

View File

@@ -0,0 +1,21 @@
@tool
extends MarginContainer
var _owner: GDLinterIgnoreWindow = owner
@onready var private_method_call: CheckBox = %PrivateMethodCall
@onready var class_definition_order: CheckBox = %ClassDefinitionOrder
func init() -> void:
_owner = owner
private_method_call.button_pressed = _owner.ignore.get("_private_method_call")
class_definition_order.button_pressed = _owner.ignore.get("_class_definitions_order")
func _on_private_method_call_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_private_method_call", toggled_on)
func _on_class_definition_order_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_class_definitions_order", toggled_on)

View File

@@ -0,0 +1,21 @@
@tool
extends MarginContainer
var _owner: GDLinterIgnoreWindow = owner
@onready var max_public_methods: CheckBox = %MaxPublicMethods
@onready var function_argument_number: CheckBox = %FunctionArgumentNumber
func init() -> void:
_owner = owner
max_public_methods.button_pressed = _owner.ignore.get("_max_public_methods")
function_argument_number.button_pressed = _owner.ignore.get("_function_arguments_number")
func _on_max_public_methods_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_max_public_methods", toggled_on)
func _on_function_argument_number_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_function_arguments_number", toggled_on)

101
addons/gdLinter/UI/Dock.gd Normal file
View File

@@ -0,0 +1,101 @@
@tool
class_name GDLinterDock
extends Control
var gd_linter: GDLinter
var error_descriptions := preload("res://addons/gdLinter/error_descriptions.gd").new()
var script_text_editor: ScriptEditorBase
var color_error: Color = EditorInterface.get_editor_settings()\
.get_setting("text_editor/theme/highlighting/comment_markers/critical_color")
var num_problems: int = 0
var num_ignored_problems: int = 0
var _ignore: GDLinterIgnore = preload("res://addons/gdLinter/Settings/ignore.tres")
@onready var file: Label = %File
@onready var problems_num: Label = %ProblemsNum
@onready var ignored_problems_num: Label = %IgnoredProblemsNum
@onready var version: Label = %Version
@onready var tree: Tree = %Tree
@onready var gd_linter_ignore_window: GDLinterIgnoreWindow = $GdLinterIgnoreWindow
func _ready() -> void:
gd_linter_ignore_window.ignore = _ignore
gd_linter_ignore_window.dock_ui = self
tree.add_theme_color_override("font_color", color_error)
tree.set_column_title(0, "Line")
tree.set_column_title(1, "Error")
tree.set_column_title_alignment(0, HORIZONTAL_ALIGNMENT_LEFT)
tree.set_column_title_alignment(1, HORIZONTAL_ALIGNMENT_LEFT)
tree.set_column_custom_minimum_width(0, 75)
tree.set_column_custom_minimum_width(1, 0)
tree.set_column_expand(0, false)
tree.set_column_expand(1, true)
tree.set_column_clip_content(0, false)
tree.set_column_clip_content(1, true)
tree.set_column_expand_ratio(0, 4)
tree.item_activated.connect(_on_item_activated)
func reset_problem_num() -> void:
num_problems = 0
num_ignored_problems = 0
func create_item(line: int, name: String) -> void:
var regex = RegEx.new()
regex.compile("(?<=\\()[^\\)]+")
var result := regex.search_all(name)
var error_type := result[-1].strings[0]
if _ignore.get(str_dash_to_underscore(error_type)):
num_ignored_problems += 1
return
var item := tree.create_item()
item.set_text(0, str(line))
item.set_text(1, name)
item.set_metadata(0, line)
if error_descriptions.error.has(error_type):
item.set_tooltip_text(1, error_descriptions.error[error_type])
num_problems += 1
func set_problems_label(number: int) -> void:
problems_num.text = str(number)
func set_ignored_problems_label(number: int) -> void:
ignored_problems_num.text = str(number)
func clear_items() -> void:
reset_problem_num()
tree.clear()
tree.create_item()
func _on_item_activated() -> void:
var selected: TreeItem = tree.get_selected()
var line := selected.get_metadata(0)
EditorInterface.edit_script(load(file.text), line)
if not EditorInterface.get_editor_settings().get("text_editor/external/use_external_editor"):
EditorInterface.set_main_screen_editor("Script")
func str_dash_to_underscore(string: String) -> String:
return "_" + string.replace("-", "_")
func is_error_ignored(name: String) -> bool:
var regex = RegEx.new()
regex.compile("(?<=\\()[^\\)]+")
var result := regex.search_all(name)
var error_type := result[-1].strings[0]
return _ignore.get(str_dash_to_underscore(error_type))
func _on_button_pressed() -> void:
gd_linter_ignore_window.popup()

View File

@@ -0,0 +1,111 @@
[gd_scene load_steps=3 format=3 uid="uid://d1eqlqvotirg1"]
[ext_resource type="Script" path="res://addons/gdLinter/UI/Dock.gd" id="1_u5r3b"]
[ext_resource type="PackedScene" uid="uid://cgk7hjif0ujw1" path="res://addons/gdLinter/UI/GDLinterIgnoreWindow.tscn" id="3_ib5aw"]
[node name="Dock" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_u5r3b")
[node name="VBoxContainer" 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="Header" type="PanelContainer" parent="VBoxContainer"]
layout_mode = 2
[node name="RichTextLabel" type="RichTextLabel" parent="VBoxContainer/Header"]
layout_mode = 2
bbcode_enabled = true
text = "[center]GDLint Plugin 2.0.2[/center]"
fit_content = true
[node name="LintedFile" type="PanelContainer" parent="VBoxContainer"]
layout_mode = 2
[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/LintedFile"]
layout_mode = 2
[node name="Label" type="Label" parent="VBoxContainer/LintedFile/HBoxContainer"]
layout_mode = 2
text = "Currently linted file:"
[node name="File" type="Label" parent="VBoxContainer/LintedFile/HBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
[node name="MiddleContainer" type="HBoxContainer" parent="VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
size_flags_stretch_ratio = 20.0
[node name="Tree" type="Tree" parent="VBoxContainer/MiddleContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
focus_mode = 0
theme_override_colors/font_color = Color(0.77, 0.35, 0.35, 1)
theme_override_constants/v_separation = 0
columns = 2
column_titles_visible = true
hide_folding = true
hide_root = true
select_mode = 1
scroll_horizontal_enabled = false
[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/MiddleContainer"]
layout_mode = 2
[node name="Button" type="Button" parent="VBoxContainer/MiddleContainer/VBoxContainer"]
layout_mode = 2
text = "Ignore
Settings"
[node name="Statusbar" type="HBoxContainer" parent="VBoxContainer"]
layout_mode = 2
size_flags_vertical = 10
[node name="ProblemsContainer" type="HBoxContainer" parent="VBoxContainer/Statusbar"]
layout_mode = 2
theme_override_constants/separation = 0
[node name="ProblemsNum" type="Label" parent="VBoxContainer/Statusbar/ProblemsContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
[node name="ProblemsLbl" type="Label" parent="VBoxContainer/Statusbar/ProblemsContainer"]
layout_mode = 2
text = "problems found"
[node name="VSeparator" type="VSeparator" parent="VBoxContainer/Statusbar/ProblemsContainer"]
layout_mode = 2
[node name="IgnoredProblemsNum" type="Label" parent="VBoxContainer/Statusbar/ProblemsContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "0"
[node name="IgnoredProblemsLbl" type="Label" parent="VBoxContainer/Statusbar/ProblemsContainer"]
layout_mode = 2
text = "problems ignored"
[node name="Version" type="Label" parent="VBoxContainer/Statusbar"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
horizontal_alignment = 2
[node name="GdLinterIgnoreWindow" parent="." instance=ExtResource("3_ib5aw")]
dialog_text = ""
[connection signal="pressed" from="VBoxContainer/MiddleContainer/VBoxContainer/Button" to="." method="_on_button_pressed"]

View File

@@ -0,0 +1,33 @@
@tool
extends MarginContainer
var _owner: GDLinterIgnoreWindow = owner
@onready var max_file_lines: CheckBox = %MaxFileLines
@onready var trailing_whitespace_check_box: CheckBox = %TrailingWhitespaceCheckBox
@onready var max_line_length: CheckBox = %MaxLineLength
@onready var mixed_tabs_and_spaces: CheckBox = %MixedTabsAndSpaces
func init() -> void:
_owner = owner
max_file_lines.button_pressed = _owner.ignore.get("_max_file_lines")
trailing_whitespace_check_box.button_pressed = _owner.ignore.get("_trailing_whitespace")
max_line_length.button_pressed = _owner.ignore.get("_max_line_length")
mixed_tabs_and_spaces.button_pressed = _owner.ignore.get("_mixed_tabs_and_spaces")
func _on_max_file_lines_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_max_file_lines", toggled_on)
func _on_trailing_whitespace_check_box_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_trailing_whitespace", toggled_on)
func _on_max_line_length_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_max_line_length", toggled_on)
func _on_mixed_tabs_and_spaces_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_mixed_tabs_and_spaces", toggled_on)

View File

@@ -0,0 +1,31 @@
@tool
class_name GDLinterIgnoreWindow
extends AcceptDialog
var ignore: GDLinterIgnore
var dock_ui: GDLinterDock
@onready var basic: MarginContainer = %Basic
@onready var design: MarginContainer = %Design
@onready var format: MarginContainer = %Format
@onready var misc: MarginContainer = %Misc
@onready var _name: MarginContainer = %Name
@onready var _class: MarginContainer = %Class
func reapply_linting() -> void:
var current_script := EditorInterface.get_script_editor().get_current_script()
dock_ui.gd_linter.script_editor.editor_script_changed.emit(current_script)
func _on_confirmed() -> void:
reapply_linting()
func _on_about_to_popup() -> void:
basic.init()
design.init()
format.init()
misc.init()
_name.init()
_class.init()

View File

@@ -0,0 +1,261 @@
[gd_scene load_steps=8 format=3 uid="uid://cgk7hjif0ujw1"]
[ext_resource type="Script" path="res://addons/gdLinter/UI/GDLinterIgnoreWindow.gd" id="1_71hhq"]
[ext_resource type="Script" path="res://addons/gdLinter/UI/Name.gd" id="2_35t2j"]
[ext_resource type="Script" path="res://addons/gdLinter/UI/Basic.gd" id="3_ijjp7"]
[ext_resource type="Script" path="res://addons/gdLinter/UI/Class.gd" id="4_s2mg3"]
[ext_resource type="Script" path="res://addons/gdLinter/UI/Design.gd" id="5_2ncqt"]
[ext_resource type="Script" path="res://addons/gdLinter/UI/Format.gd" id="6_5fvrg"]
[ext_resource type="Script" path="res://addons/gdLinter/UI/Misc.gd" id="7_l8gkb"]
[node name="GdLinterIgnoreWindow" type="AcceptDialog"]
disable_3d = true
title = "GDLinter Ignore Settings"
initial_position = 1
size = Vector2i(480, 539)
dialog_text = "fghgfdfggfd"
script = ExtResource("1_71hhq")
[node name="PanelContainer" type="PanelContainer" parent="."]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
offset_left = 8.0
offset_top = 8.0
offset_right = -8.0
offset_bottom = -34.0
grow_horizontal = 2
grow_vertical = 2
[node name="TabContainer" type="TabContainer" parent="PanelContainer"]
layout_mode = 2
[node name="Name" type="MarginContainer" parent="PanelContainer/TabContainer"]
unique_name_in_owner = true
layout_mode = 2
script = ExtResource("2_35t2j")
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/TabContainer/Name"]
layout_mode = 2
[node name="FunctionName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Function Name"
[node name="ClassName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Class Name"
[node name="SubClassName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Sub Class Name"
[node name="SignalName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Signal Name"
[node name="ClassVariableName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Class Variable Name"
[node name="ClassLoadVariableName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Class Load Variable Name"
[node name="FunctionVariableName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Function Variable Name"
[node name="FunctionPreloadVariableName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Function Preload Variable Name"
[node name="FunctionArgumentName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Function Argument Name"
[node name="LoopVariableName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Loop Variable Name"
[node name="EnumName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Enum Name"
[node name="EnumElementName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Enum Element Name"
[node name="ConstantName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Constant Name"
[node name="LoadConstantName" type="CheckBox" parent="PanelContainer/TabContainer/Name/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Load Constant Name"
[node name="Basic" type="MarginContainer" parent="PanelContainer/TabContainer"]
unique_name_in_owner = true
visible = false
layout_mode = 2
script = ExtResource("3_ijjp7")
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/TabContainer/Basic"]
layout_mode = 2
[node name="DuplicatedLoad" type="CheckBox" parent="PanelContainer/TabContainer/Basic/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Duplicated Load"
[node name="ExpressionNotAssigned" type="CheckBox" parent="PanelContainer/TabContainer/Basic/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Expression Not Assigned"
[node name="UnnecessaryPass" type="CheckBox" parent="PanelContainer/TabContainer/Basic/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Unnecessary Pass"
[node name="UnusedArgument" type="CheckBox" parent="PanelContainer/TabContainer/Basic/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Unused Argument"
[node name="ComparisionWithItself" type="CheckBox" parent="PanelContainer/TabContainer/Basic/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Comparision With Itself"
[node name="Class" type="MarginContainer" parent="PanelContainer/TabContainer"]
unique_name_in_owner = true
visible = false
layout_mode = 2
script = ExtResource("4_s2mg3")
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/TabContainer/Class"]
layout_mode = 2
[node name="PrivateMethodCall" type="CheckBox" parent="PanelContainer/TabContainer/Class/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Private Method Call"
[node name="ClassDefinitionOrder" type="CheckBox" parent="PanelContainer/TabContainer/Class/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Class Definition Order"
[node name="Design" type="MarginContainer" parent="PanelContainer/TabContainer"]
unique_name_in_owner = true
visible = false
layout_mode = 2
script = ExtResource("5_2ncqt")
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/TabContainer/Design"]
layout_mode = 2
[node name="MaxPublicMethods" type="CheckBox" parent="PanelContainer/TabContainer/Design/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Max Public Methods"
[node name="FunctionArgumentNumber" type="CheckBox" parent="PanelContainer/TabContainer/Design/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Function Argument Number"
[node name="Format" type="MarginContainer" parent="PanelContainer/TabContainer"]
unique_name_in_owner = true
visible = false
layout_mode = 2
script = ExtResource("6_5fvrg")
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/TabContainer/Format"]
layout_mode = 2
[node name="MaxFileLines" type="CheckBox" parent="PanelContainer/TabContainer/Format/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Max File Lines"
[node name="TrailingWhitespaceCheckBox" type="CheckBox" parent="PanelContainer/TabContainer/Format/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Trailing Whitespace"
[node name="MaxLineLength" type="CheckBox" parent="PanelContainer/TabContainer/Format/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Max Line Length"
[node name="MixedTabsAndSpaces" type="CheckBox" parent="PanelContainer/TabContainer/Format/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "Mixed Tabs And Spaces"
[node name="Misc" type="MarginContainer" parent="PanelContainer/TabContainer"]
unique_name_in_owner = true
visible = false
layout_mode = 2
script = ExtResource("7_l8gkb")
[node name="VBoxContainer" type="VBoxContainer" parent="PanelContainer/TabContainer/Misc"]
layout_mode = 2
[node name="NoElifReturn" type="CheckBox" parent="PanelContainer/TabContainer/Misc/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "No Elif Return"
[node name="NoElseReturn" type="CheckBox" parent="PanelContainer/TabContainer/Misc/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
text = "No Else Return"
[connection signal="about_to_popup" from="." to="." method="_on_about_to_popup"]
[connection signal="confirmed" from="." to="." method="_on_confirmed"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/FunctionName" to="PanelContainer/TabContainer/Name" method="_on_function_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/ClassName" to="PanelContainer/TabContainer/Name" method="_on_class_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/SubClassName" to="PanelContainer/TabContainer/Name" method="_on_sub_class_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/SignalName" to="PanelContainer/TabContainer/Name" method="_on_signal_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/ClassVariableName" to="PanelContainer/TabContainer/Name" method="_on_class_variable_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/ClassLoadVariableName" to="PanelContainer/TabContainer/Name" method="_on_class_load_variable_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/FunctionVariableName" to="PanelContainer/TabContainer/Name" method="_on_function_variable_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/FunctionPreloadVariableName" to="PanelContainer/TabContainer/Name" method="_on_function_preload_variable_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/FunctionArgumentName" to="PanelContainer/TabContainer/Name" method="_on_function_argument_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/LoopVariableName" to="PanelContainer/TabContainer/Name" method="_on_loop_variable_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/EnumName" to="PanelContainer/TabContainer/Name" method="_on_enum_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/EnumElementName" to="PanelContainer/TabContainer/Name" method="_on_enum_element_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/ConstantName" to="PanelContainer/TabContainer/Name" method="_on_constant_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Name/VBoxContainer/LoadConstantName" to="PanelContainer/TabContainer/Name" method="_on_load_constant_name_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Basic/VBoxContainer/DuplicatedLoad" to="PanelContainer/TabContainer/Basic" method="_on_duplicated_load_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Basic/VBoxContainer/ExpressionNotAssigned" to="PanelContainer/TabContainer/Basic" method="_on_expression_not_assigned_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Basic/VBoxContainer/UnnecessaryPass" to="PanelContainer/TabContainer/Basic" method="_on_unnecessary_pass_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Basic/VBoxContainer/UnusedArgument" to="PanelContainer/TabContainer/Basic" method="_on_unused_argument_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Basic/VBoxContainer/ComparisionWithItself" to="PanelContainer/TabContainer/Basic" method="_on_comparision_with_itself_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Class/VBoxContainer/PrivateMethodCall" to="PanelContainer/TabContainer/Class" method="_on_private_method_call_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Class/VBoxContainer/ClassDefinitionOrder" to="PanelContainer/TabContainer/Class" method="_on_class_definition_order_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Design/VBoxContainer/MaxPublicMethods" to="PanelContainer/TabContainer/Design" method="_on_max_public_methods_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Design/VBoxContainer/FunctionArgumentNumber" to="PanelContainer/TabContainer/Design" method="_on_function_argument_number_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Format/VBoxContainer/MaxFileLines" to="PanelContainer/TabContainer/Format" method="_on_max_file_lines_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Format/VBoxContainer/TrailingWhitespaceCheckBox" to="PanelContainer/TabContainer/Format" method="_on_trailing_whitespace_check_box_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Format/VBoxContainer/MaxLineLength" to="PanelContainer/TabContainer/Format" method="_on_max_line_length_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Format/VBoxContainer/MixedTabsAndSpaces" to="PanelContainer/TabContainer/Format" method="_on_mixed_tabs_and_spaces_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Misc/VBoxContainer/NoElifReturn" to="PanelContainer/TabContainer/Misc" method="_on_no_elif_return_toggled"]
[connection signal="toggled" from="PanelContainer/TabContainer/Misc/VBoxContainer/NoElseReturn" to="PanelContainer/TabContainer/Misc" method="_on_no_else_return_toggled"]

View File

@@ -0,0 +1,21 @@
@tool
extends MarginContainer
var _owner: GDLinterIgnoreWindow = owner
@onready var no_elif_return: CheckBox = %NoElifReturn
@onready var no_else_return: CheckBox = %NoElseReturn
func init() -> void:
_owner = owner
no_elif_return.button_pressed = _owner.ignore.get("_no_elif_return")
no_else_return.button_pressed = _owner.ignore.get("_no_else_return")
func _on_no_elif_return_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_no_elif_return", toggled_on)
func _on_no_else_return_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_no_else_return", toggled_on)

View File

@@ -0,0 +1,93 @@
@tool
extends MarginContainer
var _owner: GDLinterIgnoreWindow = owner
@onready var function_name: CheckBox = %FunctionName
@onready var sub_class_name: CheckBox = %SubClassName
@onready var signal_name: CheckBox = %SignalName
@onready var class_variable_name: CheckBox = %ClassVariableName
@onready var class_load_variable_name: CheckBox = %ClassLoadVariableName
@onready var function_variable_name: CheckBox = %FunctionVariableName
@onready var function_preload_variable_name: CheckBox = %FunctionPreloadVariableName
@onready var function_argument_name: CheckBox = %FunctionArgumentName
@onready var loop_variable_name: CheckBox = %LoopVariableName
@onready var enum_name: CheckBox = %EnumName
@onready var enum_element_name: CheckBox = %EnumElementName
@onready var constant_name: CheckBox = %ConstantName
@onready var load_constant_name: CheckBox = %LoadConstantName
@onready var _class_name: CheckBox = %ClassName
func init() -> void:
_owner = owner
function_name.button_pressed = _owner.ignore.get("_function_name")
_class_name.button_pressed = _owner.ignore.get("_class_name")
sub_class_name.button_pressed = _owner.ignore.get("_sub_class_name")
signal_name.button_pressed = _owner.ignore.get("_signal_name")
class_variable_name.button_pressed = _owner.ignore.get("_class_variable_name")
class_load_variable_name.button_pressed = _owner.ignore.get("_class_load_variable_name")
function_variable_name.button_pressed = _owner.ignore.get("_function_variable_name")
function_preload_variable_name.button_pressed = _owner.ignore.get("_function_preload_variable_name")
function_argument_name.button_pressed = _owner.ignore.get("_function_argument_name")
loop_variable_name.button_pressed = _owner.ignore.get("_loop_variable_name")
enum_name.button_pressed = _owner.ignore.get("_enum_name")
enum_element_name.button_pressed = _owner.ignore.get("_enum_element_name")
constant_name.button_pressed = _owner.ignore.get("_constant_name")
load_constant_name.button_pressed = _owner.ignore.get("_load_constant_name")
func _on_function_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_function_name", toggled_on)
func _on_class_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_class_name", toggled_on)
func _on_sub_class_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_sub_class_name", toggled_on)
func _on_signal_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_signal_name", toggled_on)
func _on_class_variable_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_class_variable_name", toggled_on)
func _on_class_load_variable_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_class_load_variable_name", toggled_on)
func _on_function_variable_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_function_variable_name", toggled_on)
func _on_function_preload_variable_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_function_preload_variable_name", toggled_on)
func _on_function_argument_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_function_argument_name", toggled_on)
func _on_loop_variable_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_loop_variable_name", toggled_on)
func _on_enum_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_enum_name", toggled_on)
func _on_enum_element_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_enum_element_name", toggled_on)
func _on_constant_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_constant_name", toggled_on)
func _on_load_constant_name_toggled(toggled_on: bool) -> void:
_owner.ignore.set("_load_constant_name", toggled_on)

View File

@@ -0,0 +1,51 @@
extends Resource
var error := {
#region Name Checks
"function-name": "Validates if function name conforms to snake_case, _private_snake_case, or _on_PascalCase_snake_case.",
"class-name": "Validates if class name conforms to PascalCase.",
"sub-class-name": "Validates if class name conforms to _PrivatePascalCase.",
"signal-name": "Validates if signal name conforms to PascalCase.",
"class-variable-name": "Validates if class variable name conforms to snake_case or _private_snake_case.",
"class-load-variable-name": "Validates if class load variable (var variable = load(...)) name conforms to PascalCase, snake_case or private_snake_case.",
"function-variable-name": "alidates if function variable name conforms to snake_case.",
"function-preload-variable-name": "Validates if function preload variable (var Variable = preload(...)) name conforms to PascalCase.",
"function-argument-name": "Validates if function argument (formal parameter) name conforms to snake_case or _private_snake_case.",
"loop-variable-name": "Validates if loop variable name conforms to snake_case or _private_snake_case.",
"enum-name": "Validates if enum name conforms to PascalCase.",
"enum-element-name": "Validates if enum element name conforms to UPPER_SNAKE_CASE.",
"constant-name": "Validates if constant name conforms to UPPER_SNAKE_CASE.",
"load-constant-name": "Validates if load constant (const constant = load(...)) name conforms to PascalCase, snake_case or private_snake_case.",
#endregion
#region Basic Checks
"duplicated-load": "Copy-pasted load(...) for the same path e.g. load('res://asdf.tscn') in multiple places. To fix, simply extract string to constant.",
"expression-not-assigned": "Standalone expression like 1 + 1 which is not used in any way. To fix, simply remove that expression.",
"unnecessary-pass": "Pass which is not the only expression on class or function body. To fix, simple remove that pass statement.",
"unused-argument": "Unused funtion argument. To fix, simply remove it or mark as explicitly unused by prefixing with underscore _ e.g. _unused_arg.",
"comparison-with-itself": "Redundant comparison like e.g. x == x which is always true. To fix, simply remove that expression.",
#endregion
#region Class Checks
"private-method-call": """private (prefixed with underscore _) function was called.
E.g. player._private_func(). To fix, redesign your approach so that private function is not being called.""",
"class-definitions-order": "Class statements are not in order.",
#endregion
#region Design Checks
"max-public-methods": "Validates maximum number of public methods (class-level functions).",
"function-arguments-number": "Validates number of function arguments.",
#endregion
#region Format Checks
"max-file-lines": "Validates maximum number of file lines.",
"trailing-whitespace": "Validates if any trailing whitespaces are present.",
"max-line-length": "Validates maxium line length for each line.",
"mixed-tabs-and-spaces": "Validates if either only tabs or only spaces are used for indentation.",
#endregion
#region Misc Checks
"no-elif-return": "Validates if unnecessary elif is present in case if body was ended with return.",
"no-else-return": "Validates if unnecessary else is present in case if (and each elif) body was ended with return."
#endregion
}

188
addons/gdLinter/gdLinter.gd Normal file
View File

@@ -0,0 +1,188 @@
@tool
class_name GDLinter
extends EditorPlugin
const DockScene := preload("res://addons/gdLinter/UI/Dock.tscn")
var icon_error := EditorInterface.get_editor_theme().get_icon("Error", "EditorIcons")
var color_error: Color = EditorInterface.get_editor_settings()\
.get_setting("text_editor/theme/highlighting/comment_markers/critical_color")
var icon_error_ignore := EditorInterface.get_editor_theme().get_icon("ErrorWarning", "EditorIcons")
var icon_ignore := EditorInterface.get_editor_theme().get_icon("Warning", "EditorIcons")
var icon_success := EditorInterface.get_editor_theme().get_icon("StatusSuccess", "EditorIcons")
var color_success: Color = EditorInterface.get_editor_settings()\
.get_setting("text_editor/theme/highlighting/comment_markers/notice_color")
var bottom_panel_button: Button
var highlight_lines: PackedInt32Array
var item_lists: Array[ItemList]
var script_editor: ScriptEditor
var _dock_ui: GDLinterDock
var _is_gdlint_installed: bool
var _ignore: Resource
var _gdlint_path: String
func _enter_tree() -> void:
# install the GDLint dock
_dock_ui = DockScene.instantiate()
_dock_ui.gd_linter = self
bottom_panel_button = add_control_to_bottom_panel(_dock_ui, "GDLint")
# connect signal to lint on save
resource_saved.connect(on_resource_saved)
script_editor = EditorInterface.get_script_editor()
script_editor.editor_script_changed.connect(_on_editor_script_changed)
_gdlint_path = get_gdlint_path()
get_gdlint_version()
prints("Loading GDLint Plugin success")
# Dunno how highlighting lines in Godot works, since it get removed after a second or so
# So I use this evil workaround straight from hell:
#func _process(_delta: float) -> void:
#if not get_current_editor():
#return
#
#if not highlight_lines.is_empty():
#set_line_color(color_error)
func _on_editor_script_changed(script: Script) -> void:
_dock_ui.clear_items()
on_resource_saved(script)
func get_gdlint_version() -> void:
var output := []
OS.execute(_gdlint_path, ["--version"], output)
_is_gdlint_installed = true if not output[0].is_empty() else false
if _is_gdlint_installed:
_dock_ui.version.text = "Using %s" % output[0]
else:
_dock_ui.version.text = "gdlint not found!"
func _exit_tree() -> void:
if is_instance_valid(_dock_ui):
remove_control_from_bottom_panel(_dock_ui)
_dock_ui.free()
if Engine.get_version_info().hex >= 0x40201:
prints("Unload GDLint Plugin success")
func on_resource_saved(resource: Resource) -> void:
if not resource is GDScript:
return
_dock_ui.clear_items()
clear_highlights()
# Show resource path in the GDLint Dock
_dock_ui.file.text = resource.resource_path
# Execute linting and get its output
var filepath: String = ProjectSettings.globalize_path(resource.resource_path)
var gdlint_output: Array = []
var output_array: PackedStringArray
var exit_code = OS.execute(_gdlint_path, [filepath], gdlint_output, true)
if not exit_code == -1:
var output_string: String = gdlint_output[0]
output_array = output_string.replace(filepath+":", "Line ").split("\n")
_dock_ui.set_problems_label(_dock_ui.num_problems)
_dock_ui.set_ignored_problems_label(_dock_ui.num_ignored_problems)
# Workaround until unique name bug is fixed
# https://github.com/Scony/godot-gdscript-toolkit/issues/284
# Hope I won't break other stuff with it
if not output_array.size() or output_array[0] == "Line ":
printerr("gdLint Error: ", output_array, "\n File can't be linted!")
return
# When there is no error
if output_array.size() <= 2:
bottom_panel_button.add_theme_constant_override(&"icon_max_width", 8)
bottom_panel_button.icon = icon_success
return
# When errors are found create buttons in the dock
for i in output_array.size()-2:
var regex := RegEx.new()
regex.compile("\\d+")
var result := regex.search(output_array[i])
if result:
var current_line := int(result.strings[0])-1
var error := output_array[i].rsplit(":", true, 1)
if len(error) > 1:
_dock_ui.create_item(current_line+1, error[1])
if _dock_ui.is_error_ignored(error[1]):
continue
highlight_lines.append(current_line)
_dock_ui.set_problems_label(_dock_ui.num_problems)
_dock_ui.set_ignored_problems_label(_dock_ui.num_ignored_problems)
# Error, no Ignore
if _dock_ui.num_problems > 0 and _dock_ui.num_ignored_problems <= 0:
bottom_panel_button.icon = icon_error
# no Error, Ignore
elif _dock_ui.num_problems <= 0 and _dock_ui.num_ignored_problems > 0:
bottom_panel_button.icon = icon_ignore
# Error, Ignore
elif _dock_ui.num_problems > 0 and _dock_ui.num_ignored_problems > 0:
bottom_panel_button.icon = icon_error_ignore
else:
bottom_panel_button.icon = null
_dock_ui.script_text_editor = EditorInterface.get_script_editor().get_current_editor()
func set_line_color(color: Color) -> void:
var current_code_editor := get_current_editor()
if current_code_editor == null:
return
for line: int in highlight_lines:
# Skip line if this one is from the old code editor
if line > current_code_editor.get_line_count()-1:
continue
current_code_editor.set_line_background_color(line,
color.darkened(0.5))
func clear_highlights() -> void:
set_line_color(Color(0, 0, 0, 0))
highlight_lines.clear()
func get_current_editor() -> CodeEdit:
var current_editor := EditorInterface.get_script_editor().get_current_editor()
if current_editor == null:
return
return current_editor.get_base_editor() as CodeEdit
func get_gdlint_path() -> String:
if OS.get_name() == "Windows":
return "gdlint"
# macOS & Linux
var output := []
OS.execute("python3", ["-m", "site", "--user-base"], output)
var python_bin_folder := (output[0] as String).strip_edges().path_join("bin")
if FileAccess.file_exists(python_bin_folder.path_join("gdlint")):
return python_bin_folder.path_join("gdlint")
# Linux dirty hardcoded fallback
if OS.get_name() == "Linux":
if FileAccess.file_exists("/usr/bin/gdlint"):
return "/usr/bin/gdlint"
# Global fallback
return "gdlint"

View File

@@ -0,0 +1,7 @@
[plugin]
name="gdLinter"
description="Runs `gdlint` on save to automatically lint your GDScript as you code."
author="Falli"
version="2.0.2"
script="gdLinter.gd"

BIN
assets/SpaceMono-Bold.ttf Normal file

Binary file not shown.

View File

@@ -0,0 +1,33 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://dmitg6232hytb"
path="res://.godot/imported/SpaceMono-Bold.ttf-a0599d1b2f2dabf2e3ca851caf1baa92.fontdata"
[deps]
source_file="res://assets/SpaceMono-Bold.ttf"
dest_files=["res://.godot/imported/SpaceMono-Bold.ttf-a0599d1b2f2dabf2e3ca851caf1baa92.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

Binary file not shown.

View File

@@ -0,0 +1,33 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://d2edhb701t42t"
path="res://.godot/imported/SpaceMono-BoldItalic.ttf-f7b46e55b1271856b01bb8cddc5a12ab.fontdata"
[deps]
source_file="res://assets/SpaceMono-BoldItalic.ttf"
dest_files=["res://.godot/imported/SpaceMono-BoldItalic.ttf-f7b46e55b1271856b01bb8cddc5a12ab.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

BIN
assets/SpaceMono-Italic.ttf Normal file

Binary file not shown.

View File

@@ -0,0 +1,33 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://cjyu63kdviglf"
path="res://.godot/imported/SpaceMono-Italic.ttf-c3b45ba693c1f9c8acc44c6917acf7a0.fontdata"
[deps]
source_file="res://assets/SpaceMono-Italic.ttf"
dest_files=["res://.godot/imported/SpaceMono-Italic.ttf-c3b45ba693c1f9c8acc44c6917acf7a0.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

Binary file not shown.

View File

@@ -0,0 +1,33 @@
[remap]
importer="font_data_dynamic"
type="FontFile"
uid="uid://cuhtrlqg4s5tw"
path="res://.godot/imported/SpaceMono-Regular.ttf-a0e59f506ad76f27d9c5d7797291715d.fontdata"
[deps]
source_file="res://assets/SpaceMono-Regular.ttf"
dest_files=["res://.godot/imported/SpaceMono-Regular.ttf-a0e59f506ad76f27d9c5d7797291715d.fontdata"]
[params]
Rendering=null
antialiasing=1
generate_mipmaps=false
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
allow_system_fallback=true
force_autohinter=false
hinting=1
subpixel_positioning=1
oversampling=0.0
Fallbacks=null
fallbacks=[]
Compress=null
compress=true
preload=[]
language_support={}
script_support={}
opentype_features={}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 235 KiB

After

Width:  |  Height:  |  Size: 121 KiB

View File

@@ -0,0 +1,14 @@
[gd_resource type="Resource" script_class="BuildingGroup" load_steps=4 format=3 uid="uid://cfeob1arfvw6p"]
[ext_resource type="Script" path="res://data/buildings/building_group.gd" id="1_5u0lh"]
[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_hpowi"]
[sub_resource type="AtlasTexture" id="AtlasTexture_24mqt"]
atlas = ExtResource("1_hpowi")
region = Rect2(1088, 576, 64, 64)
[resource]
script = ExtResource("1_5u0lh")
name = "Advanced"
atlas_texture = SubResource("AtlasTexture_24mqt")
buildings = Array[Resource("res://data/buildings/building.gd")]([])

View File

@@ -0,0 +1,17 @@
[gd_resource type="Resource" script_class="BuildingGroup" load_steps=7 format=3 uid="uid://dqv53okb3evb7"]
[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_p1crr"]
[ext_resource type="Script" path="res://data/buildings/building_group.gd" id="1_xphre"]
[ext_resource type="Resource" uid="uid://d38xgwstvtcm4" path="res://data/buildings/basic/harvester/harvester_building.tres" id="2_5rd2r"]
[ext_resource type="Resource" uid="uid://cta6ngelbwo8b" path="res://data/buildings/basic/warehouse/warehouse_building.tres" id="3_vxs34"]
[ext_resource type="Resource" uid="uid://bibep1rd0jml2" path="res://data/buildings/basic/researcher/researcher_building.tres" id="4_fxdio"]
[sub_resource type="AtlasTexture" id="AtlasTexture_nleix"]
atlas = ExtResource("1_p1crr")
region = Rect2(1024, 576, 64, 64)
[resource]
script = ExtResource("1_xphre")
name = "Basic"
atlas_texture = SubResource("AtlasTexture_nleix")
buildings = Array[Resource("res://data/buildings/building.gd")]([ExtResource("2_5rd2r"), ExtResource("3_vxs34"), ExtResource("4_fxdio")])

View File

@@ -0,0 +1,20 @@
extends Building
var nearest_res
var _distance
var _direction
const CARBON_RESOURCE = preload("res://data/game_resources/carbon/carbon_resource.tres")
const HARVESTER_PARTICLES = preload("res://data/buildings/basic/harvester/harvester_particles.tscn")
func initialize(building: BuildingBase) -> void:
nearest_res = Grid.get_nearest_resource(building.position, CARBON_RESOURCE)
_distance = building.position.distance_to(nearest_res)
_direction = nearest_res.direction_to(building.position)
BuildingManager.add_resource_building(CARBON_RESOURCE, building)
func ready(building: BuildingBase) -> void:
var particles = HARVESTER_PARTICLES.instantiate()
particles.init(_distance, _direction, CARBON_RESOURCE)
particles.position = nearest_res
building.add_sibling(particles)

View File

@@ -0,0 +1,18 @@
[gd_resource type="Resource" load_steps=5 format=3 uid="uid://d38xgwstvtcm4"]
[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_m1sbx"]
[ext_resource type="Script" path="res://data/buildings/basic/harvester/harvester.gd" id="3_fy2m4"]
[ext_resource type="Resource" uid="uid://bpjj0x7jr1k6u" path="res://data/game_resources/carbon/carbon_resource.tres" id="3_xlnq5"]
[sub_resource type="AtlasTexture" id="AtlasTexture_mgt0w"]
atlas = ExtResource("1_m1sbx")
region = Rect2(1088, 128, 64, 64)
[resource]
script = ExtResource("3_fy2m4")
atlas_texture = SubResource("AtlasTexture_mgt0w")
name = "Harvester"
description = "Harvests nearby resources"
cost = {
ExtResource("3_xlnq5"): 100
}

View File

@@ -0,0 +1,37 @@
extends Node2D
var _pickup
var _distance
var _direction
var _emitters: Array[CPUParticles2D] = []
func init(distance: float, direction: Vector2, res: GameResource) -> void:
_distance = distance
_direction = direction
_pickup = res
func _ready() -> void:
if _emitters.size() < 10:
var particles = CPUParticles2D.new()
particles.amount = 8
particles.spread = 8 * (_distance / 128)
particles.material = ParticleProcessMaterial.new()
particles.damping_max = _distance * -2.5
particles.damping_min = _distance * -2.55
particles.gravity = Vector2.ZERO
particles.direction = _direction
particles.initial_velocity_max = _distance * 2.25
particles.initial_velocity_min = _distance * 2.2
particles.lifetime = 1.65
add_child(particles)
_emitters.append(particles)
else:
for i in range(1, _emitters.size()):
_emitters[i].queue_free()
_emitters.resize(1)
ResourceManager.pickup(_pickup)
func _on_particles_timer_timeout() -> void:
_ready()

View File

@@ -0,0 +1,12 @@
[gd_scene load_steps=2 format=3 uid="uid://73dsjfc4imfo"]
[ext_resource type="Script" path="res://data/buildings/basic/harvester/harvester_particles.gd" id="1_td5fv"]
[node name="HarvesterParticles" type="Node2D"]
script = ExtResource("1_td5fv")
[node name="ParticlesTimer" type="Timer" parent="."]
wait_time = 0.5
autostart = true
[connection signal="timeout" from="ParticlesTimer" to="." method="_on_particles_timer_timeout"]

View File

@@ -0,0 +1,10 @@
extends Node
class_name Researcher
const RESEARCH_MENU = preload("res://scene/research_menu.tscn")
func interact(on_interaction_finished: Callable) -> bool:
var build_menu = RESEARCH_MENU.instantiate()
build_menu.research.connect(on_interaction_finished)
add_sibling(build_menu)
return true

View File

@@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://bw3j3vxpsfxst"]
[ext_resource type="Script" path="res://data/buildings/basic/researcher/researcher.gd" id="1_018kr"]
[node name="Researcher" type="Node"]
script = ExtResource("1_018kr")

View File

@@ -0,0 +1,20 @@
[gd_resource type="Resource" script_class="Building" load_steps=6 format=3 uid="uid://bibep1rd0jml2"]
[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_kruad"]
[ext_resource type="Resource" uid="uid://bpjj0x7jr1k6u" path="res://data/game_resources/carbon/carbon_resource.tres" id="2_hybxl"]
[ext_resource type="Script" path="res://data/buildings/building.gd" id="3_pleu3"]
[ext_resource type="PackedScene" uid="uid://bw3j3vxpsfxst" path="res://data/buildings/basic/researcher/researcher.tscn" id="4_sugjm"]
[sub_resource type="AtlasTexture" id="AtlasTexture_n7l2d"]
atlas = ExtResource("1_kruad")
region = Rect2(1024, 128, 64, 64)
[resource]
script = ExtResource("3_pleu3")
atlas_texture = SubResource("AtlasTexture_n7l2d")
name = "Researcher"
description = "Research new buildings and technologies"
cost = {
ExtResource("2_hybxl"): 6000
}
world_scene = ExtResource("4_sugjm")

View File

@@ -0,0 +1,9 @@
extends Building
const CARBON_RESOURCE = preload("res://data/game_resources/carbon/carbon_resource.tres")
func initialize(building: BuildingBase) -> void:
BuildingManager.add_storage_building(CARBON_RESOURCE, building)
func ready(building: BuildingBase) -> void:
pass

View File

@@ -0,0 +1,18 @@
[gd_resource type="Resource" load_steps=5 format=3 uid="uid://cta6ngelbwo8b"]
[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_t8g7q"]
[ext_resource type="Resource" uid="uid://bpjj0x7jr1k6u" path="res://data/game_resources/carbon/carbon_resource.tres" id="2_0uiah"]
[ext_resource type="Script" path="res://data/buildings/basic/warehouse/warehouse.gd" id="3_nvser"]
[sub_resource type="AtlasTexture" id="AtlasTexture_hcas6"]
atlas = ExtResource("1_t8g7q")
region = Rect2(1024, 64, 64, 64)
[resource]
script = ExtResource("3_nvser")
atlas_texture = SubResource("AtlasTexture_hcas6")
name = "Warehouse"
description = "Allows storage of more materials"
cost = {
ExtResource("2_0uiah"): 500
}

View File

@@ -0,0 +1,16 @@
class_name Building
extends Resource
@export var atlas_texture: AtlasTexture
@export var name: String
@export var description: String
@export var cost: Dictionary
@export var world_scene: PackedScene
func initialize(building: BuildingBase) -> void:
pass
func ready(building: BuildingBase) -> void:
pass

View File

@@ -0,0 +1,18 @@
class_name BuildingBase
extends Node2D
var _building_data: Building
var building_data_scene
@onready var sprite_2d: Sprite2D = $Sprite2D
func initialize(data: Building, grid_location: Vector2i) -> void:
_building_data = data
position = Grid.grid_to_world_center(grid_location)
sprite_2d.texture = _building_data.atlas_texture
if _building_data.world_scene:
building_data_scene = _building_data.world_scene.instantiate()
add_child(building_data_scene)
func interact(on_interaction_finished: Callable) -> bool:
return building_data_scene.interact(on_interaction_finished)

View File

@@ -0,0 +1,8 @@
[gd_scene load_steps=2 format=3 uid="uid://kij6k2k1rmxb"]
[ext_resource type="Script" path="res://data/buildings/building_base.gd" id="1_odhat"]
[node name="BuildingBase" type="Node2D"]
script = ExtResource("1_odhat")
[node name="Sprite2D" type="Sprite2D" parent="."]

View File

@@ -0,0 +1,7 @@
extends Resource
class_name BuildingGroup
@export var name: String
@export var atlas_texture: AtlasTexture
@export var buildings: Array[Building]

View File

@@ -0,0 +1,5 @@
extends Resource
class_name BuildingMethods
func ready(building: BuildingBase) -> void:
pass

View File

@@ -0,0 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://7threw5x5tw6"]
[ext_resource type="Script" path="res://data/buildings/building_methods.gd" id="1_ll4rt"]
[node name="BuildingMethods" type="Node2D"]
script = ExtResource("1_ll4rt")

View File

@@ -0,0 +1,14 @@
[gd_resource type="Resource" script_class="Building" load_steps=4 format=3 uid="uid://bgwoy0uh2cpvu"]
[ext_resource type="Resource" uid="uid://bpjj0x7jr1k6u" path="res://data/game_resources/carbon/carbon_resource.tres" id="1_5s38g"]
[ext_resource type="Resource" uid="uid://dr00rd4f42jqe" path="res://data/game_resources/gem/gem_resource.tres" id="2_u1tpw"]
[ext_resource type="Script" path="res://data/buildings/building.gd" id="3_bd7jk"]
[resource]
script = ExtResource("3_bd7jk")
name = "Corruptor"
description = "A building which only functions to spread corruption, and does it well"
cost = {
ExtResource("1_5s38g"): 40,
ExtResource("2_u1tpw"): 20
}

12
data/buildings/hub.tres Normal file
View File

@@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="Building" load_steps=3 format=3 uid="uid://c6vv3hyn5sd7o"]
[ext_resource type="Script" path="res://data/buildings/building.gd" id="1_ssd30"]
[ext_resource type="Resource" uid="uid://bpjj0x7jr1k6u" path="res://data/game_resources/carbon/carbon_resource.tres" id="2_d8jrj"]
[resource]
script = ExtResource("1_ssd30")
name = "Hub"
description = "Main cheap base that corrupts a square"
cost = {
ExtResource("2_d8jrj"): 50
}

View File

@@ -0,0 +1,12 @@
[gd_resource type="Resource" script_class="GameResource" load_steps=3 format=3 uid="uid://bpjj0x7jr1k6u"]
[ext_resource type="Script" path="res://scripts/game_resource.gd" id="1_4maxk"]
[ext_resource type="Resource" uid="uid://bsrqp68lxf2f" path="res://data/game_resources/carbon/spawn_pattern_close.tres" id="2_eyt7m"]
[resource]
script = ExtResource("1_4maxk")
atlas_location = Vector2i(5, 3)
pickup_value = 20
name = "Carbon"
spawn_patterns = Array[Resource("res://scripts/spawn_pattern.gd")]([ExtResource("2_eyt7m")])
storage_max = 2500

View File

@@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="SpawnPattern" load_steps=2 format=3 uid="uid://bsrqp68lxf2f"]
[ext_resource type="Script" path="res://scripts/spawn_pattern.gd" id="1_pksks"]
[resource]
script = ExtResource("1_pksks")
min_distance = 8
max_distance = 20
min_spread = 15
quantity = 4
cluster_size = 12

View File

@@ -0,0 +1,13 @@
[gd_resource type="Resource" script_class="GameResource" load_steps=3 format=3 uid="uid://dr00rd4f42jqe"]
[ext_resource type="Script" path="res://scripts/game_resource.gd" id="1_tfoa4"]
[ext_resource type="Resource" uid="uid://0crnt5nbhhlv" path="res://data/game_resources/gem/spawn_pattern_close.tres" id="2_n3fuo"]
[resource]
script = ExtResource("1_tfoa4")
atlas_location = Vector2i(5, 6)
pickup_value = 10
name = "Gem"
spawn_patterns = Array[Resource("res://scripts/spawn_pattern.gd")]([ExtResource("2_n3fuo")])
storage_max = 0
skills_needed = Array[int]([0])

View File

@@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="SpawnPattern" load_steps=2 format=3 uid="uid://0crnt5nbhhlv"]
[ext_resource type="Script" path="res://scripts/spawn_pattern.gd" id="1_bi4rm"]
[resource]
script = ExtResource("1_bi4rm")
min_distance = 16
max_distance = 40
min_spread = 30
quantity = 4
cluster_size = 6

View File

@@ -0,0 +1,13 @@
[gd_resource type="Resource" script_class="GameResource" load_steps=3 format=3 uid="uid://b7ku6pta1ysby"]
[ext_resource type="Script" path="res://scripts/game_resource.gd" id="1_aftkd"]
[ext_resource type="Resource" uid="uid://dyvae0qmdt180" path="res://data/game_resources/relic/spawn_pattern_scatter.tres" id="2_kgujr"]
[resource]
script = ExtResource("1_aftkd")
atlas_location = Vector2i(0, 8)
pickup_value = 5
name = "Relic"
spawn_patterns = Array[Resource("res://scripts/spawn_pattern.gd")]([ExtResource("2_kgujr")])
storage_max = 100
skills_needed = Array[int]([0])

View File

@@ -0,0 +1,11 @@
[gd_resource type="Resource" script_class="SpawnPattern" load_steps=2 format=3 uid="uid://dyvae0qmdt180"]
[ext_resource type="Script" path="res://scripts/spawn_pattern.gd" id="1_h52k5"]
[resource]
script = ExtResource("1_h52k5")
min_distance = 35
max_distance = 50
min_spread = 10
quantity = 8
cluster_size = 2

View File

@@ -0,0 +1,13 @@
[gd_resource type="Resource" script_class="InteractionBuildBasic" load_steps=4 format=3 uid="uid://kqcdiin4k3jr"]
[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_ce8rd"]
[ext_resource type="Script" path="res://data/interactions/build/basic/interaction_build_basic.gd" id="2_xgp0x"]
[sub_resource type="AtlasTexture" id="AtlasTexture_fxfd2"]
atlas = ExtResource("1_ce8rd")
region = Rect2(1088, 576, 64, 64)
[resource]
script = ExtResource("2_xgp0x")
name = "Advanced"
image = SubResource("AtlasTexture_fxfd2")

View File

@@ -0,0 +1,6 @@
extends Interaction
class_name InteractionBuildAdvanced
func interact_at(pos: Vector2i, root: Node) -> Array[Interaction]:
print("Building at: %s" % pos)
return []

View File

@@ -0,0 +1,13 @@
[gd_resource type="Resource" script_class="InteractionBuildBasic" load_steps=4 format=3 uid="uid://k4dq7122cnu0"]
[ext_resource type="Script" path="res://data/interactions/build/basic/interaction_build_basic.gd" id="1_8f33m"]
[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_qfmuq"]
[sub_resource type="AtlasTexture" id="AtlasTexture_w7o8k"]
atlas = ExtResource("1_qfmuq")
region = Rect2(1024, 576, 64, 64)
[resource]
script = ExtResource("1_8f33m")
name = "Basic"
image = SubResource("AtlasTexture_w7o8k")

View File

@@ -0,0 +1,6 @@
extends Interaction
class_name InteractionBuildBasic
func interact_at(pos: Vector2i, root: Node) -> Array[Interaction]:
print("Building at: %s" % pos)
return []

View File

@@ -0,0 +1,13 @@
[gd_resource type="Resource" script_class="InteractionBuild" load_steps=4 format=3 uid="uid://bo3e2jefukgdy"]
[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_bglkk"]
[ext_resource type="Script" path="res://data/interactions/build/interaction_build.gd" id="2_0g8r2"]
[sub_resource type="AtlasTexture" id="AtlasTexture_f6dt5"]
atlas = ExtResource("1_bglkk")
region = Rect2(960, 512, 64, 64)
[resource]
script = ExtResource("2_0g8r2")
name = "Build"
image = SubResource("AtlasTexture_f6dt5")

View File

@@ -0,0 +1,8 @@
extends Interaction
class_name InteractionBuild
const BUILD_ADVANCED = preload("res://data/interactions/build/advanced/build_advanced.tres")
const BUILD_BASIC = preload("res://data/interactions/build/basic/build_basic.tres")
func interact_at(pos: Vector2i, root: Node) -> Array[Interaction]:
return [BUILD_BASIC, BUILD_ADVANCED]

View File

@@ -0,0 +1,13 @@
[gd_resource type="Resource" script_class="InteractionGather" load_steps=4 format=3 uid="uid://r4evto2nkehg"]
[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_cquks"]
[ext_resource type="Script" path="res://data/interactions/gather/interaction_gather.gd" id="2_4amum"]
[sub_resource type="AtlasTexture" id="AtlasTexture_jjmaq"]
atlas = ExtResource("1_cquks")
region = Rect2(1024, 512, 64, 64)
[resource]
script = ExtResource("2_4amum")
name = "Gather"
image = SubResource("AtlasTexture_jjmaq")

View File

@@ -0,0 +1,24 @@
extends Interaction
class_name InteractionGather
var interaction_display
var _pos
func interact_at(pos: Vector2i, root: Node) -> Array[Interaction]:
_pos = pos
print("Gathering at: %s" % pos)
interaction_display = ProgressBar.new()
interaction_display.position = Grid.grid_to_world_center(_pos) - Vector2(30, 10)
interaction_display.size = Vector2(60, 20)
interaction_display.show_percentage = false
var tween = root.create_tween()
tween.tween_property(interaction_display, "value", 100, 3)
tween.tween_callback(_cleanup_gather)
root.add_child(interaction_display)
return []
func _cleanup_gather() -> void:
interaction_display.queue_free()
var res: GameResource = Grid.get_location_data(_pos).get_resource()
res.gained_resource.emit(res)

View File

@@ -0,0 +1,8 @@
extends Resource
class_name Interaction
@export var name: String
@export var image: AtlasTexture
func interact_at(pos: Vector2i, root: Node) -> Array[Interaction]:
return []

View File

@@ -0,0 +1,18 @@
[gd_resource type="Resource" script_class="Research" load_steps=5 format=3 uid="uid://ddsmk1qmb2ohf"]
[ext_resource type="Texture2D" uid="uid://n806c03hgaq1" path="res://assets/scifi_tilesheet@2.png" id="1_i07ie"]
[ext_resource type="Script" path="res://data/research/research.gd" id="1_swmp6"]
[ext_resource type="Resource" uid="uid://bpjj0x7jr1k6u" path="res://data/game_resources/carbon/carbon_resource.tres" id="2_gc3ag"]
[sub_resource type="AtlasTexture" id="AtlasTexture_1i8g4"]
atlas = ExtResource("1_i07ie")
region = Rect2(320, 384, 64, 64)
[resource]
script = ExtResource("1_swmp6")
atlas_texture = SubResource("AtlasTexture_1i8g4")
name = "Gems"
description = "Allows the gathering of Gems"
cost = {
ExtResource("2_gc3ag"): 10
}

View File

@@ -0,0 +1,8 @@
class_name Research
extends Resource
@export var atlas_texture: AtlasTexture
@export var name: String
@export var description: String
@export var cost: Dictionary
@export var world_scene: PackedScene

View File

@@ -5,146 +5,404 @@
[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_yq8ar"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_yq8ar"]
resource_name = "scifi" resource_name = "scifi"
texture = ExtResource("1_40wcs") texture = ExtResource("1_40wcs")
texture_region_size = Vector2i(128, 128) texture_region_size = Vector2i(64, 64)
0:0/0 = 0 0:0/0 = 0
0:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
0:0/0/physics_layer_0/angular_velocity = 0.0
1:0/next_alternative_id = 2 1:0/next_alternative_id = 2
1:0/0 = 0 1:0/0 = 0
1:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
1:0/0/physics_layer_0/angular_velocity = 0.0
2:0/0 = 0 2:0/0 = 0
2:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
2:0/0/physics_layer_0/angular_velocity = 0.0
3:0/0 = 0 3:0/0 = 0
3:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
3:0/0/physics_layer_0/angular_velocity = 0.0
4:0/0 = 0 4:0/0 = 0
4:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
4:0/0/physics_layer_0/angular_velocity = 0.0
5:0/0 = 0 5:0/0 = 0
5:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
5:0/0/physics_layer_0/angular_velocity = 0.0
6:0/0 = 0 6:0/0 = 0
6:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
6:0/0/physics_layer_0/angular_velocity = 0.0
7:0/0 = 0 7:0/0 = 0
7:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
7:0/0/physics_layer_0/angular_velocity = 0.0
8:0/0 = 0 8:0/0 = 0
8:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
8:0/0/physics_layer_0/angular_velocity = 0.0
9:0/0 = 0 9:0/0 = 0
9:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
9:0/0/physics_layer_0/angular_velocity = 0.0
10:0/0 = 0 10:0/0 = 0
10:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
10:0/0/physics_layer_0/angular_velocity = 0.0
11:0/0 = 0 11:0/0 = 0
11:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
11:0/0/physics_layer_0/angular_velocity = 0.0
12:0/0 = 0 12:0/0 = 0
12:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
12:0/0/physics_layer_0/angular_velocity = 0.0
13:0/0 = 0 13:0/0 = 0
13:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
13:0/0/physics_layer_0/angular_velocity = 0.0
14:0/0 = 0 14:0/0 = 0
14:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
14:0/0/physics_layer_0/angular_velocity = 0.0
15:0/0 = 0 15:0/0 = 0
15:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
15:0/0/physics_layer_0/angular_velocity = 0.0
16:0/0 = 0 16:0/0 = 0
16:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
16:0/0/physics_layer_0/angular_velocity = 0.0
17:0/0 = 0 17:0/0 = 0
17:0/0/physics_layer_0/linear_velocity = Vector2(0, 0)
17:0/0/physics_layer_0/angular_velocity = 0.0
0:1/0 = 0 0:1/0 = 0
0:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
0:1/0/physics_layer_0/angular_velocity = 0.0
1:1/0 = 0 1:1/0 = 0
1:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
1:1/0/physics_layer_0/angular_velocity = 0.0
2:1/0 = 0 2:1/0 = 0
2:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
2:1/0/physics_layer_0/angular_velocity = 0.0
3:1/0 = 0 3:1/0 = 0
3:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
3:1/0/physics_layer_0/angular_velocity = 0.0
4:1/0 = 0 4:1/0 = 0
4:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
4:1/0/physics_layer_0/angular_velocity = 0.0
5:1/0 = 0 5:1/0 = 0
5:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
5:1/0/physics_layer_0/angular_velocity = 0.0
6:1/0 = 0 6:1/0 = 0
6:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
6:1/0/physics_layer_0/angular_velocity = 0.0
7:1/0 = 0 7:1/0 = 0
7:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
7:1/0/physics_layer_0/angular_velocity = 0.0
8:1/0 = 0 8:1/0 = 0
8:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
8:1/0/physics_layer_0/angular_velocity = 0.0
9:1/0 = 0 9:1/0 = 0
9:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
9:1/0/physics_layer_0/angular_velocity = 0.0
10:1/0 = 0 10:1/0 = 0
10:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
10:1/0/physics_layer_0/angular_velocity = 0.0
11:1/0 = 0 11:1/0 = 0
11:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
11:1/0/physics_layer_0/angular_velocity = 0.0
12:1/0 = 0 12:1/0 = 0
12:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
12:1/0/physics_layer_0/angular_velocity = 0.0
13:1/0 = 0 13:1/0 = 0
13:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
13:1/0/physics_layer_0/angular_velocity = 0.0
14:1/0 = 0 14:1/0 = 0
14:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
14:1/0/physics_layer_0/angular_velocity = 0.0
15:1/0 = 0 15:1/0 = 0
15:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
15:1/0/physics_layer_0/angular_velocity = 0.0
16:1/0 = 0 16:1/0 = 0
16:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
16:1/0/physics_layer_0/angular_velocity = 0.0
17:1/0 = 0 17:1/0 = 0
17:1/0/physics_layer_0/linear_velocity = Vector2(0, 0)
17:1/0/physics_layer_0/angular_velocity = 0.0
0:2/0 = 0 0:2/0 = 0
0:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
0:2/0/physics_layer_0/angular_velocity = 0.0
1:2/0 = 0 1:2/0 = 0
1:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
1:2/0/physics_layer_0/angular_velocity = 0.0
2:2/0 = 0 2:2/0 = 0
2:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
2:2/0/physics_layer_0/angular_velocity = 0.0
3:2/0 = 0 3:2/0 = 0
3:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
3:2/0/physics_layer_0/angular_velocity = 0.0
4:2/0 = 0 4:2/0 = 0
4:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
4:2/0/physics_layer_0/angular_velocity = 0.0
5:2/0 = 0 5:2/0 = 0
5:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
5:2/0/physics_layer_0/angular_velocity = 0.0
6:2/0 = 0 6:2/0 = 0
6:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
6:2/0/physics_layer_0/angular_velocity = 0.0
7:2/0 = 0 7:2/0 = 0
7:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
7:2/0/physics_layer_0/angular_velocity = 0.0
8:2/0 = 0 8:2/0 = 0
8:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
8:2/0/physics_layer_0/angular_velocity = 0.0
9:2/0 = 0 9:2/0 = 0
9:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
9:2/0/physics_layer_0/angular_velocity = 0.0
10:2/0 = 0 10:2/0 = 0
10:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
10:2/0/physics_layer_0/angular_velocity = 0.0
11:2/0 = 0 11:2/0 = 0
11:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
11:2/0/physics_layer_0/angular_velocity = 0.0
12:2/0 = 0 12:2/0 = 0
12:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
12:2/0/physics_layer_0/angular_velocity = 0.0
13:2/0 = 0 13:2/0 = 0
13:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
13:2/0/physics_layer_0/angular_velocity = 0.0
14:2/0 = 0 14:2/0 = 0
14:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
14:2/0/physics_layer_0/angular_velocity = 0.0
15:2/0 = 0 15:2/0 = 0
15:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
15:2/0/physics_layer_0/angular_velocity = 0.0
16:2/0 = 0 16:2/0 = 0
16:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
16:2/0/physics_layer_0/angular_velocity = 0.0
17:2/0 = 0 17:2/0 = 0
17:2/0/physics_layer_0/linear_velocity = Vector2(0, 0)
17:2/0/physics_layer_0/angular_velocity = 0.0
0:3/0 = 0 0:3/0 = 0
0:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
0:3/0/physics_layer_0/angular_velocity = 0.0
1:3/0 = 0 1:3/0 = 0
1:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
1:3/0/physics_layer_0/angular_velocity = 0.0
2:3/0 = 0 2:3/0 = 0
2:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
2:3/0/physics_layer_0/angular_velocity = 0.0
3:3/0 = 0 3:3/0 = 0
3:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
3:3/0/physics_layer_0/angular_velocity = 0.0
4:3/0 = 0 4:3/0 = 0
4:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
4:3/0/physics_layer_0/angular_velocity = 0.0
5:3/0 = 0 5:3/0 = 0
5:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
5:3/0/physics_layer_0/angular_velocity = 0.0
5:3/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
6:3/0 = 0 6:3/0 = 0
6:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
6:3/0/physics_layer_0/angular_velocity = 0.0
7:3/0 = 0 7:3/0 = 0
7:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
7:3/0/physics_layer_0/angular_velocity = 0.0
8:3/0 = 0 8:3/0 = 0
8:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
8:3/0/physics_layer_0/angular_velocity = 0.0
9:3/0 = 0 9:3/0 = 0
9:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
9:3/0/physics_layer_0/angular_velocity = 0.0
10:3/0 = 0 10:3/0 = 0
10:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
10:3/0/physics_layer_0/angular_velocity = 0.0
11:3/0 = 0 11:3/0 = 0
11:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
11:3/0/physics_layer_0/angular_velocity = 0.0
12:3/0 = 0 12:3/0 = 0
12:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
12:3/0/physics_layer_0/angular_velocity = 0.0
13:3/0 = 0 13:3/0 = 0
13:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
13:3/0/physics_layer_0/angular_velocity = 0.0
14:3/0 = 0 14:3/0 = 0
14:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
14:3/0/physics_layer_0/angular_velocity = 0.0
15:3/0 = 0 15:3/0 = 0
15:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
15:3/0/physics_layer_0/angular_velocity = 0.0
16:3/0 = 0 16:3/0 = 0
16:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
16:3/0/physics_layer_0/angular_velocity = 0.0
17:3/0 = 0 17:3/0 = 0
17:3/0/physics_layer_0/linear_velocity = Vector2(0, 0)
17:3/0/physics_layer_0/angular_velocity = 0.0
0:4/0 = 0 0:4/0 = 0
0:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
0:4/0/physics_layer_0/angular_velocity = 0.0
1:4/0 = 0 1:4/0 = 0
1:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
1:4/0/physics_layer_0/angular_velocity = 0.0
2:4/0 = 0 2:4/0 = 0
2:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
2:4/0/physics_layer_0/angular_velocity = 0.0
3:4/0 = 0 3:4/0 = 0
3:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
3:4/0/physics_layer_0/angular_velocity = 0.0
4:4/0 = 0 4:4/0 = 0
4:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
4:4/0/physics_layer_0/angular_velocity = 0.0
5:4/0 = 0 5:4/0 = 0
5:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
5:4/0/physics_layer_0/angular_velocity = 0.0
6:4/0 = 0 6:4/0 = 0
6:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
6:4/0/physics_layer_0/angular_velocity = 0.0
7:4/0 = 0 7:4/0 = 0
7:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
7:4/0/physics_layer_0/angular_velocity = 0.0
8:4/0 = 0 8:4/0 = 0
8:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
8:4/0/physics_layer_0/angular_velocity = 0.0
9:4/0 = 0 9:4/0 = 0
9:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
9:4/0/physics_layer_0/angular_velocity = 0.0
10:4/0 = 0 10:4/0 = 0
10:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
10:4/0/physics_layer_0/angular_velocity = 0.0
11:4/0 = 0 11:4/0 = 0
11:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
11:4/0/physics_layer_0/angular_velocity = 0.0
12:4/0 = 0 12:4/0 = 0
12:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
12:4/0/physics_layer_0/angular_velocity = 0.0
13:4/0 = 0 13:4/0 = 0
13:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
13:4/0/physics_layer_0/angular_velocity = 0.0
14:4/0 = 0 14:4/0 = 0
14:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
14:4/0/physics_layer_0/angular_velocity = 0.0
15:4/0 = 0 15:4/0 = 0
15:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
15:4/0/physics_layer_0/angular_velocity = 0.0
16:4/0 = 0 16:4/0 = 0
16:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
16:4/0/physics_layer_0/angular_velocity = 0.0
17:4/0 = 0 17:4/0 = 0
17:4/0/physics_layer_0/linear_velocity = Vector2(0, 0)
17:4/0/physics_layer_0/angular_velocity = 0.0
0:5/0 = 0 0:5/0 = 0
0:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
0:5/0/physics_layer_0/angular_velocity = 0.0
1:5/0 = 0 1:5/0 = 0
1:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
1:5/0/physics_layer_0/angular_velocity = 0.0
2:5/0 = 0 2:5/0 = 0
2:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
2:5/0/physics_layer_0/angular_velocity = 0.0
3:5/0 = 0 3:5/0 = 0
3:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
3:5/0/physics_layer_0/angular_velocity = 0.0
4:5/0 = 0 4:5/0 = 0
4:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
4:5/0/physics_layer_0/angular_velocity = 0.0
5:5/0 = 0 5:5/0 = 0
5:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
5:5/0/physics_layer_0/angular_velocity = 0.0
6:5/0 = 0 6:5/0 = 0
6:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
6:5/0/physics_layer_0/angular_velocity = 0.0
7:5/0 = 0 7:5/0 = 0
7:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
7:5/0/physics_layer_0/angular_velocity = 0.0
8:5/0 = 0 8:5/0 = 0
8:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
8:5/0/physics_layer_0/angular_velocity = 0.0
9:5/0 = 0 9:5/0 = 0
9:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
9:5/0/physics_layer_0/angular_velocity = 0.0
10:5/0 = 0 10:5/0 = 0
10:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
10:5/0/physics_layer_0/angular_velocity = 0.0
11:5/0 = 0 11:5/0 = 0
11:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
11:5/0/physics_layer_0/angular_velocity = 0.0
12:5/0 = 0 12:5/0 = 0
12:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
12:5/0/physics_layer_0/angular_velocity = 0.0
13:5/0 = 0 13:5/0 = 0
13:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
13:5/0/physics_layer_0/angular_velocity = 0.0
14:5/0 = 0 14:5/0 = 0
14:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
14:5/0/physics_layer_0/angular_velocity = 0.0
15:5/0 = 0 15:5/0 = 0
15:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
15:5/0/physics_layer_0/angular_velocity = 0.0
16:5/0 = 0 16:5/0 = 0
16:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
16:5/0/physics_layer_0/angular_velocity = 0.0
17:5/0 = 0 17:5/0 = 0
17:5/0/physics_layer_0/linear_velocity = Vector2(0, 0)
17:5/0/physics_layer_0/angular_velocity = 0.0
0:6/0 = 0 0:6/0 = 0
0:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
0:6/0/physics_layer_0/angular_velocity = 0.0
1:6/0 = 0 1:6/0 = 0
1:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
1:6/0/physics_layer_0/angular_velocity = 0.0
2:6/0 = 0 2:6/0 = 0
2:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
2:6/0/physics_layer_0/angular_velocity = 0.0
3:6/0 = 0 3:6/0 = 0
3:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
3:6/0/physics_layer_0/angular_velocity = 0.0
4:6/0 = 0 4:6/0 = 0
4:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
4:6/0/physics_layer_0/angular_velocity = 0.0
5:6/0 = 0 5:6/0 = 0
5:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
5:6/0/physics_layer_0/angular_velocity = 0.0
5:6/0/physics_layer_0/polygon_0/points = PackedVector2Array(-16, -16, 16, -16, 16, 16, -16, 16)
6:6/0 = 0 6:6/0 = 0
6:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
6:6/0/physics_layer_0/angular_velocity = 0.0
7:6/0 = 0 7:6/0 = 0
7:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
7:6/0/physics_layer_0/angular_velocity = 0.0
10:6/0 = 0 10:6/0 = 0
10:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
10:6/0/physics_layer_0/angular_velocity = 0.0
11:6/0 = 0 11:6/0 = 0
11:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
11:6/0/physics_layer_0/angular_velocity = 0.0
12:6/0 = 0 12:6/0 = 0
12:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
12:6/0/physics_layer_0/angular_velocity = 0.0
13:6/0 = 0 13:6/0 = 0
13:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
13:6/0/physics_layer_0/angular_velocity = 0.0
14:6/0 = 0 14:6/0 = 0
14:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
14:6/0/physics_layer_0/angular_velocity = 0.0
15:6/0 = 0 15:6/0 = 0
15:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
15:6/0/physics_layer_0/angular_velocity = 0.0
16:6/0 = 0 16:6/0 = 0
16:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
16:6/0/physics_layer_0/angular_velocity = 0.0
17:6/0 = 0 17:6/0 = 0
17:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
17:6/0/physics_layer_0/angular_velocity = 0.0
0:7/0 = 0 0:7/0 = 0
0:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
0:7/0/physics_layer_0/angular_velocity = 0.0
4:7/0 = 0 4:7/0 = 0
4:7/0/terrain_set = 0 4:7/0/terrain_set = 0
4:7/0/terrain = 0 4:7/0/terrain = 0
4:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
4:7/0/physics_layer_0/angular_velocity = 0.0
4:7/0/terrains_peering_bit/bottom_side = 0 4:7/0/terrains_peering_bit/bottom_side = 0
5:7/0 = 0 5:7/0 = 0
5:7/0/terrain_set = 0 5:7/0/terrain_set = 0
5:7/0/terrain = 0 5:7/0/terrain = 0
5:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
5:7/0/physics_layer_0/angular_velocity = 0.0
5:7/0/terrains_peering_bit/right_side = 0 5:7/0/terrains_peering_bit/right_side = 0
5:7/0/terrains_peering_bit/bottom_right_corner = 0 5:7/0/terrains_peering_bit/bottom_right_corner = 0
5:7/0/terrains_peering_bit/bottom_side = 0 5:7/0/terrains_peering_bit/bottom_side = 0
6:7/0 = 0 6:7/0 = 0
6:7/0/terrain_set = 0 6:7/0/terrain_set = 0
6:7/0/terrain = 0 6:7/0/terrain = 0
6:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
6:7/0/physics_layer_0/angular_velocity = 0.0
6:7/0/terrains_peering_bit/right_side = 0 6:7/0/terrains_peering_bit/right_side = 0
6:7/0/terrains_peering_bit/bottom_right_corner = 0 6:7/0/terrains_peering_bit/bottom_right_corner = 0
6:7/0/terrains_peering_bit/bottom_side = 0 6:7/0/terrains_peering_bit/bottom_side = 0
@@ -153,12 +411,16 @@ texture_region_size = Vector2i(128, 128)
7:7/0 = 0 7:7/0 = 0
7:7/0/terrain_set = 0 7:7/0/terrain_set = 0
7:7/0/terrain = 0 7:7/0/terrain = 0
7:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
7:7/0/physics_layer_0/angular_velocity = 0.0
7:7/0/terrains_peering_bit/bottom_side = 0 7:7/0/terrains_peering_bit/bottom_side = 0
7:7/0/terrains_peering_bit/bottom_left_corner = 0 7:7/0/terrains_peering_bit/bottom_left_corner = 0
7:7/0/terrains_peering_bit/left_side = 0 7:7/0/terrains_peering_bit/left_side = 0
9:7/0 = 0 9:7/0 = 0
9:7/0/terrain_set = 0 9:7/0/terrain_set = 0
9:7/0/terrain = 0 9:7/0/terrain = 0
9:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
9:7/0/physics_layer_0/angular_velocity = 0.0
9:7/0/terrains_peering_bit/right_side = 0 9:7/0/terrains_peering_bit/right_side = 0
9:7/0/terrains_peering_bit/bottom_side = 0 9:7/0/terrains_peering_bit/bottom_side = 0
9:7/0/terrains_peering_bit/left_side = 0 9:7/0/terrains_peering_bit/left_side = 0
@@ -168,6 +430,8 @@ texture_region_size = Vector2i(128, 128)
10:7/0 = 0 10:7/0 = 0
10:7/0/terrain_set = 0 10:7/0/terrain_set = 0
10:7/0/terrain = 0 10:7/0/terrain = 0
10:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
10:7/0/physics_layer_0/angular_velocity = 0.0
10:7/0/terrains_peering_bit/right_side = 0 10:7/0/terrains_peering_bit/right_side = 0
10:7/0/terrains_peering_bit/bottom_right_corner = 0 10:7/0/terrains_peering_bit/bottom_right_corner = 0
10:7/0/terrains_peering_bit/bottom_side = 0 10:7/0/terrains_peering_bit/bottom_side = 0
@@ -176,24 +440,72 @@ texture_region_size = Vector2i(128, 128)
10:7/0/terrains_peering_bit/top_side = 0 10:7/0/terrains_peering_bit/top_side = 0
10:7/0/terrains_peering_bit/top_right_corner = 0 10:7/0/terrains_peering_bit/top_right_corner = 0
11:7/0 = 0 11:7/0 = 0
11:7/0/terrain_set = 0
11:7/0/terrain = 0
11:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
11:7/0/physics_layer_0/angular_velocity = 0.0
11:7/0/terrains_peering_bit/right_side = 0
11:7/0/terrains_peering_bit/left_side = 0
11:7/0/terrains_peering_bit/top_left_corner = 0
11:7/0/terrains_peering_bit/top_side = 0
12:7/0 = 0 12:7/0 = 0
12:7/0/terrain_set = 0
12:7/0/terrain = 0
12:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
12:7/0/physics_layer_0/angular_velocity = 0.0
12:7/0/terrains_peering_bit/right_side = 0
12:7/0/terrains_peering_bit/left_side = 0
12:7/0/terrains_peering_bit/top_side = 0
12:7/0/terrains_peering_bit/top_right_corner = 0
13:7/0 = 0 13:7/0 = 0
13:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
13:7/0/physics_layer_0/angular_velocity = 0.0
14:7/0 = 0 14:7/0 = 0
14:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
14:7/0/physics_layer_0/angular_velocity = 0.0
15:7/0 = 0 15:7/0 = 0
15:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
15:7/0/physics_layer_0/angular_velocity = 0.0
16:7/0 = 0 16:7/0 = 0
16:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
16:7/0/physics_layer_0/angular_velocity = 0.0
17:7/0 = 0 17:7/0 = 0
17:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
17:7/0/physics_layer_0/angular_velocity = 0.0
0:8/0 = 0 0:8/0 = 0
0:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
0:8/0/physics_layer_0/angular_velocity = 0.0
1:8/0 = 0 1:8/0 = 0
1:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
1:8/0/physics_layer_0/angular_velocity = 0.0
2:8/0 = 0 2:8/0 = 0
2:8/0/terrain_set = 0
2:8/0/terrain = 0
2:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
2:8/0/physics_layer_0/angular_velocity = 0.0
2:8/0/terrains_peering_bit/right_side = 0
2:8/0/terrains_peering_bit/bottom_side = 0
2:8/0/terrains_peering_bit/top_side = 0
3:8/0 = 0 3:8/0 = 0
3:8/0/terrain_set = 0
3:8/0/terrain = 0
3:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
3:8/0/physics_layer_0/angular_velocity = 0.0
3:8/0/terrains_peering_bit/bottom_side = 0
3:8/0/terrains_peering_bit/left_side = 0
3:8/0/terrains_peering_bit/top_side = 0
4:8/0 = 0 4:8/0 = 0
4:8/0/terrain_set = 0 4:8/0/terrain_set = 0
4:8/0/terrain = 0 4:8/0/terrain = 0
4:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
4:8/0/physics_layer_0/angular_velocity = 0.0
4:8/0/terrains_peering_bit/bottom_side = 0 4:8/0/terrains_peering_bit/bottom_side = 0
4:8/0/terrains_peering_bit/top_side = 0 4:8/0/terrains_peering_bit/top_side = 0
5:8/0 = 0 5:8/0 = 0
5:8/0/terrain_set = 0 5:8/0/terrain_set = 0
5:8/0/terrain = 0 5:8/0/terrain = 0
5:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
5:8/0/physics_layer_0/angular_velocity = 0.0
5:8/0/terrains_peering_bit/right_side = 0 5:8/0/terrains_peering_bit/right_side = 0
5:8/0/terrains_peering_bit/bottom_right_corner = 0 5:8/0/terrains_peering_bit/bottom_right_corner = 0
5:8/0/terrains_peering_bit/bottom_side = 0 5:8/0/terrains_peering_bit/bottom_side = 0
@@ -202,6 +514,8 @@ texture_region_size = Vector2i(128, 128)
6:8/0 = 0 6:8/0 = 0
6:8/0/terrain_set = 0 6:8/0/terrain_set = 0
6:8/0/terrain = 0 6:8/0/terrain = 0
6:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
6:8/0/physics_layer_0/angular_velocity = 0.0
6:8/0/terrains_peering_bit/right_side = 0 6:8/0/terrains_peering_bit/right_side = 0
6:8/0/terrains_peering_bit/bottom_right_corner = 0 6:8/0/terrains_peering_bit/bottom_right_corner = 0
6:8/0/terrains_peering_bit/bottom_side = 0 6:8/0/terrains_peering_bit/bottom_side = 0
@@ -213,6 +527,8 @@ texture_region_size = Vector2i(128, 128)
7:8/0 = 0 7:8/0 = 0
7:8/0/terrain_set = 0 7:8/0/terrain_set = 0
7:8/0/terrain = 0 7:8/0/terrain = 0
7:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
7:8/0/physics_layer_0/angular_velocity = 0.0
7:8/0/terrains_peering_bit/bottom_side = 0 7:8/0/terrains_peering_bit/bottom_side = 0
7:8/0/terrains_peering_bit/bottom_left_corner = 0 7:8/0/terrains_peering_bit/bottom_left_corner = 0
7:8/0/terrains_peering_bit/left_side = 0 7:8/0/terrains_peering_bit/left_side = 0
@@ -221,6 +537,8 @@ texture_region_size = Vector2i(128, 128)
8:8/0 = 0 8:8/0 = 0
8:8/0/terrain_set = 0 8:8/0/terrain_set = 0
8:8/0/terrain = 0 8:8/0/terrain = 0
8:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
8:8/0/physics_layer_0/angular_velocity = 0.0
8:8/0/terrains_peering_bit/right_side = 0 8:8/0/terrains_peering_bit/right_side = 0
8:8/0/terrains_peering_bit/bottom_side = 0 8:8/0/terrains_peering_bit/bottom_side = 0
8:8/0/terrains_peering_bit/bottom_left_corner = 0 8:8/0/terrains_peering_bit/bottom_left_corner = 0
@@ -230,6 +548,8 @@ texture_region_size = Vector2i(128, 128)
9:8/0 = 0 9:8/0 = 0
9:8/0/terrain_set = 0 9:8/0/terrain_set = 0
9:8/0/terrain = 0 9:8/0/terrain = 0
9:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
9:8/0/physics_layer_0/angular_velocity = 0.0
9:8/0/terrains_peering_bit/right_side = 0 9:8/0/terrains_peering_bit/right_side = 0
9:8/0/terrains_peering_bit/bottom_side = 0 9:8/0/terrains_peering_bit/bottom_side = 0
9:8/0/terrains_peering_bit/left_side = 0 9:8/0/terrains_peering_bit/left_side = 0
@@ -237,6 +557,8 @@ texture_region_size = Vector2i(128, 128)
10:8/0 = 0 10:8/0 = 0
10:8/0/terrain_set = 0 10:8/0/terrain_set = 0
10:8/0/terrain = 0 10:8/0/terrain = 0
10:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
10:8/0/physics_layer_0/angular_velocity = 0.0
10:8/0/terrains_peering_bit/right_side = 0 10:8/0/terrains_peering_bit/right_side = 0
10:8/0/terrains_peering_bit/bottom_right_corner = 0 10:8/0/terrains_peering_bit/bottom_right_corner = 0
10:8/0/terrains_peering_bit/bottom_side = 0 10:8/0/terrains_peering_bit/bottom_side = 0
@@ -244,29 +566,79 @@ texture_region_size = Vector2i(128, 128)
10:8/0/terrains_peering_bit/top_side = 0 10:8/0/terrains_peering_bit/top_side = 0
10:8/0/terrains_peering_bit/top_right_corner = 0 10:8/0/terrains_peering_bit/top_right_corner = 0
11:8/0 = 0 11:8/0 = 0
11:8/0/terrain_set = 0
11:8/0/terrain = 0
11:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
11:8/0/physics_layer_0/angular_velocity = 0.0
11:8/0/terrains_peering_bit/bottom_side = 0
11:8/0/terrains_peering_bit/left_side = 0
11:8/0/terrains_peering_bit/top_left_corner = 0
11:8/0/terrains_peering_bit/top_side = 0
12:8/0 = 0 12:8/0 = 0
12:8/0/terrain_set = 0
12:8/0/terrain = 0
12:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
12:8/0/physics_layer_0/angular_velocity = 0.0
12:8/0/terrains_peering_bit/bottom_side = 0
12:8/0/terrains_peering_bit/bottom_left_corner = 0
12:8/0/terrains_peering_bit/left_side = 0
12:8/0/terrains_peering_bit/top_side = 0
13:8/0 = 0 13:8/0 = 0
13:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
13:8/0/physics_layer_0/angular_velocity = 0.0
14:8/0 = 0 14:8/0 = 0
14:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
14:8/0/physics_layer_0/angular_velocity = 0.0
15:8/0 = 0 15:8/0 = 0
15:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
15:8/0/physics_layer_0/angular_velocity = 0.0
16:8/0 = 0 16:8/0 = 0
16:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
16:8/0/physics_layer_0/angular_velocity = 0.0
17:8/0 = 0 17:8/0 = 0
17:8/0/physics_layer_0/linear_velocity = Vector2(0, 0)
17:8/0/physics_layer_0/angular_velocity = 0.0
0:9/0 = 0 0:9/0 = 0
0:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
0:9/0/physics_layer_0/angular_velocity = 0.0
1:9/0 = 0 1:9/0 = 0
1:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
1:9/0/physics_layer_0/angular_velocity = 0.0
2:9/0 = 0 2:9/0 = 0
2:9/0/terrain_set = 0
2:9/0/terrain = 0
2:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
2:9/0/physics_layer_0/angular_velocity = 0.0
2:9/0/terrains_peering_bit/right_side = 0
2:9/0/terrains_peering_bit/left_side = 0
2:9/0/terrains_peering_bit/top_side = 0
3:9/0 = 0 3:9/0 = 0
3:9/0/terrain_set = 0
3:9/0/terrain = 0
3:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
3:9/0/physics_layer_0/angular_velocity = 0.0
3:9/0/terrains_peering_bit/right_side = 0
3:9/0/terrains_peering_bit/bottom_side = 0
3:9/0/terrains_peering_bit/left_side = 0
4:9/0 = 0 4:9/0 = 0
4:9/0/terrain_set = 0 4:9/0/terrain_set = 0
4:9/0/terrain = 0 4:9/0/terrain = 0
4:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
4:9/0/physics_layer_0/angular_velocity = 0.0
4:9/0/terrains_peering_bit/top_side = 0 4:9/0/terrains_peering_bit/top_side = 0
5:9/0 = 0 5:9/0 = 0
5:9/0/terrain_set = 0 5:9/0/terrain_set = 0
5:9/0/terrain = 0 5:9/0/terrain = 0
5:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
5:9/0/physics_layer_0/angular_velocity = 0.0
5:9/0/terrains_peering_bit/right_side = 0 5:9/0/terrains_peering_bit/right_side = 0
5:9/0/terrains_peering_bit/top_side = 0 5:9/0/terrains_peering_bit/top_side = 0
5:9/0/terrains_peering_bit/top_right_corner = 0 5:9/0/terrains_peering_bit/top_right_corner = 0
6:9/0 = 0 6:9/0 = 0
6:9/0/terrain_set = 0 6:9/0/terrain_set = 0
6:9/0/terrain = 0 6:9/0/terrain = 0
6:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
6:9/0/physics_layer_0/angular_velocity = 0.0
6:9/0/terrains_peering_bit/right_side = 0 6:9/0/terrains_peering_bit/right_side = 0
6:9/0/terrains_peering_bit/left_side = 0 6:9/0/terrains_peering_bit/left_side = 0
6:9/0/terrains_peering_bit/top_left_corner = 0 6:9/0/terrains_peering_bit/top_left_corner = 0
@@ -275,12 +647,16 @@ texture_region_size = Vector2i(128, 128)
7:9/0 = 0 7:9/0 = 0
7:9/0/terrain_set = 0 7:9/0/terrain_set = 0
7:9/0/terrain = 0 7:9/0/terrain = 0
7:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
7:9/0/physics_layer_0/angular_velocity = 0.0
7:9/0/terrains_peering_bit/left_side = 0 7:9/0/terrains_peering_bit/left_side = 0
7:9/0/terrains_peering_bit/top_left_corner = 0 7:9/0/terrains_peering_bit/top_left_corner = 0
7:9/0/terrains_peering_bit/top_side = 0 7:9/0/terrains_peering_bit/top_side = 0
8:9/0 = 0 8:9/0 = 0
8:9/0/terrain_set = 0 8:9/0/terrain_set = 0
8:9/0/terrain = 0 8:9/0/terrain = 0
8:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
8:9/0/physics_layer_0/angular_velocity = 0.0
8:9/0/terrains_peering_bit/right_side = 0 8:9/0/terrains_peering_bit/right_side = 0
8:9/0/terrains_peering_bit/bottom_right_corner = 0 8:9/0/terrains_peering_bit/bottom_right_corner = 0
8:9/0/terrains_peering_bit/bottom_side = 0 8:9/0/terrains_peering_bit/bottom_side = 0
@@ -291,6 +667,8 @@ texture_region_size = Vector2i(128, 128)
9:9/0 = 0 9:9/0 = 0
9:9/0/terrain_set = 0 9:9/0/terrain_set = 0
9:9/0/terrain = 0 9:9/0/terrain = 0
9:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
9:9/0/physics_layer_0/angular_velocity = 0.0
9:9/0/terrains_peering_bit/right_side = 0 9:9/0/terrains_peering_bit/right_side = 0
9:9/0/terrains_peering_bit/bottom_right_corner = 0 9:9/0/terrains_peering_bit/bottom_right_corner = 0
9:9/0/terrains_peering_bit/bottom_side = 0 9:9/0/terrains_peering_bit/bottom_side = 0
@@ -300,6 +678,8 @@ texture_region_size = Vector2i(128, 128)
10:9/0 = 0 10:9/0 = 0
10:9/0/terrain_set = 0 10:9/0/terrain_set = 0
10:9/0/terrain = 0 10:9/0/terrain = 0
10:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
10:9/0/physics_layer_0/angular_velocity = 0.0
10:9/0/terrains_peering_bit/right_side = 0 10:9/0/terrains_peering_bit/right_side = 0
10:9/0/terrains_peering_bit/bottom_right_corner = 0 10:9/0/terrains_peering_bit/bottom_right_corner = 0
10:9/0/terrains_peering_bit/bottom_side = 0 10:9/0/terrains_peering_bit/bottom_side = 0
@@ -308,50 +688,136 @@ texture_region_size = Vector2i(128, 128)
10:9/0/terrains_peering_bit/top_side = 0 10:9/0/terrains_peering_bit/top_side = 0
10:9/0/terrains_peering_bit/top_right_corner = 0 10:9/0/terrains_peering_bit/top_right_corner = 0
11:9/0 = 0 11:9/0 = 0
11:9/0/terrain_set = 0
11:9/0/terrain = 0
11:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
11:9/0/physics_layer_0/angular_velocity = 0.0
11:9/0/terrains_peering_bit/right_side = 0
11:9/0/terrains_peering_bit/bottom_right_corner = 0
11:9/0/terrains_peering_bit/bottom_side = 0
11:9/0/terrains_peering_bit/top_side = 0
12:9/0 = 0 12:9/0 = 0
12:9/0/terrain_set = 0
12:9/0/terrain = 0
12:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
12:9/0/physics_layer_0/angular_velocity = 0.0
12:9/0/terrains_peering_bit/right_side = 0
12:9/0/terrains_peering_bit/bottom_side = 0
12:9/0/terrains_peering_bit/top_side = 0
12:9/0/terrains_peering_bit/top_right_corner = 0
13:9/0 = 0 13:9/0 = 0
13:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
13:9/0/physics_layer_0/angular_velocity = 0.0
14:9/0 = 0 14:9/0 = 0
14:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
14:9/0/physics_layer_0/angular_velocity = 0.0
15:9/0 = 0 15:9/0 = 0
15:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
15:9/0/physics_layer_0/angular_velocity = 0.0
16:9/0 = 0 16:9/0 = 0
16:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
16:9/0/physics_layer_0/angular_velocity = 0.0
17:9/0 = 0 17:9/0 = 0
17:9/0/physics_layer_0/linear_velocity = Vector2(0, 0)
17:9/0/physics_layer_0/angular_velocity = 0.0
0:10/0 = 0 0:10/0 = 0
0:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
0:10/0/physics_layer_0/angular_velocity = 0.0
1:10/0 = 0 1:10/0 = 0
1:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
1:10/0/physics_layer_0/angular_velocity = 0.0
2:10/0 = 0 2:10/0 = 0
2:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
2:10/0/physics_layer_0/angular_velocity = 0.0
3:10/0 = 0 3:10/0 = 0
3:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
3:10/0/physics_layer_0/angular_velocity = 0.0
4:10/0 = 0 4:10/0 = 0
4:10/0/terrain_set = 0 4:10/0/terrain_set = 0
4:10/0/terrain = 0 4:10/0/terrain = 0
4:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
4:10/0/physics_layer_0/angular_velocity = 0.0
5:10/0 = 0 5:10/0 = 0
5:10/0/terrain_set = 0 5:10/0/terrain_set = 0
5:10/0/terrain = 0 5:10/0/terrain = 0
5:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
5:10/0/physics_layer_0/angular_velocity = 0.0
5:10/0/terrains_peering_bit/right_side = 0 5:10/0/terrains_peering_bit/right_side = 0
6:10/0 = 0 6:10/0 = 0
6:10/0/terrain_set = 0 6:10/0/terrain_set = 0
6:10/0/terrain = 0 6:10/0/terrain = 0
6:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
6:10/0/physics_layer_0/angular_velocity = 0.0
6:10/0/terrains_peering_bit/right_side = 0 6:10/0/terrains_peering_bit/right_side = 0
6:10/0/terrains_peering_bit/left_side = 0 6:10/0/terrains_peering_bit/left_side = 0
7:10/0 = 0 7:10/0 = 0
7:10/0/terrain_set = 0 7:10/0/terrain_set = 0
7:10/0/terrain = 0 7:10/0/terrain = 0
7:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
7:10/0/physics_layer_0/angular_velocity = 0.0
7:10/0/terrains_peering_bit/left_side = 0 7:10/0/terrains_peering_bit/left_side = 0
8:10/0 = 0 8:10/0 = 0
8:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
8:10/0/physics_layer_0/angular_velocity = 0.0
9:10/0 = 0 9:10/0 = 0
9:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
9:10/0/physics_layer_0/angular_velocity = 0.0
10:10/0 = 0 10:10/0 = 0
10:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
10:10/0/physics_layer_0/angular_velocity = 0.0
11:10/0 = 0 11:10/0 = 0
11:10/0/terrain_set = 0
11:10/0/terrain = 0
11:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
11:10/0/physics_layer_0/angular_velocity = 0.0
11:10/0/terrains_peering_bit/right_side = 0
11:10/0/terrains_peering_bit/bottom_side = 0
11:10/0/terrains_peering_bit/bottom_left_corner = 0
11:10/0/terrains_peering_bit/left_side = 0
12:10/0 = 0 12:10/0 = 0
12:10/0/terrain_set = 0
12:10/0/terrain = 0
12:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
12:10/0/physics_layer_0/angular_velocity = 0.0
12:10/0/terrains_peering_bit/right_side = 0
12:10/0/terrains_peering_bit/bottom_right_corner = 0
12:10/0/terrains_peering_bit/bottom_side = 0
12:10/0/terrains_peering_bit/left_side = 0
13:10/0 = 0 13:10/0 = 0
13:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
13:10/0/physics_layer_0/angular_velocity = 0.0
14:10/0 = 0 14:10/0 = 0
14:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
14:10/0/physics_layer_0/angular_velocity = 0.0
15:10/0 = 0 15:10/0 = 0
15:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
15:10/0/physics_layer_0/angular_velocity = 0.0
16:10/0 = 0 16:10/0 = 0
16:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
16:10/0/physics_layer_0/angular_velocity = 0.0
17:10/0 = 0 17:10/0 = 0
17:10/0/physics_layer_0/linear_velocity = Vector2(0, 0)
17:10/0/physics_layer_0/angular_velocity = 0.0
8:6/0 = 0 8:6/0 = 0
8:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
8:6/0/physics_layer_0/angular_velocity = 0.0
9:6/0 = 0 9:6/0 = 0
9:6/0/physics_layer_0/linear_velocity = Vector2(0, 0)
9:6/0/physics_layer_0/angular_velocity = 0.0
1:7/0 = 0 1:7/0 = 0
1:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
1:7/0/physics_layer_0/angular_velocity = 0.0
2:7/0 = 0 2:7/0 = 0
2:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
2:7/0/physics_layer_0/angular_velocity = 0.0
3:7/0 = 0 3:7/0 = 0
3:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
3:7/0/physics_layer_0/angular_velocity = 0.0
8:7/0 = 0 8:7/0 = 0
8:7/0/terrain_set = 0 8:7/0/terrain_set = 0
8:7/0/terrain = 0 8:7/0/terrain = 0
8:7/0/physics_layer_0/linear_velocity = Vector2(0, 0)
8:7/0/physics_layer_0/angular_velocity = 0.0
8:7/0/terrains_peering_bit/right_side = 0 8:7/0/terrains_peering_bit/right_side = 0
8:7/0/terrains_peering_bit/bottom_side = 0 8:7/0/terrains_peering_bit/bottom_side = 0
8:7/0/terrains_peering_bit/bottom_left_corner = 0 8:7/0/terrains_peering_bit/bottom_left_corner = 0
@@ -361,7 +827,9 @@ texture_region_size = Vector2i(128, 128)
8:7/0/terrains_peering_bit/top_right_corner = 0 8:7/0/terrains_peering_bit/top_right_corner = 0
[resource] [resource]
tile_size = Vector2i(128, 128) tile_size = Vector2i(64, 64)
physics_layer_0/collision_layer = 1
physics_layer_0/collision_mask = 0
terrain_set_0/mode = 0 terrain_set_0/mode = 0
terrain_set_0/terrain_0/name = "corruption" terrain_set_0/terrain_0/name = "corruption"
terrain_set_0/terrain_0/color = Color(0.368627, 0.411765, 0.129412, 1) terrain_set_0/terrain_0/color = Color(0.368627, 0.411765, 0.129412, 1)

6
data/world_theme.tres Normal file
View File

@@ -0,0 +1,6 @@
[gd_resource type="Theme" load_steps=2 format=3 uid="uid://dcpugcgqnnf17"]
[ext_resource type="FontFile" uid="uid://cuhtrlqg4s5tw" path="res://assets/SpaceMono-Regular.ttf" id="1_suqxc"]
[resource]
Label/fonts/font = ExtResource("1_suqxc")

View File

@@ -10,7 +10,124 @@ config_version=5
[application] [application]
config/name="Corupture" config/name="Corrupture"
run/main_scene="res://scene/world.tscn" run/main_scene="res://scene/world.tscn"
config/features=PackedStringArray("4.2", "Forward Plus") config/features=PackedStringArray("4.2", "Forward Plus")
config/icon="res://icon.svg" config/icon="res://icon.svg"
[autoload]
Grid="*res://scripts/autoloads/grid.gd"
ResourceManager="*res://scripts/autoloads/resource_manager.gd"
BuildingManager="*res://scripts/autoloads/building_manager.gd"
[debug]
gdscript/warnings/untyped_declaration=1
[editor_plugins]
enabled=PackedStringArray("res://addons/Todo_Manager/plugin.cfg", "res://addons/gdLinter/plugin.cfg")
[gui]
theme/custom="res://data/world_theme.tres"
[input]
ui_left={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null)
]
}
ui_right={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null)
]
}
ui_up={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null)
]
}
ui_down={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null)
]
}
view_right={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":1.0,"script":null)
]
}
view_left={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":-1.0,"script":null)
]
}
view_up={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":-1.0,"script":null)
]
}
view_down={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":3,"axis_value":1.0,"script":null)
]
}
move_left={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null)
]
}
move_right={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null)
]
}
move_up={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null)
]
}
move_down={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null)
]
}
interact={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"key_label":0,"unicode":101,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":false,"script":null)
]
}
build={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":66,"key_label":0,"unicode":98,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":3,"pressure":0.0,"pressed":false,"script":null)
]
}
[rendering]
textures/canvas_textures/default_texture_filter=0

View File

@@ -1,9 +1,9 @@
[gd_scene load_steps=2 format=3 uid="uid://bbsaqy4xm1ldf"] [gd_scene load_steps=2 format=3 uid="uid://bbsaqy4xm1ldf"]
[ext_resource type="Script" path="res://scripts/Base.gd" id="1_0nxag"] [ext_resource type="Script" path="res://scripts/base.gd" id="1_5hpho"]
[node name="Base" type="Node2D"] [node name="Base" type="Node2D"]
script = ExtResource("1_0nxag") script = ExtResource("1_5hpho")
[node name="ExpandTimer" type="Timer" parent="."] [node name="ExpandTimer" type="Timer" parent="."]
autostart = true autostart = true

90
scene/build_menu.tscn Normal file
View File

@@ -0,0 +1,90 @@
[gd_scene load_steps=3 format=3 uid="uid://cym5p3olst2nc"]
[ext_resource type="Script" path="res://scripts/build_menu.gd" id="1_v2c78"]
[sub_resource type="Theme" id="Theme_0djom"]
[node name="BuildMenu" type="CanvasLayer"]
script = ExtResource("1_v2c78")
[node name="MarginContainer" type="MarginContainer" parent="."]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
theme_override_constants/margin_left = 128
theme_override_constants/margin_top = 128
theme_override_constants/margin_right = 128
theme_override_constants/margin_bottom = 128
[node name="PanelContainer" type="PanelContainer" parent="MarginContainer"]
layout_mode = 2
theme = SubResource("Theme_0djom")
[node name="HBoxContainer" type="HBoxContainer" parent="MarginContainer/PanelContainer"]
layout_mode = 2
[node name="ScrollContainer" type="ScrollContainer" parent="MarginContainer/PanelContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/PanelContainer/HBoxContainer/ScrollContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="BuildingGroups" type="ItemList" parent="MarginContainer/PanelContainer/HBoxContainer/ScrollContainer/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
allow_search = false
auto_height = true
[node name="ScrollContainer2" type="ScrollContainer" parent="MarginContainer/PanelContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
[node name="VBoxContainer" type="VBoxContainer" parent="MarginContainer/PanelContainer/HBoxContainer/ScrollContainer2"]
layout_mode = 2
size_flags_horizontal = 3
[node name="Buildings" type="ItemList" parent="MarginContainer/PanelContainer/HBoxContainer/ScrollContainer2/VBoxContainer"]
layout_mode = 2
size_flags_vertical = 3
auto_height = true
[node name="DetailsContainer" type="VBoxContainer" parent="MarginContainer/PanelContainer/HBoxContainer"]
layout_mode = 2
size_flags_horizontal = 3
size_flags_stretch_ratio = 3.0
[node name="Title" type="Label" parent="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer"]
layout_mode = 2
text = "Select a building"
horizontal_alignment = 1
[node name="HSeparator" type="HSeparator" parent="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer"]
layout_mode = 2
[node name="Description" type="Label" parent="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer"]
visible = false
layout_mode = 2
text = " "
[node name="BuildMaterials" type="GridContainer" parent="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer"]
visible = false
layout_mode = 2
columns = 2
[node name="BuildButtonsContainer" type="HBoxContainer" parent="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer"]
visible = false
layout_mode = 2
alignment = 1
[node name="BuildButton" type="Button" parent="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer/BuildButtonsContainer"]
layout_mode = 2
text = "Build
"
[connection signal="item_selected" from="MarginContainer/PanelContainer/HBoxContainer/ScrollContainer/VBoxContainer/BuildingGroups" to="." method="_on_building_groups_item_selected"]
[connection signal="item_selected" from="MarginContainer/PanelContainer/HBoxContainer/ScrollContainer2/VBoxContainer/Buildings" to="." method="_on_buildings_item_selected"]
[connection signal="pressed" from="MarginContainer/PanelContainer/HBoxContainer/DetailsContainer/BuildButtonsContainer/BuildButton" to="." method="_on_build_button_pressed"]

View File

@@ -0,0 +1,9 @@
[gd_scene load_steps=2 format=3 uid="uid://dfr3hvxqo4fqf"]
[ext_resource type="Script" path="res://scripts/interaction_bar.gd" id="1_qwnlc"]
[node name="InteractionBar" type="ProgressBar"]
offset_right = 60.0
offset_bottom = 20.0
show_percentage = false
script = ExtResource("1_qwnlc")

Some files were not shown because too many files have changed in this diff Show More