Event Stream
A training vignette publishes one record for every engagement event, in order, to every in-process subscriber. It can also append each record to a JSONL file: one complete JSON object per line, with no line breaks inside it.
The on-screen engagement log, the positional-audio system and external scorers all read the same stream. The line format is a stable contract, so a scoring or after-action application can consume a run without touching the engine.
Event kinds
kind |
Meaning |
|---|---|
spawn |
A unit is placed |
lase |
A unit lases a target (range acquired) |
fire |
A round or missile is fired |
impact |
A round lands or detonates |
hit |
The round struck its target |
miss |
The round missed |
damage |
A target is damaged |
kill |
The target was killed |
call_for_fire |
A spotter calls for indirect fire |
reload |
A weapon reloads |
withdraw |
A unit breaks contact under a stated rule |
run_end |
The run is over |
Fields
| Field | Type | Meaning |
|---|---|---|
kind |
string | One of the kinds above |
t_sec |
number | Simulation time, seconds from the start of the run |
unit |
string | The unit the event belongs to (shooter, spotter, unit placed) |
target |
string | The target, where there is one; otherwise "" |
round |
string | The round type, where there is one; otherwise "" |
ecef_m |
[x, y, z] | Where it happened, ECEF metres |
lat_deg, lon_deg, alt_m |
numbers | The same place, geodetic |
range_m |
number | Shooter-to-target range, where it applies |
tof_sec |
number | The round's time of flight, where it applies |
ph, pk |
numbers | The hit and kill probabilities the shot was taken under (0 when unset) |
note |
string | Present only when set: a stated rule or reason, in words |
Fields that do not apply to a kind are present with zero values, so
every line has every field except note. All numbers are
64-bit floating point.
Example
{"alt_m":712,"ecef_m":[-2400000,-4500000,3600000],"kind":"fire","lat_deg":35.33,"lon_deg":-116.47,"ph":0.88,"pk":0.8,"range_m":1850,"round":"m829","t_sec":12.25,"target":"R1","tof_sec":1.32,"unit":"A11"}
Determinism
Hit, kill and dispersion draws come from a seeded generator (the
vignette's seed). The same configuration and seed produce
the same event stream, so a run can be replayed and audited, and
conformance tests are repeatable.