Classic Ultima Online on Godot 4 .NET
Running from the launchers uses the engine binary in tools\godot. A
Windows export produces a standalone GUO.exe that carries the project’s
own icon and splash. Source of truth: tools\windows\README.md and its run
table.
launchers\windows\doctor.bat REM what a Godot 4.7 .NET Windows export needs, and what this machine has
launchers\windows\export.bat REM headless --export-debug "Windows Desktop" into build\windows\GUO.exe, then the icon check
Underneath: python tools\windows\run.py <doctor|preset|export|icon>.
Output goes to build\windows (under UO_BUILD_DIR if you set it; see
Configuration). The release workflow also exports the
Windows build on GitHub, and a v* tag makes a draft release with it: see
Download a build. Labs features never
ship in an export (Feature Layers).
godot\GUO\GUO.sln if the editor has not (the .NET export needs it).tools\windows\export_presets.template.cfg into
godot\GUO\export_presets.cfg (gitignored). The Android and web tools
render the same file from their own templates, and each re-renders before
it exports, so the three never have to coexist.godot-console --headless --path godot\GUO --export-debug "Windows Desktop" build\windows\GUO.exe.
That runs dotnet publish for win-x64 and packs the project into GUO.pck
beside the executable, with GUO.console.exe as the console wrapper.GUO.exe, saves it
as build\windows\exe_icon.png, and compares it with the 32 px frame of
icon.ico (must match) and with the icon of the export template itself
(must differ: that one is the engine’s logo). A build whose icon is
still the engine’s fails the export.The exported build ships the plugin host, so assistant plugins load from it as they do from a launcher run (commit “Ship plugin_host in an exported build”).
Godot 4.7 writes the executable’s PE resources itself; the rcedit setting of
Godot 4.3 and earlier no longer exists, so there is nothing to install. The
preset’s application/modify_resources=true turns the rewrite on and both
application/icon and application/console_wrapper_icon name
res://icon.ico.
| Where the brand shows | Setting | File |
|---|---|---|
| Window and taskbar at runtime | application/config/icon |
godot\GUO\icon.png |
| Same, with proper small sizes on Windows | application/config/windows_native_icon |
godot\GUO\icon.ico |
The exported .exe and .console.exe |
preset application/icon, console_wrapper_icon |
icon.ico |
| Boot splash | application/boot_splash/image |
godot\GUO\splash.png |
| Android launcher and Android 12 splash | Android preset launcher_icons/* |
godot\GUO\android_icons\*.png |
All of them are built from the one committed master,
design\brand\guo-sigil.png, by python tools\brand\run.py
(launchers\dev\brand_icons.bat). Change the sigil, rerun the tool, commit
what it wrote. The sigil is not pixel art, so the tool resamples it with
Lanczos; AGENTS.md rule 7 is about the game’s art.
One thing an export cannot change: a run through the engine binary
(play.bat, screenshot.bat, the editor) shows the engine’s icon in the
title bar for the first few hundred milliseconds, until Godot applies the
project icon. The exported GUO.exe never shows it.
From the README’s table, recorded 2026-09-26 on the branch that introduced
the sigil: doctor all ok; export produced GUO.exe, GUO.console.exe
and GUO.pck with the icon check passing (distance 0.0 to ours, 103.5 to the
engine’s); the exported executable’s window, title bar and taskbar showed the
sigil, captured through PrintWindow into build\windows\ and
build\brand_capture_exe\. The desktop smoke was 5/5.
doctor.bat lists them. In short: the pinned mono engine, the mono export
templates for 4.7.2 in %APPDATA%\Godot\export_templates\4.7.2.stable.mono,
and the .NET SDK. Build output is gitignored under build\windows\.