Compare commits

...

1 Commits

Author SHA1 Message Date
c4be97e0de added forge addon
All checks were successful
Create tag and build when new code gets to main / BumpTag (push) Successful in 21s
Create tag and build when new code gets to main / Test (push) Successful in 6m56s
Create tag and build when new code gets to main / Export (push) Successful in 9m3s
2026-02-08 15:16:01 +01:00
163 changed files with 6975 additions and 141 deletions

View File

@@ -1,142 +1,143 @@
<Project Sdk="Godot.NET.Sdk/4.6.0">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
<RootNamespace>Movementtests</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Content Include=".runsettings" />
<Content Include="export_presets.cfg" />
<Content Include="menus\assets\git_logo\Git-Logo-2Color.png" />
<Content Include="menus\assets\git_logo\Git-Logo-2Color.png.import" />
<Content Include="menus\assets\git_logo\LICENSE.txt" />
<Content Include="menus\assets\godot_engine_logo\LICENSE.txt" />
<Content Include="menus\assets\godot_engine_logo\logo_vertical_color_dark.png" />
<Content Include="menus\assets\godot_engine_logo\logo_vertical_color_dark.png.import" />
<Content Include="menus\assets\icon.png" />
<Content Include="menus\assets\icon.png.import" />
<Content Include="menus\ATTRIBUTION.md" />
<Content Include="menus\resources\themes\expedition.tres" />
<Content Include="menus\resources\themes\gravity.tres" />
<Content Include="menus\resources\themes\grow.tres" />
<Content Include="menus\resources\themes\lab.tres" />
<Content Include="menus\resources\themes\lore.tres" />
<Content Include="menus\resources\themes\steal_this_theme.tres" />
<Content Include="menus\scenes\credits\scrollable_credits.gd" />
<Content Include="menus\scenes\credits\scrollable_credits.gd.uid" />
<Content Include="menus\scenes\credits\scrollable_credits.tscn" />
<Content Include="menus\scenes\credits\scrolling_credits.gd" />
<Content Include="menus\scenes\credits\scrolling_credits.gd.uid" />
<Content Include="menus\scenes\credits\scrolling_credits.tscn" />
<Content Include="menus\scenes\end_credits\end_credits.gd" />
<Content Include="menus\scenes\end_credits\end_credits.gd.uid" />
<Content Include="menus\scenes\end_credits\end_credits.tscn" />
<Content Include="menus\scenes\game_scene\configurable_sub_viewport.gd" />
<Content Include="menus\scenes\game_scene\configurable_sub_viewport.gd.uid" />
<Content Include="menus\scenes\game_scene\game_ui.tscn" />
<Content Include="menus\scenes\game_scene\input_display_label.gd" />
<Content Include="menus\scenes\game_scene\input_display_label.gd.uid" />
<Content Include="menus\scenes\game_scene\levels\level.gd" />
<Content Include="menus\scenes\game_scene\levels\level.gd.uid" />
<Content Include="menus\scenes\game_scene\levels\level_1.tscn" />
<Content Include="menus\scenes\game_scene\levels\level_2.tscn" />
<Content Include="menus\scenes\game_scene\levels\level_3.tscn" />
<Content Include="menus\scenes\game_scene\tutorials\tutorial_1.tscn" />
<Content Include="menus\scenes\game_scene\tutorials\tutorial_2.tscn" />
<Content Include="menus\scenes\game_scene\tutorials\tutorial_3.tscn" />
<Content Include="menus\scenes\game_scene\tutorial_manager.gd" />
<Content Include="menus\scenes\game_scene\tutorial_manager.gd.uid" />
<Content Include="menus\scenes\loading_screen\level_loading_screen.tscn" />
<Content Include="menus\scenes\loading_screen\loading_screen.gd" />
<Content Include="menus\scenes\loading_screen\loading_screen.gd.uid" />
<Content Include="menus\scenes\loading_screen\loading_screen.tscn" />
<Content Include="menus\scenes\loading_screen\loading_screen_with_shader_caching.gd" />
<Content Include="menus\scenes\loading_screen\loading_screen_with_shader_caching.gd.uid" />
<Content Include="menus\scenes\loading_screen\loading_screen_with_shader_caching.tscn" />
<Content Include="menus\scenes\menus\level_select_menu\level_select_menu.gd" />
<Content Include="menus\scenes\menus\level_select_menu\level_select_menu.gd.uid" />
<Content Include="menus\scenes\menus\level_select_menu\level_select_menu.tscn" />
<Content Include="menus\scenes\menus\main_menu\main_menu.gd" />
<Content Include="menus\scenes\menus\main_menu\main_menu.gd.uid" />
<Content Include="menus\scenes\menus\main_menu\main_menu.tscn" />
<Content Include="menus\scenes\menus\main_menu\main_menu_with_animations.gd" />
<Content Include="menus\scenes\menus\main_menu\main_menu_with_animations.gd.uid" />
<Content Include="menus\scenes\menus\main_menu\main_menu_with_animations.tscn" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_input_option_control.gd" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_input_option_control.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_input_option_control.tscn" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\audio\audio_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\game\game_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\game\game_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\game\game_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\game\reset_game_control\reset_game_control.gd" />
<Content Include="menus\scenes\menus\options_menu\game\reset_game_control\reset_game_control.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\game\reset_game_control\reset_game_control.tscn" />
<Content Include="menus\scenes\menus\options_menu\input\input_extras_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu_with_mouse_sensitivity.tscn" />
<Content Include="menus\scenes\menus\options_menu\master_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\master_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\master_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\master_options_menu_with_tabs.tscn" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu_with_reset.gd" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu_with_reset.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\mini_options_menu_with_reset.tscn" />
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu.gd" />
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu.gd.uid" />
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu.tscn" />
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu_with_extras.tscn" />
<Content Include="menus\scenes\opening\opening.gd" />
<Content Include="menus\scenes\opening\opening.gd.uid" />
<Content Include="menus\scenes\opening\opening.tscn" />
<Content Include="menus\scenes\opening\opening_with_logo.tscn" />
<Content Include="menus\scenes\overlaid_menus\game_won_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\game_won_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\game_won_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\level_lost_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\level_lost_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\level_lost_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\level_won_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\level_won_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\level_won_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\mini_options_overlaid_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu.tscn" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu_container.gd" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu_container.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\overlaid_menu_container.tscn" />
<Content Include="menus\scenes\overlaid_menus\pause_menu.gd" />
<Content Include="menus\scenes\overlaid_menus\pause_menu.gd.uid" />
<Content Include="menus\scenes\overlaid_menus\pause_menu.tscn" />
<Content Include="menus\scripts\game_state.gd" />
<Content Include="menus\scripts\game_state.gd.uid" />
<Content Include="menus\scripts\level_list_and_state_manager.gd" />
<Content Include="menus\scripts\level_list_and_state_manager.gd.uid" />
<Content Include="menus\scripts\level_state.gd" />
<Content Include="menus\scripts\level_state.gd.uid" />
</ItemGroup>
<ItemGroup>
<Folder Include="addons\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="RustyOptions" Version="0.10.1" />
</ItemGroup>
<!-- gdUnit4 package dependencies -->
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
<PackageReference Include="gdUnit4.api" Version="5.1.0-rc3" />
<PackageReference Include="gdUnit4.test.adapter" Version="3.0.0" />
<PackageReference Include="gdUnit4.analyzers" Version="1.0.0">
<PrivateAssets>none</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<EnableDynamicLoading>true</EnableDynamicLoading>
<RootNamespace>Movementtests</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Content Include=".runsettings"/>
<Content Include="export_presets.cfg"/>
<Content Include="menus\assets\git_logo\Git-Logo-2Color.png"/>
<Content Include="menus\assets\git_logo\Git-Logo-2Color.png.import"/>
<Content Include="menus\assets\git_logo\LICENSE.txt"/>
<Content Include="menus\assets\godot_engine_logo\LICENSE.txt"/>
<Content Include="menus\assets\godot_engine_logo\logo_vertical_color_dark.png"/>
<Content Include="menus\assets\godot_engine_logo\logo_vertical_color_dark.png.import"/>
<Content Include="menus\assets\icon.png"/>
<Content Include="menus\assets\icon.png.import"/>
<Content Include="menus\ATTRIBUTION.md"/>
<Content Include="menus\resources\themes\expedition.tres"/>
<Content Include="menus\resources\themes\gravity.tres"/>
<Content Include="menus\resources\themes\grow.tres"/>
<Content Include="menus\resources\themes\lab.tres"/>
<Content Include="menus\resources\themes\lore.tres"/>
<Content Include="menus\resources\themes\steal_this_theme.tres"/>
<Content Include="menus\scenes\credits\scrollable_credits.gd"/>
<Content Include="menus\scenes\credits\scrollable_credits.gd.uid"/>
<Content Include="menus\scenes\credits\scrollable_credits.tscn"/>
<Content Include="menus\scenes\credits\scrolling_credits.gd"/>
<Content Include="menus\scenes\credits\scrolling_credits.gd.uid"/>
<Content Include="menus\scenes\credits\scrolling_credits.tscn"/>
<Content Include="menus\scenes\end_credits\end_credits.gd"/>
<Content Include="menus\scenes\end_credits\end_credits.gd.uid"/>
<Content Include="menus\scenes\end_credits\end_credits.tscn"/>
<Content Include="menus\scenes\game_scene\configurable_sub_viewport.gd"/>
<Content Include="menus\scenes\game_scene\configurable_sub_viewport.gd.uid"/>
<Content Include="menus\scenes\game_scene\game_ui.tscn"/>
<Content Include="menus\scenes\game_scene\input_display_label.gd"/>
<Content Include="menus\scenes\game_scene\input_display_label.gd.uid"/>
<Content Include="menus\scenes\game_scene\levels\level.gd"/>
<Content Include="menus\scenes\game_scene\levels\level.gd.uid"/>
<Content Include="menus\scenes\game_scene\levels\level_1.tscn"/>
<Content Include="menus\scenes\game_scene\levels\level_2.tscn"/>
<Content Include="menus\scenes\game_scene\levels\level_3.tscn"/>
<Content Include="menus\scenes\game_scene\tutorials\tutorial_1.tscn"/>
<Content Include="menus\scenes\game_scene\tutorials\tutorial_2.tscn"/>
<Content Include="menus\scenes\game_scene\tutorials\tutorial_3.tscn"/>
<Content Include="menus\scenes\game_scene\tutorial_manager.gd"/>
<Content Include="menus\scenes\game_scene\tutorial_manager.gd.uid"/>
<Content Include="menus\scenes\loading_screen\level_loading_screen.tscn"/>
<Content Include="menus\scenes\loading_screen\loading_screen.gd"/>
<Content Include="menus\scenes\loading_screen\loading_screen.gd.uid"/>
<Content Include="menus\scenes\loading_screen\loading_screen.tscn"/>
<Content Include="menus\scenes\loading_screen\loading_screen_with_shader_caching.gd"/>
<Content Include="menus\scenes\loading_screen\loading_screen_with_shader_caching.gd.uid"/>
<Content Include="menus\scenes\loading_screen\loading_screen_with_shader_caching.tscn"/>
<Content Include="menus\scenes\menus\level_select_menu\level_select_menu.gd"/>
<Content Include="menus\scenes\menus\level_select_menu\level_select_menu.gd.uid"/>
<Content Include="menus\scenes\menus\level_select_menu\level_select_menu.tscn"/>
<Content Include="menus\scenes\menus\main_menu\main_menu.gd"/>
<Content Include="menus\scenes\menus\main_menu\main_menu.gd.uid"/>
<Content Include="menus\scenes\menus\main_menu\main_menu.tscn"/>
<Content Include="menus\scenes\menus\main_menu\main_menu_with_animations.gd"/>
<Content Include="menus\scenes\menus\main_menu\main_menu_with_animations.gd.uid"/>
<Content Include="menus\scenes\menus\main_menu\main_menu_with_animations.tscn"/>
<Content Include="menus\scenes\menus\options_menu\audio\audio_input_option_control.gd"/>
<Content Include="menus\scenes\menus\options_menu\audio\audio_input_option_control.gd.uid"/>
<Content Include="menus\scenes\menus\options_menu\audio\audio_input_option_control.tscn"/>
<Content Include="menus\scenes\menus\options_menu\audio\audio_options_menu.gd"/>
<Content Include="menus\scenes\menus\options_menu\audio\audio_options_menu.gd.uid"/>
<Content Include="menus\scenes\menus\options_menu\audio\audio_options_menu.tscn"/>
<Content Include="menus\scenes\menus\options_menu\game\game_options_menu.gd"/>
<Content Include="menus\scenes\menus\options_menu\game\game_options_menu.gd.uid"/>
<Content Include="menus\scenes\menus\options_menu\game\game_options_menu.tscn"/>
<Content Include="menus\scenes\menus\options_menu\game\reset_game_control\reset_game_control.gd"/>
<Content Include="menus\scenes\menus\options_menu\game\reset_game_control\reset_game_control.gd.uid"/>
<Content Include="menus\scenes\menus\options_menu\game\reset_game_control\reset_game_control.tscn"/>
<Content Include="menus\scenes\menus\options_menu\input\input_extras_menu.tscn"/>
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu.gd"/>
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu.gd.uid"/>
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu.tscn"/>
<Content Include="menus\scenes\menus\options_menu\input\input_options_menu_with_mouse_sensitivity.tscn"/>
<Content Include="menus\scenes\menus\options_menu\master_options_menu.gd"/>
<Content Include="menus\scenes\menus\options_menu\master_options_menu.gd.uid"/>
<Content Include="menus\scenes\menus\options_menu\master_options_menu.tscn"/>
<Content Include="menus\scenes\menus\options_menu\master_options_menu_with_tabs.tscn"/>
<Content Include="menus\scenes\menus\options_menu\mini_options_menu.gd"/>
<Content Include="menus\scenes\menus\options_menu\mini_options_menu.gd.uid"/>
<Content Include="menus\scenes\menus\options_menu\mini_options_menu.tscn"/>
<Content Include="menus\scenes\menus\options_menu\mini_options_menu_with_reset.gd"/>
<Content Include="menus\scenes\menus\options_menu\mini_options_menu_with_reset.gd.uid"/>
<Content Include="menus\scenes\menus\options_menu\mini_options_menu_with_reset.tscn"/>
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu.gd"/>
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu.gd.uid"/>
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu.tscn"/>
<Content Include="menus\scenes\menus\options_menu\video\video_options_menu_with_extras.tscn"/>
<Content Include="menus\scenes\opening\opening.gd"/>
<Content Include="menus\scenes\opening\opening.gd.uid"/>
<Content Include="menus\scenes\opening\opening.tscn"/>
<Content Include="menus\scenes\opening\opening_with_logo.tscn"/>
<Content Include="menus\scenes\overlaid_menus\game_won_menu.gd"/>
<Content Include="menus\scenes\overlaid_menus\game_won_menu.gd.uid"/>
<Content Include="menus\scenes\overlaid_menus\game_won_menu.tscn"/>
<Content Include="menus\scenes\overlaid_menus\level_lost_menu.gd"/>
<Content Include="menus\scenes\overlaid_menus\level_lost_menu.gd.uid"/>
<Content Include="menus\scenes\overlaid_menus\level_lost_menu.tscn"/>
<Content Include="menus\scenes\overlaid_menus\level_won_menu.gd"/>
<Content Include="menus\scenes\overlaid_menus\level_won_menu.gd.uid"/>
<Content Include="menus\scenes\overlaid_menus\level_won_menu.tscn"/>
<Content Include="menus\scenes\overlaid_menus\mini_options_overlaid_menu.tscn"/>
<Content Include="menus\scenes\overlaid_menus\overlaid_menu.gd"/>
<Content Include="menus\scenes\overlaid_menus\overlaid_menu.gd.uid"/>
<Content Include="menus\scenes\overlaid_menus\overlaid_menu.tscn"/>
<Content Include="menus\scenes\overlaid_menus\overlaid_menu_container.gd"/>
<Content Include="menus\scenes\overlaid_menus\overlaid_menu_container.gd.uid"/>
<Content Include="menus\scenes\overlaid_menus\overlaid_menu_container.tscn"/>
<Content Include="menus\scenes\overlaid_menus\pause_menu.gd"/>
<Content Include="menus\scenes\overlaid_menus\pause_menu.gd.uid"/>
<Content Include="menus\scenes\overlaid_menus\pause_menu.tscn"/>
<Content Include="menus\scripts\game_state.gd"/>
<Content Include="menus\scripts\game_state.gd.uid"/>
<Content Include="menus\scripts\level_list_and_state_manager.gd"/>
<Content Include="menus\scripts\level_list_and_state_manager.gd.uid"/>
<Content Include="menus\scripts\level_state.gd"/>
<Content Include="menus\scripts\level_state.gd.uid"/>
</ItemGroup>
<ItemGroup>
<Folder Include="addons\"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="RustyOptions" Version="0.10.1"/>
</ItemGroup>
<!-- gdUnit4 package dependencies -->
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0"/>
<PackageReference Include="gdUnit4.api" Version="5.1.0-rc3"/>
<PackageReference Include="gdUnit4.test.adapter" Version="3.0.0"/>
<PackageReference Include="gdUnit4.analyzers" Version="1.0.0">
<PrivateAssets>none</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<Import Project="addons/forge/Forge.props"/>
</Project>

8
addons/forge/Forge.props Normal file
View File

@@ -0,0 +1,8 @@
<Project>
<PropertyGroup>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Gamesmiths.Forge" Version="0.2.0" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,109 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using System.Diagnostics;
using Gamesmiths.Forge.Godot.Editor;
using Gamesmiths.Forge.Godot.Editor.Attributes;
using Gamesmiths.Forge.Godot.Editor.Cues;
using Gamesmiths.Forge.Godot.Editor.Tags;
using Godot;
namespace Gamesmiths.Forge.Godot;
[Tool]
public partial class ForgePluginLoader : EditorPlugin
{
private const string AutoloadPath = "uid://ba8fquhtwu5mu";
private const string PluginScenePath = "uid://pjscvogl6jak";
private EditorDock? _editorDock;
private PanelContainer? _dockedScene;
private TagContainerInspectorPlugin? _tagContainerInspectorPlugin;
private TagInspectorPlugin? _tagInspectorPlugin;
private AttributeSetInspectorPlugin? _attributeSetInspectorPlugin;
private CueHandlerInspectorPlugin? _cueHandlerInspectorPlugin;
private AttributeEditorPlugin? _attributeEditorPlugin;
public override void _EnterTree()
{
PackedScene pluginScene = ResourceLoader.Load<PackedScene>(PluginScenePath);
_editorDock = new EditorDock
{
Title = "Forge",
DockIcon = GD.Load<Texture2D>("uid://cu6ncpuumjo20"),
DefaultSlot = EditorDock.DockSlot.RightUl,
};
_dockedScene = (PanelContainer)pluginScene.Instantiate();
_dockedScene.GetNode<TagsEditor>("%Tags").IsPluginInstance = true;
_editorDock.AddChild(_dockedScene);
AddDock(_editorDock);
_tagContainerInspectorPlugin = new TagContainerInspectorPlugin();
AddInspectorPlugin(_tagContainerInspectorPlugin);
_tagInspectorPlugin = new TagInspectorPlugin();
AddInspectorPlugin(_tagInspectorPlugin);
_attributeSetInspectorPlugin = new AttributeSetInspectorPlugin();
AddInspectorPlugin(_attributeSetInspectorPlugin);
_cueHandlerInspectorPlugin = new CueHandlerInspectorPlugin();
AddInspectorPlugin(_cueHandlerInspectorPlugin);
_attributeEditorPlugin = new AttributeEditorPlugin();
AddInspectorPlugin(_attributeEditorPlugin);
AddToolMenuItem("Repair assets tags", new Callable(this, MethodName.CallAssetRepairTool));
}
public override void _ExitTree()
{
Debug.Assert(_editorDock is not null, $"{nameof(_editorDock)} should have been initialized on _Ready().");
Debug.Assert(_dockedScene is not null, $"{nameof(_dockedScene)} should have been initialized on _Ready().");
RemoveDock(_editorDock);
_editorDock.QueueFree();
_dockedScene.Free();
RemoveInspectorPlugin(_tagContainerInspectorPlugin);
RemoveInspectorPlugin(_tagInspectorPlugin);
RemoveInspectorPlugin(_attributeSetInspectorPlugin);
RemoveInspectorPlugin(_cueHandlerInspectorPlugin);
RemoveInspectorPlugin(_attributeEditorPlugin);
RemoveToolMenuItem("Repair assets tags");
}
public override void _EnablePlugin()
{
base._EnablePlugin();
var config = ProjectSettings.LoadResourcePack(AutoloadPath);
if (config)
{
GD.PrintErr("Failed to load script at res://addons/forge/core/ForgeBootstrap.cs");
return;
}
if (!ProjectSettings.HasSetting("autoload/Forge Bootstrap"))
{
ProjectSettings.SetSetting("autoload/Forge Bootstrap", AutoloadPath);
ProjectSettings.Save();
}
}
public override void _DisablePlugin()
{
if (ProjectSettings.HasSetting("autoload/Forge Bootstrap"))
{
ProjectSettings.Clear("autoload/Forge Bootstrap");
ProjectSettings.Save();
}
}
private static void CallAssetRepairTool()
{
AssetRepairTool.RepairAllAssetsTags();
}
}
#endif

View File

@@ -0,0 +1 @@
uid://686m2ah4as6w

21
addons/forge/LICENSE Normal file
View File

@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2025 Gamesmiths Guild
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.

58
addons/forge/README.md Normal file
View File

@@ -0,0 +1,58 @@
# Forge for Godot
Forge for Godot is an Unreal GAS-like gameplay framework for the Godot Engine.
It integrates the [Forge Gameplay System](https://github.com/gamesmiths-guild/forge) into Godot, providing a robust, data-driven foundation for gameplay features such as attributes, effects, gameplay tags, abilities, events, and cues, fully aligned with Godots node, resource, and editor workflows.
This plugin enables you to:
- Use **ForgeEntity** nodes or implement `IForgeEntity` to integrate core Forge systems like attributes, effects, abilities, events and tags.
- Define attributes, effects, abilities, cues, and tags directly in the Godot editor.
- Apply and manage gameplay effects with area or raycasting nodes.
- Create hierarchical gameplay tags using the built-in Tags Editor.
- Trigger visual and audio feedback with the Cues system.
- Create player skills, attacks, or behaviors, with support for custom logic, costs, cooldowns, and triggers.
## Features
- **Effects System**: Comprehensive effect application and management, including stacking, periodic, instant, and infinite effects.
- **Attributes System**: Attribute management, supporting sets, modifiers, and configuration.
- **Tags System**: Full hierarchical tag system with Godot editor integration.
- **Abilities System**: Feature-complete ability system, supporting grant/removal, custom behaviors, triggers, cooldowns, and costs.
- **Events System**: Gameplay event bus supporting event-driven logic, subscriptions, and triggers.
- **Cues System**: Visual/audio feedback layer; decouples presentation from game logic.
- **Editor Extensions**: Custom inspector elements and tag editor with Godot integration.
- **Custom Nodes**: Includes nodes like `ForgeEntity`, `ForgeAttributeSet`, `EffectArea2D`, and more.
## Installation
### Requirements
- Godot 4.6 or later with .NET support.
- .NET SDK 8.0 or later.
### Steps
1. Install the plugin via the Godot Asset Library or manually by copying the `addons` folder.
- [Godot Asset Library](https://godotengine.org/asset-library/asset/4239)
- [Manual installation guide](https://docs.godotengine.org/en/stable/tutorials/plugins/editor/installing_plugins.html)
2. Add the following line in your `.csproj` file (before the closing `</Project>` tag). The `.csproj` file can be created through Godot by navigating to `Project > Tools > C# > Create C# solution`:
```xml
<Import Project="addons/forge/Forge.props" />
```
3. Back in the Godot editor, build your project by clicking `Build` in the top-right corner of the script editor.
4. Enable **Forge Gameplay System** in `Project > Project Settings > Plugins`.
## Getting Started
- See the [Quick Start Guide](https://github.com/gamesmiths-guild/forge-godot/blob/main/docs/quick-start.md) for a basic setup.
- Explore [sample scenes](https://github.com/gamesmiths-guild/forge-godot/tree/main/examples) by cloning the full repo.
## Documentation
Full documentation, examples, and advanced usage are available in the [Forge for Godot GitHub repository](https://github.com/gamesmiths-guild/forge-godot).
For technical details about core systems, see the [Forge Gameplay System documentation](https://github.com/gamesmiths-guild/forge/blob/main/docs/README.md).
## License
This plugin is licensed under the same terms as the core [Forge Gameplay System](https://github.com/gamesmiths-guild/forge).

View File

@@ -0,0 +1,312 @@
// Copyright © Gamesmiths Guild.
using System.Collections.Generic;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Effects;
using Gamesmiths.Forge.Godot.Nodes;
using Godot;
namespace Gamesmiths.Forge.Godot.Core;
internal sealed class EffectApplier
{
private record struct EffectKey(EffectData EffectData, EffectOwnership EffectOwnership, int Level);
private readonly List<EffectData> _effects = [];
private readonly Dictionary<IForgeEntity, List<ActiveEffectHandle>> _effectInstances = [];
private readonly Dictionary<EffectKey, Effect> _effectsCache = [];
public EffectApplier(Node node)
{
foreach (Node child in node.GetChildren())
{
if (child is ForgeEffect effectNode && effectNode.EffectData is not null)
{
_effects.Add(effectNode.EffectData.GetEffectData());
}
}
}
public void ApplyEffects(
Node node,
IForgeEntity? effectOwner,
IForgeEntity? effectSource,
int level = 1)
{
if (node is IForgeEntity forgeEntity)
{
ApplyEffects(forgeEntity, effectOwner, effectSource, level);
return;
}
foreach (Node? child in node.GetChildren())
{
if (child is IForgeEntity forgeEntityChild)
{
ApplyEffects(forgeEntityChild, effectOwner, effectSource, level);
return;
}
}
}
public void ApplyEffects<TData>(
Node node,
TData contextData,
IForgeEntity? effectOwner,
IForgeEntity? effectSource,
int level = 1)
{
if (node is IForgeEntity forgeEntity)
{
ApplyEffects(forgeEntity, contextData, effectOwner, effectSource, level);
return;
}
foreach (Node? child in node.GetChildren())
{
if (child is IForgeEntity forgeEntityChild)
{
ApplyEffects(forgeEntityChild, contextData, effectOwner, effectSource, level);
return;
}
}
}
public void AddEffects(
Node node,
IForgeEntity? effectOwner,
IForgeEntity? effectSource,
int level)
{
if (node is IForgeEntity forgeEntity)
{
AddEffects(forgeEntity, effectOwner, effectSource, level);
return;
}
foreach (Node? child in node.GetChildren())
{
if (child is IForgeEntity forgeEntityChild)
{
AddEffects(forgeEntityChild, effectOwner, effectSource, level);
return;
}
}
}
public void AddEffects<TData>(
Node node,
TData contextData,
IForgeEntity? effectOwner,
IForgeEntity? effectSource,
int level)
{
if (node is IForgeEntity forgeEntity)
{
AddEffects(forgeEntity, contextData, effectOwner, effectSource, level);
return;
}
foreach (Node? child in node.GetChildren())
{
if (child is IForgeEntity forgeEntityChild)
{
AddEffects(forgeEntityChild, contextData, effectOwner, effectSource, level);
return;
}
}
}
public void RemoveEffects(Node node)
{
if (node is IForgeEntity forgeEntity)
{
RemoveEffects(forgeEntity);
return;
}
foreach (Node? child in node.GetChildren())
{
if (child is IForgeEntity forgeEntityChild)
{
RemoveEffects(forgeEntityChild);
return;
}
}
}
private void ApplyEffects(
IForgeEntity forgeEntity,
IForgeEntity? effectOwner,
IForgeEntity? effectSource,
int level)
{
var effectOwnership = new EffectOwnership(effectOwner, effectSource);
foreach (EffectData effectData in _effects)
{
var key = new EffectKey(effectData, effectOwnership, level);
if (_effectsCache.TryGetValue(key, out Effect? cachedEffect))
{
forgeEntity.EffectsManager.ApplyEffect(cachedEffect);
continue;
}
var effect = new Effect(
effectData,
new EffectOwnership(effectOwner, effectSource),
level);
_effectsCache[key] = effect;
forgeEntity.EffectsManager.ApplyEffect(effect);
}
}
private void ApplyEffects<TData>(
IForgeEntity forgeEntity,
TData contextData,
IForgeEntity? effectOwner,
IForgeEntity? effectSource,
int level)
{
var effectOwnership = new EffectOwnership(effectOwner, effectSource);
foreach (EffectData effectData in _effects)
{
var key = new EffectKey(effectData, effectOwnership, level);
if (_effectsCache.TryGetValue(key, out Effect? cachedEffect))
{
forgeEntity.EffectsManager.ApplyEffect(cachedEffect);
continue;
}
var effect = new Effect(
effectData,
new EffectOwnership(effectOwner, effectSource),
level);
_effectsCache[key] = effect;
forgeEntity.EffectsManager.ApplyEffect(effect, contextData);
}
}
private void AddEffects(
IForgeEntity forgeEntity,
IForgeEntity?
effectOwner,
IForgeEntity? effectSource,
int level)
{
var instanceEffects = new List<ActiveEffectHandle>();
if (!_effectInstances.TryAdd(forgeEntity, instanceEffects))
{
instanceEffects = _effectInstances[forgeEntity];
}
var effectOwnership = new EffectOwnership(effectOwner, effectSource);
foreach (EffectData effectData in _effects)
{
var key = new EffectKey(effectData, effectOwnership, level);
ActiveEffectHandle? handle;
if (_effectsCache.TryGetValue(key, out Effect? cachedEffect))
{
handle = forgeEntity.EffectsManager.ApplyEffect(cachedEffect);
if (handle is null)
{
continue;
}
instanceEffects.Add(handle);
continue;
}
var effect = new Effect(
effectData,
new EffectOwnership(effectOwner, effectSource),
level);
handle = forgeEntity.EffectsManager.ApplyEffect(effect);
if (handle is null)
{
continue;
}
instanceEffects.Add(handle);
}
}
private void AddEffects<TData>(
IForgeEntity forgeEntity,
TData contextData,
IForgeEntity? effectOwner,
IForgeEntity? effectSource,
int level)
{
var instanceEffects = new List<ActiveEffectHandle>();
if (!_effectInstances.TryAdd(forgeEntity, instanceEffects))
{
instanceEffects = _effectInstances[forgeEntity];
}
var effectOwnership = new EffectOwnership(effectOwner, effectSource);
foreach (EffectData effectData in _effects)
{
var key = new EffectKey(effectData, effectOwnership, level);
ActiveEffectHandle? handle;
if (_effectsCache.TryGetValue(key, out Effect? cachedEffect))
{
handle = forgeEntity.EffectsManager.ApplyEffect(cachedEffect);
if (handle is null)
{
continue;
}
instanceEffects.Add(handle);
continue;
}
var effect = new Effect(
effectData,
new EffectOwnership(effectOwner, effectSource),
level);
handle = forgeEntity.EffectsManager.ApplyEffect(effect, contextData);
if (handle is null)
{
continue;
}
instanceEffects.Add(handle);
}
}
private void RemoveEffects(IForgeEntity forgeEntity)
{
if (!_effectInstances.TryGetValue(forgeEntity, out List<ActiveEffectHandle>? value))
{
return;
}
foreach (ActiveEffectHandle handle in value)
{
forgeEntity.EffectsManager.RemoveEffect(handle);
}
_effectInstances[forgeEntity] = [];
}
}

View File

@@ -0,0 +1 @@
uid://bs52uo5esaiu2

View File

@@ -0,0 +1,14 @@
// Copyright © Gamesmiths Guild.
using Godot;
namespace Gamesmiths.Forge.Godot.Core;
public partial class ForgeBootstrap : Node
{
public override void _Ready()
{
ForgeData pluginData = ResourceLoader.Load<ForgeData>("uid://8j4xg16o3qnl");
_ = new ForgeManagers(pluginData);
}
}

View File

@@ -0,0 +1 @@
uid://ba8fquhtwu5mu

View File

@@ -0,0 +1,21 @@
// Copyright © Gamesmiths Guild.
using Gamesmiths.Forge.Core;
using Godot;
namespace Gamesmiths.Forge.Godot.Core;
public readonly struct ForgeCurve(Curve? curve) : ICurve
{
private readonly Curve? _curve = curve;
public float Evaluate(float value)
{
if (_curve is null)
{
return 1;
}
return _curve.Sample(value);
}
}

View File

@@ -0,0 +1 @@
uid://cei2cgvy84iy6

View File

@@ -0,0 +1,13 @@
// Copyright © Gamesmiths Guild.
using Godot;
using Godot.Collections;
namespace Gamesmiths.Forge.Godot.Core;
[Tool]
public partial class ForgeData : Resource
{
[Export]
public Array<string> RegisteredTags { get; set; } = [];
}

View File

@@ -0,0 +1 @@
uid://bq4vlbfx00hea

View File

@@ -0,0 +1,30 @@
// Copyright © Gamesmiths Guild.
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Cues;
using Gamesmiths.Forge.Tags;
namespace Gamesmiths.Forge.Godot.Core;
public class ForgeManagers
{
public static ForgeManagers Instance { get; private set; } = null!;
public TagsManager TagsManager { get; private set; }
public CuesManager CuesManager { get; private set; }
public ForgeManagers(ForgeData pluginData)
{
Instance = this;
#if DEBUG
Validation.Enabled = true;
#else
Validation.Enabled = false;
#endif
TagsManager = new TagsManager([.. pluginData.RegisteredTags]);
CuesManager = new CuesManager();
}
}

View File

@@ -0,0 +1 @@
uid://djeiinm1gclh4

View File

@@ -0,0 +1,98 @@
// Copyright © Gamesmiths Guild.
using System;
using Gamesmiths.Forge.Core;
using Godot;
namespace Gamesmiths.Forge.Godot.Core;
public class ForgeRandom : IRandom, IDisposable
{
private readonly RandomNumberGenerator _randomNumberGenerator;
public ForgeRandom()
{
_randomNumberGenerator = new RandomNumberGenerator();
_randomNumberGenerator.Randomize();
}
public void NextBytes(byte[] buffer)
{
for (var i = 0; i < buffer.Length; i++)
{
buffer[i] = (byte)_randomNumberGenerator.RandiRange(0, 255);
}
}
public void NextBytes(Span<byte> buffer)
{
for (var i = 0; i < buffer.Length; i++)
{
buffer[i] = (byte)_randomNumberGenerator.RandiRange(0, 255);
}
}
public double NextDouble()
{
return _randomNumberGenerator.Randf();
}
public int NextInt()
{
return (int)_randomNumberGenerator.Randi();
}
public int NextInt(int maxValue)
{
return _randomNumberGenerator.RandiRange(0, maxValue - 1);
}
public int NextInt(int minValue, int maxValue)
{
return _randomNumberGenerator.RandiRange(minValue, maxValue - 1);
}
public long NextInt64()
{
unchecked
{
var high = _randomNumberGenerator.Randi();
var low = _randomNumberGenerator.Randi();
return ((long)high << 32) | low;
}
}
public long NextInt64(long maxValue)
{
return NextInt64(0, maxValue);
}
public long NextInt64(long minValue, long maxValue)
{
if (minValue >= maxValue)
{
throw new ArgumentOutOfRangeException(nameof(minValue), "minValue must be less than maxValue.");
}
var range = (ulong)(maxValue - minValue);
var rand = (ulong)NextInt64();
return (long)(rand % range) + minValue;
}
public float NextSingle()
{
return _randomNumberGenerator.Randf();
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
_randomNumberGenerator.Dispose();
}
}

View File

@@ -0,0 +1 @@
uid://dap6x2ddf6baj

View File

@@ -0,0 +1,7 @@
[gd_resource type="Resource" load_steps=2 format=3 uid="uid://8j4xg16o3qnl"]
[ext_resource type="Script" uid="uid://bq4vlbfx00hea" path="res://addons/forge/core/ForgeData.cs" id="1_x0pne"]
[resource]
script = ExtResource("1_x0pne")
RegisteredTags = Array[String](["effect.fire", "effect.wet", "cue.floating.text", "cue.vfx.fire", "cue.vfx.wet", "cue.vfx.regen", "cooldown.enemy.attack", "set_by_caller.damage", "event.damage", "cooldown", "cooldown.skill.projectile", "cooldown.skill.shield", "cooldown.skill.dash", "movement.block", "immunity.damage", "effect.mana_shield", "cue.vfx.shield", "event.damage.taken", "event.damage.dealt", "event", "set_by_caller", "trait.flammable", "trait.healable", "trait.damageable", "trait.wettable", "cue.vfx.reflect", "cue.vfx", "cooldown.skill", "cooldown.skill.reflect"])

View File

@@ -0,0 +1,210 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using System;
using System.Collections.Generic;
using System.Linq;
using Gamesmiths.Forge.Godot.Core;
using Gamesmiths.Forge.Godot.Resources;
using Gamesmiths.Forge.Tags;
using Godot;
using Godot.Collections;
namespace Gamesmiths.Forge.Godot.Editor;
[Tool]
public partial class AssetRepairTool : EditorPlugin
{
public static void RepairAllAssetsTags()
{
ForgeData pluginData = ResourceLoader.Load<ForgeData>("uid://8j4xg16o3qnl");
var tagsManager = new TagsManager([.. pluginData.RegisteredTags]);
List<string> scenes = GetScenePaths("res://");
GD.Print($"Found {scenes.Count} scene(s) to process.");
var openedScenes = EditorInterface.Singleton.GetOpenScenes();
foreach (var originalScenePath in scenes)
{
// For some weird reason scenes from the GetScenePath are coming with 3 slashes instead of just two.
var scenePath = originalScenePath.Replace("res:///", "res://");
GD.Print($"Processing scene: {scenePath}.");
PackedScene? packedScene = ResourceLoader.Load<PackedScene>(scenePath);
if (packedScene is null)
{
GD.PrintErr($"Failed to load scene: {scenePath}.");
continue;
}
Node sceneInstance = packedScene.Instantiate();
var modified = ProcessNode(sceneInstance, tagsManager);
if (!modified)
{
GD.Print($"No changes needed for {scenePath}.");
continue;
}
// 'sceneInstance' is the modified scene instance in memory, need to save to disk and reload if needed.
var newScene = new PackedScene();
Error error = newScene.Pack(sceneInstance);
if (error != Error.Ok)
{
GD.PrintErr($"Failed to pack scene: {error}.");
continue;
}
error = ResourceSaver.Save(newScene, scenePath);
if (error != Error.Ok)
{
GD.PrintErr($"Failed to save scene: {error}.");
continue;
}
if (openedScenes.Contains(scenePath))
{
GD.Print($"Scene was opened, reloading background scene: {scenePath}.");
EditorInterface.Singleton.ReloadSceneFromPath(scenePath);
}
}
}
/// <summary>
/// Recursively get scene files from a folder.
/// </summary>
/// <param name="basePath">Current path iteration.</param>
/// <returns>List of scenes found.</returns>
private static List<string> GetScenePaths(string basePath)
{
var scenePaths = new List<string>();
var dir = DirAccess.Open(basePath);
if (dir is null)
{
GD.PrintErr($"Failed to open directory: {basePath}");
return scenePaths;
}
// Start listing directory entries; skip navigational and hidden files.
dir.ListDirBegin();
while (true)
{
var fileName = dir.GetNext();
if (string.IsNullOrEmpty(fileName))
{
break;
}
var filePath = $"{basePath}/{fileName}";
if (dir.CurrentIsDir())
{
// Recursively scan subdirectories.
scenePaths.AddRange(GetScenePaths(filePath));
}
else if (fileName.EndsWith(".tscn", StringComparison.InvariantCultureIgnoreCase)
|| fileName.EndsWith(".scn", StringComparison.InvariantCultureIgnoreCase))
{
scenePaths.Add(filePath);
}
}
dir.ListDirEnd();
return scenePaths;
}
/// <summary>
/// Recursively process nodes; returns true if any ForgeEntity was modified.
/// </summary>
/// <param name="node">Current node iteration.</param>
/// <param name="tagsManager">The tags manager used to validate tags.</param>
/// <returns><see langword="true"/> if any ForgeEntity was modified.</returns>
private static bool ProcessNode(Node node, TagsManager tagsManager)
{
var modified = ValidateNode(node, tagsManager);
foreach (Node child in node.GetChildren())
{
modified |= ProcessNode(child, tagsManager);
}
return modified;
}
private static bool ValidateNode(Node node, TagsManager tagsManager)
{
var modified = false;
foreach (Dictionary propertyInfo in node.GetPropertyList())
{
if (!propertyInfo.TryGetValue("class_name", out Variant className))
{
continue;
}
if (className.AsString() != "TagContainer")
{
continue;
}
if (!propertyInfo.TryGetValue("name", out Variant nameObj))
{
continue;
}
var propertyName = nameObj.AsString();
Variant value = node.Get(propertyName);
if (value.VariantType != Variant.Type.Object)
{
continue;
}
if (value.As<Resource>() is ForgeTagContainer tagContainer)
{
modified |= ValidateTagContainerProperty(tagContainer, node.Name, tagsManager);
}
}
return modified;
}
private static bool ValidateTagContainerProperty(
ForgeTagContainer container,
string nodeName,
TagsManager tagsManager)
{
if (container.ContainerTags is null)
{
return false;
}
Array<string> originalTags = container.ContainerTags;
var newTags = new Array<string>();
var modified = false;
foreach (var tag in originalTags)
{
try
{
Tag.RequestTag(tagsManager, tag);
newTags.Add(tag);
}
catch (TagNotRegisteredException)
{
GD.PrintRich(
$"[color=LIGHT_STEEL_BLUE][RepairTool] Removing invalid tag [{tag}] from node {nodeName}.");
modified = true;
}
}
if (modified)
{
container.ContainerTags = newTags;
}
return modified;
}
}
#endif

View File

@@ -0,0 +1 @@
uid://1runivyr5don

View File

@@ -0,0 +1,62 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Gamesmiths.Forge.Attributes;
namespace Gamesmiths.Forge.Godot.Editor;
internal static class EditorUtils
{
/// <summary>
/// Uses reflection to gather all classes inheriting from AttributeSet and their fields of type Attribute.
/// </summary>
/// <returns>An array with the available attributes.</returns>
public static string[] GetAttributeSetOptions()
{
var options = new List<string>();
// Get all types in the current assembly
Type[] allTypes = Assembly.GetExecutingAssembly().GetTypes();
// Find all types that subclass AttributeSet
foreach (Type attributeSetType in allTypes.Where(x => x.IsSubclassOf(typeof(AttributeSet))))
{
options.Add(attributeSetType.Name);
}
return [.. options];
}
/// <summary>
/// Uses reflection to gather all classes inheriting from AttributeSet and their fields of type Attribute.
/// </summary>
/// <param name="attributeSet">The attribute set used to search for the attributes.</param>
/// <returns>An array with the available attributes.</returns>
public static string[] GetAttributeOptions(string? attributeSet)
{
if (string.IsNullOrEmpty(attributeSet))
{
return [];
}
var asm = Assembly.GetExecutingAssembly();
Type? type = Array.Find(
asm.GetTypes(),
x => x.IsSubclassOf(typeof(AttributeSet)) && x.Name == attributeSet);
if (type is null)
{
return [];
}
IEnumerable<PropertyInfo> properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(x => x.PropertyType == typeof(EntityAttribute));
return [.. properties.Select(x => $"{x.Name}")];
}
}
#endif

View File

@@ -0,0 +1 @@
uid://dcvmf0r1f43m6

View File

@@ -0,0 +1,14 @@
[gd_scene format=3 uid="uid://pjscvogl6jak"]
[ext_resource type="PackedScene" uid="uid://c17f812by5x23" path="res://addons/forge/editor/tags/TagsEditor.tscn" id="1_bxwfw"]
[node name="Forge" type="PanelContainer" unique_id=249446352]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
[node name="Tags" parent="." unique_id=654228508 instance=ExtResource("1_bxwfw")]
unique_name_in_owner = true
layout_mode = 2

View File

@@ -0,0 +1,34 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using Godot;
namespace Gamesmiths.Forge.Godot.Editor.Attributes;
[Tool]
public partial class AttributeEditorPlugin : EditorInspectorPlugin
{
public override bool _CanHandle(GodotObject @object)
{
return @object is Resources.ForgeModifier || @object is Resources.ForgeCue;
}
public override bool _ParseProperty(
GodotObject @object,
Variant.Type type,
string name,
PropertyHint hintType,
string hintString,
PropertyUsageFlags usageFlags,
bool wide)
{
if (name == "Attribute" || name == "CapturedAttribute" || name == "MagnitudeAttribute")
{
AddPropertyEditor(name, new AttributeEditorProperty());
return true;
}
return false;
}
}
#endif

View File

@@ -0,0 +1 @@
uid://bl2w0vp6b5p8k

View File

@@ -0,0 +1,101 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using Godot;
namespace Gamesmiths.Forge.Godot.Editor.Attributes;
[Tool]
public partial class AttributeEditorProperty : EditorProperty
{
private const int ButtonSize = 26;
private const int PopupSize = 300;
private Label _label = null!;
public override void _Ready()
{
Texture2D dropdownIcon = EditorInterface.Singleton
.GetEditorTheme()
.GetIcon("GuiDropdown", "EditorIcons");
var hbox = new HBoxContainer();
_label = new Label { Text = "None", SizeFlagsHorizontal = SizeFlags.ExpandFill };
var button = new Button { Icon = dropdownIcon, CustomMinimumSize = new Vector2(ButtonSize, 0) };
hbox.AddChild(_label);
hbox.AddChild(button);
AddChild(hbox);
var popup = new Popup { Size = new Vector2I(PopupSize, PopupSize) };
var tree = new Tree
{
HideRoot = true,
AnchorRight = 1,
AnchorBottom = 1,
};
popup.AddChild(tree);
var bg = new StyleBoxFlat
{
BgColor = EditorInterface.Singleton
.GetEditorTheme()
.GetColor("dark_color_2", "Editor"),
};
tree.AddThemeStyleboxOverride("panel", bg);
AddChild(popup);
BuildAttributeTree(tree);
button.Pressed += () =>
{
Window win = GetWindow();
popup.Position = (Vector2I)button.GlobalPosition
+ win.Position
- new Vector2I(PopupSize - ButtonSize, -30);
popup.Popup();
};
tree.ItemActivated += () =>
{
TreeItem item = tree.GetSelected();
if (item?.HasMeta("attribute_path") != true)
{
return;
}
var fullPath = item.GetMeta("attribute_path").AsString();
_label.Text = fullPath;
EmitChanged(GetEditedProperty(), fullPath);
popup.Hide();
};
}
public override void _UpdateProperty()
{
var value = GetEditedObject().Get(GetEditedProperty()).AsString();
_label.Text = string.IsNullOrEmpty(value) ? "None" : value;
}
private static void BuildAttributeTree(Tree tree)
{
TreeItem root = tree.CreateItem();
foreach (var attributeSet in EditorUtils.GetAttributeSetOptions())
{
TreeItem setItem = tree.CreateItem(root);
setItem.SetText(0, attributeSet);
setItem.Collapsed = true;
foreach (var attribute in EditorUtils.GetAttributeOptions(attributeSet))
{
TreeItem attributeItem = tree.CreateItem(setItem);
var attributePath = $"{attributeSet}.{attribute}";
attributeItem.SetText(0, attribute);
attributeItem.SetMeta("attribute_path", attributePath);
}
}
}
}
#endif

View File

@@ -0,0 +1 @@
uid://dvjqj637kfav

View File

@@ -0,0 +1,74 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using System;
using System.Linq;
using System.Reflection;
using Gamesmiths.Forge.Attributes;
using Gamesmiths.Forge.Godot.Nodes;
using Godot;
using Godot.Collections;
namespace Gamesmiths.Forge.Godot.Editor.Attributes;
[Tool]
public partial class AttributeSetClassEditorProperty : EditorProperty
{
private OptionButton _optionButton = null!;
public override void _Ready()
{
_optionButton = new OptionButton();
AddChild(_optionButton);
_optionButton.AddItem("Select AttributeSet Class");
foreach (var option in EditorUtils.GetAttributeSetOptions())
{
_optionButton.AddItem(option);
}
_optionButton.ItemSelected += x =>
{
var className = _optionButton.GetItemText((int)x);
EmitChanged(GetEditedProperty(), className);
GodotObject obj = GetEditedObject();
if (obj is not null)
{
var dict = new Dictionary<string, AttributeValues>();
var assembly = Assembly.GetAssembly(typeof(ForgeAttributeSet));
Type? targetType = System.Array.Find(assembly?.GetTypes() ?? [], x => x.Name == className);
if (targetType is not null)
{
System.Collections.Generic.IEnumerable<PropertyInfo> attrProps = targetType
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(x => x.PropertyType == typeof(EntityAttribute));
foreach (PropertyInfo? pi in attrProps)
{
dict[pi.Name] = new AttributeValues(0, 0, int.MaxValue);
}
}
EmitChanged("InitialAttributeValues", dict);
}
};
}
public override void _UpdateProperty()
{
GodotObject obj = GetEditedObject();
StringName property = GetEditedProperty();
var val = obj.Get(property).AsString();
for (var i = 0; i < _optionButton.GetItemCount(); i++)
{
if (_optionButton.GetItemText(i) == val)
{
_optionButton.Selected = i;
break;
}
}
}
}
#endif

View File

@@ -0,0 +1 @@
uid://bumuxlivyt66b

View File

@@ -0,0 +1,43 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using Gamesmiths.Forge.Godot.Nodes;
using Godot;
namespace Gamesmiths.Forge.Godot.Editor.Attributes;
[Tool]
public partial class AttributeSetInspectorPlugin : EditorInspectorPlugin
{
private PackedScene? _inspectorScene;
public override bool _CanHandle(GodotObject @object)
{
return @object is ForgeAttributeSet;
}
public override bool _ParseProperty(
GodotObject @object,
Variant.Type type,
string name,
PropertyHint hintType,
string hintString,
PropertyUsageFlags usageFlags,
bool wide)
{
if (name == "AttributeSetClass")
{
AddPropertyEditor(name, new AttributeSetClassEditorProperty());
return true;
}
if (name == "InitialAttributeValues")
{
AddPropertyEditor(name, new AttributeSetValuesEditorProperty());
return true;
}
return false;
}
}
#endif

View File

@@ -0,0 +1 @@
uid://t3gpjlcyqor

View File

@@ -0,0 +1,171 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using Gamesmiths.Forge.Attributes;
using Gamesmiths.Forge.Godot.Nodes;
using Godot;
using Godot.Collections;
namespace Gamesmiths.Forge.Godot.Editor.Attributes;
[Tool]
public partial class AttributeSetValuesEditorProperty : EditorProperty
{
public override void _Ready()
{
var attributesRoot = new VBoxContainer { Name = "AttributesRoot" };
AddChild(attributesRoot);
SetBottomEditor(attributesRoot);
}
public override void _UpdateProperty()
{
VBoxContainer attributesRoot = GetNodeOrNull<VBoxContainer>("AttributesRoot");
if (attributesRoot is null)
{
return;
}
FreeAllChildren(attributesRoot);
if (GetEditedObject() is not ForgeAttributeSet obj
|| string.IsNullOrEmpty(obj.AttributeSetClass)
|| obj.InitialAttributeValues is null)
{
return;
}
var className = obj.AttributeSetClass;
var assembly = Assembly.GetAssembly(typeof(ForgeAttributeSet));
Type? targetType = System.Array.Find(assembly?.GetTypes() ?? [], x => x.Name == className);
if (targetType is null)
{
return;
}
System.Collections.Generic.IEnumerable<PropertyInfo> attributeProperties = targetType
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(x => x.PropertyType == typeof(EntityAttribute));
foreach (var attributeName in attributeProperties.Select(x => x.Name))
{
var groupVBox = new VBoxContainer();
groupVBox.AddChild(AttributeHeader(attributeName));
AttributeValues value = obj.InitialAttributeValues.TryGetValue(attributeName, out AttributeValues? v)
? v
: new AttributeValues(0, 0, int.MaxValue);
SpinBox spinDefault = CreateSpinBox(value.Min, value.Max, value.Default);
SpinBox spinMin = CreateSpinBox(int.MinValue, value.Max, value.Min);
SpinBox spinMax = CreateSpinBox(value.Min, int.MaxValue, value.Max);
groupVBox.AddChild(AttributeFieldRow("Default", spinDefault));
groupVBox.AddChild(AttributeFieldRow("Min", spinMin));
groupVBox.AddChild(AttributeFieldRow("Max", spinMax));
spinDefault.ValueChanged += x =>
{
UpdateAndEmit(obj, attributeName, (int)x, (int)spinMin.Value, (int)spinMax.Value);
};
spinMin.ValueChanged += x =>
{
spinDefault.MinValue = x;
spinMax.MinValue = x;
UpdateAndEmit(obj, attributeName, (int)spinDefault.Value, (int)x, (int)spinMax.Value);
};
spinMax.ValueChanged += x =>
{
spinDefault.MaxValue = x;
spinMin.MaxValue = x;
UpdateAndEmit(obj, attributeName, (int)spinDefault.Value, (int)spinMin.Value, (int)x);
};
attributesRoot.AddChild(groupVBox);
}
}
private static PanelContainer AttributeHeader(string text)
{
var headerPanel = new PanelContainer
{
CustomMinimumSize = new Vector2(0, 28),
};
var style = new StyleBoxFlat
{
BgColor = new Color(0.16f, 0.17f, 0.20f),
};
headerPanel.AddThemeStyleboxOverride("panel", style);
var label = new Label
{
Text = text,
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center,
SizeFlagsHorizontal = (SizeFlags)(int)SizeFlags.ExpandFill,
CustomMinimumSize = new Vector2(0, 22),
AutowrapMode = TextServer.AutowrapMode.Off,
};
headerPanel.AddChild(label);
return headerPanel;
}
private static HBoxContainer AttributeFieldRow(string label, SpinBox spinBox)
{
var hbox = new HBoxContainer();
hbox.AddChild(new Label
{
Text = label,
CustomMinimumSize = new Vector2(80, 0),
SizeFlagsHorizontal = SizeFlags.ExpandFill,
});
hbox.AddChild(spinBox);
return hbox;
}
private static SpinBox CreateSpinBox(int min, int max, int value)
{
return new SpinBox
{
MinValue = min,
MaxValue = max,
Value = value,
SizeFlagsHorizontal = SizeFlags.ExpandFill,
};
}
private static void FreeAllChildren(Node node)
{
for (var i = node.GetChildCount() - 1; i >= 0; i--)
{
node.GetChild(i).QueueFree();
}
}
private void UpdateAndEmit(ForgeAttributeSet obj, string name, int def, int min, int max)
{
Debug.Assert(obj.InitialAttributeValues is not null, "InitialAttributeValues should not be null here.");
var dict = new Dictionary<string, AttributeValues>(obj.InitialAttributeValues)
{
[name] = new AttributeValues(def, min, max),
};
EmitChanged(nameof(ForgeAttributeSet.InitialAttributeValues), dict);
}
}
#endif

View File

@@ -0,0 +1 @@
uid://cdj20gbpxkda1

View File

@@ -0,0 +1,29 @@
// Copyright © Gamesmiths Guild.
using Godot;
namespace Gamesmiths.Forge.Godot.Editor.Attributes;
[Tool]
public partial class AttributeValues : Resource
{
[Export]
public int Default { get; set; }
[Export]
public int Min { get; set; }
[Export]
public int Max { get; set; }
public AttributeValues()
{
}
public AttributeValues(int @default, int min, int max)
{
Default = @default;
Min = min;
Max = max;
}
}

View File

@@ -0,0 +1 @@
uid://ccovd5i0wr3kk

View File

@@ -0,0 +1,53 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using System;
using Gamesmiths.Forge.Godot.Nodes;
using Godot;
namespace Gamesmiths.Forge.Godot.Editor.Cues;
[Tool]
public partial class CueHandlerInspectorPlugin : EditorInspectorPlugin
{
public override bool _CanHandle(GodotObject @object)
{
// Find out if its an implementation of CueHandler without having to add [Tool] attribute to them.
if (@object?.GetScript().As<CSharpScript>() is CSharpScript script)
{
StringName className = script.GetGlobalName();
Type baseType = typeof(ForgeCueHandler);
System.Reflection.Assembly assembly = baseType.Assembly;
Type? implementationType =
Array.Find(assembly.GetTypes(), x =>
x.Name == className &&
baseType.IsAssignableFrom(x));
return implementationType is not null;
}
return false;
}
public override bool _ParseProperty(
GodotObject @object,
Variant.Type type,
string name,
PropertyHint hintType,
string hintString,
PropertyUsageFlags usageFlags,
bool wide)
{
if (name == "CueTag")
{
var cueKeyEditorProperty = new CueKeyEditorProperty();
AddPropertyEditor(name, cueKeyEditorProperty);
return true;
}
return base._ParseProperty(@object, type, name, hintType, hintString, usageFlags, wide);
}
}
#endif

View File

@@ -0,0 +1 @@
uid://dattkelp87mhv

View File

@@ -0,0 +1,106 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using System.Collections.Generic;
using Gamesmiths.Forge.Godot.Core;
using Gamesmiths.Forge.Tags;
using Godot;
namespace Gamesmiths.Forge.Godot.Editor.Cues;
[Tool]
public partial class CueKeyEditorProperty : EditorProperty
{
private const int ButtonSize = 26;
private const int PopupSize = 300;
private Label _label = null!;
public override void _Ready()
{
Texture2D dropdownIcon = EditorInterface.Singleton
.GetEditorTheme()
.GetIcon("GuiDropdown", "EditorIcons");
var hbox = new HBoxContainer();
_label = new Label { Text = "None", SizeFlagsHorizontal = SizeFlags.ExpandFill };
var button = new Button { Icon = dropdownIcon, CustomMinimumSize = new Vector2(ButtonSize, 0) };
hbox.AddChild(_label);
hbox.AddChild(button);
AddChild(hbox);
var popup = new Popup { Size = new Vector2I(PopupSize, PopupSize) };
var tree = new Tree
{
HideRoot = true,
AnchorRight = 1,
AnchorBottom = 1,
};
popup.AddChild(tree);
var backgroundStyle = new StyleBoxFlat
{
BgColor = EditorInterface.Singleton.GetEditorTheme().GetColor("base_color", "Editor"),
};
tree.AddThemeStyleboxOverride("panel", backgroundStyle);
AddChild(popup);
ForgeData pluginData = ResourceLoader.Load<ForgeData>("uid://8j4xg16o3qnl");
var tagsManager = new TagsManager([.. pluginData.RegisteredTags]);
TreeItem root = tree.CreateItem();
BuildTreeRecursively(tree, root, tagsManager.RootNode);
button.Pressed += () =>
{
Window win = GetWindow();
popup.Position = (Vector2I)button.GlobalPosition
+ win.Position
- new Vector2I(PopupSize - ButtonSize, -30);
popup.Popup();
};
tree.ItemActivated += () =>
{
TreeItem item = tree.GetSelected();
if (item is null)
{
return;
}
// Build full path from root.
var segments = new List<string>();
TreeItem current = item;
while (current.GetParent() is not null)
{
segments.Insert(0, current.GetText(0));
current = current.GetParent();
}
var fullPath = string.Join(".", segments);
_label.Text = fullPath;
EmitChanged(GetEditedProperty(), fullPath);
popup.Hide();
};
}
public override void _UpdateProperty()
{
var property = GetEditedObject().Get(GetEditedProperty()).AsString();
_label.Text = string.IsNullOrEmpty(property) ? "None" : property;
}
private static void BuildTreeRecursively(Tree tree, TreeItem currentTreeItem, TagNode currentNode)
{
foreach (TagNode childTagNode in currentNode.ChildTags)
{
TreeItem childTreeNode = tree.CreateItem(currentTreeItem);
childTreeNode.SetText(0, childTagNode.TagKey);
childTreeNode.Collapsed = true;
BuildTreeRecursively(tree, childTreeNode, childTagNode);
}
}
}
#endif

View File

@@ -0,0 +1 @@
uid://csmr2puffid4k

View File

@@ -0,0 +1 @@
uid://dnsy7p8h1ujjv

View File

@@ -0,0 +1,160 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using System.Collections.Generic;
using Gamesmiths.Forge.Godot.Core;
using Gamesmiths.Forge.Tags;
using Godot;
using GodotStringArray = Godot.Collections.Array<string>;
namespace Gamesmiths.Forge.Godot.Editor.Tags;
[Tool]
public partial class TagContainerEditorProperty : EditorProperty
{
private readonly Dictionary<TreeItem, TagNode> _treeItemToNode = [];
private VBoxContainer _root = null!;
private Button _containerButton = null!;
private ScrollContainer _scroll = null!;
private Tree _tree = null!;
private Texture2D _checkedIcon = null!;
private Texture2D _uncheckedIcon = null!;
private GodotStringArray _currentValue = [];
public override void _Ready()
{
_root = new VBoxContainer
{
SizeFlagsHorizontal = SizeFlags.ExpandFill,
};
_containerButton = new Button
{
ToggleMode = true,
SizeFlagsHorizontal = SizeFlags.ExpandFill,
};
_containerButton.Toggled += OnToggled;
_scroll = new ScrollContainer
{
Visible = false,
CustomMinimumSize = new Vector2(0, 220),
SizeFlagsHorizontal = SizeFlags.ExpandFill,
SizeFlagsVertical = SizeFlags.ExpandFill,
};
_tree = new Tree
{
HideRoot = true,
SizeFlagsHorizontal = SizeFlags.ExpandFill,
SizeFlagsVertical = SizeFlags.ExpandFill,
};
_scroll.AddChild(_tree);
_root.AddChild(_containerButton);
_root.AddChild(_scroll);
AddChild(_root);
SetBottomEditor(_root);
_checkedIcon = EditorInterface.Singleton
.GetEditorTheme()
.GetIcon("GuiChecked", "EditorIcons");
_uncheckedIcon = EditorInterface.Singleton
.GetEditorTheme()
.GetIcon("GuiUnchecked", "EditorIcons");
_tree.ButtonClicked += OnTreeButtonClicked;
}
public override void _UpdateProperty()
{
GodotObject obj = GetEditedObject();
string propertyName = GetEditedProperty();
_currentValue =
obj.Get(propertyName).AsGodotArray<string>() ?? [];
RebuildTree();
}
private void RebuildTree()
{
_tree.Clear();
_treeItemToNode.Clear();
_containerButton.Text =
$"Container (size: {_currentValue.Count})";
TreeItem root = _tree.CreateItem();
ForgeData forgePluginData =
ResourceLoader.Load<ForgeData>("uid://8j4xg16o3qnl");
var tagsManager =
new TagsManager([.. forgePluginData.RegisteredTags]);
BuildTreeRecursive(root, tagsManager.RootNode);
UpdateMinimumSize();
NotifyPropertyListChanged();
}
private void BuildTreeRecursive(TreeItem parent, TagNode node)
{
foreach (TagNode child in node.ChildTags)
{
TreeItem item = _tree.CreateItem(parent);
item.SetText(0, child.TagKey);
var checkedState =
_currentValue.Contains(child.CompleteTagKey);
item.AddButton(
0,
checkedState ? _checkedIcon : _uncheckedIcon);
_treeItemToNode[item] = child;
BuildTreeRecursive(item, child);
}
}
private void OnTreeButtonClicked(
TreeItem item,
long column,
long id,
long mouseButtonIndex)
{
if (mouseButtonIndex != 1 || id != 0)
{
return;
}
string tag = _treeItemToNode[item].CompleteTagKey;
var newValue = new GodotStringArray();
newValue.AddRange(_currentValue);
if (!newValue.Remove(tag))
{
newValue.Add(tag);
}
EmitChanged(GetEditedProperty(), newValue);
}
private void OnToggled(bool toggled)
{
_scroll.Visible = toggled;
UpdateMinimumSize();
NotifyPropertyListChanged();
}
}
#endif

View File

@@ -0,0 +1 @@
uid://dppi5lmv8q5ti

View File

@@ -0,0 +1,35 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using Gamesmiths.Forge.Godot.Resources;
using Godot;
namespace Gamesmiths.Forge.Godot.Editor.Tags;
public partial class TagContainerInspectorPlugin : EditorInspectorPlugin
{
public override bool _CanHandle(GodotObject @object)
{
return @object is ForgeTagContainer;
}
public override bool _ParseProperty(
GodotObject @object,
Variant.Type type,
string name,
PropertyHint hintType,
string hintString,
PropertyUsageFlags usageFlags,
bool wide)
{
if (name != "ContainerTags")
{
return false;
}
var prop = new TagContainerEditorProperty();
AddPropertyEditor(name, prop);
return true;
}
}
#endif

View File

@@ -0,0 +1 @@
uid://8g56j8vs35mn

View File

@@ -0,0 +1,149 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using System.Collections.Generic;
using Gamesmiths.Forge.Godot.Core;
using Gamesmiths.Forge.Tags;
using Godot;
namespace Gamesmiths.Forge.Godot.Editor.Tags;
[Tool]
public partial class TagEditorProperty : EditorProperty
{
private readonly Dictionary<TreeItem, TagNode> _treeItemToNode = [];
private VBoxContainer _root = null!;
private Button _containerButton = null!;
private ScrollContainer _scroll = null!;
private Tree _tree = null!;
private Texture2D _checkedIcon = null!;
private Texture2D _uncheckedIcon = null!;
private string _currentValue = string.Empty;
public override void _Ready()
{
_root = new VBoxContainer
{
SizeFlagsHorizontal = SizeFlags.ExpandFill,
};
_containerButton = new Button
{
ToggleMode = true,
SizeFlagsHorizontal = SizeFlags.ExpandFill,
};
_containerButton.Toggled += OnToggled;
_scroll = new ScrollContainer
{
Visible = false,
CustomMinimumSize = new Vector2(0, 220),
SizeFlagsHorizontal = SizeFlags.ExpandFill,
SizeFlagsVertical = SizeFlags.ExpandFill,
};
_tree = new Tree
{
HideRoot = true,
SizeFlagsHorizontal = SizeFlags.ExpandFill,
SizeFlagsVertical = SizeFlags.ExpandFill,
};
_scroll.AddChild(_tree);
_root.AddChild(_containerButton);
_root.AddChild(_scroll);
AddChild(_root);
SetBottomEditor(_root);
_checkedIcon = EditorInterface.Singleton
.GetEditorTheme()
.GetIcon("GuiRadioChecked", "EditorIcons");
_uncheckedIcon = EditorInterface.Singleton
.GetEditorTheme()
.GetIcon("GuiRadioUnchecked", "EditorIcons");
_tree.ButtonClicked += OnTreeButtonClicked;
}
public override void _UpdateProperty()
{
GodotObject obj = GetEditedObject();
string propertyName = GetEditedProperty();
_currentValue = obj.Get(propertyName).AsString();
RebuildTree();
}
private void RebuildTree()
{
_tree.Clear();
_treeItemToNode.Clear();
_containerButton.Text =
string.IsNullOrEmpty(_currentValue) ? "(none)" : _currentValue;
TreeItem root = _tree.CreateItem();
ForgeData forgePluginData =
ResourceLoader.Load<ForgeData>("uid://8j4xg16o3qnl");
var tagsManager =
new TagsManager([.. forgePluginData.RegisteredTags]);
BuildTreeRecursive(root, tagsManager.RootNode);
UpdateMinimumSize();
NotifyPropertyListChanged();
}
private void BuildTreeRecursive(TreeItem parent, TagNode node)
{
foreach (TagNode child in node.ChildTags)
{
TreeItem item = _tree.CreateItem(parent);
item.SetText(0, child.TagKey);
var selected = _currentValue == child.CompleteTagKey;
item.AddButton(0, selected ? _checkedIcon : _uncheckedIcon);
_treeItemToNode[item] = child;
BuildTreeRecursive(item, child);
}
}
private void OnTreeButtonClicked(
TreeItem item,
long column,
long id,
long mouseButtonIndex)
{
if (mouseButtonIndex != 1 || id != 0)
{
return;
}
string newValue = _treeItemToNode[item].CompleteTagKey;
if (newValue == _currentValue)
{
newValue = string.Empty;
}
EmitChanged(GetEditedProperty(), newValue);
}
private void OnToggled(bool toggled)
{
_scroll.Visible = toggled;
UpdateMinimumSize();
NotifyPropertyListChanged();
}
}
#endif

View File

@@ -0,0 +1 @@
uid://bc4vhfbuyp7xd

View File

@@ -0,0 +1,35 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using Gamesmiths.Forge.Godot.Resources;
using Godot;
namespace Gamesmiths.Forge.Godot.Editor.Tags;
public partial class TagInspectorPlugin : EditorInspectorPlugin
{
public override bool _CanHandle(GodotObject @object)
{
return @object is ForgeTag;
}
public override bool _ParseProperty(
GodotObject @object,
Variant.Type type,
string name,
PropertyHint hintType,
string hintString,
PropertyUsageFlags usageFlags,
bool wide)
{
if (name != "Tag")
{
return false;
}
var prop = new TagEditorProperty();
AddPropertyEditor(name, prop);
return true;
}
}
#endif

View File

@@ -0,0 +1 @@
uid://cx3reriadfsnh

View File

@@ -0,0 +1,192 @@
// Copyright © Gamesmiths Guild.
#if TOOLS
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using Gamesmiths.Forge.Godot.Core;
using Gamesmiths.Forge.Tags;
using Godot;
namespace Gamesmiths.Forge.Godot.Editor.Tags;
[Tool]
public partial class TagsEditor : VBoxContainer, ISerializationListener
{
private readonly Dictionary<TreeItem, TagNode> _treeItemToNode = [];
private TagsManager _tagsManager = null!;
private ForgeData? _forgePluginData;
private Tree? _tree;
private LineEdit? _tagNameTextField;
private Button? _addTagButton;
private Texture2D? _addIcon;
private Texture2D? _removeIcon;
public bool IsPluginInstance { get; set; }
public override void _Ready()
{
base._Ready();
if (!IsPluginInstance)
{
return;
}
_forgePluginData = ResourceLoader.Load<ForgeData>("uid://8j4xg16o3qnl");
_tagsManager = new TagsManager([.. _forgePluginData.RegisteredTags]);
_addIcon = EditorInterface.Singleton.GetEditorTheme().GetIcon("Add", "EditorIcons");
_removeIcon = EditorInterface.Singleton.GetEditorTheme().GetIcon("Remove", "EditorIcons");
_tree = GetNode<Tree>("%Tree");
_tagNameTextField = GetNode<LineEdit>("%TagNameField");
_addTagButton = GetNode<Button>("%AddTagButton");
ConstructTagTree();
_tree.ButtonClicked += TreeButtonClicked;
_addTagButton.Pressed += AddTagButton_Pressed;
}
public void OnBeforeSerialize()
{
// This method was intentionally left empty.
}
public void OnAfterDeserialize()
{
EnsureInitialized();
_tagsManager = new TagsManager([.. _forgePluginData.RegisteredTags]);
ReconstructTreeNode();
}
private void AddTagButton_Pressed()
{
EnsureInitialized();
Debug.Assert(
_forgePluginData.RegisteredTags is not null,
$"{_forgePluginData.RegisteredTags} should have been initialized by the Forge plugin.");
if (!Tag.IsValidKey(_tagNameTextField.Text, out var _, out var fixedTag))
{
_tagNameTextField.Text = fixedTag;
}
if (_forgePluginData.RegisteredTags.Contains(_tagNameTextField.Text))
{
GD.PushWarning($"Tag [{_tagNameTextField.Text}] is already present in the manager.");
return;
}
_forgePluginData.RegisteredTags.Add(_tagNameTextField.Text);
ResourceSaver.Save(_forgePluginData);
ReconstructTreeNode();
}
private void ReconstructTreeNode()
{
EnsureInitialized();
Debug.Assert(
_forgePluginData.RegisteredTags is not null,
$"{_forgePluginData.RegisteredTags} should have been initialized by the Forge plugin.");
_tagsManager.DestroyTagTree();
_tagsManager = new TagsManager([.. _forgePluginData.RegisteredTags]);
_tree.Clear();
ConstructTagTree();
}
private void ConstructTagTree()
{
EnsureInitialized();
TreeItem rootTreeNode = _tree.CreateItem();
_tree.HideRoot = true;
if (_tagsManager.RootNode.ChildTags.Count == 0)
{
TreeItem childTreeNode = _tree.CreateItem(rootTreeNode);
childTreeNode.SetText(0, "No tag has been registered yet.");
childTreeNode.SetCustomColor(0, Color.FromHtml("EED202"));
return;
}
BuildTreeRecursively(_tree, rootTreeNode, _tagsManager.RootNode);
}
private void BuildTreeRecursively(Tree tree, TreeItem currentTreeItem, TagNode currentNode)
{
foreach (TagNode childTagNode in currentNode.ChildTags)
{
TreeItem childTreeNode = tree.CreateItem(currentTreeItem);
childTreeNode.SetText(0, childTagNode.TagKey);
childTreeNode.AddButton(0, _addIcon);
childTreeNode.AddButton(0, _removeIcon);
_treeItemToNode.Add(childTreeNode, childTagNode);
BuildTreeRecursively(tree, childTreeNode, childTagNode);
}
}
private void TreeButtonClicked(TreeItem item, long column, long id, long mouseButtonIndex)
{
EnsureInitialized();
Debug.Assert(
_forgePluginData.RegisteredTags is not null,
$"{_forgePluginData.RegisteredTags} should have been initialized by the Forge plugin.");
if (mouseButtonIndex == 1)
{
if (id == 0)
{
_tagNameTextField.Text = $"{_treeItemToNode[item].CompleteTagKey}.";
_tagNameTextField.GrabFocus();
_tagNameTextField.CaretColumn = _tagNameTextField.Text.Length;
}
if (id == 1)
{
TagNode selectedTag = _treeItemToNode[item];
for (var i = _forgePluginData.RegisteredTags.Count - 1; i >= 0; i--)
{
var tag = _forgePluginData.RegisteredTags[i];
if (string.Equals(tag, selectedTag.CompleteTagKey, StringComparison.OrdinalIgnoreCase) ||
tag.StartsWith(selectedTag.CompleteTagKey + ".", StringComparison.InvariantCultureIgnoreCase))
{
_forgePluginData.RegisteredTags.Remove(tag);
}
}
if (selectedTag.ParentTagNode is not null
&& !_forgePluginData.RegisteredTags.Contains(selectedTag.ParentTagNode.CompleteTagKey))
{
_forgePluginData.RegisteredTags.Add(selectedTag.ParentTagNode.CompleteTagKey);
}
ResourceSaver.Save(_forgePluginData);
ReconstructTreeNode();
}
}
}
[MemberNotNull(nameof(_tree), nameof(_tagNameTextField), nameof(_forgePluginData))]
private void EnsureInitialized()
{
Debug.Assert(_tree is not null, $"{_tree} should have been initialized on _Ready().");
Debug.Assert(_tagNameTextField is not null, $"{_tagNameTextField} should have been initialized on _Ready().");
Debug.Assert(_forgePluginData is not null, $"{_forgePluginData} should have been initialized on _Ready().");
}
}
#endif

View File

@@ -0,0 +1 @@
uid://do8jplrf64p5f

View File

@@ -0,0 +1,33 @@
[gd_scene format=3 uid="uid://c17f812by5x23"]
[ext_resource type="Script" uid="uid://do8jplrf64p5f" path="res://addons/forge/editor/tags/TagsEditor.cs" id="1_7jg4t"]
[node name="GameplayTagsEditor" type="VBoxContainer" unique_id=1724725192]
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1_7jg4t")
[node name="HBoxContainer" type="HBoxContainer" parent="." unique_id=613044022]
layout_mode = 2
[node name="Label" type="Label" parent="HBoxContainer" unique_id=2121441014]
layout_mode = 2
text = "Tag Name:"
[node name="TagNameField" type="LineEdit" parent="HBoxContainer" unique_id=337174471]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
[node name="AddTagButton" type="Button" parent="HBoxContainer" unique_id=19730410]
unique_name_in_owner = true
layout_mode = 2
text = "Add Tag"
[node name="Tree" type="Tree" parent="." unique_id=1467435445]
unique_name_in_owner = true
layout_mode = 2
size_flags_vertical = 3

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="Component.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="38.71875"
inkscape:cx="-2.5569007"
inkscape:cy="12.229217"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
id="path1"
d="M 2 1 A 1 1 0 0 0 1 2 L 1 10 A 1 1 0 0 0 2 11 L 5 11 L 5 11.25 A 2 2 0 1 0 7 11.25 L 7 11 L 10 11 A 1 1 0 0 0 11 10 L 11 7 L 11.25 7 A 2 2 0 1 0 11.25 5 L 11 5 L 11 2 A 1 1 0 0 0 10 1 L 2 1 z M 5.9511719 1.2792969 C 6.1185719 1.2701534 6.2744307 1.3251527 6.4257812 1.4042969 L 9.2949219 3.0644531 C 9.4301815 3.2067284 9.6365783 3.3229416 9.2851562 3.6445312 L 6.3261719 5.3144531 C 6.1107587 5.4239228 5.8805972 5.4823444 5.5859375 5.3144531 L 2.5742188 3.5644531 C 2.4153933 3.4085242 2.3598137 3.2358539 2.625 3.0136719 L 5.6347656 1.3730469 C 5.7454085 1.3114219 5.8507402 1.2847569 5.9511719 1.2792969 z M 6.0332031 2.6894531 C 5.6520888 2.6894531 5.3417969 2.9070874 5.3417969 3.1777344 C 5.3417969 3.448379 5.6520888 3.6679688 6.0332031 3.6679688 C 6.4143173 3.6679687 6.7226562 3.4483811 6.7226562 3.1777344 C 6.7226563 2.9070883 6.4143179 2.6894531 6.0332031 2.6894531 z M 1.8691406 4.0332031 C 1.9335624 4.0353281 2.0095282 4.0494568 2.0957031 4.0742188 C 3.0773271 4.6476906 5.1953125 5.8535156 5.1953125 5.8535156 C 5.5889109 6.104997 5.5354819 6.2930662 5.5761719 6.4941406 L 5.5859375 9.6835938 C 5.4998457 10.167951 5.2323451 10.165924 4.9355469 10.083984 L 1.8652344 8.2734375 C 1.7066216 8.1255786 1.4907006 8.0558101 1.4941406 7.6835938 C 1.4941406 7.6835938 1.4580738 5.5430631 1.4648438 4.4238281 C 1.5003081 4.2094734 1.5899828 4.0239031 1.8691406 4.0332031 z M 10.107422 4.0507812 C 10.347874 4.0487345 10.420931 4.2373663 10.476562 4.4433594 L 10.480469 7.71875 C 10.438667 8.0884717 10.273485 8.1715083 10.115234 8.2695312 L 6.890625 10.068359 C 6.6433259 10.095889 6.3579755 10.272959 6.2753906 9.6542969 L 6.3007812 6.4492188 C 6.2997989 6.2047287 6.4106434 6.0093456 6.6894531 5.8847656 L 9.8066406 4.1230469 C 9.9299153 4.0738499 10.027272 4.0514652 10.107422 4.0507812 z M 2.6523438 5.6191406 C 2.3485583 5.6191352 2.1015586 5.9000697 2.1015625 6.2480469 C 2.1015586 6.5960221 2.3485543 6.8789002 2.6523438 6.8789062 C 2.9561289 6.8789109 3.2031285 6.5960238 3.203125 6.2480469 C 3.2031285 5.9000703 2.9561284 5.6191358 2.6523438 5.6191406 z M 4.25 7.5273438 C 3.9462137 7.5273391 3.6992152 7.8082734 3.6992188 8.15625 C 3.6992152 8.5042267 3.9462152 8.7871148 4.25 8.7871094 C 4.553784 8.7871157 4.8007853 8.5042276 4.8007812 8.15625 C 4.8007853 7.8082743 4.5537895 7.5273384 4.25 7.5273438 z "
style="fill:#e0e0e0;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bcx7anhepqfmd"
path="res://.godot/imported/Component.svg-24c843a11e5d49c1760fb4d44ede1d06.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/Component.svg"
dest_files=["res://.godot/imported/Component.svg-24c843a11e5d49c1760fb4d44ede1d06.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="ability.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs1" /><sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="53.961086"
inkscape:cx="4.4476496"
inkscape:cy="8.330077"
inkscape:window-width="2560"
inkscape:window-height="1417"
inkscape:window-x="3432"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" /><path
style="fill:#d2d3d5;stroke-width:0.58;stroke-linecap:round;stroke-linejoin:round;paint-order:markers fill stroke;stroke:#d2d3d5;stroke-opacity:1;stroke-dasharray:none;fill-opacity:1"
d="M 1.5381455,12.990843 3.1133547,14.621648 10.767018,6.5602831 12.490483,8.3949386 14.825499,6.0599225 13.027907,4.1882034 13.342949,3.8546296 11.730676,2.2423567 11.489762,2.5944623 10.322253,1.5196136 7.2830261,1.5381455 6.5788149,2.2052929 9.1732772,4.9294783 Z"
id="path6" /></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://l04b8et2244r"
path="res://.godot/imported/ability.svg-cd6e6cbb3e7cb989c28f2c9df8e8c09e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/ability.svg"
dest_files=["res://.godot/imported/ability.svg-cd6e6cbb3e7cb989c28f2c9df8e8c09e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="16"
height="15.999999"
viewBox="0 0 4.2333332 4.233333"
version="1.1"
id="svg1"
xml:space="preserve"
sodipodi:docname="attributes.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="76.312505"
inkscape:cx="8.3341518"
inkscape:cy="7.3710069"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" /><defs
id="defs1"><inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 2.1166665 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="4.2333332 : 2.1166665 : 1"
inkscape:persp3d-origin="2.1166666 : 1.411111 : 1"
id="perspective1" /></defs><path
sodipodi:type="star"
style="fill:none;stroke:#ffca5f;stroke-width:0.31872669;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:markers fill stroke;stroke-opacity:1"
id="path7"
inkscape:flatsided="true"
sodipodi:sides="6"
sodipodi:cx="1.9970515"
sodipodi:cy="2.0594592"
sodipodi:r1="2.1229575"
sodipodi:r2="1.838535"
sodipodi:arg1="-0.52359878"
sodipodi:arg2="0"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 3.8355866,0.99798047 0,2.12295743 -1.8385351,1.0614788 -1.83853512,-1.0614787 -1e-8,-2.12295752 1.83853513,-1.06147874 z"
transform="matrix(0.91313864,0,0,0.91313864,0.18769001,0.24756988)" /><path
id="path9"
style="fill:#ffca5f;fill-opacity:1;stroke:#ffca5f;stroke-width:0.105833;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;paint-order:markers fill stroke"
transform="translate(0.79085464,1.0290699)"
d="M 1.877053,1.4646749 1.239307,2.2259255 -0.14541727,1.8880592 0.98677415,0.95883034 1.2188689,-0.3328871 l 0.76758,0.97928037 z"
sodipodi:nodetypes="ccccccc" /><path
style="fill:#ffca5f;fill-opacity:1;stroke:#ffca5f;stroke-width:0.29104166;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:markers fill stroke;stroke-opacity:1"
d="M 2.014387,0.19069068 V 4.0565107"
id="path10" /><path
style="fill:#6d6e72;fill-opacity:1;stroke:#ffca5f;stroke-width:0.29104166;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:markers fill stroke;stroke-opacity:1"
d="M 3.6855307,3.0961232 0.34671031,1.1580125"
id="path11" /><path
style="fill:#ffca5f;fill-opacity:1;stroke:#ffca5f;stroke-width:0.29104166;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:markers fill stroke;stroke-opacity:1"
d="M 3.6751294,1.1614796 0.36751294,3.0718535"
id="path12" /></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dnqaqpc02lx3p"
path="res://.godot/imported/attributes.svg-742b4837434c2bfaff3c7290518935f0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/attributes.svg"
dest_files=["res://.godot/imported/attributes.svg-742b4837434c2bfaff3c7290518935f0.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg4"
sodipodi:docname="calculator.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs4" /><sodipodi:namedview
id="namedview4"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="27.378291"
inkscape:cx="-0.23741438"
inkscape:cy="9.9531415"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" /><path
style="fill:#e0e0e0;fill-opacity:1"
d="M 4.1470306,14.992828 C 3.7695856,14.858214 3.5750051,14.678558 3.4044987,14.307247 3.2731068,14.021116 3.2653701,13.660984 3.2653701,7.831065 c 0,-5.829919 0.00774,-6.1900511 0.1391286,-6.4761821 C 3.5750051,0.98357254 3.7695856,0.80391606 4.1470306,0.66930228 4.5228372,0.53527283 11.836886,0.51218703 12.309994,0.643537 c 0.382892,0.10630276 0.760087,0.4834984 0.86639,0.8663898 0.05716,0.2058833 0.08326,2.2051995 0.08355,6.3997697 4.23e-4,6.1003445 4.23e-4,6.1003445 -0.170003,6.4338755 -0.200746,0.392868 -0.449214,0.591665 -0.857991,0.686472 -0.163415,0.0379 -1.984333,0.06823 -4.0464859,0.06739 -2.9674845,-0.0012 -3.8096476,-0.02302 -4.0384255,-0.104608 z M 8.5011403,14.115623 C 8.6569841,14.072337 8.8814508,13.921721 9.0124178,13.772558 9.2965965,13.448896 9.3273203,13.017744 9.0931999,12.638929 8.8133927,12.186192 8.6287283,12.14852 6.6892501,12.14852 c -1.6794974,0 -1.7471415,0.0058 -1.9957904,0.171425 -0.3498332,0.23301 -0.5535951,0.661517 -0.4859706,1.021987 0.058017,0.309256 0.4614738,0.744656 0.7396524,0.798213 0.3593062,0.06918 3.2894406,0.04896 3.5539988,-0.02452 z m 3.4971107,-0.255576 c 0.566827,-0.566827 0.343025,-1.434555 -0.423211,-1.640881 -0.613521,-0.165203 -1.192984,0.27487 -1.192984,0.906011 0,0.636726 0.351443,0.984161 1.001094,0.989675 0.307417,0.0026 0.393237,-0.03294 0.615101,-0.254805 z M 5.5583033,11.002882 C 6.0964205,10.725735 6.2987087,10.265851 6.1052831,9.7593729 5.79256,8.940519 4.6656594,8.8944844 4.2904238,9.6852347 4.1234626,10.037079 4.1787926,10.389777 4.45186,10.714299 c 0.3033021,0.360454 0.7438144,0.475349 1.1064433,0.288583 z m 3.2104978,-0.06321 C 9.311954,10.608489 9.4012767,9.8451196 8.9497133,9.3935562 8.7372642,9.1811071 8.6660535,9.1565994 8.2612009,9.1565994 c -0.4048526,0 -0.4760634,0.024508 -0.6885125,0.2369568 -0.6146044,0.6146048 -0.1758974,1.6939698 0.6885125,1.6939698 0.1458088,0 0.3742288,-0.06654 0.5076002,-0.147857 z m 2.9737349,0.03632 C 12.261652,10.707543 12.447674,10.198582 12.207789,9.7030452 12.018286,9.3115837 11.715145,9.118727 11.289332,9.118727 c -0.269725,0 -0.364673,0.045533 -0.613208,0.2940681 -0.261496,0.2614963 -0.294068,0.3351369 -0.294068,0.6648499 0,0.419341 0.128151,0.649248 0.482245,0.865164 0.284844,0.173689 0.584618,0.185015 0.878235,0.03318 z M 5.7163619,7.8447379 C 6.2570275,7.5316953 6.3351994,6.8000423 5.8770171,6.3410788 5.4427471,5.9060684 4.8341492,5.9326578 4.437568,6.4039678 4.0092999,6.9129355 4.1611285,7.5779353 4.7769394,7.8903937 5.141788,8.0755155 5.3339047,8.0661786 5.7163619,7.8447379 Z M 8.6163238,7.9470687 C 8.7074923,7.9209403 8.8864394,7.780709 9.0139841,7.6354437 9.4279889,7.1639182 9.2620537,6.4091311 8.6840924,6.1348705 c -0.3233975,-0.1534622 -0.5223856,-0.1534622 -0.845783,0 -0.3344109,0.1586884 -0.5617911,0.5335256 -0.5617911,0.926115 0,0.3743135 0.3353781,0.8069649 0.7083356,0.9137818 0.2362074,0.067651 0.3100776,0.064411 0.6314699,-0.027699 z M 11.831607,7.8635597 C 12.154209,7.6967358 12.364788,7.2036216 12.277916,6.8184392 12.097072,6.0166034 11.1029,5.7740967 10.573897,6.4027811 10.225551,6.816766 10.35915,7.614722 10.818541,7.8639846 11.09135,8.0120093 11.544905,8.011819 11.831607,7.8635597 Z m 0.0436,-2.9903129 c 0.35249,-0.1228787 0.400467,-0.3274422 0.400467,-1.7074952 0,-1.2258154 -0.0035,-1.2532172 -0.185919,-1.4355875 C 11.903838,1.544245 11.903838,1.544245 8.2612009,1.544245 c -3.6426371,0 -3.6426371,0 -3.8285561,0.1859191 -0.1823704,0.1823703 -0.1859191,0.2097721 -0.1859191,1.4355875 0,1.3543371 0.050224,1.584995 0.3707322,1.7026217 0.2796437,0.1026292 6.9644521,0.1071181 7.2577511,0.00487 z"
id="path1" /></svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b3mnlhfvbttw0"
path="res://.godot/imported/calculator.svg-df0be254cf026a5b94684b8dc0da5148.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/calculator.svg"
dest_files=["res://.godot/imported/calculator.svg-df0be254cf026a5b94684b8dc0da5148.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="cue_data.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="53.961086"
inkscape:cx="9.0806178"
inkscape:cy="7.4776108"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
fill="#e0e0e0"
d="m 5.6478944,1.0744881 h 5.9999996 l -1.9999996,6 h 3.9999996 l -7.9999996,7.9999999 2,-5.9999999 h -4 z"
id="path1"
sodipodi:nodetypes="cccccccc"
style="stroke-width:2" />
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://din7fexs0x53h"
path="res://.godot/imported/cue_data.svg-6d5a0b820e64495d08303cc07b8d0a2e.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/cue_data.svg"
dest_files=["res://.godot/imported/cue_data.svg-6d5a0b820e64495d08303cc07b8d0a2e.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="cue_handler.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="38.71875"
inkscape:cx="2.401937"
inkscape:cy="6.3664245"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
fill="#e0e0e0"
d="m 2.2953994,0.10169496 c -0.7947728,0 -1.4390637,0.64429087 -1.4390637,1.43906364 V 14.492331 c 0,0.794774 0.6442909,1.439064 1.4390637,1.439064 H 13.807908 c 0.794774,0 1.439064,-0.64429 1.439064,-1.439064 V 1.5407586 c 0,-0.79477277 -0.64429,-1.43906364 -1.439064,-1.43906364 z M 6.6125906,2.9798225 H 10.929782 L 9.4907181,7.2970134 H 12.368846 L 6.6125906,13.053269 8.0516543,8.7360772 H 5.1735271 Z"
id="path1"
sodipodi:nodetypes="ssssssssscccccccc"
style="stroke-width:1.43906;fill:#ffca5f;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://snulmvxydrp4"
path="res://.godot/imported/cue_handler.svg-28576752521f681db16ed2a959088ef8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/cue_handler.svg"
dest_files=["res://.godot/imported/cue_handler.svg-28576752521f681db16ed2a959088ef8.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="16"
height="15.999999"
viewBox="0 0 4.2333332 4.233333"
version="1.1"
id="svg1"
xml:space="preserve"
sodipodi:docname="effect.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="45.254834"
inkscape:cx="1.9887378"
inkscape:cy="9.3360192"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" /><defs
id="defs1"><inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 2.1166665 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="4.2333332 : 2.1166665 : 1"
inkscape:persp3d-origin="2.1166666 : 1.411111 : 1"
id="perspective1" /></defs><path
id="path12"
style="display:inline;fill:#ffca5f;stroke:#d2d3d5;stroke-width:0.00370879;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:markers fill stroke;fill-opacity:1"
d="M 2.037535,0.06018232 C 2.1277826,0.43135157 2.1511779,1.286157 1.807312,1.2179896 1.6627523,1.1893322 1.1623632,0.91914409 1.1950463,0.69389747 1.2277292,0.46865071 0.83800893,0.95023713 0.55714215,1.9753147 0.27627529,3.0003922 0.71026348,4.1910236 2.1618721,4.1975096 4.5119453,4.1530485 3.5625124,1.5727466 3.2688439,0.72643753 2.767567,2.1509769 2.8415957,0.41887306 2.037535,0.06018232 Z M 2.119064,1.4269357 c 0.048499,-0.00265 0.093781,0.013289 0.1376308,0.036218 l 0.8315811,0.4809842 c 0.039196,0.04122 0.098917,0.074883 -0.0029,0.1680548 L 2.2277151,2.5960748 c -0.06241,0.031716 -0.1290451,0.048642 -0.2144146,0 L 1.1411587,2.0890134 C 1.0951435,2.0438377 1.0788163,1.994022 1.155646,1.9296511 L 2.0277923,1.4544619 c 0.032055,-0.01785 0.062172,-0.025935 0.091272,-0.027526 z m 0.023904,0.4085468 c -0.1104172,0 -0.1999273,0.063565 -0.1999273,0.1419773 0,0.078413 0.08951,0.1419773 0.1999273,0.1419773 0.1104171,0 0.1999271,-0.063565 0.1999271,-0.1419773 0,-0.078412 -0.08951,-0.1419773 -0.1999271,-0.1419773 z M 0.93688522,2.2251957 c 0.0186643,6.205e-4 0.0402274,0.00442 0.0651939,0.011592 0.2843981,0.1661474 0.8982236,0.5157542 0.8982236,0.5157542 0.1140295,0.07286 0.098313,0.1271849 0.1101046,0.1854398 l 0.0029,0.9243009 C 1.9883621,4.0026102 1.910956,4.0019218 1.8249676,3.9781803 L 0.93543652,3.4537338 C 0.88948298,3.4108963 0.82723551,3.3906214 0.82822935,3.2827815 c 0,0 -0.0106533,-0.6203164 -0.008691,-0.9445835 0.0102748,-0.062103 0.0364707,-0.1156906 0.11734882,-0.113002 z m 2.38681178,0.00507 c 0.069664,-5.924e-4 0.090395,0.054046 0.1064825,0.1137267 l 0.00144,0.9489298 C 3.4195122,3.4000426 3.3717125,3.4238891 3.3258641,3.4522887 L 2.391428,3.9738341 C 2.3197804,3.98181 2.2371584,4.0328281 2.2132319,3.8535878 l 0.00725,-0.9286473 c -2.845e-4,-0.070835 0.032225,-0.1276152 0.113002,-0.1637084 l 0.9025669,-0.509959 c 0.035718,-0.014257 0.064427,-0.020809 0.087648,-0.021007 z m -2.1600827,0.454183 c -0.088014,-1.5e-6 -0.1593634,0.081726 -0.1593623,0.1825422 -1.1e-6,0.1008166 0.071349,0.1825438 0.1593623,0.1825422 0.088013,1.4e-6 0.1593633,-0.081726 0.1593622,-0.1825422 1.1e-6,-0.1008152 -0.071349,-0.1825436 -0.1593622,-0.1825422 z m 0.4628748,0.5526972 c -0.088013,-1.4e-6 -0.1593634,0.081726 -0.1593622,0.1825422 -1.2e-6,0.1008152 0.071349,0.1825436 0.1593622,0.1825422 0.088014,1.5e-6 0.1593634,-0.081726 0.1593623,-0.1825422 1.1e-6,-0.1008166 -0.071349,-0.1825438 -0.1593623,-0.1825422 z"
sodipodi:nodetypes="cssssccccccccccccssssssccccccccssccccccccscccccccccccc" /></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bpl454nqdpfjx"
path="res://.godot/imported/effect.svg-8509f01b90acfb491db905096f21979a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/effect.svg"
dest_files=["res://.godot/imported/effect.svg-8509f01b90acfb491db905096f21979a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="effect_area_2d.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="45.254834"
inkscape:cx="2.784233"
inkscape:cy="7.6124464"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
fill="#fc7f7f"
d="M 1,1 V 5 H 3 V 3 H 5 V 1 Z m 10,0 v 2 h 2 v 2 h 2 V 1 Z M 4,4 v 8 z m 2,2 v 4 z m -5,5 v 4 H 5 V 13 H 3 v -2 z m 12,0 v 2 h -2 v 2 h 4 v -4 z"
id="path1"
sodipodi:nodetypes="cccccccccccccccccccccccccccccccccc"
style="fill:#8da5f3;fill-opacity:1" />
<path
id="path12"
style="display:inline;fill:#8da5f3;stroke:#d2d3d5;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:markers fill stroke;fill-opacity:1"
d="M 7.7175263,1.4524809 C 7.9758008,2.5147092 8.0427544,4.9610285 7.058664,4.7659441 6.6449569,4.6839312 5.2129216,3.9106951 5.3064556,3.2660745 5.3999889,2.6214536 4.2846704,3.9996785 3.4808742,6.9332899 2.6770765,9.8669014 3.9190832,13.274301 8.0733595,13.292864 14.798902,13.165622 12.081772,5.7812031 11.24134,3.3591991 9.8067637,7.4360076 10.018622,2.4789977 7.7175263,1.4524809 Z m 0.2333231,3.9114342 c 0.1387966,-0.00759 0.2683867,0.038031 0.3938779,0.1036501 l 2.3798547,1.3765014 c 0.112173,0.1179647 0.283085,0.2143034 -0.0083,0.4809466 L 8.2617919,8.7098081 c -0.1786076,0.090766 -0.3693068,0.139206 -0.6136211,0 L 5.1522377,7.2586778 C 5.0205494,7.1293919 4.9738234,6.9868272 5.193698,6.8026079 L 7.6896442,5.4426908 c 0.091736,-0.051084 0.1779266,-0.074222 0.2612052,-0.078776 z m 0.068409,1.169197 c -0.3159967,0 -0.5721606,0.1819129 -0.5721606,0.4063167 0,0.2244058 0.2561637,0.4063168 0.5721606,0.4063168 0.3159965,0 0.57216,-0.1819131 0.57216,-0.4063168 0,-0.2244028 -0.2561635,-0.4063167 -0.57216,-0.4063167 z M 4.5676391,7.6484102 c 0.053413,0.00178 0.115125,0.012644 0.1865747,0.033175 C 5.5681165,8.1570731 7.324789,9.1575926 7.324789,9.1575926 7.6511235,9.366107 7.6061453,9.5215754 7.6398912,9.6882924 l 0.00829,2.6452046 c -0.07138,0.401596 -0.2929043,0.399625 -0.5389895,0.331681 L 4.5634933,11.164294 C 4.4319814,11.0417 4.2538388,10.983676 4.2566829,10.675055 c 0,0 -0.030485,-1.7752483 -0.024874,-2.7032499 0.029402,-0.1777291 0.1043738,-0.3310884 0.3358339,-0.323394 z m 6.8306819,0.014509 c 0.199367,-0.0017 0.258696,0.1546714 0.304737,0.3254682 l 0.004,2.7156886 c -0.03461,0.306562 -0.171405,0.374807 -0.302616,0.456082 L 8.7302633,12.65274 C 8.5252194,12.67556 8.2887681,12.821571 8.2202943,12.308613 L 8.2410423,9.6509704 C 8.2402734,9.4482514 8.3333141,9.2857556 8.5644852,9.1824627 L 11.147491,7.7230396 c 0.102219,-0.040802 0.184379,-0.059552 0.250834,-0.060119 z M 5.2165022,8.9627206 c -0.2518824,-4.5e-6 -0.4560732,0.2338865 -0.4560701,0.5224068 -3.1e-6,0.288521 0.2041898,0.5224116 0.4560701,0.5224066 0.2518794,5e-6 0.4560727,-0.2338856 0.4560695,-0.5224066 3.2e-6,-0.2885172 -0.2041896,-0.5224113 -0.4560695,-0.5224068 z m 1.3246751,1.5817324 c -0.2518795,-4e-6 -0.4560731,0.233887 -0.4560696,0.522407 -3.5e-6,0.288517 0.2041896,0.522411 0.4560696,0.522408 0.2518823,3e-6 0.4560731,-0.233887 0.4560699,-0.522408 3.2e-6,-0.288521 -0.2041897,-0.522411 -0.4560699,-0.522407 z"
sodipodi:nodetypes="cssssccccccccccccssssssccccccccssccccccccscccccccccccc" />
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cnjrjkgwyewjx"
path="res://.godot/imported/effect_area_2d.svg-2fa846cc04ac024c81e4a9b438b2b2ce.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/effect_area_2d.svg"
dest_files=["res://.godot/imported/effect_area_2d.svg-2fa846cc04ac024c81e4a9b438b2b2ce.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="effect_area_3d.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="45.254834"
inkscape:cx="2.7842329"
inkscape:cy="7.6124464"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
fill="#fc7f7f"
d="M 1,1 V 5 H 3 V 3 H 5 V 1 Z m 10,0 v 2 h 2 v 2 h 2 V 1 Z M 4,4 v 8 z m 2,2 v 4 z m -5,5 v 4 H 5 V 13 H 3 v -2 z m 12,0 v 2 h -2 v 2 h 4 v -4 z"
id="path1"
sodipodi:nodetypes="cccccccccccccccccccccccccccccccccc"
style="fill:#fc7f7f;fill-opacity:1" />
<path
id="path12"
style="display:inline;fill:#fc7f7f;stroke:#d2d3d5;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:markers fill stroke;fill-opacity:1"
d="M 7.7175263,1.4524809 C 7.9758008,2.5147092 8.0427544,4.9610285 7.058664,4.7659441 6.6449569,4.6839312 5.2129216,3.9106951 5.3064556,3.2660745 5.3999889,2.6214536 4.2846704,3.9996785 3.4808742,6.9332899 2.6770765,9.8669014 3.9190832,13.274301 8.0733595,13.292864 14.798902,13.165622 12.081772,5.7812031 11.24134,3.3591991 9.8067637,7.4360076 10.018622,2.4789977 7.7175263,1.4524809 Z m 0.2333231,3.9114342 c 0.1387966,-0.00759 0.2683867,0.038031 0.3938779,0.1036501 l 2.3798547,1.3765014 c 0.112173,0.1179647 0.283085,0.2143034 -0.0083,0.4809466 L 8.2617919,8.7098081 c -0.1786076,0.090766 -0.3693068,0.139206 -0.6136211,0 L 5.1522377,7.2586778 C 5.0205494,7.1293919 4.9738234,6.9868272 5.193698,6.8026079 L 7.6896442,5.4426908 c 0.091736,-0.051084 0.1779266,-0.074222 0.2612052,-0.078776 z m 0.068409,1.169197 c -0.3159967,0 -0.5721606,0.1819129 -0.5721606,0.4063167 0,0.2244058 0.2561637,0.4063168 0.5721606,0.4063168 0.3159965,0 0.57216,-0.1819131 0.57216,-0.4063168 0,-0.2244028 -0.2561635,-0.4063167 -0.57216,-0.4063167 z M 4.5676391,7.6484102 c 0.053413,0.00178 0.115125,0.012644 0.1865747,0.033175 C 5.5681165,8.1570731 7.324789,9.1575926 7.324789,9.1575926 7.6511235,9.366107 7.6061453,9.5215754 7.6398912,9.6882924 l 0.00829,2.6452046 c -0.07138,0.401596 -0.2929043,0.399625 -0.5389895,0.331681 L 4.5634933,11.164294 C 4.4319814,11.0417 4.2538388,10.983676 4.2566829,10.675055 c 0,0 -0.030485,-1.7752483 -0.024874,-2.7032499 0.029402,-0.1777291 0.1043738,-0.3310884 0.3358339,-0.323394 z m 6.8306819,0.014509 c 0.199367,-0.0017 0.258696,0.1546714 0.304737,0.3254682 l 0.004,2.7156886 c -0.03461,0.306562 -0.171405,0.374807 -0.302616,0.456082 L 8.7302633,12.65274 C 8.5252194,12.67556 8.2887681,12.821571 8.2202943,12.308613 L 8.2410423,9.6509704 C 8.2402734,9.4482514 8.3333141,9.2857556 8.5644852,9.1824627 L 11.147491,7.7230396 c 0.102219,-0.040802 0.184379,-0.059552 0.250834,-0.060119 z M 5.2165022,8.9627206 c -0.2518824,-4.5e-6 -0.4560732,0.2338865 -0.4560701,0.5224068 -3.1e-6,0.288521 0.2041898,0.5224116 0.4560701,0.5224066 0.2518794,5e-6 0.4560727,-0.2338856 0.4560695,-0.5224066 3.2e-6,-0.2885172 -0.2041896,-0.5224113 -0.4560695,-0.5224068 z m 1.3246751,1.5817324 c -0.2518795,-4e-6 -0.4560731,0.233887 -0.4560696,0.522407 -3.5e-6,0.288517 0.2041896,0.522411 0.4560696,0.522408 0.2518823,3e-6 0.4560731,-0.233887 0.4560699,-0.522408 3.2e-6,-0.288521 -0.2041897,-0.522411 -0.4560699,-0.522407 z"
sodipodi:nodetypes="cssssccccccccccccssssssccccccccssccccccccscccccccccccc" />
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://tbuwwf03ikr3"
path="res://.godot/imported/effect_area_3d.svg-576bfbd1397bd9e6d9b73a1004c934e8.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/effect_area_3d.svg"
dest_files=["res://.godot/imported/effect_area_3d.svg-576bfbd1397bd9e6d9b73a1004c934e8.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="16"
height="15.999999"
viewBox="0 0 4.2333332 4.233333"
version="1.1"
id="svg1"
xml:space="preserve"
sodipodi:docname="effect_data.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="45.254834"
inkscape:cx="1.9887378"
inkscape:cy="9.3360192"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" /><defs
id="defs1"><inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 2.1166665 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="4.2333332 : 2.1166665 : 1"
inkscape:persp3d-origin="2.1166666 : 1.411111 : 1"
id="perspective1" /></defs><path
id="path12"
style="display:inline;fill:#d2d3d5;stroke:#d2d3d5;stroke-width:0.00564427;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:markers fill stroke"
d="m 2.1144199,0.11266658 c -0.044282,0.00241 -0.090117,0.0147196 -0.1389013,0.0418909 L 0.64823191,0.87773002 C 0.53130687,0.97569372 0.5561563,1.0515058 0.62618504,1.1202574 L 1.9534708,1.891935 c 0.1299203,0.074026 0.2313301,0.048267 0.3263093,0 L 3.5850177,1.1555342 C 3.7399656,1.01374 3.6490711,0.96250952 3.5894325,0.89977802 L 2.3238753,0.16778639 c -0.066733,-0.034896 -0.135646,-0.0591513 -0.2094554,-0.0551198 z m 0.036379,0.62175183 c 0.1680397,0 0.3042614,0.0967376 0.3042614,0.21606991 0,0.11933258 -0.1362219,0.21606968 -0.3042614,0.21606968 -0.1680396,0 -0.3042616,-0.096738 -0.3042616,-0.21606968 0,-0.11933271 0.136222,-0.21606991 0.3042616,-0.21606991 z M 0.31530865,1.327508 c -0.12308528,-0.0041 -0.16295183,0.077461 -0.17858868,0.1719735 -0.002987,0.4934892 0.0132263,1.4375254 0.0132263,1.4375254 -0.001513,0.1641166 0.093219,0.1949723 0.163154,0.2601658 L 1.6668468,3.9953083 c 0.1308633,0.036131 0.2486638,0.037178 0.2866231,-0.176383 l -0.00441,-1.4066582 c -0.017941,-0.088657 0.00598,-0.1713313 -0.1675639,-0.2822136 0,0 -0.93415802,-0.5320535 -1.36697226,-0.7849067 -0.0379957,-0.010918 -0.0708116,-0.016704 -0.0992162,-0.017641 z m 3.63239755,0.00773 c -0.03534,3.01e-4 -0.079035,0.010277 -0.1333889,0.031969 L 2.4407293,2.1432817 C 2.3177975,2.1982111 2.2683228,2.2846236 2.2687559,2.3924233 l -0.011029,1.4132728 c 0.036413,0.2727785 0.1621518,0.1951364 0.2711898,0.1829982 L 3.9510129,3.1949682 c 0.069775,-0.04322 0.1425195,-0.079511 0.1609509,-0.2425272 l -0.0022,-1.4441401 C 4.0852746,1.4174751 4.053725,1.3343223 3.9477057,1.3352248 Z M 0.66035851,2.0264328 c 0.13394368,-2.1e-6 0.2425288,0.1243754 0.24252723,0.277804 1.57e-6,0.1534288 -0.10858334,0.277806 -0.24252723,0.2778039 -0.1339458,-2.7e-6 -0.24252914,-0.124381 -0.24252743,-0.277809 -1.71e-6,-0.1534289 0.10858339,-0.2778064 0.24252743,-0.277804 z M 1.3647899,2.8675614 c 0.1339458,-2.4e-6 0.2425292,0.1243756 0.2425274,0.277804 1.8e-6,0.1534288 -0.108584,0.2778064 -0.2425274,0.277804 -0.1339437,2.2e-6 -0.2425288,-0.1243755 -0.2425272,-0.277804 -1.6e-6,-0.1534289 0.1085828,-0.2778061 0.2425272,-0.277804 z"
sodipodi:nodetypes="ccccccccccsssssscccccccccsccccccccscccccccccccc" /></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://obsk7rrtq1xd"
path="res://.godot/imported/effect_data.svg-d846693cd1c2700362c2e6f5c6281239.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/effect_data.svg"
dest_files=["res://.godot/imported/effect_data.svg-d846693cd1c2700362c2e6f5c6281239.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="ray_cast_2d.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="19.078125"
inkscape:cx="11.321867"
inkscape:cy="5.3202293"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
id="path1"
d="M 7 1 L 7 2.7050781 C 7.2900472 3.318458 7.8139989 4.6324434 7.7832031 6.0800781 C 7.753814 7.4615875 7.2858874 8.1120413 7 8.3808594 L 7 10 L 4 10 L 8 15 L 12 10 L 9 10 L 9 1 L 7 1 z "
style="fill:#8da5f3;fill-opacity:1" />
<path
id="path12"
style="display:inline;fill:#8da5f3;stroke:#d2d3d5;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:markers fill stroke;fill-opacity:1"
d="M 4.1978808,1.1704294 C 4.365921,1.861544 4.4094828,3.4531862 3.7692071,3.3262589 3.5000377,3.2728989 2.5683167,2.7698105 2.6291727,2.3504027 2.6900281,1.9309948 1.9643713,2.8277055 1.441399,4.7363929 0.91842677,6.6450804 1.7265098,8.8620289 4.4293953,8.8741054 8.8052157,8.7913187 7.0373782,3.9868141 6.4905693,2.4109922 5.5571953,5.0634748 5.6950364,1.8383092 4.1978808,1.1704294 Z m 0.1518064,2.5448858 c 0.090304,-0.00494 0.1746196,0.024744 0.2562679,0.067437 l 1.5483981,0.8955891 c 0.072984,0.076748 0.184183,0.139432 -0.00539,0.3129169 L 4.5520063,5.8922444 c -0.116207,0.059054 -0.2402814,0.090571 -0.3992386,0 L 2.5288418,4.9480994 C 2.4431618,4.8639829 2.4127606,4.7712264 2.5558171,4.6513681 L 4.1797478,3.7665688 c 0.059686,-0.033236 0.115764,-0.048291 0.1699473,-0.051254 z m 0.044511,0.7607113 c -0.205596,0 -0.3722632,0.1183574 -0.3722632,0.2643605 0,0.1460045 0.1666672,0.2643611 0.3722632,0.2643611 0.2055958,0 0.3722631,-0.1183574 0.3722631,-0.2643611 0,-0.1460024 -0.1666673,-0.2643605 -0.3722631,-0.2643605 z m -2.245718,0.7256434 c 0.034752,0.00115 0.074902,0.00822 0.1213911,0.021583 0.5295471,0.3093648 1.6724863,0.9603307 1.6724863,0.9603307 0.2123219,0.1356644 0.1830579,0.2368177 0.2050138,0.345288 l 0.0054,1.7210427 C 4.1063217,8.5112041 3.9621916,8.5099222 3.8020819,8.4657155 L 2.1457806,7.4891997 C 2.0602157,7.4094357 1.9443115,7.3716848 1.9461617,7.1708871 c 0,0 -0.019834,-1.1550243 -0.016185,-1.7588075 0.01913,-0.1156353 0.067908,-0.2154151 0.2185035,-0.2104097 z m 4.4442277,0.00943 c 0.1297136,-0.00108 0.1683147,0.1006334 0.1982689,0.2117588 l 0.00269,1.7669057 C 6.771126,7.3892241 6.6821247,7.4336257 6.5967551,7.4865057 L 4.8568297,8.45762 C 4.7234223,8.472469 4.5695809,8.5674665 4.5250297,8.2337219 L 4.5385282,6.504587 C 4.5380011,6.3726927 4.598532,6.266968 4.748938,6.1997628 l 1.6805737,-0.94954 c 0.066503,-0.026547 0.1199624,-0.038747 0.1632,-0.039117 z m -4.0220601,0.845696 c -0.1638813,-3.3e-6 -0.2967335,0.1521723 -0.2967315,0.3398915 -2e-6,0.1877201 0.1328517,0.3398954 0.2967315,0.3398924 0.1638797,3e-6 0.2967334,-0.1521731 0.2967314,-0.3398924 2e-6,-0.1877169 -0.132851,-0.3398948 -0.2967314,-0.3398915 z M 3.432518,7.0859142 c -0.1638799,-3e-6 -0.2967338,0.1521731 -0.2967313,0.3398916 -2.5e-6,0.1877178 0.1328511,0.3398955 0.2967313,0.3398931 0.1638813,2.4e-6 0.2967333,-0.1521738 0.2967314,-0.3398931 C 3.7292513,7.2380865 3.5963979,7.0859112 3.432518,7.0859142 Z"
sodipodi:nodetypes="cssssccccccccccccssssssccccccccssccccccccscccccccccccc" />
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://d3wjawuu1ej3s"
path="res://.godot/imported/effect_ray_cast_2d.svg-38774a815d0c14e2adb8c8d652e29ca6.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/effect_ray_cast_2d.svg"
dest_files=["res://.godot/imported/effect_ray_cast_2d.svg-38774a815d0c14e2adb8c8d652e29ca6.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="ray_cast_3d.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="19.078125"
inkscape:cx="11.321867"
inkscape:cy="5.3202293"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
id="path1"
d="M 7 1 L 7 2.7050781 C 7.2900472 3.318458 7.8139989 4.6324434 7.7832031 6.0800781 C 7.753814 7.4615875 7.2858874 8.1120413 7 8.3808594 L 7 10 L 4 10 L 8 15 L 12 10 L 9 10 L 9 1 L 7 1 z "
style="fill:#fc7f7f;fill-opacity:1" />
<path
id="path12"
style="display:inline;fill:#fc7f7f;stroke:#d2d3d5;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;paint-order:markers fill stroke;fill-opacity:1"
d="M 4.1978808,1.1704294 C 4.365921,1.861544 4.4094828,3.4531862 3.7692071,3.3262589 3.5000377,3.2728989 2.5683167,2.7698105 2.6291727,2.3504027 2.6900281,1.9309948 1.9643713,2.8277055 1.441399,4.7363929 0.91842677,6.6450804 1.7265098,8.8620289 4.4293953,8.8741054 8.8052157,8.7913187 7.0373782,3.9868141 6.4905693,2.4109922 5.5571953,5.0634748 5.6950364,1.8383092 4.1978808,1.1704294 Z m 0.1518064,2.5448858 c 0.090304,-0.00494 0.1746196,0.024744 0.2562679,0.067437 l 1.5483981,0.8955891 c 0.072984,0.076748 0.184183,0.139432 -0.00539,0.3129169 L 4.5520063,5.8922444 c -0.116207,0.059054 -0.2402814,0.090571 -0.3992386,0 L 2.5288418,4.9480994 C 2.4431618,4.8639829 2.4127606,4.7712264 2.5558171,4.6513681 L 4.1797478,3.7665688 c 0.059686,-0.033236 0.115764,-0.048291 0.1699473,-0.051254 z m 0.044511,0.7607113 c -0.205596,0 -0.3722632,0.1183574 -0.3722632,0.2643605 0,0.1460045 0.1666672,0.2643611 0.3722632,0.2643611 0.2055958,0 0.3722631,-0.1183574 0.3722631,-0.2643611 0,-0.1460024 -0.1666673,-0.2643605 -0.3722631,-0.2643605 z m -2.245718,0.7256434 c 0.034752,0.00115 0.074902,0.00822 0.1213911,0.021583 0.5295471,0.3093648 1.6724863,0.9603307 1.6724863,0.9603307 0.2123219,0.1356644 0.1830579,0.2368177 0.2050138,0.345288 l 0.0054,1.7210427 C 4.1063217,8.5112041 3.9621916,8.5099222 3.8020819,8.4657155 L 2.1457806,7.4891997 C 2.0602157,7.4094357 1.9443115,7.3716848 1.9461617,7.1708871 c 0,0 -0.019834,-1.1550243 -0.016185,-1.7588075 0.01913,-0.1156353 0.067908,-0.2154151 0.2185035,-0.2104097 z m 4.4442277,0.00943 c 0.1297136,-0.00108 0.1683147,0.1006334 0.1982689,0.2117588 l 0.00269,1.7669057 C 6.771126,7.3892241 6.6821247,7.4336257 6.5967551,7.4865057 L 4.8568297,8.45762 C 4.7234223,8.472469 4.5695809,8.5674665 4.5250297,8.2337219 L 4.5385282,6.504587 C 4.5380011,6.3726927 4.598532,6.266968 4.748938,6.1997628 l 1.6805737,-0.94954 c 0.066503,-0.026547 0.1199624,-0.038747 0.1632,-0.039117 z m -4.0220601,0.845696 c -0.1638813,-3.3e-6 -0.2967335,0.1521723 -0.2967315,0.3398915 -2e-6,0.1877201 0.1328517,0.3398954 0.2967315,0.3398924 0.1638797,3e-6 0.2967334,-0.1521731 0.2967314,-0.3398924 2e-6,-0.1877169 -0.132851,-0.3398948 -0.2967314,-0.3398915 z M 3.432518,7.0859142 c -0.1638799,-3e-6 -0.2967338,0.1521731 -0.2967313,0.3398916 -2.5e-6,0.1877178 0.1328511,0.3398955 0.2967313,0.3398931 0.1638813,2.4e-6 0.2967333,-0.1521738 0.2967314,-0.3398931 C 3.7292513,7.2380865 3.5963979,7.0859112 3.432518,7.0859142 Z"
sodipodi:nodetypes="cssssccccccccccccssssssccccccccssccccccccscccccccccccc" />
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dskf1b0eecaxl"
path="res://.godot/imported/effect_ray_cast_3d.svg-d66a481d1126e3560bd16542349178e3.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/effect_ray_cast_3d.svg"
dest_files=["res://.godot/imported/effect_ray_cast_3d.svg-d66a481d1126e3560bd16542349178e3.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="effect_shape_cast_2d.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="38.15625"
inkscape:cx="13.81163"
inkscape:cy="7.8755119"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
id="path1"
style="fill:#8da5f3;fill-opacity:1"
d="M 7.8007812 0.35742188 C 7.9851717 1.1157788 8.032649 2.8619329 7.3300781 2.7226562 C 7.0347193 2.6641044 6.0113482 2.1125579 6.078125 1.6523438 C 6.1449028 1.1921293 5.3492464 2.1751373 4.7753906 4.2695312 C 4.2725277 6.1048268 4.8904099 8.2000344 7.046875 8.6992188 C 7.0214837 8.6994116 7.0268071 8.6990006 7 8.6992188 L 7 10 L 4 10 L 8 15 L 12 10 L 9 10 L 9 8.7109375 C 12.579035 7.9688284 10.872634 3.3217163 10.316406 1.71875 C 9.2922191 4.629307 9.4436034 1.0902832 7.8007812 0.35742188 z M 7.9667969 3.1503906 C 8.0658878 3.1449706 8.1584554 3.1777614 8.2480469 3.2246094 L 9.9472656 4.2070312 C 10.027346 4.2912502 10.149409 4.3604166 9.9414062 4.5507812 L 8.1894531 5.5390625 C 8.0619394 5.6038634 7.9244223 5.6384454 7.75 5.5390625 L 5.96875 4.5019531 C 5.8747337 4.409652 5.8410714 4.3092542 5.9980469 4.1777344 L 7.7792969 3.2070312 C 7.8447868 3.1705613 7.9073417 3.153642 7.9667969 3.1503906 z M 8.015625 3.984375 C 7.7900255 3.984375 7.6074219 4.1151821 7.6074219 4.2753906 C 7.6074219 4.4356008 7.7900255 4.5644531 8.015625 4.5644531 C 8.2412236 4.5644531 8.4238281 4.4355993 8.4238281 4.2753906 C 8.4238281 4.1151827 8.2412236 3.984375 8.015625 3.984375 z M 5.5507812 4.78125 C 5.5889162 4.78252 5.6325818 4.7900335 5.6835938 4.8046875 C 6.2646636 5.1441527 7.5195312 5.8574219 7.5195312 5.8574219 C 7.7525107 6.006286 7.7200485 6.117304 7.7441406 6.2363281 L 7.75 8.125 C 7.6990305 8.411711 7.5409217 8.4117891 7.3652344 8.3632812 L 5.5488281 7.2910156 C 5.4549382 7.2034897 5.3280475 7.1617402 5.3300781 6.9414062 C 5.3300781 6.9414062 5.3065419 5.6742476 5.3105469 5.0117188 C 5.3315419 4.8848326 5.385533 4.7757568 5.5507812 4.78125 z M 10.427734 4.7910156 C 10.570069 4.7898056 10.611662 4.9015004 10.644531 5.0234375 L 10.648438 6.9628906 C 10.623708 7.1817541 10.525317 7.229085 10.431641 7.2871094 L 8.5234375 8.3535156 C 8.3770504 8.3698087 8.2070894 8.4736383 8.1582031 8.1074219 L 8.1738281 6.2109375 C 8.1732476 6.0662105 8.2392578 5.9506972 8.4042969 5.8769531 L 10.248047 4.8339844 C 10.321027 4.8048554 10.380289 4.7914206 10.427734 4.7910156 z M 6.0136719 5.71875 C 5.8338456 5.7187473 5.6894505 5.8858135 5.6894531 6.0917969 C 5.6894505 6.2977811 5.8338474 6.4648473 6.0136719 6.4648438 C 6.1934964 6.4648473 6.3398455 6.2977803 6.3398438 6.0917969 C 6.3398455 5.8858161 6.1934972 5.7187473 6.0136719 5.71875 z M 6.9609375 6.8476562 C 6.781113 6.8476537 6.634763 7.0147197 6.6347656 7.2207031 C 6.634763 7.4266838 6.781113 7.5937526 6.9609375 7.59375 C 7.1407637 7.5937526 7.2851588 7.4266865 7.2851562 7.2207031 C 7.2851588 7.0147188 7.140762 6.8476528 6.9609375 6.8476562 z " />
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dni75h8pnigh2"
path="res://.godot/imported/effect_shape_cast_2d.svg-760a67ed358df0828149d5d37860ebe1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/effect_shape_cast_2d.svg"
dest_files=["res://.godot/imported/effect_shape_cast_2d.svg-760a67ed358df0828149d5d37860ebe1.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="effect_shape_cast_3d.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="38.15625"
inkscape:cx="13.81163"
inkscape:cy="7.8755119"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
id="path1"
d="M 7.8007812 0.35742188 C 7.9851717 1.1157788 8.032649 2.8619329 7.3300781 2.7226562 C 7.0347193 2.6641044 6.0113482 2.1125579 6.078125 1.6523438 C 6.1449028 1.1921293 5.3492464 2.1751373 4.7753906 4.2695312 C 4.2725277 6.1048268 4.8904099 8.2000344 7.046875 8.6992188 C 7.0214837 8.6994116 7.0268071 8.6990006 7 8.6992188 L 7 10 L 4 10 L 8 15 L 12 10 L 9 10 L 9 8.7109375 C 12.579035 7.9688284 10.872634 3.3217163 10.316406 1.71875 C 9.2922191 4.629307 9.4436034 1.0902832 7.8007812 0.35742188 z M 7.9667969 3.1503906 C 8.0658878 3.1449706 8.1584554 3.1777614 8.2480469 3.2246094 L 9.9472656 4.2070312 C 10.027346 4.2912502 10.149409 4.3604166 9.9414062 4.5507812 L 8.1894531 5.5390625 C 8.0619394 5.6038634 7.9244223 5.6384454 7.75 5.5390625 L 5.96875 4.5019531 C 5.8747337 4.409652 5.8410714 4.3092542 5.9980469 4.1777344 L 7.7792969 3.2070312 C 7.8447868 3.1705613 7.9073417 3.153642 7.9667969 3.1503906 z M 8.015625 3.984375 C 7.7900255 3.984375 7.6074219 4.1151821 7.6074219 4.2753906 C 7.6074219 4.4356008 7.7900255 4.5644531 8.015625 4.5644531 C 8.2412236 4.5644531 8.4238281 4.4355993 8.4238281 4.2753906 C 8.4238281 4.1151827 8.2412236 3.984375 8.015625 3.984375 z M 5.5507812 4.78125 C 5.5889162 4.78252 5.6325818 4.7900335 5.6835938 4.8046875 C 6.2646636 5.1441527 7.5195312 5.8574219 7.5195312 5.8574219 C 7.7525107 6.006286 7.7200485 6.117304 7.7441406 6.2363281 L 7.75 8.125 C 7.6990305 8.411711 7.5409217 8.4117891 7.3652344 8.3632812 L 5.5488281 7.2910156 C 5.4549382 7.2034897 5.3280475 7.1617402 5.3300781 6.9414062 C 5.3300781 6.9414062 5.3065419 5.6742476 5.3105469 5.0117188 C 5.3315419 4.8848326 5.385533 4.7757568 5.5507812 4.78125 z M 10.427734 4.7910156 C 10.570069 4.7898056 10.611662 4.9015004 10.644531 5.0234375 L 10.648438 6.9628906 C 10.623708 7.1817541 10.525317 7.229085 10.431641 7.2871094 L 8.5234375 8.3535156 C 8.3770504 8.3698087 8.2070894 8.4736383 8.1582031 8.1074219 L 8.1738281 6.2109375 C 8.1732476 6.0662105 8.2392578 5.9506972 8.4042969 5.8769531 L 10.248047 4.8339844 C 10.321027 4.8048554 10.380289 4.7914206 10.427734 4.7910156 z M 6.0136719 5.71875 C 5.8338456 5.7187473 5.6894505 5.8858135 5.6894531 6.0917969 C 5.6894505 6.2977811 5.8338474 6.4648473 6.0136719 6.4648438 C 6.1934964 6.4648473 6.3398455 6.2977803 6.3398438 6.0917969 C 6.3398455 5.8858161 6.1934972 5.7187473 6.0136719 5.71875 z M 6.9609375 6.8476562 C 6.781113 6.8476537 6.634763 7.0147197 6.6347656 7.2207031 C 6.634763 7.4266838 6.781113 7.5937526 6.9609375 7.59375 C 7.1407637 7.5937526 7.2851588 7.4266865 7.2851562 7.2207031 C 7.2851588 7.0147188 7.140762 6.8476528 6.9609375 6.8476562 z "
style="fill:#fc7f7f;fill-opacity:1" />
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://e2ynjdppura3"
path="res://.godot/imported/effect_shape_cast_3d.svg-7792dea5e674a600e08c04ad5e3ff501.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/effect_shape_cast_3d.svg"
dest_files=["res://.godot/imported/effect_shape_cast_3d.svg-7792dea5e674a600e08c04ad5e3ff501.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="execution.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="54.756581"
inkscape:cx="7.5972603"
inkscape:cy="11.350234"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
id="path1"
style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1.03396;stroke-opacity:1"
d="M 7.0019531 0.65234375 L 6.4199219 2.984375 L 5.7109375 3.2792969 L 3.6503906 2.0429688 L 2.1894531 3.5039062 L 3.4238281 5.5605469 L 3.1328125 6.2734375 L 0.79882812 6.8574219 L 0.79882812 8.9238281 L 3.1289062 9.5058594 L 3.4257812 10.214844 L 2.1894531 12.277344 L 3.6503906 13.738281 L 5.7070312 12.503906 L 6.4199219 12.792969 L 7.0019531 15.128906 L 9.0703125 15.128906 L 9.0703125 15.09375 L 9.6464844 12.785156 L 9.8417969 12.703125 L 9.8417969 9.4804688 C 9.841732 9.0433396 10.099183 8.6881937 10.447266 8.5019531 C 10.59955 8.4204729 10.76831 8.370519 10.941406 8.3613281 C 11.163959 8.3495113 11.393116 8.40455 11.597656 8.5410156 L 13.009766 9.4824219 L 15.253906 8.921875 L 15.253906 6.859375 L 12.929688 6.2792969 L 12.634766 5.5722656 L 13.867188 3.5136719 L 12.410156 2.0566406 L 10.355469 3.2890625 L 9.6464844 3.0019531 L 9.0703125 0.6875 L 9.0703125 0.65234375 L 7.0019531 0.65234375 z M 8.0605469 5.8242188 C 9.1148666 5.8566237 10.0625 6.7122379 10.0625 7.890625 C 10.0625 9.1366866 9.0036711 10.020371 7.8789062 9.953125 C 7.8742063 9.9526749 7.8679772 9.9516519 7.8632812 9.9511719 C 6.8661274 9.8486789 6.0019531 9.0174651 6.0019531 7.890625 C 6.0019531 6.7645404 6.8650202 5.9334789 7.8613281 5.8300781 C 7.8666881 5.8295217 7.8735373 5.828635 7.8789062 5.828125 C 7.9399932 5.824475 7.9999974 5.8223588 8.0605469 5.8242188 z " />
<path
fill="#e0e0e0"
d="m 10.651663,14.48505 a 0.54883988,0.54883988 0 0 0 0.853445,0.456634 l 3.293039,-2.195359 a 0.54883988,0.54883988 0 0 0 0,-0.91327 L 11.505108,9.6376949 A 0.54883988,0.54883988 0 0 0 10.651663,10.09433 Z"
id="path1-1"
style="stroke-width:0.54884" />
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dy874wbbpsewt"
path="res://.godot/imported/execution.svg-83228725b36fa4c88a76f83bfdec0286.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/execution.svg"
dest_files=["res://.godot/imported/execution.svg-83228725b36fa4c88a76f83bfdec0286.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="16"
height="15.999999"
viewBox="0 0 4.2333332 4.233333"
version="1.1"
id="svg1"
xml:space="preserve"
sodipodi:docname="forge_entity.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="77.437505"
inkscape:cx="8.0064563"
inkscape:cy="7.9999995"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" /><defs
id="defs1" /><g
id="layer1"
style="stroke-width:1.00012497;stroke-dasharray:none"><path
style="fill:#ffca5f;stroke-width:1.00012497;stroke-dasharray:none;fill-opacity:1"
d="M 1.5551745,0.96467593 4.1685694,0.98221542 4.1627221,1.4674766 3.4494464,1.6077932 2.8881805,2.0813613 V 2.5081574 L 3.1688135,2.7770973 3.6248422,3.098656 V 3.3208237 L 2.9934185,3.3383635 2.6426274,3.098656 2.0872079,3.07527 1.7364167,3.3149772 H 1.1576111 L 1.1693042,3.07527 1.6019467,2.7595578 1.8825797,2.5081574 V 2.256757 L 1.5785606,1.9819706 1.0172946,1.964431 0.42679601,1.5785606 0.06431173,1.0757598 H 1.5434815 Z"
id="path2" /></g></svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cu6ncpuumjo20"
path="res://.godot/imported/forge_entity.svg-d743df11c7a67f6bf91b9199475109b5.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/forge_entity.svg"
dest_files=["res://.godot/imported/forge_entity.svg-d743df11c7a67f6bf91b9199475109b5.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg4"
sodipodi:docname="modifier.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs4" />
<sodipodi:namedview
id="namedview4"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="38.71875"
inkscape:cx="9.4527845"
inkscape:cy="11.867635"
inkscape:window-width="2560"
inkscape:window-height="1417"
inkscape:window-x="3432"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
sodipodi:type="star"
style="fill:none;fill-rule:nonzero;stroke:#e0e0e0;stroke-width:1.82772133;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
id="path1"
inkscape:flatsided="true"
sodipodi:sides="6"
sodipodi:cx="4.6618242"
sodipodi:cy="2.5827279"
sodipodi:r1="8.1015778"
sodipodi:r2="7.0161719"
sodipodi:arg1="0.52359878"
sodipodi:arg2="1.0471976"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 11.677996,6.6335168 -7.0161718,4.0507892 -7.0161721,-4.0507892 0,-8.1015778 7.0161722,-4.0507888 7.0161717,4.0507889 z"
transform="matrix(0.82069404,0,0,0.82069404,4.1875682,5.8716712)" />
<path
fill="#5fff97"
d="m 7.9265537,9.7974173 -2,-4 -2,4 z"
id="path1-1" />
<path
fill="#ff5f5f"
d="m 11.926554,5.7974173 -2.0000003,4 -2,-4 z"
id="path2" />
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bbwv58ku4cv0i"
path="res://.godot/imported/modifier.svg-3b296d7c6fecf2c20d9d36cbf7b38059.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/modifier.svg"
dest_files=["res://.godot/imported/modifier.svg-3b296d7c6fecf2c20d9d36cbf7b38059.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg4"
sodipodi:docname="modifier_magnitude.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs4" />
<sodipodi:namedview
id="namedview4"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="38.71875"
inkscape:cx="9.4527845"
inkscape:cy="11.867635"
inkscape:window-width="3408"
inkscape:window-height="1417"
inkscape:window-x="24"
inkscape:window-y="723"
inkscape:window-maximized="1"
inkscape:current-layer="svg4" />
<path
fill="#5fff97"
d="M 7.9265536,11.734463 3.9895075,3.8603713 0.05246155,11.734463 Z"
id="path1-1"
style="stroke-width:1.96852" />
<path
fill="#ff5f5f"
d="M 15.800646,3.8603713 11.8636,11.734463 7.9265536,3.8603713 Z"
id="path2"
style="stroke-width:1.96852" />
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cesj1p71jsco5"
path="res://.godot/imported/modifier_magnitude.svg-e06a8ba19595207512a4ac520c20cda1.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/modifier_magnitude.svg"
dest_files=["res://.godot/imported/modifier_magnitude.svg-e06a8ba19595207512a4ac520c20cda1.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg1"
sodipodi:docname="query_expression.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<sodipodi:namedview
id="namedview1"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="64"
inkscape:cx="5.984375"
inkscape:cy="8.2421875"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg1" />
<path
id="path1-0"
style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:1.02962"
d="M 5.421875,0.546875 C 5.1479804,0.54644379 4.885166,0.65466151 4.6914062,0.84765625 L 0.56835938,4.9609375 c -0.40220357,0.4013913 -0.40220357,1.0517337 0,1.453125 L 4.6914062,10.525391 C 4.860843,10.690736 5.0822564,10.79282 5.3183594,10.814453 4.5836009,9.2175943 4.6805978,7.1832208 6.1992188,5.5957031 7.1213377,4.6317496 8.2294899,4.1906359 9.2949219,4.1875 c 1.0654321,-0.00314 2.0781751,0.4157302 2.8750001,1.09375 1.461965,1.243988 2.143226,3.4343473 1.140625,5.546875 h 0.361328 c 0.570025,2.9e-5 1.031942,-0.461014 1.03125,-1.0292969 V 1.5742188 C 14.702735,1.0066984 14.241134,0.54684641 13.671875,0.546875 Z m -1.03125,4.1113281 c 1.3752944,0 1.3752944,2.0566407 0,2.0566407 -1.3752944,0 -1.3752944,-2.0566407 0,-2.0566407 z M 9.2988281,5.1875 C 8.4986886,5.189855 7.6777091,5.4969847 6.921875,6.2871094 6.041631,7.2072883 5.759352,8.2574971 5.8789062,9.2363281 6.0607113,8.9990945 6.2670421,8.7835935 6.4941406,8.59375 6.5433745,7.9581412 6.7710915,7.3329008 7.1953125,6.8339844 7.6285263,6.3244916 8.2798604,5.9672084 9.0722656,5.8984375 9.2623734,5.6462688 9.4799922,5.4181624 9.7207031,5.21875 9.5806907,5.1996101 9.4402892,5.1870845 9.2988281,5.1875 Z m 1.0371099,0.1777344 c 0.136406,0.2591255 0.245758,0.5328346 0.326171,0.8164062 0.333328,0.1639255 0.619801,0.3865299 0.845703,0.6523438 0.483258,0.5686351 0.710938,1.3003355 0.710938,2.0253906 0,0.3037427 -0.04304,0.6087209 -0.125,0.9023438 0.129291,0.2472762 0.234005,0.5077512 0.3125,0.7773432 C 13.333166,8.7717455 12.713495,7.0572511 11.521484,6.0429688 11.167313,5.7416031 10.76299,5.5113762 10.335938,5.3652344 Z M 6.0234375,9.8925781 C 6.1271092,10.22179 6.2754128,10.536225 6.4589844,10.828125 H 7.1503906 C 6.9990896,10.640122 6.874167,10.436045 6.7753906,10.220703 6.5145802,10.138745 6.2625862,10.028784 6.0234375,9.8925781 Z"
sodipodi:nodetypes="ccccccsssccccccssscsccscccccssccscccccc" />
<path
fill="#e0e0e0"
d="m 12.641903,11.13138 a 3.9462881,4.1253232 0 1 0 -1.11601,1.166641 L 14.93233,15.859 16.048339,14.692359 Z M 9.352277,6.3839578 a 2.3677731,2.4751942 0 0 1 0,4.9503882 2.3677731,2.4751942 0 0 1 0,-4.9503882 z"
id="path1"
style="fill:#e0e0e0;fill-opacity:1;stroke-width:0.807;stroke-dasharray:none" />
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dscm401i41h52"
path="res://.godot/imported/query_expression.svg-cb8342a68cfc5f51aa9d1b000f16c8cb.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/query_expression.svg"
dest_files=["res://.godot/imported/query_expression.svg-cb8342a68cfc5f51aa9d1b000f16c8cb.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg2"
sodipodi:docname="scalable_float.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs2" />
<sodipodi:namedview
id="namedview2"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="45.254834"
inkscape:cx="-4.065864"
inkscape:cy="6.1540387"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<g
fill="none"
stroke="#e0e0e0"
stroke-width="2"
id="g2">
<path
id="path1"
style="color:#000000;fill:#e0e0e0;fill-opacity:0.325;-inkscape-stroke:none;stroke:none"
d="M 1 1 L 1 1.8671875 C 1.5661756 1.4731384 2.25303 1.2402344 2.9921875 1.2402344 L 3 1.2402344 L 3 1 L 1 1 z M 2.9921875 4.2402344 C 2.7101237 4.2402344 2.4921875 4.4581706 2.4921875 4.7402344 L 2.4921875 5.2402344 L 3 5.2402344 L 3 4.2402344 L 2.9921875 4.2402344 z M 2.4921875 8.2402344 L 2.4921875 10.240234 L 1 10.240234 L 1 15 L 15 15 L 15 13 L 3 13 L 3 8.2402344 L 2.4921875 8.2402344 z " />
<path
id="path2"
style="color:#000000;fill:#e0e0e0;stroke-linecap:round;-inkscape-stroke:none;stroke:none"
d="M 14 1 A 1 1 0 0 0 13.371094 1.2402344 L 14.492188 1.2402344 L 14.492188 3.2402344 L 14.964844 3.2402344 C 14.986782 2.835054 15 2.4231804 15 2 A 1 1 0 0 0 14 1 z M 14.492188 6.2402344 L 14.492188 6.5273438 C 14.515831 6.4319983 14.54054 6.3370158 14.5625 6.2402344 L 14.492188 6.2402344 z M 11.798828 8.1640625 C 11.440482 8.8910992 11.002975 9.5281747 10.492188 10.080078 L 10.492188 10.240234 L 10.341797 10.240234 C 10.32503 10.257323 10.309886 10.276051 10.292969 10.292969 C 8.5286743 12.057263 5.8333257 13 2 13 A 1 1 0 0 0 1 14 A 1 1 0 0 0 2 15 C 6.1666583 15 9.4713337 13.942729 11.707031 11.707031 C 12.288713 11.125349 12.788618 10.470807 13.212891 9.7480469 C 12.593 9.3794825 12.09613 8.8264434 11.798828 8.1640625 z " />
</g>
<path
fill="#35d4f4"
d="m 2.992629,1.7411957 a 3,3 0 0 0 -2.99999998,3 v 5 H 1.992629 v -2 h 2 v -2 h -2 v -1 a 1,1 0 0 1 1,-1 h 1 v -2 z m 3,0 v 5 a 3,3 0 0 0 3,3 h 1 v -2 h -1 a 1,1 0 0 1 -1,-1 v -5 z m 6,0 v 5 a 3,3 0 0 0 3,3 h 1 v -2 h -1 a 1,1 0 0 1 -1,-1 v -1 h 2 v -2 h -2 v -2 z"
id="path1-6"
style="display:inline" />
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dvlaw4yolashm"
path="res://.godot/imported/scalable_float.svg-49fb50922766865135c5bd252fe20b53.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/scalable_float.svg"
dest_files=["res://.godot/imported/scalable_float.svg-49fb50922766865135c5bd252fe20b53.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg2"
sodipodi:docname="scalable_int.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs2" />
<sodipodi:namedview
id="namedview2"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="45.254834"
inkscape:cx="-7.0268736"
inkscape:cy="11.501534"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<g
fill="none"
stroke="#e0e0e0"
stroke-width="2"
id="g2">
<path
id="path1"
style="color:#000000;fill:#e0e0e0;fill-opacity:0.325;-inkscape-stroke:none;stroke:none"
d="M 1 1 L 1 1.234375 L 3 1.234375 L 3 1 L 1 1 z M 1 4.234375 L 1 5.234375 L 3 5.234375 L 3 4.234375 L 1 4.234375 z M 1 10.234375 L 1 15 L 15 15 L 15 13 L 3 13 L 3 10.234375 L 1 10.234375 z " />
<path
id="path2"
style="color:#000000;fill:#e0e0e0;stroke-linecap:round;-inkscape-stroke:none;stroke:none"
d="M 14 1 A 1 1 0 0 0 13.380859 1.234375 L 14.486328 1.234375 L 14.486328 3.234375 L 14.964844 3.234375 C 14.986572 2.8310508 15 2.4211509 15 2 A 1 1 0 0 0 14 1 z M 14.486328 6.234375 L 14.486328 6.5507812 C 14.512519 6.4459127 14.538352 6.3409854 14.5625 6.234375 L 14.486328 6.234375 z M 11.796875 8.1679688 C 11.437574 8.8960511 10.998628 9.5336185 10.486328 10.085938 L 10.486328 10.234375 L 10.347656 10.234375 C 10.328977 10.253455 10.311836 10.274102 10.292969 10.292969 C 8.5286743 12.057263 5.8333257 13 2 13 A 1 1 0 0 0 1 14 A 1 1 0 0 0 2 15 C 6.1666583 15 9.4713337 13.942729 11.707031 11.707031 C 12.289106 11.124957 12.788437 10.469434 13.212891 9.7460938 C 12.593176 9.3793126 12.095636 8.8282754 11.796875 8.1679688 z " />
</g>
<path
fill="#5abbef"
d="m 0.98607698,1.7338248 v 2 H 2.986077 v -2 z m 11.00000002,0 v 5.0000001 a 3,3 0 0 0 3,3 h 1 v -2 h -1 a 1,1 0 0 1 -1,-1 v -1 h 2 V 3.7338248 h -2 v -2 z m -8,2 v 6.0000001 h 2 v -4 h 1 a 1,1 0 0 1 1,1 v 3 h 2 v -3 a 3,3 0 0 0 -3,-3.0000001 h -1 z M 0.98607698,5.7338249 v 4 H 2.986077 v -4 z"
id="path1-8"
style="display:inline" />
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dnagt7tdo3dos"
path="res://.godot/imported/scalable_int.svg-76441cc193862ebf98ed5979b17f9d4a.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/scalable_int.svg"
dest_files=["res://.godot/imported/scalable_int.svg-76441cc193862ebf98ed5979b17f9d4a.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg3"
sodipodi:docname="tag.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs3" />
<sodipodi:namedview
id="namedview3"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="77.4375"
inkscape:cx="8.0064568"
inkscape:cy="8"
inkscape:window-width="2560"
inkscape:window-height="1417"
inkscape:window-x="3432"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g3" />
<g
fill="none"
stroke="#e0e0e0"
stroke-linejoin="round"
stroke-miterlimit="0"
id="g3">
<path
fill="#8eef97"
d="M 5.5727153,3.5360126 A 0.89391939,0.89118867 0 0 0 4.9407147,3.797131 L 1.3650364,7.3618855 a 0.89391939,0.89118867 0 0 0 0,1.2601408 l 3.5756783,3.5647557 a 0.89391939,0.89118867 0 0 0 0.6320006,0.261117 h 7.1513567 a 0.89391939,0.89118867 0 0 0 0.893917,-0.891188 V 4.4272012 A 0.89391939,0.89118867 0 0 0 12.724072,3.5360126 Z M 4.6787954,7.1007674 a 0.89391939,0.89118867 0 0 1 0,1.7823771 0.89391939,0.89118867 0 0 1 0,-1.7823771 z"
id="path1"
style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:0.892552" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://vsfdeevye6jm"
path="res://.godot/imported/tag.svg-305aafc67c809438fb029f409df5751b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/tag.svg"
dest_files=["res://.godot/imported/tag.svg-305aafc67c809438fb029f409df5751b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="16"
height="16"
version="1.1"
id="svg3"
sodipodi:docname="tags_container.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs3" />
<sodipodi:namedview
id="namedview3"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
inkscape:zoom="77.4375"
inkscape:cx="8.0064568"
inkscape:cy="8"
inkscape:window-width="3407"
inkscape:window-height="1417"
inkscape:window-x="25"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g3" />
<g
fill="none"
stroke="#e0e0e0"
stroke-linejoin="round"
stroke-miterlimit="0"
id="g3">
<path
d="m2.1058 5.8844v-2.7749h2.9127m5.8565 0.0498h2.7749v2.9127"
transform="matrix(1.1315 0 0 1.1398 -.914 -1.888)"
id="path2" />
<path
d="m13.757 11.466v2.7749h-2.9127m-5.856-0.0499h-2.7749v-2.9127"
transform="matrix(1.1315 0 0 1.1398 -1.035 -1.888)"
id="path3" />
<path
fill="#8eef97"
d="M 5.5727153,3.5360126 A 0.89391939,0.89118867 0 0 0 4.9407147,3.797131 L 1.3650364,7.3618855 a 0.89391939,0.89118867 0 0 0 0,1.2601408 l 3.5756783,3.5647557 a 0.89391939,0.89118867 0 0 0 0.6320006,0.261117 h 7.1513567 a 0.89391939,0.89118867 0 0 0 0.893917,-0.891188 V 4.4272012 A 0.89391939,0.89118867 0 0 0 12.724072,3.5360126 Z M 4.6787954,7.1007674 a 0.89391939,0.89118867 0 0 1 0,1.7823771 0.89391939,0.89118867 0 0 1 0,-1.7823771 z"
id="path1"
style="fill:#e0e0e0;fill-opacity:1;stroke:none;stroke-width:0.892552" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -0,0 +1,43 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://ddeg62ps243fn"
path="res://.godot/imported/tags_container.svg-4859716f6791e3bae789357a5e01bb5c.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://addons/forge/icons/tags_container.svg"
dest_files=["res://.godot/imported/tags_container.svg-4859716f6791e3bae789357a5e01bb5c.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1
svg/scale=1.0
editor/scale_with_editor_scale=false
editor/convert_colors_with_editor_theme=false

View File

@@ -0,0 +1,81 @@
// Copyright © Gamesmiths Guild.
using System.Diagnostics;
using Gamesmiths.Forge.Core;
using Gamesmiths.Forge.Godot.Core;
using Godot;
namespace Gamesmiths.Forge.Godot.Nodes;
[GlobalClass]
[Icon("uid://cnjrjkgwyewjx")]
public partial class EffectArea2D : Area2D
{
private EffectApplier? _effectApplier;
[Export]
public Node? EffectOwner { get; set; }
[Export]
public Node? EffectSource { get; set; }
[Export]
public int EffectLevel { get; set; } = 1;
[Export]
public EffectTriggerMode TriggerMode { get; set; }
private IForgeEntity? OwnerEntity => EffectOwner as IForgeEntity;
private IForgeEntity? SourceEntity => EffectSource as IForgeEntity;
public override void _Ready()
{
if (EffectOwner is not null && EffectOwner is not IForgeEntity)
{
GD.PushError($"{nameof(EffectOwner)} must implement {nameof(IForgeEntity)}.");
}
base._Ready();
_effectApplier = new EffectApplier(this);
switch (TriggerMode)
{
case EffectTriggerMode.OnEnter:
BodyEntered += ApplyEffects;
AreaEntered += ApplyEffects;
break;
case EffectTriggerMode.OnExit:
BodyExited += ApplyEffects;
AreaExited += ApplyEffects;
break;
case EffectTriggerMode.OnStay:
BodyEntered += AddEffects;
AreaEntered += AddEffects;
BodyExited += RemoveEffects;
AreaExited += RemoveEffects;
break;
}
}
private void ApplyEffects(Node2D node)
{
Debug.Assert(_effectApplier is not null, $"{_effectApplier} should have been initialized on _Ready().");
_effectApplier.ApplyEffects(node, OwnerEntity, SourceEntity, EffectLevel);
}
private void AddEffects(Node2D node)
{
Debug.Assert(_effectApplier is not null, $"{_effectApplier} should have been initialized on _Ready().");
_effectApplier.AddEffects(node, OwnerEntity, SourceEntity, EffectLevel);
}
private void RemoveEffects(Node2D node)
{
Debug.Assert(_effectApplier is not null, $"{_effectApplier} should have been initialized on _Ready().");
_effectApplier.RemoveEffects(node);
}
}

View File

@@ -0,0 +1 @@
uid://bc8wkfv6rdpu1

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