Capture current mission, AI, map and administration development

Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
This commit is contained in:
2026-10-13 22:52:53 +02:00
parent a951a96edc
commit 6a667d8deb
8104 changed files with 2124945 additions and 2061 deletions
+149 -3
View File
@@ -1,7 +1,121 @@
# Base mission configuration
Field-site population is configurable under **Forces → Configure sites**.
`fieldCampCount` accepts 1–16 (default 12); `fieldHospitalCount` accepts 1–8
(default 6). Both apply next round. Existing settings files missing these keys
receive the defaults. Commands: `/esc mission camps set N` and
`/esc mission hospitals set N`. Defaults request 26 mission sites; maximum counts
request 32, while retaining the required objective and radio-clue sites. Actual
placement can omit unsuitable optional sites. Sites remain hidden until discovery
or intel, except the existing initial clue markers.
Above eight camps and hospitals combined, sites share the original field-force
budget of 32 fixed guards and 16 mobile soldiers. Increasing the number of sites
adds locations and supplies without increasing that soldier budget.
On added terrains, the initial airport survey processes up to eight 2 km tiles
per generation update, yielding after 4 ms of query work (a native query already
in progress finishes first). This avoids a separate 250 ms wait after every
cheap tile. All airport candidates are still surveyed; ground, navigation and
helicopter-clearance checks remain required. The main log records the survey
duration once, followed by spawn-ready and background-completion timings.
These timings exclude the engine's initial terrain loading and any startup
switch from the configured scenario to the selected terrain.
The independent Core scenario loads `Configs/ERR/VanillaFactions.conf` through `ERR_GameMode.m_FactionDefinition` and `Configs/ERR/EveronSites.conf` through the scenario component. Both are successor resources. Changing a configuration requires restarting the scenario; the live round is not repopulated.
## Starting weapons and ammunition
The admin menu **Mission** page has **Starting pistols** (0–12, default 5)
and **Starting spare magazines** (0–48, default 8). These are totals in the
shared prison/crash supply backpack, not per-player allowances. Magazines are
the existing PM 8-round type; the count excludes ammunition loaded in weapons.
The map remains in the backpack, including when both counts are zero.
Press **Apply** to save each value for the next round. Existing backpacks are
not refilled. Older configurations receive the original defaults automatically.
The values are `mission.startWeaponCount` and `mission.startMagazineCount` in
`$profile:Escapists.json`. Chat equivalents are `/esc mission startweapons set N`
and `/esc mission startammo set N` (also `show` and `help`).
## Roadblocks
The admin menu **Settings → Roadblocks next round** sets `mission.roadblockCount`
in `Escapists.json`: **0–12**, default **4**; **0 disables** them. The chat equivalent
is `/esc mission roadblocks set N` (also `show` and `help`). Changes apply on the
next round/restart, leaving current units and cover in place.
These are simple roadside checkpoints: two sandbag positions and four soldiers
from the selected enemy faction. They use normal equipment rules and physical
radio reporting to VirtualHQ; HQ can send their squad to respond to contacts.
They do not reveal player locations to HQ merely by being created. Soldiers and
cover are owned by the round; killed guards are not replaced.
Placement uses the loaded terrain's road network and Soldiers navmesh before
player admission. Posts stay at least 600 m apart, 700 m from the prison and any
controlled player body, 150 m from mission sites and outside settlement centres.
Elevated bridge segments, narrow roads, steep or obstructed shoulders are rejected.
Cover stays outside the travelled road to preserve vehicle passage. The requested
count is a maximum: a bounded search skips unsuitable posts and logs placed versus
requested totals instead of preventing mission startup. The admin Status page
also shows these totals. This is an interim checkpoint system, independent of the
existing HQ-directed road interceptions.
## One server configuration
All mission preferences now live in **`$profile:Escapists.json`** on the server.
It is created automatically on the first start of this build. The admin menu
reads and saves this same file; changing a setting preserves the other sections.
Edit the file while the mission is stopped, then restart to load manual changes.
| Section | Contents | Imported from on first start |
| --- | --- | --- |
| `mission` | Gameplay, HQ, time, weather, view distance, helicopter timer | `rereintroduced.json` |
| `mods` | Content and faction-pack switches | `EscapistsContent.json` |
| `factions` | Player, enemy and independent role choices | `EscapistsFactions.json` |
| `terrain` | Selected next-start scenario | `EscapistsTerrain.json` |
| `items` | Item rules and named presets, including dormant rules for absent mods | `EscapistsItems.json` |
| `voice` | Original welcome clip (`welcomeUrl`), speech bridge URL/token (`briefingUrl`, `briefingToken`), optional `ttsEnabled` | `EscapistsWelcomeVoice.json` |
The admin mission menu's **TTS** page can test and save the speech bridge settings
without a restart. Only a successful test enables the new settings; an empty or
disabled setup leaves the original welcome behavior unchanged. Google credentials
stay on the speech host. See [speech setup](welcome-voice-test.md).
During an active Escape round, the original surviving player body is reserved
for at least 15 minutes after a disconnect, including a client crash. A longer
native `operating.slotReservationTimeout` is respected, as is its unlimited
setting. Rejoining with the same authenticated account returns control of that
body, keeping its inventory, injuries and vehicle seat. It stays vulnerable while
the player is away. Expiry, death or a different round does not grant a replacement
life or duplicate equipment. This is recovery within the running mission, not
saved characters across server restarts. Reconnect reservation, rejection and
successful handoff are logged without account identifiers.
The root has `"configVersion": 1`. Missing legacy files get defaults. Existing
valid values are imported, using a valid `.bak` if the old primary is damaged.
If neither copy is valid, migration logs the filename and leaves the originals
untouched; repair that file before retrying. Legacy files are retained for
rollback, but are ignored once `Escapists.json` exists. They can be archived after
verifying the migration. Do not edit them expecting the new build to reload them.
`Escapists.json.bak` is the last valid configuration before a successful update;
`.tmp` is only a write staging file. Neither is a separate configuration to
maintain. Writes are read back before and after promotion, and a valid backup
allows recovery from a damaged primary. Unsupported schema versions are kept
read-only. Unknown fields and preferences for absent mods are retained.
A malformed known section also prevents unrelated menu changes from being saved.
This preserves the last valid backup instead of replacing it with damaged data.
Repair invalid sections while the mission is stopped; a valid replacement for the
only damaged section can also be saved through its existing menu. Successful repair
keeps the good backup, and subsequent ordinary saves resume normal backup rotation.
Missing optional sections still use defaults, and unknown fields remain intact.
Server host settings (ports, passwords and the Workshop mod list), cloud
credentials, and authored faction/site assets remain with their respective
systems. The welcome helper serves its cached clip independently; only its
public audio URL belongs in the mission configuration.
## Factions and assets
The catalog explicitly selects the player faction, enemy faction, prisoner character, guard group and extraction helicopter. Current defaults are unarmed US prisoners, Soviet guards and the vanilla unarmed Mi-8 transport. Both factions must exist in the world's faction manager and consider one another hostile. Required prefab resources must resolve. The extraction resource must be a helicopter with a pilot position and at least twelve pilot/passenger seats; invalid extraction setup rolls back prepared sites before players spawn. Guard groups must have the catalog's enemy affiliation; an incompatible group is rejected rather than relabelled.
@@ -20,14 +134,15 @@ Open the normal game chat and enter a command. Core provides:
| `/esc killais` | Server administrator | Kill AI characters within 1,000 m of your living character; preserve players and vehicles |
| `/esc settings` | Server administrator | Current shared settings and values |
| `/esc mission keepweapon set 0` / `1` | Server administrator | Disable/enable retaining the held firearm while unconscious and equipping it after revival; applies from the next knockout |
| `/esc mission traffic set N` | Server administrator | Set 0–6 civilian traffic cars, default 3; 0 disables new traffic. Also on the Factions menu page. Distant-only cleanup and claimed-car preservation remain active. |
| `/esc mission radio show` | Server administrator | Radio defence duration in seconds |
| `/esc mission radio set N` | Server administrator | Save a whole-number duration from 30 to 1800 seconds |
| `/esc mission time show` | Server administrator | Current clock and saved next-round time/speed |
| `/esc mission time set HH:MM` | Server administrator | Save next-round start time, 00:00–23:59 |
| `/esc mission speed show` | Server administrator | Current clock and saved next-round time/speed |
| `/esc mission speed set N` | Server administrator | Save next-round time progression, 1–24× |
| `/esc spectate next` | Spectating player | Select the next surviving friendly player |
| `/esc spectate previous` | Spectating player | Select the previous surviving friendly player |
| `/esc spectate next` | Spectating player | Select the next friendly teammate; use round-owned bodies when no eligible survivor remains |
| `/esc spectate previous` | Spectating player | Select the previous friendly teammate or fallback body |
The server derives administrator status from the requesting controller's authenticated player ID. Clients cannot send an administrator flag through the RPC. Requests are limited in length and rate; malformed numbers and out-of-range values leave the previous setting intact. Saved values belong to the server profile, not client profiles. Changing radio duration affects the current defence calculation, so configure it before starting the transmission.
@@ -41,8 +156,9 @@ Additional AI commands:
| --- | --- |
| `/esc hq memory` | Show bounded delivered-report beliefs, confidence, uncertainty and travel estimates |
| `/esc hq aa show` / `/esc hq aa set N` | Enemy MANPADS grant chance, 0–100% or Random; default 7% |
| `/esc hq equipment show` / `/esc hq equipment set N` | Automatic catalog equipment attempt chance, 0–100% or Random; default 25%; [details](enemy-loadouts.md#automatic-equipment-from-installed-mods) |
| `/esc hq mines show` / `/esc hq mines set N` | Enemy AP-mine grant chance, 0–100% or Random; default 60%, up to two carried mines |
| `/esc hq stinger show` / `/esc hq stinger set N` | Legacy alias for anti-air percentage, now 0–100 rather than one-in-N |
| `/esc hq stinger show` / `/esc hq stinger set N` | Legacy alias for anti-air percentage, 0–100 or `set random`; `show` displays Random; no reroll of existing soldiers |
| `/esc hq convoy show` | Show the finite deployment task, retained vehicles, native cargo insertion results and stop reason |
| `/esc hq convoy start` | Deploy the next unused slot in this round’s configured convoy allowance after physical force admission |
| `/esc convoys show` | Show the saved count and active fleet |
@@ -87,6 +203,24 @@ faction, the enemy that controls HQ, and the other hostile faction.
**Keep weapon when unconscious** has explicit Enabled/Disabled buttons on Mission. It defaults to Enabled and applies from each player’s next knockout. With it enabled, the same gun is retained and re-equipped after revival; Disabled restores the normal ground drop. Unconscious and dead spectators use **Left/Right arrows** to change teammates.
When no eligible living teammate remains, arrows cycle through the current
round's surviving corpses, including your own, until the round ends. Corpses are
selected from the authenticated round roster even after their controllers detach;
AI corpses and bodies from other rounds are excluded.
**Enter** switches between orbit and the living teammate's actual camera pose.
Their client supplies position, look direction, roll, vertical field of view and
near clipping distance; the server forwards samples only to their current
authorized spectators. This follows whichever normal player camera the teammate
uses, including their own third-person selection. It does not copy their HUD,
picture-in-picture scope rendering or player-only weapon animation.
Samples are sent at up to 20 Hz only while requested, interpolated relative to the
replicated body, and discarded after a 350 ms gap. Corpses, unavailable streams
and other camera modes such as Game Master use the orbit fallback. Native head
and helmet fading prevents looking through the target's face and is restored on
view changes. This is a synchronized camera view, not a latency-free video feed.
The Journal normally shows sentences with real server-local clock time
(`HH:MM:SS`), event numbers and radio message numbers. Timestamps are captured
when events occur and stay unchanged when history is opened or resumed. It distinguishes local sightings, reports awaiting transmission,
@@ -186,3 +320,15 @@ Enemy equipment percentages affect soldiers whose initial loadout has not yet be
**Factions → Random all** immediately saves Random for all three roles; no second Apply is needed. Random remains saved after closing the menu and is resolved afresh at each round startup. Current factions stay unchanged until the next round. Individual dropdown edits still use **Apply factions**.
The 2026-09-23 native `prisoner-kit` fixture verified that Random all saves via the authenticated owner RPC, survives a fresh settings load and menu reopen without Apply, and preserves current-round faction roles. It completed 357 assertions without script/runtime failures; installed external resource errors still make the engine report non-clean. Regression coverage is in `test_faction_menu.py` and `test_faction_selection.py`.
Civilian traffic uses `mission.civilianTrafficCount` in the same configuration. See [civilian traffic](civilian-traffic.md) for routes, observer distances and vehicle ownership.
## Optional Cessna patrol
`planeReconEnabled` defaults to `1`: use Cessna 172 only when it and Propeller
Flight Core are loaded on a dedicated server. **HQ → Configure Cessna** provides
Enabled/Disabled buttons and Apply fields for patrol altitude (150–500 m, default
250), replacement delay (30–1800 s, default 60), and new patrol area interval
(30–600 s, default 120). All save for the next round. `/esc mission plane set 0|1` uses
the same admin authorization. No loaded addon or no safe airport means no plane.
See [reconnaissance plane details](cessna-reconnaissance.md).