Campaign Mission Flow - LordBlacksun/Starlancer-OSS GitHub Wiki

Campaign Mission Flow

How Starlancer's 24 single‑player missions are ordered, numbered, and branched — recovered by static RE of the executable (the progression logic) fused with our .DTE decoder (per‑mission content). Addresses are VA for ImageBase 0x400000; all facts read from the decompilation/data — the game is never run. The full 24‑row per‑mission map lives in the repo doc docs/campaign-flow.md.

Progression rule [verified]

DAT_00562DC8 holds the current mission number, used directly as the %d in ..\missions\mission%d.dte. It starts at 1 and the gameflow advance routine steps it after each mission with a valid outcome. The advance is a straight line with three skips and an end (switch at decompiled lines 55856‑55883):

next = current + 1
  11 → 14    (files 12, 13 don't exist)
  16 → 18    (file 17 doesn't exist)
  21 → 23    (file 22 doesn't exist)
  28 → 29    (end-game / credits)

There is no performance‑based path divergence — "branching" is done by loading a variant file into the same slot (below), not by reordering missions.

In‑game number ↔ .dte file [verified]

Because four file numbers are skipped, the player‑facing "Mission N" is offset from the file number (rule: in‑game N = the N‑th existing .dte once files 12/13/17/22 are dropped):

In‑game File In‑game File In‑game File In‑game File
1–11 1–11 12 14 15 18 19 23
13 15 16 19 20 24
14 16 17 20 21 25
18 21 22 26
23 27
24 28

Story anchors

  • Foster's Last Stand = game 15 (mission18.dte) — the captain rams the Reliant into a Coalition carrier. It's the only mission carrying both Reliant and Yamato flight groups (the carrier hand‑off). Scripted via the PlayFostersLastStand Executor command (0x21 0x3F, impl 0x00459740).
  • Dark Reign = game 18 (mission21.dte) — wingman line "MOOSE: I'm getting some activity from the dark reign", plus NAV DARK REIGN, dark‑reign turrets, and an "impressive" camera cutscene.
  • Arc: Reliant tour (games 1–14) → Foster transition (15) → Yamato tour (16–24); end‑game = 29.

Variants & unused content

  • Slot 25 → mission251.dte on replay (flag DAT_00587CDC == 1, load line 86341). [verified]
  • Slot 3 has two files. The single-player campaign, flown from the ship's rooms (vr_rooms), loads mission%d.dte (line 86719), so its mission 3 is mission3.dte: the player is sent through the proto gate (order 26), fights at it, destroys its power core and escapes back through the tunnel. A multiplayer session that is not a deathmatch map (interface_run returns "fly" only from the multiplayer session screens; multiplayer_mission 0) loads mission311.dte for slot 3 (line 86343): it still places the proto gate and its script blows the gate's core (part 20, order 11), but it never sends the player's wing through the gate. Most likely co-op. [load lines and the multiplayer entries verified 2026-10-01, from user ground-truth that the trip through the gate is not in mission311.dte; co-op specifically inferred; this line called mission3.dte unused until then] The files that do not exist are 12, 13, 17, 22.
  • mission191 resembles mission19 but is not the same mission (36 flight groups to 47, with its own Petrovwing, kamovs and warpgate), and the campaign never loads it: WinMain names mission%d.dte by mission_number, with only mission251 (mission 25's second part) and mission311 (mission 3 in a multiplayer game) apart, and nothing sets mission_number to 191. [verified 2026-09-29; this line said the two files match by content until then]
  • mission271 against mission27: load condition still open.

Tables (indexed by mission number)

Table Addr Holds
Mission number shown DAT_004E5C78 short: the mission number the player knows, indexed by file number. 0x00475BFC passes it to sprintf; language_string gets only the string id 0x18A. This row said "Title ID → title string" until 2026-09-29
Earned grade DAT_00562E2A the 0–4 outcome grade you got, per mission
Bonus‑cutscene flag DAT_005009BB if set & grade == 4, play a reward movie

Outcome grades (DAT_0052A428): 0 Failure · 1 Partial Failure · 2 Partial Success · 3 Success · 4 Success + Bonus.

Open items

The load condition for mission271. (Resolved 2026-09-29: DAT_004E5C78 holds the mission numbers the player sees, not title ids; mission191 is never loaded; mission311 is mission 3 in a multiplayer game. Resolved 2026-10-01: the single-player mission 3 is mission3.dte, and the multiplayer game is most likely co-op.)

See also: Missions, AI & Scripting · .DTE Scripting Reference.


Licence — this page is licensed CC BY 4.0: use it in any project, whatever that project's own licence, with attribution. Code and tools in Starlancer-OSS remain GPL-3.0-only, and the Game Reference pages are CC BY-SA 3.0, as they derive from the Starlancer Fandom Wiki. StarLancer, its code and its assets belong to their owners; no licence here covers them.