Files
runi-dist/docs/launch-providers.md
T

127 lines
5.7 KiB
Markdown

<!-- Generated from the Runi source repository at v0.4.0. -->
<!-- Edit the original there, not this copy. -->
# Launch providers, emulated games and auxiliary actions
## Status
This describes the implemented provider model for Windows executables,
wrapper bundles, emulated games and shared storefront clients.
## Architecture
Launch construction has three independent dimensions:
```text
Launch target -> provider -> execution engine -> optional wrappers -> process
```
- A **target** is Play, Settings, Open Emulator or another explicit action.
- A **provider** builds the program invocation: direct executable, Xenia,
RPCS3 or Ubisoft Connect.
- An **engine** runs that invocation: Proton/UMU, direct Proton or the Linux
host. `host` is deliberately distinct from the legacy runtime backend named
`native`, which means direct Proton.
- Gamescope, MangoHud and CPU affinity wrap Play by default. Utility actions do
not inherit graphical wrappers.
Examples:
| Use case | Provider | Engine |
|---|---|---|
| Existing Windows game/wrapper | executable | Proton/UMU or direct Proton |
| Xenia with an ISO | xenia | Proton |
| RPCS3 with a PS3 game directory | rpcs3 | host |
| Windows Settings tool | executable | inherited Proton engine |
| Open emulator UI | executable/emulator UI | provider's engine |
| Ubisoft game deeplink | ubisoft | shared Proton prefix |
## Persistence and compatibility
Schema v3 added `game.platform`, `game.install_root`, `[launch]` and repeated
`[[actions]]`. Schema v5 adds `[store_binding]` and store-specific identity
aliases. Schema v7 separates a port's original platform from its target OS
and stores optional Lossless Scaling frame-generation settings. Schema v8 adds
explicit OptiScaler provider and migration state. Schema v9 adds managed native
HDR state and migrates the legacy Lossless Scaling HDR option. Schema-v2 files remain
readable and map to Windows, direct
executable provider and Proton engine. Merely reading/listing does not rewrite
them; the first later save creates a `.toml.v2.bak` and writes v9.
Every existing v2 game must produce the same argv, environment and working
directory after loading through the new model. Recipes, prefix bundles,
Doctor, saves, artwork, notes and configuration edits remain compatible.
## Library hierarchy
The primary navigation is platform, followed by a scoped store filter:
```text
All | PC | Windows Ports | Linux Ports | Xbox 360 | PlayStation 3
All stores | Steam | GOG | Epic | Ubisoft | Local
```
Only populated platform/store values appear. Search and sort apply after both
filters. Store and platform remain independent; emulator is neither. An Xbox
360 ISO imported from disk is initially `platform = "xbox360"`,
`store = "local"`. Disc/digital format may become a separate future field.
Port collections are derived from `port_target_os`, while `platform` retains
the original/content platform. A Windows port keeps Proton, Windows Technology
Scan, recipes and OptiScaler. The first curated example is Gears of War 2 -
Hollow (`xbox360 -> windows`); see its
investigation (source repository). Linux Ports is structural in
this phase: ELF/AppImage import and host launch remain future work.
## Add/import experience
Selecting a file or folder runs conservative local detection and shows the
platform, evidence, confidence and additional actions before registration.
Recognized Xenia bundles use the included wrapper by default and offer direct
Xenia as an alternative; an existing wrapper is never silently replaced.
`Settings.exe` and the Xenia UI become Settings and Open Emulator actions using
the same prefix.
RPCS3 imports read `PS3_GAME/PARAM.SFO`, resolve title/Title ID and build a host
launch without Proton. A later library importer can batch-select games from an
RPCS3 installation. Runi detects existing emulators or accepts a custom
path; the first phase does not install/update them.
## Process and safety rules
- Process tracking keys auxiliary work by `(game_id, action_id)`; Play/Stop
remains tied only to the primary target.
- Settings and Open Emulator are unavailable while Play owns the same prefix.
- Relative target paths resolve below the explicit install root. Importers do
not create arbitrary command strings.
- Providers own argument ordering and validation.
- Adapter-suggested save paths require user confirmation; no backup starts
automatically.
- Multi-disc metadata may be retained, but interactive disc switching is a
later phase; existing wrappers continue owning it.
## Shared storefront sessions
Ubisoft games reference a versioned store installation instead of owning a
Wine prefix. The shared installation owns the prefix, launcher path and Proton
runner; changing its runner updates every linked game. Play sends
`uplay://launch/<id>/0` to `upc.exe` and monitors the detected game executable,
not merely the short-lived deeplink process. After that executable exits,
Runi allows 30 seconds for cloud sync before closing the managed session;
**Keep Open** cancels automatic closure. Concurrent games in the same store
prefix are refused, removal of one game never removes the shared prefix, and a
per-game prefix bundle cannot include it. See [ubisoft-connect.md](ubisoft-connect.md).
## Delivery and acceptance
1. Schema-v3 compatibility and golden launch-plan regression tests.
2. Provider/engine boundary with executable and host execution.
3. Auxiliary action model, CLI and GUI process tracking.
4. Xenia and RPCS3 providers plus conservative detection.
5. Platform -> Store library filters and reviewed Add flow.
6. Real acceptance: existing registered Windows titles, Lost Odyssey wrapper,
direct Xenia and one RPCS3-native title.
No phase is accepted while an existing game's launch plan changes
unintentionally.