Files
EscapistsReintroduced/docs/evidence/uaz-coordination-2026-10-04
jakub 6a667d8deb Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
2026-10-13 22:52:53 +02:00
..

Hunter UAZ coordination — local encounter review

Implemented a VirtualHQ response for the original physical hunter crews: one armed covering vehicle and one or two dismounted flanks, separated approach positions, a wider detour when a direct infantry segment crosses the reported enemy area, bounded sector search and survivor regroup. Initial orders use the existing physical radio network. Native perception and weapon AI own targeting and fire. The coordinator neither reads a live player target position nor supplies extra crew/ammunition.

Only ERR_HunterService.c and the new ERR_HunterTactics.c changed in the addon relative to the previous restart-loading task. changed-addon-files.json records that comparison. Existing traffic, game-master, loading, faction, finite-force, capture and survivor fixes are preserved.

What was exercised

The private fixture starts Nogova's test scenario, allows production Escape takeover/generation, places a protected vanilla US AI team as escapee stand-ins near 9606/4826, and starts actual production hunter UAZs on checked nearby roads. It drives the crews toward the encounter once, then leaves detection, radio transport, native combat and tactical movement to production code. It ticks HQ without requiring a connected player. Characters are damage-protected to retain actors for observation; vehicles are not. Positions and mounted magazine counts are sampled every five seconds. This is not a survival/balance test against real connected players.

  • Baseline: the first placement survey found two UAZs. Both drivers and gunners remained mounted; only one passenger from each vehicle dismounted and stayed near the vehicle. It completed 210 seconds. This establishes the observed passive behaviour, but is not a matched three-vehicle A/B performance benchmark.
  • Manoeuvre run: three UAZs, one mounted covering crew and two fully dismounted original crews. Both flanks reached their separate approach positions and began their sector searches. Maximum leader displacement after dismount was about 464 m and 318 m. It completed 330 seconds. This iteration exposed that a covering weapon could become empty while still counted as support.
  • Full run with ammunition checks (final-*): all six flank soldiers dismounted; the two leaders moved about 386 m and 286 m from their dismount positions. The covering vehicle fired, exhausted a mounted magazine, and reloaded natively. Both flanks paused while support was unavailable and resumed when it recovered. The left flank reached its search sector; the longer right flank eventually returned when support remained unavailable. It completed 330 seconds. This is the intended conservative fallback, not a claim that both flanks always complete.
  • Final cover-selection run (selection-*): repeats native compilation and a shorter 120-second encounter with the final source. The last change makes initial allocation skip a crew whose mounted gun cannot provide cover, allowing a different loaded UAZ to take that role. The exact empty-nearest/loaded-farther selection and all-empty refusal cases execute in the production-method regression.
  • Headless Workbench (workbench-*): final ammunition-aware behaviour also completed 330 seconds, including physical dismount, both flank advances, loss of support and regroup. The saved editor viewport did not follow the runtime camera, despite the runtime camera reporting the intended position. These captures are not visual proof of the encounter. Movement conclusions come from native actor positions and the HQ journal, with a plotted spatial reconstruction in movement.png/movement.svg.

metrics.json contains per-crew observations and tactical events. Foot displacement excludes the initial unmounted spawn before native boarding. The diagram shows the first 210 seconds shared by baseline and the full ammunition-aware run; the dot marks the initial escapee area, not continuously tracked actors. Broken lines mean mounted travel, solid lines mean infantry travel. Different vehicle counts and starting positions are explicitly labelled.

Corrections discovered in engine

  1. Shared road projection could collapse planned flank staging on sparse Nogova roads. Added checked open-ground staging and a separated, already-parked fallback.
  2. Vanilla GetOut is a SCR_BoardingWaypoint, while GetIn uses its entity subclass. Reused the existing correct convoy boarding builder, with driver/gunner/passenger allowances.
  3. Normal hunter recovery re-registered the UAZ with native vehicle usage even during a flank. Delivered tactics now own dismount/regroup and temporarily remove only their own UAZ from that group's usable vehicles.
  4. A static trace to an old report point was an unreliable cover test. Cover readiness now requires an actual fresh visible threat near the reported area, a valid original mounted gunner/driver and mounted ammunition.
  5. Ninety seconds was too short for the long opposite-side route. The movement deadline now scales with the planned path, bounded at 240 seconds.
  6. Loss of cover or ammunition now pauses an unfinished advance. Regroup, dismount and wait deadlines prevent indefinite tactical ownership. Only the covering assignment releases crew holds it actually applied.
  7. A fresh distant report no longer blocks a reachable local fight. Up to five bounded encounters may run independently, each with at most three crews. Other hunters avoid duplicating an already assigned contact within 300 m.

Validation and limits

python3 tools/check.py passed. Subsequent narrow cover/ammunition selection changes passed the affected production-method tests in focused-tests.log and the final native selection run. Tests execute production geometry, allocation, radio-gated lifecycle, boarding/waypoint ownership, vehicle detach/restore and original gunner/ammunition checks using engine-boundary doubles. Existing hunter opening, combat, capture, fallback and survivor-release tests also passed. The full suite is not a substitute for native or multiplayer qualification.

The native runs completed without a mission-script compile failure or process crash. Raw logs retain external localization/manager warnings and occasional engine/native AI warnings; this is not a clean-log claim. The earlier manoeuvre run also raised one native SuppressBehavior.bt error, “No suppression volume provided!”, through SCR_AIGetSuppressionVolumePosition.c; the scene continued. That exception did not recur in the subsequent full ammunition-aware dedicated or Workbench run, but it remains an unresolved native-behaviour observation. Earlier Workbench iterations reported native fire-timing Math.RandomFloat(0.1, 0) and particle warnings. The new tactics only use fixed valid random ranges; those native warnings are retained rather than hidden or patched speculatively. Early development attempts also caught a reserved identifier and wrong priority constant name before the successful native runs.

The coordinator currently chooses a bounded reported area and lets native AI navigate/search it. It does not continuously track unseen escapees, replace every island AI behaviour, guarantee a navmesh path, force effective suppression, promote a new covering crew mid-encounter, or replenish supplies. Simultaneous fronts, disconnected radios, captured vehicles and ownership failures have policy-test coverage; they were not all reproduced in this protected physical encounter. No multiplayer, every-terrain, maximum-force FPS or full-round survival claim is made.

No live server was changed or restarted, and nothing was published to Workshop. The user remains responsible for publishing this local addon update.

Reproduction and provenance

The *.py.txt runners and scene-probe.c.txt preserve the private setup. They refer to this machine's installed engine, cached resource database, audited mod directories and isolated test profiles; adapt paths before reuse. The fixture is not part of the shipped addon. Dedicated runs use a private network namespace with backend disabled. Workbench uses a disposable prefix/profile, headless Gamescope and muted test audio; its runner records source fingerprints and process cleanup.

source-sha256.json records the final addon. Each dedicated run has script fingerprints; the manoeuvre and full ammunition-aware implementation snapshots are retained as *-hunter-tactics.c.txt to distinguish iterations. selection-* records the final compiled source and workbench-runner.json records the headless completion/cleanup. The generic Workbench smoke report expects a different fixture marker, so its wrapper exit status is not used as encounter acceptance: the explicit ERR SCENE COMPLETE marker, actual events, compile diagnostics and cleanup report are reviewed separately.