Tools¶
Everything in tools/. Each C++ binary is built by the standard presets and answers --help; the
usage lines below are taken from the binaries themselves.
Build one on its own with cmake --build --preset release --target <name>.
Content validators¶
Every asset class has a validator, and the pack CI gates run them. Each one delegates to the engine's own parser, so a file that passes cannot be rejected by the engine for a schema reason — the validator and the runtime cannot drift into disagreeing.
| Tool | Usage |
|---|---|
validate-mission |
validate-mission [--pack <dir>] <file.yaml> [file2.yaml ...] |
validate-campaign |
validate-campaign [--pack <dir>] <campaign.yaml> [more.yaml ...] |
validate-entity |
validate-entity <file.toml> [file2.toml ...] |
validate-flight-model |
validate-flight-model <file.toml> [file2.toml ...] |
validate-weapon |
validate-weapon <file.toml> [file2.toml ...] |
validate-sensor |
validate-sensor <file.toml> [file2.toml ...] |
validate-livery |
validate-livery <file.toml> [file2.toml ...] |
validate-mode |
validate-mode <file.toml> [file2.toml ...] |
validate-playlist |
validate-playlist --playlist <path/to/data/playlist.toml> [--pack <dir>] |
validate-mesh |
validate-mesh <file.glb> [file2.gltf ...] |
validate-mod |
validate-mod [--no-licenses] [--allow <spdx-id>]... <pack-dir> |
validate-licenses |
validate-licenses [--dir <path>] [--licenses-dir <path>] [--allow <id>] ... |
--pack <dir> is the flag that matters. Without it a validator checks the file's schema in
isolation; with it, cross-references are resolved against a real pack — that every sensor id
exists, every weapon a hardpoint allows is defined, every mesh a definition names is present. Most
real content bugs are reference bugs, and they are invisible without --pack.
Asset pipeline¶
| Tool | Usage / purpose |
|---|---|
tex-compress |
tex-compress [options] <input.png> [<output.ktx2>] — Basis Universal compression |
terrain-chunk-io |
terrain-chunk-io <subcommand> [options] — decode terrain PNGs, generate procedural tiles |
fl-viewer |
Model preview in the game renderer |
locale-extract |
Extract translatable strings |
gen_terrain_tiles.py |
Cube-sphere quadtree tiles from a global DEM (the current terrain path); --bbox scopes a run to one theater, full faces otherwise |
gen_terrain_chunks.py |
Planar chunk grid — legacy, superseded by the above |
gen_terrain_color.py |
Sentinel-2 satellite imagery tiles |
gen_wind_profile.py |
Altitude wind profile TOML from gridded wind data |
blender_gen.py |
Parametric aircraft mesh generation, headless Blender |
gen_builtin_glb.py · gen_unifont_header.py |
Regenerate compiled-in geometry and the HUD font |
The Python tools guard heavy imports (GDAL, netCDF) behind try/except ImportError, so --help
and the unit tests work without the system packages installed.
Measurement and analysis¶
| Tool | Usage / purpose |
|---|---|
bot_swarm |
bot_swarm [host] [port] [options] — headless multi-client load generator |
scale_gate.py |
Drives bot_swarm against scale-gate.json thresholds; the CI scale gate |
net_check |
net_check [host] [port] [--count N] [--interval MS] — ENet smoke test and latency bench |
fm-trim |
fm-trim <flight-model.toml> [options] — derives performance from a flight model |
audio_check |
audio_check [--check-ogg <file.ogg>] — audio device and OGG decode check |
input_check |
Gamepad, joystick and HOTAS axis inspection |
latency_analysis/ |
Per-platform loopback RTT measurement and comparison |
gpu_contention/ |
GPU contention harness |
ai_eval/ |
Local AI provider evaluation (README) |
fm-trim --expect is the flight-model acceptance instrument: it derives stall speed, turn rates,
climb and specific range from the model and gates them against the published chart. It runs in CI,
which also makes it the engine's guard against a change to the aerodynamics silently altering every
aircraft's performance.
Development and CI helpers¶
| Tool | Purpose |
|---|---|
code_stats.py |
Application statistics for a release: composition by category plus the product surface. Attached to every release and appended to minor-release bodies — see the release process |
docs_drift.py |
Checks documentation against the code it describes (the drift gate) |
coverage_gate.py |
Runs gcovr once and gates on the result, separating "below threshold" from "no number was produced" (code coverage) |
check_deps.py |
Reports which pinned dependencies have newer upstream releases |
lint_workflow_expressions.py |
Catches ${{ }} interpolation into run: blocks |
lint_test_names.py |
Catches non-ASCII in Catch2 test names and tags, which ctest cannot select on Windows |
lint_backend_seam.py |
Catches a product-library source reaching a backend's third-party headers — an include that compiles only where a system package supplies them and fails on every CI platform (product libraries) |
mission_test/ |
Mission harness assertions |
record_demo/ |
Headless cinematic capture (demo recording) |
visual_check.sh / .ps1 |
Launch the game into a known scene for visual verification |
build_global_base.sh |
Build the coarse global base terrain bundle |
Repository scripts live in scripts/: cut-release.sh and tag-release.sh (the release process
in project management), roadmap-status.sh, and the
commit-msg / pre-commit hooks.
See also¶
- Development — building, presets and prerequisites
- Load testing — using
bot_swarmand the scale gate properly - Modding Guide — what the validators are validating