Use this file to discover all available pages before exploring further.
simterm-engine is the reusable library at the heart of Simterm. It owns the immutable campaign data model, the mutable game-state runtime, the campaign loader, the semantic validator, and the asset-source abstraction — with no dependency on ratatui, crossterm, or any other UI library. Any Rust binary can pull it in and drive a full campaign loop without touching the terminal frontend.
If you are authoring a campaign in RON files and playing it through the standard simterm CLI, you do not need to depend on simterm-engine directly — the frontend already does that for you.Use simterm-engine directly when you want to:
Build an alternative frontend (web, headless server, embedded TUI)
Write integration tests that drive a campaign programmatically
Build tooling such as a campaign linter or validator
The following snippet — drawn from the crate’s own rustdoc — is the smallest possible headless session: load a campaign from disk, construct a GameState, and call the first action.
use simterm_engine::{load_campaign, GameState, actions};let campaign = load_campaign("examples/sample_campaign").expect("valid campaign");let mut game = GameState::new(campaign);actions::recon(&mut game);
From here you can inspect game.intel, call actions::enumerate, actions::exploit, and so on to drive the full recon → enum → exploit → post loop.
Everything the library exposes is re-exported from the crate root so you only need one use simterm_engine::… import. The exports are grouped below by layer.
simterm-engine never imports ratatui, crossterm, or any audio library. All presentation decisions — terminal rendering, input handling, help text, audio playback — belong to the frontend. The engine owns every state transition: phase advances, trace accumulation, detection checks, loot application, achievement unlocking, and mission completion.When building a custom frontend you pass the verb string to actions::campaign_command and call individual actions::* functions. The engine mutates GameState and appends to game.logs; your frontend reads those logs and renders them however it chooses.