From 59e86af7a24b39a2cbe545237e5a25426a8ac6eb Mon Sep 17 00:00:00 2001 From: Christopher Wiebe Date: Thu, 30 Apr 2026 20:52:35 -0700 Subject: [PATCH] M0: Scaffold Theriapolis.Godot project (hello-world) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First milestone of the Godot port. Establishes the new project structure and verifies the toolchain is wired up end-to-end. - Godot.NET.Sdk/4.6.2 targeting net8.0; references Theriapolis.Core - project.godot configured for borderless fullscreen at native resolution (per port plan §10 resolved decisions); F11 toggles to windowed - Main.tscn + Main.cs hello-world; nearest-neighbor texture filtering - icon.svg placeholder (T in gild on dark) - Added to Theriapolis.sln Verification: - dotnet build Theriapolis.Godot.csproj: 0 errors, 0 warnings - dotnet build Theriapolis.sln: 0 errors (6 pre-existing warnings unrelated) - dotnet test: 708/708 pass in 26s (unchanged from master) - Godot 4.6.2 opens project; fullscreen + F11 toggle confirmed visually Co-Authored-By: Claude Opus 4.7 --- Theriapolis.Godot/Main.cs | 23 ++++++++ Theriapolis.Godot/Main.tscn | 20 +++++++ Theriapolis.Godot/Theriapolis.Godot.csproj | 13 +++++ Theriapolis.Godot/icon.svg | 5 ++ Theriapolis.Godot/project.godot | 39 ++++++++++++++ Theriapolis.sln | 63 +++++++++++++++++++++- 6 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 Theriapolis.Godot/Main.cs create mode 100644 Theriapolis.Godot/Main.tscn create mode 100644 Theriapolis.Godot/Theriapolis.Godot.csproj create mode 100644 Theriapolis.Godot/icon.svg create mode 100644 Theriapolis.Godot/project.godot diff --git a/Theriapolis.Godot/Main.cs b/Theriapolis.Godot/Main.cs new file mode 100644 index 0000000..b6c895c --- /dev/null +++ b/Theriapolis.Godot/Main.cs @@ -0,0 +1,23 @@ +using Godot; + +namespace Theriapolis.GodotHost; + +public partial class Main : Node +{ + public override void _Ready() + { + GD.Print("Theriapolis.Godot host ready (M0 hello-world)."); + } + + public override void _UnhandledInput(InputEvent @event) + { + if (@event.IsActionPressed("ui_toggle_fullscreen")) + { + var mode = DisplayServer.WindowGetMode(); + DisplayServer.WindowSetMode( + mode == DisplayServer.WindowMode.Fullscreen + ? DisplayServer.WindowMode.Windowed + : DisplayServer.WindowMode.Fullscreen); + } + } +} diff --git a/Theriapolis.Godot/Main.tscn b/Theriapolis.Godot/Main.tscn new file mode 100644 index 0000000..2a83460 --- /dev/null +++ b/Theriapolis.Godot/Main.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=2 format=3 uid="uid://btheriapolis0m0"] + +[ext_resource type="Script" path="res://Main.cs" id="1_main"] + +[node name="Main" type="Node"] +script = ExtResource("1_main") + +[node name="Label" type="Label" parent="."] +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -200.0 +offset_top = -16.0 +offset_right = 200.0 +offset_bottom = 16.0 +horizontal_alignment = 1 +vertical_alignment = 1 +text = "Theriapolis · Godot port · M0 · F11 toggles fullscreen" diff --git a/Theriapolis.Godot/Theriapolis.Godot.csproj b/Theriapolis.Godot/Theriapolis.Godot.csproj new file mode 100644 index 0000000..7c401b6 --- /dev/null +++ b/Theriapolis.Godot/Theriapolis.Godot.csproj @@ -0,0 +1,13 @@ + + + net8.0 + 12 + enable + true + Theriapolis.GodotHost + + + + + + diff --git a/Theriapolis.Godot/icon.svg b/Theriapolis.Godot/icon.svg new file mode 100644 index 0000000..8d21504 --- /dev/null +++ b/Theriapolis.Godot/icon.svg @@ -0,0 +1,5 @@ + + + + T + diff --git a/Theriapolis.Godot/project.godot b/Theriapolis.Godot/project.godot new file mode 100644 index 0000000..4139a08 --- /dev/null +++ b/Theriapolis.Godot/project.godot @@ -0,0 +1,39 @@ +; Engine configuration file. +; Generated for Theriapolis Godot port (M0). +; +; Format documentation: https://docs.godotengine.org/en/stable/classes/class_projectsettings.html + +config_version=5 + +[application] + +config/name="Theriapolis" +config/description="Theriapolis — TTRPG worldgen + simulation game (Godot port)." +run/main_scene="res://Main.tscn" +config/features=PackedStringArray("4.6", "C#", "Forward Plus") +config/icon="res://icon.svg" + +[display] + +; Borderless fullscreen at the primary monitor's native resolution +; (per port plan §10 resolved decisions). F11 toggles to windowed. +window/size/mode=3 +window/stretch/mode="canvas_items" +window/stretch/aspect="expand" + +[dotnet] + +project/assembly_name="Theriapolis.Godot" + +[input] + +ui_toggle_fullscreen={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194342,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} + +[rendering] + +renderer/rendering_method="forward_plus" +textures/canvas_textures/default_texture_filter=0 diff --git a/Theriapolis.sln b/Theriapolis.sln index cf679c0..3598ee6 100644 --- a/Theriapolis.sln +++ b/Theriapolis.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31903.59 @@ -13,31 +13,92 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Theriapolis.Tools", "Theria EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Theriapolis.Tests", "Theriapolis.Tests\Theriapolis.Tests.csproj", "{E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Theriapolis.Godot", "Theriapolis.Godot\Theriapolis.Godot.csproj", "{1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A1A2A3A4-B1B2-C1C2-D1D2-E1E2E3E4E5E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A1A2A3A4-B1B2-C1C2-D1D2-E1E2E3E4E5E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A1A2A3A4-B1B2-C1C2-D1D2-E1E2E3E4E5E6}.Debug|x64.ActiveCfg = Debug|Any CPU + {A1A2A3A4-B1B2-C1C2-D1D2-E1E2E3E4E5E6}.Debug|x64.Build.0 = Debug|Any CPU + {A1A2A3A4-B1B2-C1C2-D1D2-E1E2E3E4E5E6}.Debug|x86.ActiveCfg = Debug|Any CPU + {A1A2A3A4-B1B2-C1C2-D1D2-E1E2E3E4E5E6}.Debug|x86.Build.0 = Debug|Any CPU {A1A2A3A4-B1B2-C1C2-D1D2-E1E2E3E4E5E6}.Release|Any CPU.ActiveCfg = Release|Any CPU {A1A2A3A4-B1B2-C1C2-D1D2-E1E2E3E4E5E6}.Release|Any CPU.Build.0 = Release|Any CPU + {A1A2A3A4-B1B2-C1C2-D1D2-E1E2E3E4E5E6}.Release|x64.ActiveCfg = Release|Any CPU + {A1A2A3A4-B1B2-C1C2-D1D2-E1E2E3E4E5E6}.Release|x64.Build.0 = Release|Any CPU + {A1A2A3A4-B1B2-C1C2-D1D2-E1E2E3E4E5E6}.Release|x86.ActiveCfg = Release|Any CPU + {A1A2A3A4-B1B2-C1C2-D1D2-E1E2E3E4E5E6}.Release|x86.Build.0 = Release|Any CPU {B1B2B3B4-C1C2-D1D2-E1E2-F1F2F3F4F5F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B1B2B3B4-C1C2-D1D2-E1E2-F1F2F3F4F5F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1B2B3B4-C1C2-D1D2-E1E2-F1F2F3F4F5F6}.Debug|x64.ActiveCfg = Debug|Any CPU + {B1B2B3B4-C1C2-D1D2-E1E2-F1F2F3F4F5F6}.Debug|x64.Build.0 = Debug|Any CPU + {B1B2B3B4-C1C2-D1D2-E1E2-F1F2F3F4F5F6}.Debug|x86.ActiveCfg = Debug|Any CPU + {B1B2B3B4-C1C2-D1D2-E1E2-F1F2F3F4F5F6}.Debug|x86.Build.0 = Debug|Any CPU {B1B2B3B4-C1C2-D1D2-E1E2-F1F2F3F4F5F6}.Release|Any CPU.ActiveCfg = Release|Any CPU {B1B2B3B4-C1C2-D1D2-E1E2-F1F2F3F4F5F6}.Release|Any CPU.Build.0 = Release|Any CPU + {B1B2B3B4-C1C2-D1D2-E1E2-F1F2F3F4F5F6}.Release|x64.ActiveCfg = Release|Any CPU + {B1B2B3B4-C1C2-D1D2-E1E2-F1F2F3F4F5F6}.Release|x64.Build.0 = Release|Any CPU + {B1B2B3B4-C1C2-D1D2-E1E2-F1F2F3F4F5F6}.Release|x86.ActiveCfg = Release|Any CPU + {B1B2B3B4-C1C2-D1D2-E1E2-F1F2F3F4F5F6}.Release|x86.Build.0 = Release|Any CPU {C1C2C3C4-D1D2-E1E2-F1F2-A1A2A3A4A5A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C1C2C3C4-D1D2-E1E2-F1F2-A1A2A3A4A5A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1C2C3C4-D1D2-E1E2-F1F2-A1A2A3A4A5A6}.Debug|x64.ActiveCfg = Debug|Any CPU + {C1C2C3C4-D1D2-E1E2-F1F2-A1A2A3A4A5A6}.Debug|x64.Build.0 = Debug|Any CPU + {C1C2C3C4-D1D2-E1E2-F1F2-A1A2A3A4A5A6}.Debug|x86.ActiveCfg = Debug|Any CPU + {C1C2C3C4-D1D2-E1E2-F1F2-A1A2A3A4A5A6}.Debug|x86.Build.0 = Debug|Any CPU {C1C2C3C4-D1D2-E1E2-F1F2-A1A2A3A4A5A6}.Release|Any CPU.ActiveCfg = Release|Any CPU {C1C2C3C4-D1D2-E1E2-F1F2-A1A2A3A4A5A6}.Release|Any CPU.Build.0 = Release|Any CPU + {C1C2C3C4-D1D2-E1E2-F1F2-A1A2A3A4A5A6}.Release|x64.ActiveCfg = Release|Any CPU + {C1C2C3C4-D1D2-E1E2-F1F2-A1A2A3A4A5A6}.Release|x64.Build.0 = Release|Any CPU + {C1C2C3C4-D1D2-E1E2-F1F2-A1A2A3A4A5A6}.Release|x86.ActiveCfg = Release|Any CPU + {C1C2C3C4-D1D2-E1E2-F1F2-A1A2A3A4A5A6}.Release|x86.Build.0 = Release|Any CPU {D1D2D3D4-E1E2-F1F2-A1A2-B1B2B3B4B5B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D1D2D3D4-E1E2-F1F2-A1A2-B1B2B3B4B5B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D1D2D3D4-E1E2-F1F2-A1A2-B1B2B3B4B5B6}.Debug|x64.ActiveCfg = Debug|Any CPU + {D1D2D3D4-E1E2-F1F2-A1A2-B1B2B3B4B5B6}.Debug|x64.Build.0 = Debug|Any CPU + {D1D2D3D4-E1E2-F1F2-A1A2-B1B2B3B4B5B6}.Debug|x86.ActiveCfg = Debug|Any CPU + {D1D2D3D4-E1E2-F1F2-A1A2-B1B2B3B4B5B6}.Debug|x86.Build.0 = Debug|Any CPU {D1D2D3D4-E1E2-F1F2-A1A2-B1B2B3B4B5B6}.Release|Any CPU.ActiveCfg = Release|Any CPU {D1D2D3D4-E1E2-F1F2-A1A2-B1B2B3B4B5B6}.Release|Any CPU.Build.0 = Release|Any CPU + {D1D2D3D4-E1E2-F1F2-A1A2-B1B2B3B4B5B6}.Release|x64.ActiveCfg = Release|Any CPU + {D1D2D3D4-E1E2-F1F2-A1A2-B1B2B3B4B5B6}.Release|x64.Build.0 = Release|Any CPU + {D1D2D3D4-E1E2-F1F2-A1A2-B1B2B3B4B5B6}.Release|x86.ActiveCfg = Release|Any CPU + {D1D2D3D4-E1E2-F1F2-A1A2-B1B2B3B4B5B6}.Release|x86.Build.0 = Release|Any CPU {E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}.Debug|x64.ActiveCfg = Debug|Any CPU + {E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}.Debug|x64.Build.0 = Debug|Any CPU + {E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}.Debug|x86.Build.0 = Debug|Any CPU {E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}.Release|Any CPU.ActiveCfg = Release|Any CPU {E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}.Release|Any CPU.Build.0 = Release|Any CPU + {E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}.Release|x64.ActiveCfg = Release|Any CPU + {E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}.Release|x64.Build.0 = Release|Any CPU + {E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}.Release|x86.ActiveCfg = Release|Any CPU + {E1E2E3E4-F1F2-A1A2-B1B2-C1C2C3C4C5C6}.Release|x86.Build.0 = Release|Any CPU + {1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}.Debug|x64.ActiveCfg = Debug|Any CPU + {1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}.Debug|x64.Build.0 = Debug|Any CPU + {1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}.Debug|x86.ActiveCfg = Debug|Any CPU + {1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}.Debug|x86.Build.0 = Debug|Any CPU + {1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}.Release|Any CPU.ActiveCfg = Debug|Any CPU + {1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}.Release|Any CPU.Build.0 = Debug|Any CPU + {1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}.Release|x64.ActiveCfg = Debug|Any CPU + {1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}.Release|x64.Build.0 = Debug|Any CPU + {1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}.Release|x86.ActiveCfg = Debug|Any CPU + {1E1A085D-6303-450C-BBF6-2B44C2CCA0FF}.Release|x86.Build.0 = Debug|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE EndGlobalSection EndGlobal