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:
- 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. - 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
Campaignbutton; the existingMissionsbrowser 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 +
CampaignLua 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.
Source: OpenRA/OpenRA