#22600·OpenRA

Campaign progression: design and roadmap

Author: penev92Created Sep 3, 2026Updated Sep 17, 2026
LabelsFeatureMeta

This writes down the design @pchote and I converged on so campaign progression finally has a canonical plan and future work doesn't restart from scratch. The UI side remains specced by #17067. This issue covers the data/flow architecture and tracks the implementation milestones. Related (and possibly superseded): #14238, #4492, #7213, #21698.

Agreed design

Two strictly separate data concerns:

  1. Campaign definitions — campaign metadata in YAML (initially just a list in mod.yaml?), a per-campaign Lua script that drives progression, and the missions themselves.
  2. Player playthrough progress — everything a playthrough produces: completion/unlock flags, difficulty, completion time, score, later statistics and achievements. Stored per campaign in the support dir. One playthrough per campaign — no multi-playthrough support; replaying arbitrary unlocked missions stays in the existing mission browser.

Progression is driven by Lua, not by the engine:

  • No progression rules in YAML, no C# campaign manager. The engine provides primitives; campaign scripts compose them.
  • Missions record their outcome to the store on victory/defeat (they may also store/load arbitrary data during gameplay). The campaign's shared Lua script computes the currently available missions from stored state — arbitrary conditions allowed. Linear campaigns can simply chain to the next map.
  • Cross-campaign reads are supported (C&C3-style: finish GDI + Nod → unlock Scrin).

UI flow (start simple, fancy later):

  • The main menu gets a Campaign button; the existing Missions browser stays untouched (later enhanced to show playthrough info).
  • Campaign → campaign browser (first implementation - just a list of names - works for ANY mod, including custom ones; later a fancier TD/D2k/RA2 faction picker can be added) → the selected campaign ID is handed to the shellmap's Lua → intro FMVs → mission-selection screen if there's a choice → the mission launches.
  • The mission-selection screen is a fullscreen panel over the current world (shellmap at campaign start, the just-finished mission mid-campaign) — no dummy maps. Its structure comes from mod widget YAML + logic; Lua supplies the content (available missions, images/animations, clickmap regions, callbacks).
  • Post-victory: the victory-conditions code triggers the score screen and runs a callback when it is dismissed. Requires keeping the script context callable after game end.

Milestones

Small PRs; each milestone lands separately and has its own issue:

  • #22601 — Persistent state store + Campaign Lua API
  • #22602 — Standard progress schema + shared campaign Lua boilerplate
  • #22603 — Mission browser integration
  • #22604 — Post-victory flow
  • #22605 — Campaign browser + Lua-driven mission selection

Backlog (designed for, not scheduled)

Fancy per-mod campaign screens and clickmaps (#17639 has ideas), campaign bundles, achievements/statistics UI, an archive screen, campaign-aware save games, an unlock-all option.

Cross-cutting open questions

  • Co-op/multiplayer campaigns (#20540) are explicitly out of scope for now; the store is local-player data.