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 @@
+
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