Missions are the fundamental unit of progression in a Simterm campaign. Each entry in theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/0x-unkwn0wn/simterm/llms.txt
Use this file to discover all available pages before exploring further.
missions list represents one self-contained operation: it defines the target host (or network), the kill-chain parameters, the narrative text, and — optionally — branching endings that let the player choose how the operation closes. Missions are played in the order they appear in the list.
Mission struct fields
| Field | Type | Default | Description |
|---|---|---|---|
id | string | required | Internal identifier. Must be unique and non-empty. |
name | string | required | Visible mission name shown in the UI. |
briefing | string list | [] | Lines shown at mission start. |
detection_limit | float | 100.0 | Trace threshold that triggers defeat. |
time_limit | Some(u32) or None | None | Mission time window in action ticks. None means no limit. |
reactive | bool | false | Enables active defense escalation when true. |
skill | float | 0.5 | Operator skill modifier, normally 0.0..=1.0. |
root_difficulty | integer | 5 | Local privilege escalation difficulty, 1..=10. |
objective | Some("/path") or None | None | VFS path to exfiltrate. If None, root access completes the mission. |
debrief | string list | [] | Lines shown after mission completion. |
entry | EntryVector | Active | Opening mission state. See below. |
endings | Ending list | [] | Branching ending choices. Player selects with choose <n>. |
target | TargetNode | empty | Single-host target. Ignored when network is present. |
network | NetHost list | [] | Multi-host network. When non-empty, target is ignored. |
music | Some("path/to/file.wav") or None | None | WAV path relative to the campaign directory for this mission’s track. |
EntryVector
Theentry field controls how a mission opens — specifically, what state the player starts in and how noisy initial reconnaissance is.
Active
Classic active scan flow. The player begins at the recon phase and should start with nmap.
Cold
Selected ports are already known; the mission starts in the enumeration phase with those ports pre-discovered. No nmap required.
Passive
Passive discovery via sniff. Very stealthy, but services are revealed one at a time. Running nmap in passive mode adds extra trace.
Pivot
The objective host is behind a bastion. The player must connect to the gateway before scanning.
Branching endings
When a mission definesendings, the player selects one with choose <n> instead of the mission closing automatically. Each Ending has a title (shown in the selection list) and optional lines (epilogue text).
Linking achievements to ending choices
Linking achievements to ending choices
Use
ChooseEnding in CampaignAchievement.trigger to unlock an achievement when the player picks a specific ending. The choice index is 1-based and must be within range — --doctor reports an error if it is not.Multi-host network missions
Setnetwork instead of target when a mission spans more than one host. When network is non-empty the target field is ignored entirely.
NetHost struct
| Field | Type | Default | Description |
|---|---|---|---|
target | TargetNode | required | The host definition (services, vulnerabilities, filesystem). |
links | string list | [] | Short hostnames (or FQDNs) of other hosts reachable from this one via pivot. |
entry | bool | false | true marks this host as the player’s initial entry point. |
objective | Some("/path") or None | None | VFS path to exfiltrate on this host to complete the mission. |
entry: true. Connect hosts directionally with links — the short hostname is the first segment of the FQDN (e.g. "db-03" for "db-03.range.local"). Place the objective on the host that should close the mission when exfiltrated.
Multi-host mission example
gw-02 → pick up foothold_token: "range-key" from cred.env → run netmap → run pivot db-03 → run login (deterministic foothold because accepts_token matches) → escalate → exfiltrate /root/loot.dat.
Minimal single-host mission
The following is adapted from the sample campaign. It demonstrates the complete single-host shape with an explicit objective and anActive entry.
Per-mission music
Attach a soundtrack to a mission in two ways, checked in this order:-
Explicit
musicfield — set it to a WAV path relative to the campaign directory: -
Naming convention — if
musicis omitted, the frontend looks formusic/mission_N_theme.wavnext tocampaign.ron, whereNis the 1-based mission number:
--no-music to disable audio entirely. Only WAV is supported. Music is a frontend feature — the engine only carries the path as data and never touches audio.