Files
2026-08-06 15:15:07 +01:00

4.5 KiB

Gen1Recomp Xbox UWP build notes

This is the Xbox Dev Mode package for Gen1Recomp.

The rough shape is:

  • Gen1RecompUWP.exe starts LÖVE through SDL's WinRT wrapper
  • the bundled LÖVE 11.5 UWP backend provides LuaJIT and the Xbox file picker
  • the bundled SDL2 runtime contains the Xbox controller mapping
  • ANGLE provides OpenGL ES over D3D11
  • the bundled runtime contains the audio, font, video, and compression libraries

What You Need

The tested toolchain is:

  • Visual Studio 2022 17.14
  • MSVC v143 x64/x86 build tools
  • C++ Universal Windows Platform tools
  • Windows 11 SDK 10.0.26100.0
  • CMake 3.24 or newer
  • Git for Windows
  • Info-ZIP zip and unzip

Use Visual Studio Installer to add Universal Windows Platform development, the v143 C++ tools, CMake tools for Windows, and Windows SDK 10.0.26100.0.

The x64 UWP dependencies are committed under third_party. Their versions, source revisions, licences, and hashes are recorded in third_party/manifest.json. No additional checkout or environment variable is required for a normal game build.

Rebuild the Dependencies

Run the dependency rebuild from the repository root:

.\scripts\xbox-uwp\rebuild_dependencies.ps1

The script clones the pinned SDL2, LÖVE, LuaJIT, vcpkg, depot_tools, and ANGLE sources when they are missing. It applies the Xbox SDL2 patch, builds the x64 UWP Release libraries, stages the required DLLs, import libraries, headers, and licences under third_party, updates every SHA-256 entry in the manifest, then builds the Release MSIX.

The generated source checkouts are ignored by Git. A fresh ANGLE sync is about 10 GB, so allow at least 20 GB of free disk space for all sources and build outputs. Use -SkipAngle to retain the existing pinned ANGLE runtime while rebuilding SDL2, LÖVE, LuaJIT, and the vcpkg libraries. Use -SkipPackage when only the dependency bundle needs to be refreshed. The rebuild stops if a source checkout has local changes. Remove that generated source directory to restore the pinned revision.

Build the MSIX

Run the Xbox build from Git Bash at the repository root:

scripts/build_xbox_uwp.sh --release --version 1.2.3

The build uses scripts/pack_love.sh to create and verify the same ROM-free game.love payload used by the other release targets. It then links the UWP host and stages LÖVE, LuaJIT, SDL2, ANGLE, and the vcpkg runtime DLLs.

Use --relwithdebinfo for a package with symbols. To package a .love produced by another build or downloaded from CI, pass --game-love path/to/game.love. The upstream X.Y.Z release becomes X.Y.Z.0 in the generated MSIX manifest. Neither the manifest template nor src/core/Version.lua is edited in place.

The manifest publisher must match the signing certificate subject. Pass it when preparing a signed package:

scripts/build_xbox_uwp.sh --release --version 1.2.3 \
  --publisher "CN=Gen1Recomp"

The normal build is unsigned. Release CI supplies the private PFX and password from XBOX_UWP_SIGNING_CERTIFICATE and XBOX_UWP_SIGNING_PASSWORD; neither may be committed. The public certificate is safe to include with the release.

Run the offline packaging checks from Git Bash:

bash scripts/xbox-uwp/selftest_build_xbox_uwp.sh

Build Output

Visual Studio package output lands under:

ports\uwp\build\release\AppPackages\Gen1RecompUWP

The build also stages the distributable archive and checksum under:

dist\xbox-uwp\gen1recomp-X.Y.Z-xbox-uwp.zip
dist\xbox-uwp\gen1recomp-X.Y.Z-xbox-uwp.zip.sha256

The archive contains the MSIX, framework dependencies, build provenance and, for a signed release, the public certificate. The third-party notices are packaged inside the MSIX. Install the MSIX and dependency packages through Xbox Device Portal.

Runtime Data

The package contains no ROM, generated cache, save or mod data. The Xbox file picker copies user-selected files into LocalState and the launcher imports them from there. Saves, ROM cache and installed mods remain under the LÖVE save directory in LocalState.

The launcher also checks LocalState\pokemon-love2d\baseroms once at startup for clean Red, Blue, and Yellow ROMs. Compatible files are offered on their launcher tabs and remain in baseroms after import. The file picker remains available when no compatible ROM is found.

LuaJIT requires the codeGeneration capability. removableStorage exposes external media to the Xbox picker. The network capabilities support relay play and direct hosting. The package does not request full trust or broad filesystem access.