Compare commits

...

9 Commits

Author SHA1 Message Date
8df4ebb6d5 add: Selectable Tile Map Layer/Mouse Controlled Camera 2025-02-26 20:17:37 +00:00
92770d3425 fix: disabled button turns into focused after click 2025-02-22 05:19:16 +00:00
50ca3f75ec add: Template Define 2025-02-22 03:56:27 +00:00
0e00bacfeb test: vcs.xml 2025-02-21 04:56:53 +00:00
ee4e489219 improve: clean up 2025-02-20 10:42:46 +00:00
d720b03480 add: registry pass through 2025-02-19 17:09:07 +00:00
2c32af6b42 improve: better version control 2025-02-18 21:22:47 +00:00
b21023ba24 fix: missing type 2025-02-18 16:05:37 +00:00
2d0b25f65c Merge pull request 'draft_texture_button' (#2) from draft_texture_button into master
Reviewed-on: #2
2025-02-18 14:29:28 +00:00
23 changed files with 240 additions and 74 deletions

6
.gitignore vendored
View File

@@ -3,3 +3,9 @@ obj/
/packages/ /packages/
riderModule.iml riderModule.iml
/_ReSharper.Caches/ /_ReSharper.Caches/
Package/embedded/polonium_templates/
Package/embedded/Patches/RegistryPassThrough.p.cs
VersionInfo.props
Polonium.sln.DotSettings.user
.godot
.idea

View File

@@ -1,13 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml
# Rider ignored files
/.idea.Hangman.SDK.iml
/modules.xml
/projectSettingsUpdater.xml
/contentModel.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" addBOMForNewFiles="with BOM under Windows, with no BOM otherwise" />
</project>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="UserContentModel">
<attachedFolders />
<explicitIncludes />
<explicitExcludes />
</component>
</project>

View File

@@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="$PROJECT_DIR$/../Polonium.Generators" vcs="Git" />
</component>
</project>

View File

@@ -9,6 +9,7 @@
<Compile Remove="script_templates/**/*.*"/> <Compile Remove="script_templates/**/*.*"/>
<Compile Remove="embedded/polonium_templates/**/*.cs"/> <Compile Remove="embedded/polonium_templates/**/*.cs"/>
<AdditionalFiles Include="Assets/**/*.tscn"/> <AdditionalFiles Include="Assets/**/*.tscn"/>
<AdditionalFiles Include="Data/**/*" />
</ItemGroup> </ItemGroup>
<Target Name="PoloniumPrepare" BeforeTargets="PoloniumClean"> <Target Name="PoloniumPrepare" BeforeTargets="PoloniumClean">
@@ -41,8 +42,16 @@
<EmbeddedFiles Include="$(MSBuildThisFileDirectory)embedded/**/*.*"/> <EmbeddedFiles Include="$(MSBuildThisFileDirectory)embedded/**/*.*"/>
</ItemGroup> </ItemGroup>
<Copy <Copy
SourceFiles="@(EmbeddedFiles)" SourceFiles="@(EmbeddedFiles)"
DestinationFolder="$(ProjectDir)embedded/%(RecursiveDir)" DestinationFolder="$(ProjectDir)embedded/%(RecursiveDir)"
/>
<Copy
SourceFiles="$(MSBuildThisFileDirectory)editorconfig"
DestinationFiles="$(ProjectDir).editorconfig"
/>
<Copy
SourceFiles="$(MSBuildThisFileDirectory)gitignore"
DestinationFiles="$(ProjectDir)embedded/.gitignore"
/> />
<ItemGroup> <ItemGroup>
<PoloniumTemplateFiles Include="$(MSBuildThisFileDirectory)embedded/polonium_templates/**/*.*" /> <PoloniumTemplateFiles Include="$(MSBuildThisFileDirectory)embedded/polonium_templates/**/*.*" />

View File

@@ -0,0 +1,2 @@
[embedded/*]
generated_code = true

1
Package/build/gitignore Normal file
View File

@@ -0,0 +1 @@
*

View File

@@ -17,6 +17,17 @@ public partial class PoloniumTextureButton : TextureButton
private GlobalRegistry.TextureSetName PrivateTextureSetName { get; set; } private GlobalRegistry.TextureSetName PrivateTextureSetName { get; set; }
public bool ButtonDisabled
{
get => Disabled;
set
{
Disabled = value;
FocusMode = Disabled ? FocusMode = Control.FocusModeEnum.None : FocusMode = Control.FocusModeEnum.All;
}
}
[Export] [Export]
public GlobalRegistry.TextureSetName TextureSetName public GlobalRegistry.TextureSetName TextureSetName
{ {
@@ -24,7 +35,7 @@ public partial class PoloniumTextureButton : TextureButton
set set
{ {
PrivateTextureSetName = value; PrivateTextureSetName = value;
t = GlobalRegistry.TextureSetMap.GetValueOrDefault(value, null); TextureSet t = GlobalRegistry.TextureSetMap.GetValueOrDefault(value, null);
if (t is not null) if (t is not null)
{ {
TextureNormal = t.Normal; TextureNormal = t.Normal;

View File

@@ -0,0 +1,48 @@
using Godot;
using Polonium.Attributes;
// ReSharper disable once CheckNamespace
namespace GlobalClasses;
[ProxyNode]
[GlobalClass]
[Tool]
public partial class MouseControlledCamera : Camera2D
{
private Vector2 DragStartPosition { get; set; }
private bool IsDragging { get; set; }
[Signal]
public delegate void ZoomInEventHandler();
[Signal]
public delegate void ZoomOutEventHandler();
[Export]
public MouseButton DragButton { get; set; } = MouseButton.Middle;
public override void _UnhandledInput(InputEvent @event)
{
if (@event is InputEventMouseButton mouseButtonEvent)
{
if(mouseButtonEvent.ButtonIndex == MouseButton.WheelUp)
EmitSignalZoomIn();
else if(mouseButtonEvent.ButtonIndex == MouseButton.WheelDown)
EmitSignalZoomOut();
else if (mouseButtonEvent.ButtonIndex == DragButton)
{
IsDragging = mouseButtonEvent.Pressed;
if(IsDragging)
DragStartPosition = GetGlobalMousePosition();
}
}
else if (@event is InputEventMouseMotion mouseMotionEvent && IsDragging)
{
Vector2 mousePos = GetGlobalMousePosition();
Vector2 offset = DragStartPosition - mousePos;
Position += offset;
DragStartPosition = mousePos;
}
}
}

View File

@@ -7,12 +7,12 @@ namespace GlobalClasses;
[Tool] [Tool]
public partial class CameraScene : Scene public partial class CameraScene : Scene
{ {
private Camera2D Camera { get; set; } protected Camera2D Camera { get; set; }
[Export]
public float MaxZoom { get; set; } public float MaxZoom { get; set; }
[Export]
public float MinZoom { get; set; } public float MinZoom { get; set; }
[Export]
public float ZoomRate { get; set; } public float ZoomRate { get; set; }
private float Zoom private float Zoom
@@ -26,13 +26,18 @@ public partial class CameraScene : Scene
{ {
} }
public sealed override void _Ready() protected virtual void _Ready_()
{ {
Camera = GetNode<Camera2D>("Camera"); Camera = GetNode<Camera2D>("Camera");
}
public sealed override void _Ready()
{
_Ready_();
__Ready(); __Ready();
base._Ready(); base._Ready();
} }
protected void ZoomIn() => Zoom = Mathf.Max(Zoom * (1 + ZoomRate), MaxZoom); protected void ZoomIn() => Zoom = Mathf.Min(Zoom * (1 + ZoomRate), MaxZoom);
protected void ZoomOut() => Zoom = Mathf.Min(Zoom * (1 - ZoomRate), MinZoom); protected void ZoomOut() => Zoom = Mathf.Max(Zoom * (1 - ZoomRate), MinZoom);
protected void ZoomAt(Vector2 pos) => Camera.Position = pos; protected void ZoomAt(Vector2 pos) => Camera.Position = pos;
} }

View File

@@ -0,0 +1,24 @@
using Godot;
using Polonium.Attributes;
// ReSharper disable once CheckNamespace
namespace GlobalClasses;
[ProxyNode]
[GlobalClass]
[Tool]
public partial class MouseControlledCameraScene : CameraScene
{
protected new MouseControlledCamera Camera
{
get => base.Camera as MouseControlledCamera;
set => base.Camera = value;
}
protected sealed override void _Ready_()
{
Camera = GetNode<MouseControlledCamera>("Camera");
Camera.ZoomIn += ZoomIn;
Camera.ZoomOut += ZoomOut;
}
}

View File

@@ -0,0 +1,42 @@
using Godot;
using Polonium.Attributes;
namespace GlobalClasses;
[ProxyNode]
[GlobalClass]
[Tool]
public partial class SelectableTileMapLayer : TileMapLayer
{
[Signal]
public delegate void CellSelectedEventHandler(Vector2I pos);
[Signal]
public delegate void CellEnteredEventHandler(Vector2I pos);
private Vector2I HoveredCell { get; set; } = new Vector2I(-1, -1);
public sealed override void _Process(double delta)
{
Vector2 mousePos = GetGlobalMousePosition();
Vector2 localMousePos = ToLocal(mousePos);
Vector2I cell = LocalToMap(localMousePos);
if(cell != HoveredCell)
{
EmitSignalCellEntered(cell);
HoveredCell = cell;
}
__Process(delta);
base._Process(delta);
}
public override void _UnhandledInput(InputEvent @event)
{
if (@event is InputEventMouseButton mouseEvent)
if (mouseEvent.ButtonIndex == MouseButton.Left && mouseEvent.Pressed)
EmitSignalCellSelected(HoveredCell);
}
[ProxyMethod]
public virtual void __Process(double delta)
{
}
}

View File

@@ -45,7 +45,6 @@ public static partial class GlobalRegistry
} }
public static PoloniumRegistry PoloniumRegistry => PoloniumRegistry.Instance; public static PoloniumRegistry PoloniumRegistry => PoloniumRegistry.Instance;
public static bool Paused { get; set; } public static bool Paused { get; set; }
public static HashSet<ITimeConsumer> TimeConsumers { get; } = [];
public static void Prepare() => PoloniumRegistry.Prepare(); public static void Prepare() => PoloniumRegistry.Prepare();
// ReSharper disable once PartialTypeWithSinglePart // ReSharper disable once PartialTypeWithSinglePart

View File

@@ -1,5 +1,5 @@
<Project Sdk="Godot.NET.Sdk/4.4.0-beta.3"> <Project Sdk="Godot.NET.Sdk/4.4.0-beta.3">
<Import Project="VersionInfo.props" Condition="Exists('VersionInfo.props')" />
<PropertyGroup> <PropertyGroup>
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
@@ -8,12 +8,13 @@
<GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute> <GenerateTargetFrameworkAttribute>false</GenerateTargetFrameworkAttribute>
<PackageId>Polonium</PackageId> <PackageId>Polonium</PackageId>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild> <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Version>0.1.1-x</Version> <Version>$(PoloniumVersion)</Version>
<Authors>Hangman</Authors> <Authors>Hangman</Authors>
<DisableImplicitRestore>true</DisableImplicitRestore> <DisableImplicitRestore>true</DisableImplicitRestore>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Polonium.Tasks" Version="0.1.1-x" /> <PackageReference Include="Polonium.Tasks" Version="$(PoloniumTasksVersion)" />
<None Include="VersionInfo.props" Pack="true" PackagePath="build" Condition="Exists('VersionInfo.props')" />
</ItemGroup> </ItemGroup>
<Target Name="Prepare" BeforeTargets="BeforeBuild"> <Target Name="Prepare" BeforeTargets="BeforeBuild">
<RemoveDir Directories="$(ProjectDir)Package/embedded/polonium_templates" Condition="Exists('$(ProjectDir)Package/polonium_templates')"/> <RemoveDir Directories="$(ProjectDir)Package/embedded/polonium_templates" Condition="Exists('$(ProjectDir)Package/polonium_templates')"/>
@@ -23,16 +24,23 @@
TemplateDirectory="$(ProjectDir)Package/embedded/polonium_templates" TemplateDirectory="$(ProjectDir)Package/embedded/polonium_templates"
AttributeName="ProxyNode" AttributeName="ProxyNode"
/> />
<Delete
Files="$(ProjectDir)Package/embedded/RegistryPassThrough.p.cs"
Condition="Exists('$(ProjectDir)Package/embedded/RegistryPassThrough.p.cs')"
/>
<GenerateRegistryPassThrough ProjectDir="$(ProjectDir)" />
</Target> </Target>
<ItemGroup> <ItemGroup>
<None Include="NuGet.config" /> <None Include="NuGet.config" />
<None Include="Package/build/$(AssemblyName).targets" Pack="true" PackagePath="build" /> <None Include="Package/build/**/*" Pack="true" PackagePath="build" />
<None Include="Package/build/$(AssemblyName).props" Pack="true" PackagePath="build" />
<None Include="Package/embedded/**/*.*" Pack="true" PackagePath="build/embedded" /> <None Include="Package/embedded/**/*.*" Pack="true" PackagePath="build/embedded" />
<None Include="publish" /> <None Include="publish" />
<None Include="build" /> <Compile Remove="Package/**/*.*" />
<Compile Remove="Package/**/*.*"/> </ItemGroup>
<ItemGroup>
<None Include="Package\build\editorconfig" />
</ItemGroup> </ItemGroup>
<Target Name="CleanPreviousPackages" BeforeTargets="Build"> <Target Name="CleanPreviousPackages" BeforeTargets="Build">
@@ -57,6 +65,7 @@
<Target Name="RestoreNoCache" BeforeTargets="Build"> <Target Name="RestoreNoCache" BeforeTargets="Build">
<Message Text="Restoring packages with no chache" Importance="high" /> <Message Text="Restoring packages with no chache" Importance="high" />
<Exec Command="dotnet restore --no-cache" /> <Exec Command="dotnet restore --no-cache" />
</Target> </Target>
</Project> </Project>

17
build
View File

@@ -1,17 +0,0 @@
#! /bin/bash
rm -rf ~/.nuget/packages/polonium*
cd ../Polonium.Tasks
dotnet clean Polonium.Tasks.csproj
dotnet restore Polonium.Tasks.csproj
dotnet build Polonium.Tasks.csproj
cd ../Polonium.Generators
dotnet clean Polonium.Generators.csproj
dotnet restore Polonium.Generators.csproj
dotnet build Polonium.Generators.csproj
cd ../Polonium
rm -rf ~/.nuget/packages/polonium*
dotnet clean Polonium.csproj
dotnet restore Polonium.csproj
dotnet build Polonium.csproj

13
publish Normal file → Executable file
View File

@@ -1,2 +1,13 @@
#!/bin/bash #!/bin/bash
dotnet nuget push "$(ls -t ./.godot/mono/temp/bin/Debug/Polonium.*.nupkg | head -n 1)" --source hangman-lab
SCRIPT_DIR=$(dirname "$(realpath "${BASH_SOURCE[0]}")")/
LATEST_PACKAGE=$(ls -t "${SCRIPT_DIR}".godot/mono/temp/bin/Debug/Polonium.*.nupkg 2>/dev/null | head -n 1)
if [[ -z "$LATEST_PACKAGE" ]]; then
echo "❌ Error: No .nupkg file found in ${SCRIPT_DIR}/bin/Debug/"
exit 1
fi
echo "🚀 Pushing NuGet package: $LATEST_PACKAGE"
dotnet nuget push "$LATEST_PACKAGE" --source hangman-lab

View File

@@ -0,0 +1,6 @@
namespace Polonium.Attributes;
[AttributeUsage(AttributeTargets.Property)]
public class RegistryPassThrough(bool getterOnly = false) : Attribute
{
public bool GetterOnly { get; set; } = getterOnly;
}

View File

@@ -0,0 +1,9 @@
namespace Polonium.Attributes.TemplateDefines;
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class TemplateBlock(string signature, string template, string dataFile, string deps="") : Attribute
{
public string Signature { get; set; } = signature;
public string Template { get; set; } = template;
public string DataFile { get; set; } = dataFile;
public string Deps { get; set; } = deps;
}

View File

@@ -0,0 +1,9 @@
namespace Polonium.Attributes.TemplateDefines;
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class TemplateInline(string template, string dataFile, string deps="") : Attribute
{
public string Template { get; set; } = template;
public string DataFile { get; set; } = dataFile;
public string Deps { get; set; } = deps;
}

View File

@@ -0,0 +1,12 @@
using Godot;
namespace Polonium.Extensions;
public static class LinqExtensions
{
public static T RandomSelect<T>(this IEnumerable<T> source)
{
T[] s = source.ToArray();
return s[GD.Randi() % s.Length];
}
}

View File

@@ -1,5 +1,6 @@
using Godot; using Godot;
using Polonium.Agents; using Polonium.Agents;
using Polonium.Attributes;
using Polonium.Interfaces; using Polonium.Interfaces;
using Polonium.Resources; using Polonium.Resources;
@@ -7,19 +8,24 @@ namespace Polonium;
public class PoloniumRegistry public class PoloniumRegistry
{ {
public static IGlobalRegistry GlobalRegistry { get; set; }
private static PoloniumRegistry InternalInstance { get; set; } private static PoloniumRegistry InternalInstance { get; set; }
public static PoloniumRegistry Instance => InternalInstance ??= new PoloniumRegistry(); public static PoloniumRegistry Instance => InternalInstance ??= new PoloniumRegistry();
[RegistryPassThrough]
public Config Config { get; set; } public Config Config { get; set; }
[RegistryPassThrough]
public Save Save { get; set; } public Save Save { get; set; }
public static void Prepare() public static void Prepare()
{ {
DirAccess.MakeDirAbsolute("user://saves"); DirAccess.MakeDirAbsolute("user://saves");
} }
public Dictionary<string, Agent> Agents { get; set; } = new(); // ReSharper disable once CollectionNeverQueried.Global
[RegistryPassThrough(true)]
public Dictionary<string, Agent> Agents { get; } = new();
public HashSet<ITimeConsumer> TimeConsumers { get; set; } = new(); // ReSharper disable once CollectionNeverQueried.Global
[RegistryPassThrough(true)]
public HashSet<ITimeConsumer> TimeConsumers { get; } = new();
} }

View File

@@ -33,8 +33,13 @@ public static class Utils
{ {
if (!fname.EndsWith(".png")) if (!fname.EndsWith(".png"))
continue; continue;
AnimatedTextureCache[path].SetFrameTexture(f, ResourceLoader.Load<Texture2D>(fname)); AnimatedTextureCache[path].SetFrameTexture(f, ResourceLoader.Load<Texture2D>($"{path}/{fname}"));
f += 1;
} }
AnimatedTextureCache[path].SetFrames(f + 1);
AnimatedTextureCache[path].SetOneShot(false);
AnimatedTextureCache[path].SetSpeedScale(4);
} }
return AnimatedTextureCache[path]; return AnimatedTextureCache[path];
@@ -44,6 +49,7 @@ public static class Utils
return null; return null;
} }
} }
} }
#pragma warning restore CS0618 #pragma warning restore CS0618
#pragma warning restore CS0168 #pragma warning restore CS0168