Embed RHS 1.9 compatibility; record Workshop 0.0.141
continuous-integration/drone/push Build is passing
continuous-integration/drone/push Build is passing
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,93 @@
|
||||
# Co10 Escape Reintroduced
|
||||
|
||||
Author: **Jakub Jim Žáček**.
|
||||
|
||||
An independently authored replacement for the abandoned Escapists base mission, targeting Everon and up to twelve players. This is a separate repository and **not a completed or release-ready replacement**. The base rewrite is the primary deliverable; companion migration supports it.
|
||||
|
||||
The current base supplies prison spawning, two independent scavenging/clue routes, finite medical and outpost stock, an optional ground vehicle, physical radio documents, named discovery markers, native objectives, a separate radio-defence service, capacity-checked helicopter extraction, identity-based partial results, early helicopter-loss defeat, saved mission time/speed, defeat/restart, identity-based lives and local spectator following. Authored site definitions and an injected vanilla faction/asset catalog own the initial physical population. Core provides administration and startup diagnostics; the AI, Intel, Chat and Map modules extend its interfaces inside one addon. HQ coordinates enemy responses through physical radios and available forces.
|
||||
|
||||
The complete repository validator passes at the [5 November integration checkpoint](docs/evidence/integration-check-2026-11-05/report.json), bound to 1,229 unchanged input files. These offline checks do not establish native gameplay or multiplayer correctness.
|
||||
|
||||
The [4 October development playtest handoff](.build/playtest-2026-10-04-ui-bmp/README.md) includes the inventory callback and BMP ammunition-accounting corrections. Its 439 authored files match 378 PAK payloads and three runtime files. At that archived checkpoint, code/tests/tools bound to 309 passing regression programs; exact-source normal escape and ordinary packaged startup complete with retained engine errors. It remains an **unqualified development candidate**. Existing missions and prior packages are preserved. See [current status](docs/current-status.md) for exact scope and limits.
|
||||
|
||||
The [AI migration checkpoint](docs/ai-migration-progress.md) adds delivered-report memory, bounded trajectory prediction, physical infantry pursuit, status checks, body observations and finite equipment. Native memory and actual-sighting response fixtures pass their assertions, with four retained upstream localization errors. See [current development status](docs/current-status.md) for source-bound checkpoints. The earlier five-addon checkpoint shows the [real prisoner view and starting objective](docs/evidence/game-2026-09-19-125906-integrated-prison/ordinary-prison-view.png). Native tests cover scripted escape/restart, finite mortar support, physical radio delivery, shared-map ownership, and the reusable aircraft controller's vertical flight, airborne cancellation and an isolated 20 m fixed route. Archived five-addon packages pass ordinary Chat startup without loose successor source and compile/prepare the empty mission on an isolated Linux server. The latter retains four installed-asset errors reproduced by a vanilla control.
|
||||
|
||||
Native game-over now stops successor services and queued preparation before vanilla restart; unknown personal results use neutral wording. Two-round preparation/active-end regressions pass at their archived source checkpoint. Current Core/companion escape/restart and ordinary startup also pass after the guidance and route changes; the ordinary read-only sampler is separate from player-input acceptance.
|
||||
|
||||
Later ordinary input checks demonstrate walking, clean inventory interaction and selecting the original prison lock. Automated held-action testing and experimental AI aircraft work are paused in favor of concrete base gameplay bugs and a playable development build. The complete player-controlled escape, real multiplayer, operational HQ aircraft routes and measured FPS improvement remain unfinished. Native packaging still produces [UI shutdown errors also reproduced by an empty-addon control](docs/native-packaging-control.md); successful packed startup does not qualify that build process. All seventeen first-release acceptance cases remain pending. The [original responsibility inventory](docs/original-feature-coverage.md) tracks the unfinished scope.
|
||||
|
||||
## Workbench project and scenario
|
||||
|
||||
Open **`addons/core/addon.gproj`**, titled **Co10 Escape Reintroduced**. This is the
|
||||
single project to develop, package and eventually publish as one Workshop mod.
|
||||
Select **Co10 Escape Reintroduced — Automatic terrain**,
|
||||
**`Missions/ERR_Everon.conf`** (`{C1E20667DCE324ED}`), as the universal starting
|
||||
scenario. It opens Escape on Everon by default; a saved choice in the admin
|
||||
**Terrains** menu loads another installed terrain after restart. The existing
|
||||
resource ID is unchanged. The public browser may keep the generic Automatic
|
||||
terrain title after switching maps; it no longer labels this entry as Everon.
|
||||
The Core directory and addon GUID `2528466DE220D91C` are retained for continuity.
|
||||
|
||||
Scripts are organized under `addons/core/Scripts/Game/ERR/`:
|
||||
|
||||
- `00_Core`: mission, players, settings and administration
|
||||
- `10_AI`: HQ, patrols, logistics and support
|
||||
- `20_Intel`: enemy documents and discovery feedback
|
||||
- `30_Map`: shared field map
|
||||
- `40_Chat`: command integration and full-scenario test fixtures
|
||||
|
||||
The prefixes preserve Enforce script extension order. All modules load together.
|
||||
Resources retain their existing paths and GUIDs within the combined project.
|
||||
|
||||
Menu appearance and navigation are maintained in [ui/admin_menu](ui/admin_menu/README.md):
|
||||
one theme, a navigation manifest, and separate page layouts. Run
|
||||
`python3 tools/build_admin_menu.py` after changing those sources; the generated
|
||||
native layouts remain in the addon for Workbench and publishing.
|
||||
|
||||
Register only this project and its external dependencies in Workbench. Remove stale
|
||||
AI/Intel/Map/Chat project entries if you previously added them. RHS: Status Quo,
|
||||
WCS Armaments and WCS BMP-1 (including their dependencies) remain separate,
|
||||
author-supplied mods; see [external dependencies](docs/external-addons.md).
|
||||
Their assets are referenced, never redistributed.
|
||||
|
||||
With a shovel equipped, look at a dead body and hold **Bury body** for eight
|
||||
seconds. This removes the corpse and its remaining equipment; loot it first.
|
||||
Living and unconscious characters cannot be buried. Existing HQ casualty reports
|
||||
remain valid after burial.
|
||||
|
||||
Optional [enemy reconnaissance drones](docs/drone-reconnaissance.md) use Realistic
|
||||
Combat Drones. Configure their limit and cooldown in **HQ → Recon drones**;
|
||||
they are disabled by default.
|
||||
|
||||
See the [single-mod migration and current commands](docs/single-mod.md).
|
||||
Earlier five-addon build reports below are historical evidence, not validation of
|
||||
the merged project. Nothing has been published to Workshop.
|
||||
|
||||
[Automatic terrain takeover](docs/terrain-takeover.md) starts Escape when an admin
|
||||
loads Escape alongside a terrain and selects that terrain's existing scenario.
|
||||
No connector, custom startup flag or airport coordinates are required. The map
|
||||
must provide usable navigation and safe placement space. Published authenticated
|
||||
multiplayer validation remains outstanding; see the linked test scope.
|
||||
Terrain authors can optionally use the [shared connector prefab](docs/terrain-adapters.md)
|
||||
for an authored Escape scenario; [Nogova setup](docs/nogova-publishing.md) describes
|
||||
both routes.
|
||||
|
||||
See the [player route playtest guide](docs/player-route.md), [player lifecycle](docs/player-lifecycle.md), [manual gameplay gaps](docs/base-gameplay-gaps.md), [release qualification](docs/release-qualification.md), [performance comparison tooling](docs/performance-comparison.md), [configuration and commands](docs/configuration.md), [site authoring](docs/site-authoring.md), [architecture](docs/architecture.md) and [migration priorities](docs/base-replacement.md).
|
||||
|
||||
## Validation
|
||||
|
||||
Run source/resource isolation and production-policy regressions with Python 3 and a C++17 compiler:
|
||||
|
||||
```sh
|
||||
python3 tools/check.py
|
||||
```
|
||||
|
||||
For bounded hidden, muted local native tests, see [runtime testing](docs/runtime-testing.md). Recorded Workbench checkpoints include Core-only and companion-loaded escape/restart, finite stock and document-loss recovery, twelve physical prisoner/seat fixtures, real medical treatment, local result/objective widgets, patrol movement and HQ preemption/resumption. Clean environment/restart evidence exists after narrowing the vanilla vehicle catalogs; it does not qualify subsequent source changes.
|
||||
|
||||
These scripted local fixtures manipulate positions and selected native states. They do not establish manual escape/piloting, real remote reconnects, twelve connected players or improved FPS. Separate regular-game runs establish standalone startup/admission; an isolated native Linux run establishes empty-server preparation, with inherited resource errors reproduced by a vanilla control. [Current status](docs/current-status.md) separates those gaps from demonstrated development behavior. [Validation evidence](docs/validation.md) preserves exact source checkpoints and failed iterations; `docs/acceptance.json` keeps unverified release requirements pending.
|
||||
|
||||
The [development source bundle tool](docs/development-source-bundle.md) previews a deterministic handoff of the single editable project and writes only an explicitly requested new ZIP. It is **DEVELOPMENT SOURCE BUNDLE**, not a native `.pak` or qualified release; release-mode requests remain blocked by pending acceptance. No release package has been published.
|
||||
|
||||
Random field hospitals and camps, their permanent/mobile guard split, finite supplies and authoring options are documented in [Field sites](docs/field-sites.md).
|
||||
|
||||
Town population, configurable factory guards and safe tower/roof posts: [town and object garrisons](docs/town-garrisons.md).
|
||||
@@ -0,0 +1,864 @@
|
||||
# Current development status
|
||||
|
||||
**5 November 2026 — full offline integration check restored:** the complete
|
||||
repository validator passes on 1,229 unchanged recorded input files, including
|
||||
the earlier HQ recovery-hold and objective-guidance changes. Two stale test
|
||||
contracts were repaired: observer ownership doubles now expose the committed
|
||||
hint debounce/quiet-call interface, and preparation checks expect the committed
|
||||
120-second results countdown. Gameplay code and the countdown itself are
|
||||
unchanged by this continuation. Current terrain-takeover documentation agrees.
|
||||
|
||||
Initial sandbox socket, observer compilation and obsolete countdown failures
|
||||
remain archived. Independent base-loop reviews found no demonstrated defect in
|
||||
intel progression, radio occupancy or reconnect/partial-result identity. This is
|
||||
offline validation only. No engine was launched; this continuation did not change
|
||||
installed builds or publish. Manual escape, multiplayer and FPS acceptance remain open.
|
||||
[Exact inputs, failures and results](evidence/integration-check-2026-11-05/report.json).
|
||||
|
||||
**5 November 2026 — persistent objective guidance matches progression:** radio
|
||||
search instructions now explain keeping undeciphered documents and identifying
|
||||
other distinct non-radio sites first; starting clue markers do not count. This
|
||||
replaces the misleading promise that collecting more starting folders alone
|
||||
reveals the radio. The guidance stays conditional because the server owns the
|
||||
round's configured requirement. Identified-radio instructions and close-view
|
||||
identification remain available. The airborne extraction objective now states
|
||||
30 continuous seconds for all rescue transports, matching the current rule.
|
||||
|
||||
The player-route guide is updated. Four existing objective/intel/rescue checks
|
||||
pass unchanged on the recorded inputs. Only wording changed; native UI rendering,
|
||||
multiplayer and performance were not tested. No engine was launched, installed
|
||||
builds were not replaced, and the earlier HQ fix was preserved.
|
||||
[Evidence](evidence/objective-guidance-2026-11-05/report.json).
|
||||
|
||||
**5 November 2026 — depleted squads can receive their recovery hold:** HQ already
|
||||
planned a reserve hold after a withdrawal reached shelter, but its radio delivery
|
||||
gate rejected that order when the squad had no ammunition. Delivery now permits
|
||||
that hold only for a coordinated squad whose existing judgment still requires
|
||||
recovery. Ordinary tactical reserve and attack orders retain the ammunition gate;
|
||||
exact task identity, current belief, expiry and force-ownership checks still apply.
|
||||
|
||||
Nine focused HQ regression programs pass on unchanged relevant inputs, including
|
||||
actual delivery and coordinated-admission methods; the prior source compiles but
|
||||
fails the new recovery-hold assertion. Eight base-loop regressions also passed
|
||||
before the change. This is a source-only correction: native radio/physical movement,
|
||||
multiplayer and performance remain unverified. No engine was opened, and this
|
||||
continuation did not install, publish or alter original missions. Concurrent garage
|
||||
work was preserved. [Evidence](evidence/hq-recovery-reserve-2026-11-05/report.json).
|
||||
|
||||
**7 October 2026 — shorten the initial airport survey:** the latest live
|
||||
Chernarus log spent 48.5s between terrain-survey start and airport completion,
|
||||
then admitted the player after the prison/aircraft and client scene were ready.
|
||||
The survey previously processed one 2km tile per 250ms scenario tick. It now
|
||||
batches up to eight tiles, yielding after 4ms of work between native queries.
|
||||
It still completes the full survey and retains navigation, clearance and spawn
|
||||
protection checks. Isolated Nogova comparison: airport survey 21.2s → 7.0s;
|
||||
spawn-ready 27.5s → 13.1s. All 26 sites completed and all 13 native assertions
|
||||
passed, with zero script errors. Scheduler/airfield policy checks and the source
|
||||
bundle preview passed. These are single random-placement runs, not an FPS
|
||||
benchmark or live Chernarus validation. Initial engine terrain loading and the
|
||||
startup map redirect are unchanged. Not published or deployed. Evidence:
|
||||
[`airport-survey-batching-2026-10-07/report.json`](evidence/airport-survey-batching-2026-10-07/report.json).
|
||||
|
||||
**7 October 2026 — configurable field-site population:** ordinary rounds now
|
||||
request 12 camps and six hospitals, for 26 total mission sites. The new
|
||||
**Forces → Configure sites** page saves camps (1–16) and hospitals (1–8) for
|
||||
the next round. Old settings files receive the new defaults. Required objectives,
|
||||
initial radio-clue sources and discovery/intel rules are retained; extra locations
|
||||
use background generation and may be omitted if safe placement is unavailable.
|
||||
Above eight field sites, the original 32 fixed guards and 16 mobile soldiers are
|
||||
shared across them. The first unbudgeted expansion stalled during guard/scout
|
||||
preparation; the budgeted run completed all 26 sites and scouts, with 13 native
|
||||
assertions passed and zero script errors. Nogova spawn admission opened at 27.5s,
|
||||
background preparation completed at 100.8s. Min/max definitions validated; physical
|
||||
maximum-density placement, connected-client UI and FPS were not tested. Focused
|
||||
settings, menu-routing and roster-budget regressions passed. Not published or
|
||||
installed on the live server. Evidence:
|
||||
[`site-population-2026-10-07/report.json`](evidence/site-population-2026-10-07/report.json).
|
||||
|
||||
**7 October 2026 — protect loading prisoners:** newly created admission bodies
|
||||
now have a server-owned damage protection lease for the scene-replication,
|
||||
inventory and native asset-preload wait. The final verified handover restores
|
||||
damage; rejection, timeout cleanup, disconnect, round cancellation and discarded
|
||||
tickets release the lease as well. It preserves a pre-existing disabled damage
|
||||
state and never heals or grants another life. Existing-body reconnect handoff is
|
||||
unchanged; this protects newly spawning characters, not offline reserved bodies.
|
||||
Eight isolated engine checks passed: native damage is blocked while held and the
|
||||
same request damages the actor after release; duplicate release, prior protection
|
||||
and ticket destruction behave correctly. Scene/timeout/lease policy tests and
|
||||
native compilation passed. No connected-client playtest was performed. Evidence:
|
||||
[`spawn-loading-protection-2026-10-07/report.json`](evidence/spawn-loading-protection-2026-10-07/report.json).
|
||||
|
||||
**7 October 2026 — progressive mission generation:** ordinary rounds now admit
|
||||
players once the prison (or crash start), its finite supplies/guards, and the
|
||||
extraction helicopter are ready. The existing per-player replicated-scene,
|
||||
inventory and native asset-preload gate still withholds control until its final
|
||||
client verification; timeout rejects/retries instead of assigning an empty scene.
|
||||
Remaining terrain searches continue in bounded
|
||||
slices; camps are prepared one at a time, followed by scouts, roadblocks and
|
||||
support initialization. Background work runs even with no connected players.
|
||||
Each late site is committed into the existing mission only after stock and guards
|
||||
are ready; unfinished locations stay out of discovery/intel selection. Generic
|
||||
folders are retained when no target exists yet, and late RevealOnEscape sites
|
||||
catch up if players already escaped. Sites within 200m of a living player defer
|
||||
creation. Stopping the round cancels unfinished work without rolling back committed
|
||||
sites. Optional failed sites can be omitted only while required objectives and
|
||||
accessible radio clues remain valid; required failures end the round explicitly.
|
||||
Native 1.8.0.13 Nogova test: spawn-ready at 25.4s, all 16 sites and remaining
|
||||
preparation complete at 82.7s, nine checks passed and zero script errors. Ordinary
|
||||
Everon cancellation test: spawn-ready at 5.7s; partial site cleanup preserved the
|
||||
prison and committed sites, no later generation occurred. These are isolated
|
||||
server-side tests, not a connected-client or FPS benchmark. Evidence:
|
||||
[`progressive-generation-2026-10-07/report.json`](evidence/progressive-generation-2026-10-07/report.json).
|
||||
|
||||
**7 October 2026 — checkpoint mine laying:** quiet roadblock guards can now make
|
||||
up to four finite off-road placement attempts per post, using original carried
|
||||
PMN4s and the existing mine inventory chance. Jobs start during ordinary HQ ticks
|
||||
(after prison escape), with at most two checkpoint engineers working at once.
|
||||
Every nearby road edge has a 15m exclusion margin; the defend area plus a 20m
|
||||
buffer stays clear. Original hold orders, finite inventory/callback custody,
|
||||
continuous preparation, engineer withdrawal and friendly clearance remain required.
|
||||
Combat, reassignment, custody loss or a 180s deadline cancels placement. The working
|
||||
guard gets a temporary native AI activation/LOD lease, restored on completion.
|
||||
Known checkpoint mines steer friendly foot AI around a safety circle, preserving
|
||||
individual destinations through the detour and cancelling on a changed group order.
|
||||
Players, mine triggers and blast damage are unchanged. Moved/disarmed/destroyed
|
||||
mines lose their stored avoidance entry. This is local steering with physical
|
||||
corridor checks, not an engine-wide navmesh exclusion or friendly immunity.
|
||||
Six focused regression programs and the development source bundle check pass.
|
||||
The isolated Reforger 1.8.0.13 Nogova run placed and armed eight distinct carried
|
||||
mines with zero script errors; a separate crossing probe verified friendly detours
|
||||
around live mines: all three started crossings completed, with 10.06–11.86m
|
||||
minimum clearance and their mines still armed. The final inside-danger-area
|
||||
wait safeguard was native-compiled separately. See [native evidence and limits](evidence/roadblock-mining-2026-10-07/report.json).
|
||||
Not published or installed on the live server.
|
||||
|
||||
**7 October 2026 — editor registration and item-catalog lifecycle errors:** terrain
|
||||
takeover now reuses an existing editor and waits for a valid, distinct player
|
||||
replication identity before creating a missing one. An 80-attempt retry only
|
||||
visits missing editors and cancels on mode detach/end. Normal host ownership and
|
||||
native administrator permissions remain intact. Item-station cleanup records
|
||||
successful native subscriptions and releases their original owners independently
|
||||
of the catalog; transient preloads without a catalog do not initialize a gameplay
|
||||
station. Main-world setup errors remain visible.
|
||||
Five focused regression programs pass. In the isolated 1.8.0.13 Nogova fixture,
|
||||
the previous source reproduced four catalog errors and two failed cleanup checks;
|
||||
the fixed source passes all seven native checks with zero script errors. The
|
||||
fixture includes real kit creation/deletion and kit-local catalog expiry with the
|
||||
global catalog unchanged. Connected two-player restart still needs live validation.
|
||||
These are source fixes, not a published/deployed update; the running server was
|
||||
only inspected. [Evidence](evidence/server-lifecycle-fixes-2026-10-07/report.json).
|
||||
|
||||
|
||||
**7 October 2026 — configurable building guard density:** Forces → Configure
|
||||
guards groups the existing 0–16 soldiers-per-site control with every 1st/2nd/3rd/4th
|
||||
eligible compound (new default: every third) and hold/half-to-HQ/all-to-HQ choices.
|
||||
Settings persist in the unified mission config and are frozen at round setup.
|
||||
Skipped compounds stay skipped for the round; fixed guards retain the existing
|
||||
HQ reservation and reporting path. Site logs include density and HQ mode.
|
||||
Four focused regression programs and isolated 1.8.0.13 script compilation pass.
|
||||
The revised UI and live mission behavior still need playtesting; source only,
|
||||
publication remains with the user. See [guard settings](town-garrisons.md).
|
||||
RKS #2 logs were read after explicit approval of read-only sudo: the last played
|
||||
round spawned 72 object guards (36 fixed/36 responders) plus 18 town soldiers.
|
||||
Two editor-manager registration exceptions occurred at 14:00:58 UTC during terrain
|
||||
takeover; the process continued. Repeated missing entity-catalog errors remain.
|
||||
No live settings were changed and the server was not restarted.
|
||||
|
||||
|
||||
**7 October 2026 — spectator scope view:** first-person camera samples now carry
|
||||
bounded cosmetic scope identity, magnification, vertical reticle offset and
|
||||
illumination. Standard 2D/PiP optics use their authored reticle in a private
|
||||
full-screen spectator display; ordinary first-person poses are unchanged.
|
||||
Weapon/sight identity matching, stale-view fallback and scope transition resets
|
||||
prevent retaining another weapon's scope. No weapon input or native ADS callback
|
||||
is invoked on the watched soldier. The display cleans up on orbit, target loss,
|
||||
menus, camera exit and recovery. Eight focused offline regression programs pass.
|
||||
The hidden 1.8.0.13 client creates and renders the PSO overlay, restores visibility
|
||||
on close, and reopens with illumination; both captures were inspected. This is
|
||||
local rendering evidence, not remote multiplayer/aiming proof. The last
|
||||
ignore-cursor flag is separately compiled. See [evidence and limits](evidence/observer-scopes-2026-10-07/report.json).
|
||||
Source only; publication remains with the user.
|
||||
|
||||
|
||||
**7 October 2026 — solo death camera and starting supplies:** the observer now
|
||||
detects death from the round roster even if native possession keeps the corpse,
|
||||
initially selects the player's own available body, and restores an observer camera
|
||||
displaced by the native death camera. Open Game Master keeps its camera. Dead-body
|
||||
orbit input also works after selecting player view. The existing final-death grace
|
||||
period and round restart timing are unchanged. Mission-menu settings control the
|
||||
shared starting backpack's pistols (0–12, default 5) and spare magazines (0–48,
|
||||
default 8) for the next round. Focused offline regressions cover saved-setting
|
||||
migration/ranges/failure retention, spectator selection and camera recovery;
|
||||
native multiplayer behavior and the revised menu rendering still need playtesting.
|
||||
Source changes only; publication remains with the user.
|
||||
|
||||
|
||||
**7 October 2026 — AI offloading decision deferred pending measurements:** preserve
|
||||
the isolated Reforger 1.8 probes and evidence. Ownership transfer and worker-local
|
||||
soldier copies did not move native AI updates. Remote native collision-query
|
||||
batches worked, including authoritative waypoint application and timeout fallback,
|
||||
but no useful CPU saving was established. The user wants to collect representative
|
||||
mission performance data before deciding how to use this. Do not integrate an
|
||||
offloading architecture on the strength of the prototype alone. See the
|
||||
[workaround findings and recorded decision](ai-delegation-workarounds-1.8.md) and
|
||||
[HQ measurement instructions](hq-performance-measurements.md).
|
||||
|
||||
**5 October 2026 — review and regression repair:** all **326 registered regression programs pass**. Audio graph resource validation now handles escaped quotes and checks six verified vanilla audio resources; corrupted IDs/paths remain rejected. Stale roadblock, logging and five-vehicle convoy adapters were repaired without changing gameplay scripts. The development source bundle validates 455 authored files. This is offline validation, not a new native-game, multiplayer or FPS result. [Changes and review limits](evidence/review-audit-2026-10-05/review.json).
|
||||
|
||||
**5 October 2026 — configurable interim roadblocks:** Settings now includes a next-round count from 0–12 (default 4; 0 off), saved in the unified server configuration. Native road sampling places finite four-soldier checkpoints with roadside sandbags, selected-faction equipment and normal VirtualHQ reporting/tasking. A bounded optional search cannot hold up startup indefinitely. The final hidden Workbench run placed four posts with sixteen living guards, passed 51 assertions and completed player admission, prison release and radio progression without script/runtime failures. Its thirteen engine resource errors match the earlier spectator baseline. Live multiplayer and other-terrain placement remain playtest work. [Evidence and limits](evidence/roadblocks-2026-10-05/review.json).
|
||||
|
||||
**4 October 2026 — spectator body cycling and player-camera relay:** when no eligible survivor remains, spectators can cycle the current round's player corpses even after native controllers detach. Player view now uses the teammate's sampled camera transform and zoom, with bounded owner/server/observer relay, short interpolation, stale-stream orbit fallback and native head/helmet fading. Nineteen targeted regression programs pass. A hidden/muted native fixture completes 31 assertions with no script/runtime failures and the same thirteen installed-resource errors as its earlier baseline; both view screenshots were inspected. The fixture uses a physical stand-in with injected samples, so real multiplayer latency, HUD and picture-in-picture optics are not claimed as verified or identical. [Evidence and limits](evidence/observer-player-view-2026-10-04/review.json).
|
||||
|
||||
**4 October 2026 — civilian van and terrain Game Master follow-up:** the reported Chernarus session lacked per-car readiness/motion diagnostics. S1203 driving works in an isolated native baseline. Civilian traffic now logs prefab/readiness/progress, starts its stall allowance after readiness, and makes two bounded attempts to restore remaining fixed route orders. The Game Master pause-menu button now follows native permission changes; takeover reconciles already-connected editor managers using native roles. Full repository checks and focused regressions pass; native van recovery after injected order loss and editor event handover pass. Actual multiplayer Game Master UI and the exact reported Chernarus stall still require playtesting. Source is ready for user publication; live server settings and release were not changed. [Evidence and limits](evidence/playtest-traffic-editor-2026-10-04/README.md).
|
||||
|
||||
**4 October 2026 — refreshed UI/BMP development handoff:** [package and editable source](../.build/playtest-2026-10-04-ui-bmp/README.md).
|
||||
|
||||
The combined addon includes the inventory hit-zone callback correction and mounted BMP ammunition-accounting corrections, alongside selectable static crash starts and the existing finite base escape loop. Prison remains the default. **439 authored files, 378 exact PAK payloads and 3 runtime files** match the handoff. The exact code/tests/tools bind to the completed **309-program regression pass**, with any later checkpoint prose changes recorded separately. The exact-source normal escape completes **64 assertions and 1 completion**, with zero script/runtime failures and **13 retained engine errors**. Ordinary startup of these exact runtime bytes reaches the normal mission and local prisoner with zero script/runtime failures and **17 retained engine errors**.
|
||||
|
||||
This is an **unqualified development candidate**. Strict packaging/startup failures remain recorded. Synthetic inventory notifications and bounded BMP inventory/status diagnostics do not establish natural-injury/manual UI behavior, physical interception, human escape, multiplayer/JIP/reconnect, comparative FPS or clean release acceptance. Existing missions and all five prior sealed candidates remain unchanged. No installed runtime is replaced and nothing is published.
|
||||
|
||||
**4 October 2026 — inventory callbacks and original BMP radio accounting verified:** the native inventory check completes **96 assertions**, proving all seven original injury widgets receive the real one-argument event once and detach without late updates; it changes no health. The BMP sampler now recognizes the exact WCS inert control's proved structural attachment when its disabled inventory component is absent, while retaining real-weapon custody, completeness and counting limits.
|
||||
|
||||
The corrected original-BMP check completes **60 assertions**, including a complete mounted sample and actual radio delivery into a detached HQ Watch copy. The exact final-source scripted normal escape completes **64 assertions and one round**. All three completed runs have zero script/runtime failures and retain **13 known engine errors**; they ran hidden and muted with unchanged inputs and verified cleanup. All **309 regression programs pass** on unchanged final inputs. The initial 48-assertion/two-failure BMP diagnostic remains archived. Manual injury/rendering, full-fleet or physical interception reliability, multiplayer, FPS and clean release remain unqualified. Original missions, staged work and prior packages are preserved; installed runtime is unchanged and a refreshed development handoff is next. [Correction, exact evidence and limits](evidence/ui-bmp-corrections-2026-10-04/README.md).
|
||||
|
||||
**3 October 2026 — full regression restored; bounded inventory/BMP checks prepared:** all **309 registered regression programs pass** on unchanged final inputs, including the inventory callback correction and previously quota-blocked packaging checks. Only this task's inactive frozen-source duplicate was moved to disk with all 1031 files verified and its original path retained; no other task's temporary files or evidence were deleted.
|
||||
|
||||
The new opt-in inventory check uses the real menu, seven native injury handlers and one-argument blood notifications to test exact forwarding and genuine detach cleanup, without changing health or using desktop input. BMP diagnostics now distinguish missing inventory components, null/conflicting parent slots and failed zero-muzzle classification. Production ammunition/completeness rules and the callback adapter are unchanged. A running user game prevented native execution; the newly prepared checks remain **native-compilation and execution pending**. Original missions, staged work, five sealed packages and installed runtime are unchanged. [Exact checks, source, reviews and next native commands](evidence/inventory-bmp-checks-2026-10-03/README.md).
|
||||
|
||||
**3 October 2026 — inventory injury callback corrected in source:** a mission-scoped adapter fixes the one-argument damage event/two-argument UI callback mismatch observed in the installed client. It retains native updates and initialization, with owned-subscription cleanup. Focused regression and native compilation pass; actual injury-widget dispatch, rendered UI and multiplayer remain unverified. The installed package is unchanged.
|
||||
|
||||
The full suite stopped after **134 passing programs** on a shared `/tmp` disk-quota failure in offline packaging; **308 programs are registered**, but no full pass is claimed. No unrelated temporary files were deleted. The hidden, muted BMP check now reaches the original slot-4 vehicle and records **48 assertions**, but its numerically valid snapshot remains incomplete at the exact empty-armament slot binding. Two fixture failures and 13 existing engine errors are retained; radio proof is not reached. Source/dependency preservation and private cleanup are confirmed. Original missions, staged work and five sealed packages are unchanged. [Correction, failed checks and next steps](evidence/inventory-hitzone-compat-2026-10-03/README.md).
|
||||
|
||||
**3 October 2026 — BMP accounting verification strengthened; native run pending:** an opt-in Workbench check now requires complete armed counts from the original slot-4 BMP and that same vehicle’s actual queued and radio-delivered HQ status. The old generic check could be satisfied by a UAZ. The isolated check stops opening hunters and new town admissions before prison exit, while retaining original site troops, automatic convoy target, body cap, finite stock and the fixed proof deadline. Ordinary mission behavior is unchanged.
|
||||
|
||||
All **10 affected regression programs pass** on unchanged inputs; baseline and missing-completeness controls fail as expected. A read-only host preflight found an existing game, so no native run was started and the game was left untouched. The earlier 117/135 refusal correctly enforced the documented shared cap and was not a demonstrated accounting defect. The current crash-start playtest package is unchanged; it predates this diagnostic only. Native BMP accounting/radio proof, physical support reliability, manual play, multiplayer and FPS remain unqualified. [Prepared check and exact evidence](evidence/bmp-native-proof-preparation-2026-10-03/README.md).
|
||||
|
||||
**3 October 2026 — refreshed crash-start development handoff:** [package and editable source](../.build/playtest-2026-10-03-crash-start/README.md).
|
||||
|
||||
The combined addon now packages the static crash-start choice, memory-based HQ searches, BMP interception implementation and recent configuration/resupply fixes. Prison remains the default. **437 authored files, 376 exact PAK payloads and 3 runtime files** match the handoff. The unchanged code/tests/tools reuse the completed **307-program regression pass** with three recorded subsequent documentation changes. The exact-source scripted default escape completes **64 assertions and one round**; ordinary startup of the exact package reaches the normal mission and local prisoner. Both have zero script/runtime failures, while retaining **13 and 17 engine errors**, respectively. The earlier 66-assertion crash route predates two terrain Game Master edits; that source difference remains recorded.
|
||||
|
||||
This is an **unqualified development candidate**: strict packaging/startup failures, human play, multiplayer, physical support reliability, comparative FPS and clean release qualification remain outstanding. Tests stayed hidden and muted. Prior packages and existing missions are preserved. [Start controls](mission-starts.md) · [Exact handoff evidence](evidence/playtest-refresh-2026-10-03-crash-start/README.md).
|
||||
|
||||
**3 October 2026 — independent crash aftermath start implemented:** Prison remains the default. Administrators can save Prison or Crash for the next round through Settings or `/esc mission start set prison|crash`. The server freezes and replicates that choice before site preparation. Crash creates a successor-owned static wreck scene, admits ordinary one-life survivors on foot and enters the existing intel → radio defence → extraction loop directly. The original finite supplies and shared field map are retained; the measured full wreck footprint and starting area are surveyed before placement.
|
||||
|
||||
The strengthened scripted crash route completes **66 assertions and one round**; the default prison route completes **64 assertions and one round**, both with zero script/runtime failures with unchanged inputs in each accepted run. The crash snapshot predates two unrelated terrain Game Master edits from the user’s other task; the repeated default route checks a frozen copy of the resulting source. The crash check also observes native activation of retained original clue defenders after the scripted approach, without an activation override. All **307 registered regression programs pass** on an unchanged frozen snapshot; the recorded documentation update follows those checks.
|
||||
|
||||
An initial crash fixture wrongly required every distant enemy to be currently active. Its failure remains archived; the corrected Workbench-only probe checks prison-hold release separately from native activation. Native AI behavior was not changed. The first default run completed but was rejected by the source guard because of the concurrent terrain edits; its raw evidence is retained and the default check was repeated against a frozen copy. A complete suite run also detected a concurrent peer edit; all 307 programs were then rerun on the frozen inputs. Each successful run still retains **13 engine errors**. These hidden, muted fixtures protect and teleport the participant, shorten radio defence and move the extraction vehicle: they do not qualify manual play, real flying, remote clients, twelve-player multiplayer or FPS. Static aftermath does not implement an animated helicopter crash or hideout start. Original missions and prior sealed packages are unchanged; a fresh package is still pending. [Controls and limits](mission-starts.md) · [Exact evidence and source](evidence/crash-start-2026-10-03/README.md).
|
||||
|
||||
**3 October 2026 — latest mission and HQ native checks completed:** the scripted normal Everon escape route completes **64 assertions and one round**, with zero script/runtime failures. A separate corrected HQ fixture completes **172 assertions and one round**: an original two-member mobile team receives the copied **45 m** native search radius, pauses/resumes its queued search under injected contact, and returns to its existing home-defence waypoint on release. A separate six-member permanent guard patrol physically completes five ordered native moves and travels at least 8 m.
|
||||
|
||||
The first patrol attempt remained in the deliberately frozen prison phase; the second reached physical patrol completion but its historical catalog had no mobile responders. Both failures remain archived. Workbench-only setup now opens the prison through the canonical participant API, prepares two finite responders through the normal site owner, and checks their HQ queue before observing the separate permanent patrol. Ordinary mission behavior, movement criteria and deadlines are unchanged. All **305 registered regression programs pass** on the final unchanged snapshot.
|
||||
|
||||
Each completed native run retains **13 engine errors**, so strict clean-build qualification still fails. Both ran hidden and muted with unchanged source/dependency inputs and confirmed cleanup. The normal route preceded the three diagnostic source edits; exact snapshots and deltas are recorded. Radio transit, same-group physical search/resumption, a 110 m search sweep, twelve-player multiplayer and FPS are not established by these fixtures. Original missions and sealed packages are unchanged; the packages still predate recent source changes. [Checkpoint, failures and next work](evidence/hq-native-checkpoint-2026-10-03/README.md).
|
||||
|
||||
**3 October 2026 — memory-based ground search areas implemented:** ordinary HQ SEARCH orders copy the delivered belief's uncertainty into a 45–110 m native search radius when queued. Delivery validates that snapshot before allocating a waypoint or replacing the previous task, then installs it once. Search centres still follow delivered tracks and coverage; missing-patrol investigations, road/site defence, interception, containment and the separate air-team path retain their previous behavior.
|
||||
|
||||
All **305 registered regression programs pass** on the recorded unchanged snapshot. Six focused programs, a failing baseline and two mutation controls cover queue snapshots and delivery guards. The existing 40 m / 30 s negative-search witness remains unchanged; a visited 500 m cell does not prove every part of that area was cleared. The native search grid grows with radius, so runtime cost and FPS remain unmeasured. Native checks were deferred because an existing game was running. Original missions, the index and sealed development packages remain preserved; packages predate this change. [Implementation and evidence](evidence/hq-search-radius-2026-10-03/README.md).
|
||||
|
||||
**3 October 2026 — configuration recovery and interrupted rifle resupply corrected:** changing one setting can no longer overwrite the only valid backup of another malformed section. Invalid recognized sections block unrelated saves before disk writes; repairing the damaged section preserves the good backup. Ordinary ammunition trips now retain their exact truck and recipient claims while an accepted native move remains unresolved, preventing a second supply job from racing the first. Existing finite stock, radio demand, deadlines and transfer rules remain in place.
|
||||
|
||||
All **305 registered regression programs pass** on the recorded unchanged snapshot. Baseline failures and focused controls reproduce both bugs. Repository and source-bundle validation now recognize one audited optional resource-name comparison without adding a runtime dependency, and the existing vanilla character load has verified resource metadata. The initial validation failure remains archived. A separate bounded base-loop review found no new demonstrated defect in radio defence, extraction ordering, player identity or terminal cleanup. Native checks were deferred because an existing game was running; no window, input, audio or process changes were made. Native transfers, manual escape, multiplayer and FPS remain unqualified. The sealed development packages predate these source changes. [Implementation and evidence](evidence/config-supply-recovery-2026-10-03/README.md).
|
||||
|
||||
**3 October 2026 — original BMP singleton interception implemented in source:** after six confirmed original-unit losses reach HQ through delivered reports, HQ can assign an existing original slot-4 WCS BMP to a road ahead of the remembered track. Fresh delivered crew/ammunition status, original force custody and a real radio command remain required. Its measured vehicle/attachment envelope governs conservative road and destination clearance. Existing UAZ pairs and singleton fallback share the same two-survey budget; no new vehicle, crew or stock is spawned.
|
||||
|
||||
All **305 registered regression programs pass** on the recorded unchanged snapshot. Independent reviews cover dispatch, service and geometry integration. Native compilation, physical BMP driving/interception and path reachability remain unverified: a read-only preflight found an existing user game, so no native test was started. The sealed depot-mines package remains unchanged and predates this source feature. Original missions and earlier packages remain preserved. [Source and regression evidence](evidence/bmp-interception-2026-10-03/README.md).
|
||||
|
||||
**3 October 2026 — BMP ammunition accounting corrected; native confirmation pending:** two verified non-firing WCS/vanilla controls were counted as weapons with missing muzzles. The sampler now excludes only these exact resources when their native muzzle list is empty and reciprocal mounted ownership is valid. Real weapons and unknown or malformed components retain all completeness checks. This corrects accounting; it does not add BMP interception.
|
||||
|
||||
All **302 registered regression programs pass** on the recorded unchanged test snapshot, including its welcome-voice addition. Subsequent concurrent settings, faction/item preferences, terrain preference and welcome-voice edits are preserved live and are not covered by these results. The old sampler compiles and fails the new actual-method assertion; the correction passes ordinary and WORKBENCH controls. Exact installed resource identities were independently audited. One hidden/muted mounted-ammo run compiles but cannot admit an original convoy within its fixed proof window: the shared body budget reaches 117/135, while a convoy requires 25. It records **32 passing assertions, zero completions, two script test failures and fifteen engine-error entries**, including those two failures and thirteen existing entries. No BMP sample was observed; physical accounting and radio delivery remain unverified. Cleanup and unchanged source/external inputs are confirmed. [Source, tests and failed native evidence](evidence/bmp-ammo-accounting-2026-10-03/README.md).
|
||||
|
||||
The sealed depot-mines development package below predates this correction and excludes later live source changes. Original missions and all earlier packages remain preserved. Manual escape, multiplayer, physical logistics, comparative FPS and clean-release qualification remain unfinished.
|
||||
|
||||
**3 October 2026 — depot-mines development handoff:** [package and editable source](../.build/playtest-2026-10-03-depot-mines/README.md).
|
||||
|
||||
**423 authored files**, **364 exact PAK payloads** and **3 runtime files** match the editable source and handoff manifest.
|
||||
|
||||
This snapshot adds ten finite startup PMN4 mines across five original camp caches. An existing original responder can carry one inert original mine to an existing ammunition truck after separately tracked mine expenditure; magazine expenditure cannot request mines. The loader also selects a compatible eligible porter from the original roster instead of letting an incompatible first member block magazine loading. Exact cargo identities, typed delivery proof, fixed deadlines and cancellation quarantine remain enforced. Earlier finite engineer-post reuse, compatible-stock supply, mine-flank safety and paired interception are included.
|
||||
|
||||
The unchanged authored source, tests and tools reuse the completed **301-program regression pass**; 3 later documentation-only differences are separately reviewed. The unchanged-source archived normal Everon route completes **64 assertions and 1 round**, with zero script/runtime failures and **13 retained engine errors**. The normal-route read-only stock witness confirms **ten distinct original inert PMN4s in five camp caches**; it does not prove courier travel or transfer. Ordinary startup of the exact new runtime bytes verifies the normal mission and local prisoner, with zero script/runtime failures and **17 retained engine errors**. Strict packaging/startup failures remain recorded.
|
||||
|
||||
This is an **unqualified development candidate**. Native repeated mining and route avoidance, mine placement/arming/detonation, physical resupply/interception and survivor retasking remain unverified, as do complete human escape, real multiplayer/JIP/reconnect/twelve-player play, manual UI behavior, comparative FPS and a clean release. An intermittent zero-radius engine diagnostic remains unresolved; the opt-in trace preserves native behavior and is not a fix or proof of the caller. Qualification binds the exact tested depot-mines snapshot. Concurrent welcome-voice additions and later source or test changes, including the BMP sampler correction, are preserved live but excluded from this frozen handoff and its qualification. Earlier packages and original missions remain preserved.
|
||||
|
||||
**Earlier source and package checkpoints (historical):**
|
||||
|
||||
**3 October 2026 — finite camp mines join the physical supply chain:** five authored Everon camps now start with two PMN4 mines each. The existing original-responder courier can carry one inert original mine to an existing ammunition truck after separately tracked mine expenditure. Magazine expenditure cannot request mines. Cargo type, exact identities, native custody and cancellation are checked throughout; the original engineer entitlement and consumed-post rules remain unchanged.
|
||||
|
||||
All **301 registered regression programs pass**. One hidden/muted normal Everon run completes **64 assertions and one round**, with **0 script/runtime failures and 13 retained engine-error entries**. The added read-only stock witness confirms **ten distinct original inert PMN4s stored in five camp caches**. Cleanup and unchanged source/external inputs are confirmed. Autonomous porter travel and native mine delivery, mine placement/arming, real multiplayer and comparative FPS remain unqualified. Existing missions, the index and packages are preserved; the ground-supply package predates this feature. The intermittent zero-radius issue remains unresolved. [Implementation and evidence](evidence/depot-mines-2026-10-03/review.json).
|
||||
|
||||
**3 October 2026 — camp loading selects a compatible original porter:** a camp's first responder can no longer block loading solely because its rifle is incompatible with the remaining cache magazines. The loader searches the bounded original roster for a compatible eligible member before reserving forces or sending a truck hold. Existing military/ownership eligibility now applies during selection as well as execution. No stock, troops, deadlines or native transfer rules change.
|
||||
|
||||
All **300 registered regression programs pass**. Actual-method tests reproduce the old mixed-roster failure and preserve the existing cancellation and finite-delivery checks. One hidden/muted normal Everon run compiles and completes **63 assertions and one round**, with **0 script/runtime failures and 13 retained engine-error entries**. Cleanup and unchanged source/external inputs are confirmed. The existing zero-radius trace was enabled; neither the earlier error nor a caller trace appeared. Its cause remains unresolved; no extra reproduction run was made. Physical autonomous loading, multiplayer and performance remain unqualified. Existing missions, the index and packages are preserved; the ground-supply package predates this correction. [Implementation and evidence](evidence/depot-porter-pair-2026-10-03/review.json).
|
||||
|
||||
**3 October 2026 — ground-supply development handoff:** [package and editable source](../.build/playtest-2026-10-03-ground-supply/README.md).
|
||||
|
||||
**423 authored files**, **364 exact PAK payloads** and **3 runtime files** match the editable source and handoff manifest.
|
||||
|
||||
This snapshot adds finite engineer reuse at genuinely newer radio-delivered road posts: four consumed attempts per original force and thirty-two per mission, with every new post more than 160 m from consumed posts. Original stock, native movement envelopes, fixed deadlines and unresolved-removal quarantine remain intact. Ordinary small-arms supply now refuses trucks lacking compatible nonempty original magazines before spending a report or claiming forces. Earlier mine-flank safety, paired interception and player-recovery changes remain included.
|
||||
|
||||
The unchanged authored source, tests and tools reuse the completed **300-program regression pass**; 2 later documentation-only differences are separately reviewed. The unchanged-source archived normal Everon route completes **63 assertions and 1 round**, with zero script/runtime failures and **13 retained engine errors**. Ordinary startup of the exact new runtime bytes verifies the normal mission and local prisoner, with zero script/runtime failures and **17 retained engine errors**. Strict packaging/startup failures remain recorded.
|
||||
|
||||
This is an **unqualified development candidate**. Native repeated mining and route avoidance, mine placement/arming/detonation, physical resupply/interception and survivor retasking remain unverified, as do complete human escape, real multiplayer/JIP/reconnect/twelve-player play, manual UI behavior, comparative FPS and a clean release. An intermittent zero-radius engine diagnostic remains unresolved; the opt-in trace preserves native behavior and is not a fix or proof of the caller. Qualification binds this frozen snapshot; later live edits are excluded. Earlier packages and original missions remain preserved.
|
||||
|
||||
**Earlier source and package checkpoints (historical):**
|
||||
|
||||
**3 October 2026 — HQ skips ammunition trucks that cannot supply the reported patrol:** ordinary rifle-supply admission now checks for compatible, nonempty original magazines before reserving forces, consuming the report or starting its three-minute cooldown. Previously an incompatible belt or launcher round could trigger a futile trip and stop the convoy. Launcher and mine behavior, delivered positions, original stock and later physical transfer checks remain unchanged.
|
||||
|
||||
All **300 registered regression programs pass**. Independent actual-method tests reproduce the old failure and confirm a later compatible original truck can accept the same delivered report. One hidden/muted normal Everon run compiles and completes **63 assertions and one round**, with **0 script/runtime failures and 13 retained engine-error entries**. Cleanup and unchanged source/external inputs are confirmed. The existing zero-radius trace was enabled, but neither the error nor a caller trace appeared; the earlier intermittent issue remains unresolved. No additional reproduction run was made. Autonomous resupply, real multiplayer and performance remain unqualified. Original missions, the index and existing packages are preserved; the mine-safety package predates this source change. [Implementation and evidence](evidence/resupply-compatible-stock-2026-10-03/review.json).
|
||||
|
||||
**3 October 2026 — engineers can reuse remaining stock at a newer delivered road post:** a mission-owned history now permits a second original mine attempt after a genuinely newer radio-delivered assignment. Each original force has four attempts per round and the mission has thirty-two; every new post must be more than 160 m from all consumed posts. Refused attempts remain spent. Active jobs and unresolved removal callbacks block new work for that original force, and copied prior mine sites constrain the next local work area. Original forces, stock, native defend radius and task deadlines remain unchanged.
|
||||
|
||||
All **300 registered regression programs pass**. Actual-method tests reproduce the previous second-post refusal and catch quota and pending-callback regressions. One hidden/muted normal Everon run compiles and completes **63 assertions and one round**, with **one recurring zero-radius script error and fourteen engine-error entries**. Those entries include the same script error plus thirteen installed-resource errors; the exact caller remains unknown. The first native compile exposed a ledger field/type name collision; its failed result is retained, and the corrected source was retested. Cleanup and unchanged source/external inputs are confirmed. Physical repeated mining, native path avoidance, multiplayer and FPS remain unqualified; straight corridor and sampled-position checks are not a navigation guarantee. Existing missions, the index and the mine-safety package remain preserved. That package predates this source change. [Implementation and evidence](evidence/engineer-posts-2026-10-03/review.json).
|
||||
|
||||
**3 October 2026 — mine-safety development handoff:** [package and editable source](../.build/playtest-2026-10-03-mine-safety/README.md).
|
||||
|
||||
**422 authored files**, **363 exact PAK payloads** and **3 runtime files** match the editable source and handoff manifest.
|
||||
|
||||
This snapshot adds engineer mine flanks with at least 15 m clearance from nearby road centerlines and more than 200 m from named settlements. Mine dispatch also respects the group’s current native movement envelope before starting and throughout the job. Original items, fixed deadlines and cancellation quarantine remain intact. Earlier paired interception, finite supply and player-recovery changes remain included.
|
||||
|
||||
The unchanged authored source, tests and tools reuse the completed **299-program regression pass**; 2 later documentation-only differences are separately reviewed. The unchanged-source archived normal Everon route completes **63 assertions and 1 round**, with zero script/runtime failures and **13 retained engine errors**. Ordinary startup of the exact new runtime bytes verifies the normal mission and local prisoner, with zero script/runtime failures and **17 retained engine errors**. Strict packaging/startup failures remain recorded.
|
||||
|
||||
This is an **unqualified development candidate**. Native mine placement, arming and detonation, physical resupply/interception and survivor retasking remain unverified, as do complete human escape, real multiplayer/JIP/reconnect/twelve-player play, manual UI behavior, comparative FPS and a clean release. An intermittent zero-radius engine diagnostic remains unresolved; the opt-in trace preserves native behavior and is not a fix or proof of the caller. Qualification binds this frozen snapshot; later live edits are excluded. Earlier packages and original missions remain preserved.
|
||||
|
||||
**Earlier source and package checkpoints (historical):**
|
||||
|
||||
**3 October 2026 — engineer mine orders respect their group's native movement limits:** admission and every active phase now require the current group utility to allow the selected mine position. Previously a point could pass terrain/road/settlement checks but still trigger individual movement outside the group's defend or autonomous radius. A refusal uses existing cancellation without consuming an item attempt before admission; an already-spent item remains quarantined and late callbacks cannot arm it.
|
||||
|
||||
All **299 regression programs pass**. Independent tests reproduce the prior failure and reject an admission-only correction that misses later restrictions. One hidden/muted normal Everon run compiles and completes **63 assertions and one round**, with **zero script errors and thirteen retained resource errors**. Cleanup and unchanged source/external inputs are confirmed. Native physical mine placement/arming and multiplayer remain unqualified, and the separate intermittent zero-radius error is unresolved. Original missions, the index and previous development package remain preserved. [Implementation and evidence](evidence/engineer-movement-2026-10-03/review.json).
|
||||
|
||||
**3 October 2026 — zero-radius caller diagnostic compiles; earlier error remains unresolved:** an opt-in Workbench diagnostic now observes five native script callsites, with one shared sixteen-record cap and AI node/script stacks. Superclass arguments, results, output parameters and random draws remain unchanged. It is disabled by default and excluded outside Workbench.
|
||||
|
||||
All **299 regression programs pass**, including independent checks that catch three deliberate diagnostic regressions. One hidden/muted normal Everon run completes **63 assertions and one round**, with **zero script errors and thirteen retained resource errors**. The engine CLI confirms tracing was enabled, but the earlier zero-radius error did not recur and no trace was emitted. Its caller remains unknown; this is not a gameplay fix or proof that the error is gone. No repeated run was used to chase reproduction. Cleanup and unchanged source/external inputs are confirmed. Original missions, the Git index and the previous development package remain preserved. [Diagnostic and evidence](evidence/random-radius-trace-2026-10-03/review.json).
|
||||
|
||||
**3 October 2026 — engineer mine sites recover the owned road/settlement exclusions:** the existing finite engineer now selects a flank position 25–60 metres from its delivered road post, at least fifteen metres from every nearby road centerline and outside the shared two-hundred-metre named-settlement exclusion. Previously the selector chose centerline points and omitted the settlement guard. Crossing and narrow roads participate in clearance; invalid or over-budget geometry refuses placement. Original soldiers, carried mines, HQ orders, attempt limits and arming/withdrawal rules are unchanged.
|
||||
|
||||
All **297 registered regression programs pass** on the corrected source. Independent tests reproduce the old placement-policy failure and catch five deliberate regressions; review also corrected tiny-segment clearance and reversed-polyline rounding. The hidden/muted normal Everon route compiles and completes **63 assertions and one round**, with **one zero-radius random-point script error and fourteen engine-error entries**. The fourteen entries include that same script error plus thirteen installed-resource errors; the exact caller is unknown and no evidence attributes it to the mine-site change. Cleanup and unchanged source/external inputs are confirmed. This does not exercise native mine laying or arming, manual play, multiplayer or FPS. The existing development package and original missions are preserved; the package predates this correction. [Implementation and evidence](evidence/mine-flanks-2026-10-03/review.json).
|
||||
|
||||
**3 October 2026 — bounded production convoy observation added; travel qualification remains incomplete:** the new opt-in `supply-travel` fixture watches the first naturally admitted production convoy, retaining its six vehicles, eight groups and 25 original actors. No enemy orders, budgets, routes or contacts are injected. The canonical scripted observer alone is temporarily protected from damage, with its prior flag restored on cleanup.
|
||||
|
||||
The hidden/muted run compiled and admitted the full original formation. Slots **0, 1 and 5** each moved at least twenty metres from their first-ready positions; slots **2, 3 and 4** did not meet that requirement before the fixed three-minute window expired. The task remained ready and active in combat state. Original crew/seat/record checks passed through the last pre-deadline observation; the deadline poll itself exits before revalidation. The archived result is a failure: **zero completions, one script test failure and fourteen engine-error entries**, including that same test failure and thirteen installed-resource errors. Its 453 assertion-pass calls include 419 repeated probe-presence checks and are not 453 distinct gameplay checks. Cleanup and unchanged source/external inputs are confirmed.
|
||||
|
||||
All **297 registered regression programs passed** before a reviewed strong-reference cleanup correction; four relevant checks were rerun successfully on the corrected source, with other suite inputs unchanged. No production AI change or package refresh was made. The earlier mounted-pair handoff below remains preserved. Full travel, tactics, resupply/interception, human play, multiplayer and FPS remain unqualified. [Evidence and limits](evidence/supply-travel-2026-10-03/review.json).
|
||||
|
||||
**3 October 2026 — mounted-pair development handoff:** [package and editable source](../.build/playtest-2026-10-03-mounted-pair/README.md).
|
||||
|
||||
**420 authored files**, **361 exact PAK payloads** and **3 runtime files** match the editable source and handoff manifest.
|
||||
|
||||
This snapshot adds event-time capture cancellation for original active hunter vehicles, the current inherited terrain presentation, and paired radio interception by two original convoy escorts. Both real order receipts precede detours; finite forces, crew identities, stock and fixed deadlines are preserved. Earlier convoy-survivor, radio interruption and finite-transfer corrections remain included.
|
||||
|
||||
The unchanged authored source, tests and tools reuse the completed **294-program regression pass**; four later prose-only documentation updates are separately reviewed. The unchanged-source archived normal Everon route completes **63 assertions and 1 round**, with zero script/runtime failures and **13 retained engine errors**. Ordinary startup of the exact new runtime bytes verifies the normal mission and local prisoner, with zero script/runtime failures and **17 retained engine errors**. Strict packaging/startup failures remain recorded.
|
||||
|
||||
This is an **unqualified development candidate**. Native survivor radio delivery and physical retasking remain unverified, as do physical resupply/interception, complete human escape, real multiplayer/JIP/reconnect/twelve-player play, manual UI behavior, comparative FPS and a clean release. Qualification binds this frozen snapshot; later live edits are excluded. Earlier packages and original missions remain preserved.
|
||||
|
||||
**Earlier source and package checkpoints (historical):**
|
||||
|
||||
**3 October 2026 — HQ can dispatch a pair of original convoy escorts:** two armed escorts from the same finite convoy can receive separate radio orders to spaced positions on one actual road ahead of delivered travel memory. Both receipts are required before either detour begins. Interrupted delivery, stale history or loss of an original crew cancels the pair; there is no replacement partner, deadline renewal or new combat force. Single-escort fallback, force limits and the total two-road-survey budget remain intact.
|
||||
|
||||
All **294 registered regression programs pass**. Independent review corrected a feasible-pair selection gap; source tests cover radio arrival order, interrupted delivery, waypoint allocation failure, exact ownership and two-escort column rejoining. A hidden/muted normal Everon run completes **63 assertions and one round**, with **zero script/runtime failures and thirteen retained engine errors**. The first native compile caught a field/type naming conflict; its failed result is retained, and the corrected source was retested. Cleanup and unchanged source/external inputs are confirmed. This establishes compilation and ordinary-loop integration, not native physical paired interception, human play, multiplayer or FPS. Existing missions, the Git index and the previous playtest package are preserved; that package predates this addition. [Implementation and evidence](evidence/mounted-pair-2026-10-03/review.json).
|
||||
|
||||
**3 October 2026 — current mission survives two native end/restart cycles:** the hidden/muted Core fixture passes **21 assertions across two independently initialized rounds**, with **zero script/runtime failures and thirteen retained engine errors**. Each round reaches the prepared prison phase, ends through vanilla `EndGameMode`, shuts down successor services once, cancels queued work and leaves stale callbacks inert. Native end data remains unchanged, no escape is invented, and vanilla reload initializes the second round with fresh state.
|
||||
|
||||
A fresh **292-program regression run passes** on the same **420-file authored source**, including the inherited terrain-presentation update; earlier source bindings are not reused. Cleanup and unchanged source/external inputs are confirmed. This checks local prepared-round termination and restart, not pending native preloads, field-logistics teardown, complete human play, multiplayer or FPS. Strict native failure remains recorded. No production code changed in this continuation; existing missions, inherited work and the packaged handoff are preserved. [Evidence and limits](evidence/active-restart-current-2026-10-03/review.json).
|
||||
|
||||
**2 October 2026 — combined admin and intel reroll fixture completes on current source:** the hidden/muted native run passes **116 assertions and one escape round**, with **zero script/runtime failures and thirteen retained engine errors**. It exercises the administration menu and owner RPCs, then processes **126 original AI at 100% and again at 0%**, both with zero failed or skipped entries inside the unchanged shared ninety-second gate. The checked guards gain/remove their native folders while the player’s exact collected clues and identified radio remain intact. Interrupted radio defence, extraction and results then complete.
|
||||
|
||||
No production source changed. The prior **292-program regression pass** covers identical authored source, tests and tools; this was not a new full-suite run. The earlier 129-actor timeout remains preserved, and this 126-actor result is not an identical-workload comparison. Scripted local legacy-site/admin checks do not establish ordinary input, remote multiplayer, generated-route balance or FPS. Strict engine failures remain; cleanup and unchanged external inputs are confirmed. Three bounded gameplay reviews found no new demonstrated defect. Original missions and the existing package remain unchanged. [Evidence and scope](evidence/intel-reroll-current-2026-10-02/review.json).
|
||||
|
||||
**2 October 2026 — active hunter capture is remembered at vehicle entry:** when a current admitted player enters an active original HQ hunter vehicle, the server records capture before native entry callbacks can change player ownership. The existing driving/recovery order and HQ registration are released once, even if current occupancy disappears before the next one-second poll. Vehicles, crew and spent deployment allowances remain physical and unchanged. Entering an already-released vehicle does not revoke its former crew’s independent infantry role.
|
||||
|
||||
All **292 registered regression programs pass**. Independent actual-method tests reproduce the old event gap and a missing survivor-retention guard, then pass with the fix. The installed SDK signature and callback ordering are verified. A hidden/muted normal Everon run completes **63 assertions and one round**, with **zero script/runtime failures and thirteen retained engine errors**, confirmed cleanup and unchanged inputs. This proves compilation and ordinary-loop integration; native capture-event timing, remote multiplayer and performance remain unverified.
|
||||
|
||||
The existing convoy-survivors package is unchanged and predates this source fix. Original missions and inherited work are preserved; nothing was committed or published. [Implementation and evidence](evidence/hunter-capture-2026-10-02/review.json).
|
||||
|
||||
**2 October 2026 — convoy-survivors development handoff:** [package and editable source](../.build/playtest-2026-10-02-convoy-survivors/README.md).
|
||||
|
||||
**420 authored files**, **361 exact PAK payloads** and **3 runtime files** match the editable source and handoff manifest.
|
||||
|
||||
The snapshot retains eligible original enemy convoy survivors in their existing HQ registration when travel or boarding ends. Exact ownership, roster and force identity still apply; no new soldiers, equipment or contacts are created. Radio-hop interruption, finite-transfer cancellation and deleted-mortar-shell fixes remain included.
|
||||
|
||||
The exact source passes **291 registered regression programs**. The unchanged-source archived normal Everon route completes **63 assertions and 1 round**, with zero script/runtime failures and **13 retained engine errors**. Ordinary startup of the exact new runtime bytes verifies the normal mission and local prisoner, with zero script/runtime failures and **17 retained engine errors**. Strict packaging/startup failures remain recorded.
|
||||
|
||||
This is an **unqualified development candidate**. Native survivor radio delivery and physical retasking remain unverified, as do physical resupply/interception, complete human escape, real multiplayer/JIP/reconnect/twelve-player play, manual UI behavior, comparative FPS and a clean release. Qualification binds this frozen snapshot; later live edits are excluded. Earlier packages and original missions remain preserved.
|
||||
|
||||
**Earlier source and package checkpoints (historical):**
|
||||
|
||||
**2 October 2026 — original convoy survivors stay available to HQ:** ending a convoy travel task or passenger-team boarding task now retains the existing HQ registration for eligible original enemy survivors. Ownership, original roster and force identity must still match. Captured vehicles, player/foreign/replacement groups, old missions and stopped HQs keep the unregister path. No new soldiers, registrations, equipment grants or contacts are created. Existing radio/report state remains, while ordinary on-foot eligibility still requires conscious survivors outside vehicles. Unsettled logistics transfers retain their exact reservation until the existing owner settles them.
|
||||
|
||||
Nine focused regression programs pass, including actual release/retention/eligibility and exact-token cleanup. The first native compilation exposed an Enforce class-layer visibility error; the corrected source clears the already-validated unit support flag directly, and its normal Everon route completes **63 assertions and one round, with zero script/runtime failures and thirteen retained engine errors**. The failed compile and its cascade are preserved separately. Native survivor radio delivery, physical retasking, multiplayer and FPS remain unverified. This source change is newer than the preserved transfer-fixes package. [Implementation and evidence](evidence/convoy-survivors-2026-10-02/review.json).
|
||||
|
||||
A separate earlier diagnostic identifies the released troop truck: its vehicle and all nine original soldiers were alive in the original enemy group; the conscious driver was outside the vehicle. That is a failure-time observation, not proof of the earlier release trigger. The convoy witness still fails before movement/interception, with 124 assertions, zero completions and two script test failures. Its raw result remains retained.
|
||||
|
||||
**2 October 2026 — convoy diagnostic admission corrected; interception still unproved:** the isolated legacy convoy fixture now stops unrelated opening hunters before prison release. Its original 60-body cap and 19-body convoy reservation are unchanged. Previously nine hunter crew pushed its committed population above the cap; stopping their driving after spawn would not refund those bodies. Normal mission behavior is unchanged.
|
||||
|
||||
Four focused regression programs pass. One hidden/muted native run now admits all six vehicles and nineteen original crew and confirms finite truck cargo, reaching **124 assertions**. It then fails before the road-movement proof because a vehicle is missing or released: **zero completions, two script test failures and fifteen retained engine-error entries**. The current log does not identify the vehicle or release cause; nearby contact/gunfire does not prove a casualty. No physical interception was reached, and no production crew/order guard was weakened. Cleanup and unchanged source/external inputs are confirmed. The earlier profile-path refusal occurred before launch and is also retained. [Correction, failed evidence and remaining diagnostic](evidence/convoy-fixture-admission-2026-10-02/review.json).
|
||||
|
||||
The latest transfer-fixes runtime candidate is preserved; this later edit affects only its Workbench diagnostic. Coverage descriptions now match that candidate and the implemented finite mine resupply; all release acceptance statuses remain pending.
|
||||
|
||||
**2 October 2026 — transfer-fixes development handoff:** [sealed package manifest and editable source](../.build/playtest-2026-10-02-transfer-fixes/handoff.json).
|
||||
|
||||
**420 authored files**, **361 exact PAK payloads** and **3 runtime files** match the sealed source.
|
||||
|
||||
This snapshot includes the radio-hop interruption checks, cancellation guards for finite supply transactions, and the deleted-mortar-shell settlement fix. Earlier terrain/admin integration and bounded HQ travel-history planning remain included.
|
||||
|
||||
The exact frozen source passes **290 registered regression programs**. The normal Everon route completes **63 assertions and 1 round**, with zero script/runtime failures and **13 retained engine errors**.
|
||||
|
||||
Ordinary startup verifies the normal mission and local prisoner with zero script/runtime failures and **17 retained engine errors**. Strict packaging/startup failures remain recorded; this is an **unqualified development candidate**.
|
||||
|
||||
Qualification covers this frozen snapshot, not later live edits. Physical resupply/interception, manual UI behavior, complete human escape, real multiplayer/JIP/reconnect/twelve-player play, comparative FPS and a clean release remain unverified. Existing packages and original missions remain unchanged.
|
||||
|
||||
**2 October 2026 — deleted mortar shells no longer block the battery:** a shell deleted during an accepted transfer now settles as a failed loss. The battery can consider its remaining physical shells; surviving items with uncertain custody remain quarantined, with no refund or retry. Four focused regression programs pass, including actual transfer and battery pending methods. Independent testing reproduces the baseline failure. No native or multiplayer run was made for this change, and existing packaged/source checkpoints predate it. [Fix and verification](evidence/mortar-deleted-shell-2026-10-02/review.json).
|
||||
|
||||
**2 October 2026 — interrupted radio hops and cancelled supply transactions stay stopped:** HQ radio routes now validate both carriers and the existing range rule on each observed sending tick. A carrier losing its radio, consciousness or ownership, or a receiver leaving the link, cannot recover before the deadline and complete that interrupted hop. Delivery and route advancement still wait for the original deadline; radio capability caching remains unchanged.
|
||||
|
||||
Mine resupply, mounted-ammunition pickup and mounted-magazine exchange now preserve cancellation and recheck authority after native submission. An inline callback can no longer turn a stopped or captured transaction into a successful delivery. Committed stock remains spent, and late exact movement can settle uncertainty without a retry or refund. Existing physical-access checks and trace budgets remain intact.
|
||||
|
||||
**Eleven focused regression programs pass** on the changed source. Independent actual-method tests reproduce the old failures and pass with the fixes. Native boundaries are doubled in those tests; no engine session was launched for this increment after detecting an existing Reforger session, which was left untouched. Physical supply, real multiplayer and performance remain unverified. The prior runtime package and sealed source checkpoint are preserved and predate these fixes; refresh the source snapshot before packaging the latest implementation. [Changes, tests and preservation](evidence/radio-transfer-cancellation-2026-10-02/review.json).
|
||||
|
||||
**2 October 2026 — gameplay-fixes source verified; new runtime package deferred:** the [sealed editable source](../.build/playtest-source-2026-10-02-gameplay-fixes/PENDING-PACKAGE.md) contains **420 authored files** and passes **290 registered regression programs**. The confirmed normal Everon route completes **63 assertions and one round**, with zero script/runtime failures and **13 retained engine errors**.
|
||||
|
||||
The snapshot includes the rifle-supply callback cancellation guard, bounded HQ road-survey fairness, and inherited terrain/admin-item integration. These are source inclusions; manual UI behavior, physical resupply/interception, complete human escape, multiplayer and comparative FPS remain unqualified.
|
||||
|
||||
Packaging was refused before creating its session because an existing Reforger session was detected. It was left untouched, and no new runtime candidate was produced. No native process was left waiting to launch; continuation will recheck host idleness before packaging. The [latest existing playtest package](../.build/playtest-2026-10-02-hq-memory-menu-fix/README.md) remains unchanged. The first normal-route cleanup refusal (a transient compiler process could not be classified), successful retry and package refusal are all [retained with source bindings and review](evidence/source-refresh-2026-10-02-gameplay-fixes/review.json). Strict failures are not waived.
|
||||
|
||||
**2 October 2026 — cancelled rifle resupply stays cancelled:** a synchronous native inventory callback could move the magazine while cancelling the transfer, capturing its donor or changing ownership. Rifle transfers then skipped the guards used by launcher transfers and could record a successful delivery. Both modes now recheck terminal state and authority after submission. Submitted items remain spent; late physical arrival can settle uncertainty without counting a delivery or permitting another attempt.
|
||||
|
||||
Four focused regression programs pass for the current source, including the actual transfer and coordinator, shared finite reservations and convoy budget admission. Independent tests reproduce the old failure and pass with the correction; a mutation also demonstrates the ownership guard. No new engine or multiplayer run was made for this two-line correction. [Fix, tests and preservation](evidence/rifle-transfer-cancellation-2026-10-02/review.json).
|
||||
|
||||
The earlier **415-file frozen source** now completes **288 registered programs across resumed verification**: 233 unchanged passing records plus 55 freshly passing programs. Preserving an inactive task-owned temporary snapshot elsewhere, with every file verified and its old path retained, freed the required temporary quota. Earlier failed attempts remain archived. This finishes that snapshot's checks; it is not a full-suite result for the current 417-file source. Existing missions, inherited work and the previous development package are unchanged. Physical interception, manual escape, real multiplayer, comparative FPS and release qualification remain open.
|
||||
|
||||
**2 October 2026 — fair bounded HQ road surveying and an opt-in physical interception witness:** HQ road surveying now rotates through delivered tracks while retaining the existing two-survey limit. Previously, the first two eligible tracks with blocked road candidates could consume every pass and permanently starve a later usable track. The actual-method regression fails before the change and passes afterward; independent review confirms the bounded cursor and unchanged radio, force-claim and expiry policy.
|
||||
|
||||
Resumed verification retains **233 passing programs** against identical frozen input hashes and attempts **1 fresh suffix program**; the current resumed result exits **1** after **234 total recorded programs**. Complete passing verification remains unestablished. The initial deadline-test adapter failure, later `/tmp` quota failure and rejected alternate-directory attempt remain archived. Resumed temporary files use `/tmp`; no production/native source changed for this resumption. The final canonical `/tmp` retry stops in `test_native_package.py` with disk-quota errors (Errno 122); the remaining suffix is unverified. No full-suite pass is claimed. The bounded native run records **33 assertions**, **0 completions**, **2 script/runtime failures** and **15 retained engine errors**; runner result: `test-failed`. It does not establish the complete physical interception sequence; preserve the failed or incomplete result and its raw logs. The canonical convoy admission assertion failed before the interception stage; no physical interception was exercised and no admission policy was weakened. Cleanup confirmed: `True`. Strict engine errors are retained. A separate normal-route run of the same source records **63 assertions**, **1 completion**, **0 script/runtime failures** and **13 retained engine errors**; runner result: `smoke-completed` and cleanup confirmed: `True`. This ordinary route does not validate physical interception.
|
||||
|
||||
The opt-in Workbench witness uses two synthetic observation positions in an original soldier’s local inbox. Radio hops, HQ memory/planning, the original escort and physical AI movement remain production paths. It is not natural detection, a human escape, multiplayer, interception effectiveness, FPS or release qualification. No vehicles, crew or stock are created by the new interception stage. The separate [HQ-memory/menu-fix development package](../.build/playtest-2026-10-02-hq-memory-menu-fix/README.md) is unchanged and predates this survey correction and opt-in witness. Concurrent terrain work and older evidence remain preserved. [Source, regression, native and independent-review evidence](evidence/mounted-native-2026-10-02/review.json).
|
||||
|
||||
**2 October 2026 — corrected HQ-memory/menu-startup development handoff:** [separate package and editable source](../.build/playtest-2026-10-02-hq-memory-menu-fix/README.md). 409 authored files, 351 exact PAK payloads and three runtime files match editable source and `handoff.json`.
|
||||
|
||||
A startup guard now skips automatic terrain takeover in mode-less menu worlds; ordinary supported scenarios and unsupported-mode diagnostics keep their existing behavior. This snapshot includes observer recovery/defeat guidance, finite resupply of supported reloadable launchers, and one original armed convoy escort receiving a radio interception order ahead of delivered player travel history. Earlier finite logistics, controller ownership and authored discovery/mine-warning map presentation remain included. The frozen snapshot includes the earlier parallel task’s automatic terrain takeover behavior; newer concurrent terrain-name/presentation edits remain in the live workspace and are not in this package; this handoff’s fresh scripted route targets Everon.
|
||||
|
||||
The exact source passes **285 registered regression programs** and the [fresh normal escape fixture](evidence/native-2026-10-02-hq-memory-menu-fix-normal/report.json) completes **63 assertions and one round**, with zero script/runtime failures and thirteen retained engine errors. Fresh ordinary startup of this exact package verifies the normal mission and local prisoner with zero script/runtime failures and 17 retained engine errors. Strict packaging/startup failures remain recorded.
|
||||
|
||||
The initial HQ-memory candidate and its one script/eighteen engine errors remain retained; this corrected package includes the demonstrated menu-world guard. This is an **unqualified development candidate**. Physical launcher delivery, native interception movement/holding/rejoining, a complete human escape, real multiplayer/JIP/reconnect/twelve-player play, comparative FPS and a clean release remain unverified. Historical standard-map visual checks do not prove physical held-map rendering or current remote UI behavior. No new native flight or prison-input experiments are included. Previous packages, original missions and inherited work remain preserved; nothing was committed or published. [Package hashes](evidence/package-2026-10-02-hq-memory-menu-fix/handoff.json).
|
||||
|
||||
|
||||
**2 October 2026 — HQ motorized interception implemented in source:** one original armed UAZ convoy escort can receive a radio command to hold a road ahead of remembered player travel, then rejoin its convoy. Orders use delivered history and complete original-formation status, share force limits, expire on a fixed deadline and cannot spawn replacements or compete with logistics. [Behavior and limits](mounted-interception.md).
|
||||
|
||||
All **285 registered regression programs pass**. The [hidden/muted final-source normal escape](evidence/native-2026-10-02-mounted-intercept-normal/report.json) passes **63 assertions and one round**, with zero script/runtime failures and thirteen retained engine errors. The initial missing-hook compilation failure and test default-path failure are preserved with their fixes. [Implementation, review and preservation](evidence/mounted-interception-2026-10-02/review.json).
|
||||
|
||||
Native driving to the intercept, physical holding/rejoining and interception effectiveness remain unverified; the normal escape run proves compilation and base-loop integration only. Human play, real multiplayer, comparative FPS and clean release remain pending. The existing 416-file playtest package is unchanged and predates this increment. Original missions and inherited work are preserved; nothing was committed or published.
|
||||
|
||||
|
||||
**2 October 2026 — recovery warnings and finite launcher resupply:** unconscious spectators now receive the already-replicated recovery, reconnection or thirty-second defeat warning. Hints refresh when that information changes and clear on awakening. HQ can also arrange supply for a reported empty, supported reloadable launcher using original compatible truck stock, after rifle and mounted demand. Disposable launchers remain excluded. [Implementation and review](evidence/recovery-launcher-2026-10-02/review.json).
|
||||
|
||||
All **283 registered regression programs pass**. The hidden/muted [observer fixture](evidence/native-2026-10-02-recovery-warning/report.json) passes **29 assertions**, including accepted recovery text and clearing on wake; the [final-source normal escape](evidence/native-2026-10-02-recovery-launcher-normal/report.json) passes **63 assertions and one round**. Both have zero script/runtime failures and **thirteen retained engine errors**, with confirmed cleanup. The observer run predates the four AI changes but uses exactly the final observer/probe code; the normal route binds all 407 final authored files.
|
||||
|
||||
Actual launcher transfer/reloading, full human play, multiplayer and comparative FPS remain unverified; no release qualification is claimed. The existing 416-file playtest package predates these changes and is unchanged. Original missions and inherited work are preserved; nothing was committed or published. A separate motorized-interception proposal remains design-only.
|
||||
|
||||
**2 October 2026 — current package checked on an isolated Linux dedicated server:** the unchanged [objective-map playtest](../.build/playtest-2026-10-02-objective-map/README.md) loads its exact ten-addon closure, compiles Game scripts and reaches the normal Everon prison phase. The empty server stays under observation for fifteen seconds afterward; there are zero script/runtime failures and **eleven retained engine errors**. [Raw evidence and independent review](evidence/dedicated-packed-2026-10-02-objective-map/report.json).
|
||||
|
||||
This is packaged dedicated startup, **not connected-client, multiplayer, complete-escape, performance or release qualification**. The private supervisor stops its own server with SIGTERM after 72 seconds; graceful shutdown is unproved. Network/PID isolation, no display/audio, cleanup and unchanged package/external inputs are recorded. Three bounded gameplay reviews found no demonstrated defect; no production code changed. All 407 authored files, 416 candidate files, 533 original reference files and 70 inherited unstaged paths remain unchanged. The prior 283-program pass still covers identical source. [Preservation](evidence/dedicated-packed-2026-10-02-objective-map/review.json).
|
||||
|
||||
**2 October 2026 — objective-map playtest package refreshed:** the [new separate development handoff](../.build/playtest-2026-10-02-objective-map/README.md) contains the authored discovery/mine-warning UI alongside the earlier controller ownership, HQ and logistics work. **407 authored files, 349 exact PAK payloads and three runtime files** match editable source. [Artifact hashes](evidence/package-2026-10-02-objective-map/handoff.json).
|
||||
|
||||
The unchanged source retains its **283-program regression pass**, **101 map-fixture assertions** and **63-assertion normal escape route**. [Fresh ordinary startup of the exact package](evidence/packed-2026-10-02-objective-map/archive-review.json) verifies the normal mission and local prisoner, with zero script/runtime failures and seventeen retained engine errors. Strict packaging/startup failures remain; this is **not a qualified release**. Shared-map evidence remains geometry-only, with physical held-map capture unverified.
|
||||
|
||||
Three bounded parallel reviews of base radio/extraction/guidance, map lifecycle and intel/loot ownership found no demonstrated new defect; no production code changed for this packaging increment. All native work stayed hidden/muted with confirmed cleanup and unchanged inputs. Original missions, existing working changes and the previous 412-file candidate are preserved; nothing was committed or published. [Review and preservation](evidence/playtest-refresh-2026-10-02-objective-map/review.json). Human play, real multiplayer, physical logistics, comparative FPS and clean release remain unfinished.
|
||||
|
||||
**2 October 2026 — independent objective map UI integrated:** discovered sites and recovered mine warnings now use authored UI outside the native player-annotation lists. Stable rough positions, exact identification, pan/zoom culling and close/reopen cleanup remain intact. Supported standard-map and shared-map containers replace the rejected Canvas parent. Player annotations and their restrictions are unchanged. [Implementation and limits](objective-map-presentation.md).
|
||||
|
||||
All **283 registered regression programs pass**. The [final hidden/muted map fixture](evidence/native-2026-10-02-objective-map-final/report.json) completes **101 assertions and one completion**, and the [normal escape route](evidence/native-2026-10-02-objective-map-normal/report.json) completes **63 assertions and one round**. Both record zero script/runtime failures; **16/13 engine errors and strict failed verdicts remain**. Earlier compile, Canvas-parent and asynchronous-close fixture failures are retained.
|
||||
|
||||
Read-only private-window captures show the standard question/radio glyphs, reopened marker and long-warning text at the small Workbench viewport. Shared-map checks establish widget geometry/lifecycle only: its disabled render target does not appear in screenshots, and physical held-map capture remains unverified. [Review, raw captures and preservation](evidence/objective-map-2026-10-02/summary.json).
|
||||
|
||||
Source contains **407 authored files**. The existing owner-fixes playtest is unchanged and predates this increment. Original missions and inherited work are preserved; nothing was committed or published. Human play, manual map interaction, real multiplayer, physical logistics, comparative FPS and clean release remain unfinished.
|
||||
|
||||
**2 October 2026 — development package refreshed with controller ownership fixes:** the [separate owner-fixes handoff](../.build/playtest-2026-10-02-owner-fixes/README.md) now includes the tested observer/rebinding and chat-menu cleanup corrections alongside the earlier ground-depot/guide features. **403 authored files, 346 exact PAK payloads and three runtime files** match editable source. [Artifact hashes](evidence/package-2026-10-02-owner-fixes/handoff.json).
|
||||
|
||||
The unchanged source retains its **280-program regression pass** and **63-assertion normal escape**. [Fresh ordinary startup of the exact package](evidence/packed-2026-10-02-owner-fixes/archive-review.json) verifies the normal mission and local prisoner, with zero script/runtime failures and seventeen retained installed-resource errors. Strict packaging/startup failures remain; this is **not a qualified release**. The earlier route retains thirteen installed-resource errors.
|
||||
|
||||
All native work stayed hidden/muted with confirmed cleanup and unchanged inputs. Original missions, 61 inherited unstaged paths and the previous 412-file candidate are preserved. No production code changed for this packaging increment. A separate authored map-overlay proposal is not included. Human play, real multiplayer, native controller replacement, physical logistics, comparative FPS and clean release remain unfinished. [Independent review and preservation](evidence/playtest-refresh-2026-10-02-owner-fixes/review.json).
|
||||
|
||||
**2 October 2026 — old chat callbacks preserve the current administration menu:** a retained former local controller now removes only its own chat listener and timers; it cannot close a replacement controller's newly opened panel. Current-owner shutdown and mission-change cleanup remain intact. Independent actual-method tests compile and reproduce the old failure, then pass with the ownership check; all **280 registered regression programs pass**.
|
||||
|
||||
The [hidden/muted normal escape](evidence/native-2026-10-02-chat-ownership/report.json) completes **63 assertions and one round**, with zero script/runtime failures, thirteen retained installed-resource errors, confirmed cleanup and unchanged source/external inputs. This is compilation and ordinary scripted-route evidence, not native controller-replacement or multiplayer qualification. [Review and preservation](evidence/chat-ownership-2026-10-02/review.json). Original missions, inherited changes and the existing 412-file playtest are unchanged; that package predates the observer and chat ownership fixes. Human play, real multiplayer, physical logistics, comparative FPS and clean release remain unfinished.
|
||||
|
||||
**2 October 2026 — partial-clue loss recovery checked on current source:** the [hidden/muted fixed-site fixture](evidence/native-2026-10-02-partial-document-loss/report.json) passes **76 assertions and one completion**. After ordinary partial discovery and deliberate loss of all four targeted documents, distant, unauthorized and obstructed observations remain rejected; a clear close approach identifies the radio once and permits entry into radio defence without replacement clues. This uses the existing LegacySites test catalog, teleports, damage protection and direct mission interfaces, then explicitly ends the round. It does not prove generated-site coverage, held interactions, defence completion or a full escape.
|
||||
|
||||
Zero script/runtime failures, thirteen retained installed-resource errors and confirmed cleanup; source and external inputs remain unchanged. Three bounded parallel gameplay reviews found no demonstrated new defect. No production changes or package refresh were made; the previous 279-program pass covers identical addon source. Original missions, 61 inherited unstaged paths and the existing playtest are preserved. [Review and exact limitations](evidence/base-progression-review-2026-10-02/review.json). Human play, real multiplayer, physical logistics, comparative FPS and clean release remain unfinished.
|
||||
|
||||
**2 October 2026 — spectator callbacks respect local controller ownership:** a retained old controller can no longer restore its old body camera, close the current editor or create a new spectator view after replacement. It stops only its own monitor and releases its owned presentation state. The existing binder keeps watching for a replacement controller and starts its monitor once, retaining normal stop/end cleanup. Independent actual-method tests reproduce the old fault and verify the corrected behavior; all **279 registered regression programs pass**.
|
||||
|
||||
The [hidden/muted unconscious-camera run](evidence/native-2026-10-02-observer-ownership/report.json) completes **27 assertions and one round**, preserving ordinary unconsciousness, both spectator views, tracking, pose-gap fallback, healing and repeated knockout. It records zero script/runtime failures and thirteen retained installed-resource errors, with confirmed cleanup and unchanged inputs. The first attempt used the wrong Chat fixture selector and failed because the general smoke also ran; that evidence is retained, and the runner now refuses that selector combination before native setup. This is normal camera integration evidence; native controller replacement and real multiplayer remain unverified. [Review and exact limits](evidence/observer-ownership-2026-10-02/review.json).
|
||||
|
||||
Playtest instructions now open the actual combined Core project and point to the latest retained build. Original missions and inherited changes are preserved. The existing 412-file packaged candidate is unchanged and does not yet contain this observer fix. Human play, multiplayer, physical logistics, comparative FPS and clean release remain unfinished.
|
||||
|
||||
**2 October 2026 — updated development playtest and objective-hint ownership fix:** the [separate ground-depot/guide handoff](../.build/playtest-2026-10-02-ground-depot-guide/README.md) now includes recent finite camp loading, zero-stock engineer resupply, HQ count optimization and a correction preventing a retained old controller from displaying hints after local ownership changes. It contains **403 authored files, 346 exact PAK payloads and three runtime files**, with matching editable source. [Artifact hashes and strict limits](evidence/package-2026-10-02-ground-depot-guide/handoff.json).
|
||||
|
||||
All **277 registered regression programs pass**; the guide regression independently fails on the old code and passes with the fix. The [fresh source-matched normal escape](evidence/native-2026-10-02-ground-depot-guide/report.json) passes **63 assertions and one round**, with zero script/runtime failures and thirteen retained installed-resource errors. [Ordinary startup of the exact package](evidence/packed-2026-10-02-ground-depot-guide/archive-review.json) verifies the normal mission and local prisoner, with zero script/runtime failures and seventeen retained installed-resource errors. Strict packaging/startup failures remain; this is **not a qualified release**.
|
||||
|
||||
A bounded admission/reconnect source audit found no demonstrated additional bug. [Guide fix and exact validation scope](evidence/guide-controller-2026-10-02/review.json). Native controller replacement, human play, real multiplayer, physical logistics, comparative FPS and clean release remain unfinished. All native sessions stayed hidden/muted and cleaned up; original missions, 61 inherited unstaged paths and the prior 409-file candidate are preserved. Nothing was committed or published. [Preservation and build review](evidence/playtest-refresh-2026-10-02-ground-depot-guide/review.json).
|
||||
|
||||
**2 October 2026 — finite camp-to-truck ammunition loading:** HQ can assign one available original camp responder to carry one exact original cache magazine to a nearby original ammunition truck after delivered radio orders. Recorded finite magazine expenditure gates admission; separate pickup/delivery proof, unchanged rounds, original identities and bounded reservations prevent refill or replay. Existing tactical/logistics work retains priority. [Behavior and limits](ground-depot-loading.md).
|
||||
|
||||
The full **277-program regression suite passed** before native compilation. The first native run exposed getter formatting and a helper-name conflict; its [failed evidence](evidence/native-2026-10-02-ground-depot-compile/report.json) is retained. After those behavior-preserving corrections, all four relevant programs passed again. The [corrected hidden/muted normal route](evidence/native-2026-10-02-ground-depot-integration/report.json) completes **63 assertions and one round**, with zero script/runtime failures and thirteen retained installed-resource errors. Cleanup and unchanged source/external inputs are confirmed. This qualifies compilation and normal-loop integration only. [Independent review, mutation evidence and preservation](evidence/ground-depot-loading-2026-10-02/review.json). The existing playtest package predates this feature. Original missions, inherited changes and that package remain preserved. Physical loading, human play, real multiplayer, comparative FPS and clean release remain unfinished.
|
||||
|
||||
**2 October 2026 — HQ planning removes repeated force counts:** the final pursuit selection pass now counts global commitments once after cleanup/retasking/investigation and increments only for a newly queued order. Separate hunting/global limits, orders and reservations are preserved. A controlled 64-belief/128-unit no-dispatch regression reduces the repeated count scans from over 10,000 unit visits to 128; this measures that subpass only, **not FPS**.
|
||||
|
||||
All **273 registered regression programs pass**. Independent review includes a compiled failing increment-removal mutation and 360 before/after order, reservation and cooldown comparisons. The [hidden/muted frozen-source normal escape](evidence/native-2026-10-02-hq-planner-budget/report.json) completes **63 assertions and one round**, with zero script/runtime failures and thirteen retained installed-resource errors. Cleanup and unchanged inputs are confirmed. [Scope and preservation](evidence/hq-planner-budget-2026-10-02/review.json). Existing missions, inherited changes and the prior packaged playtest remain preserved; human play, real multiplayer, physical logistics, measured performance and clean release remain unfinished.
|
||||
|
||||
**2 October 2026 — finite replacement for empty designated engineers:** HQ can now dispatch one existing convoy PMN4 to an original engineer whose startup designation and settled grant are recorded, using fresh complete delivered zero-stock reports. Unknown inventory does not count as empty; the same original actor and zero/one mode stay fixed through retries. Shared finite stock, spent items and unresolved cross-truck claims remain protected. No replacement mine is spawned and no mine-laying attempt is reset.
|
||||
|
||||
All **272 registered regression programs pass across a resumed run**, with independent review and a compiled regression failure on the old planning method. The [hidden/muted frozen-source normal route](evidence/native-2026-10-02-zero-mine-integration/report.json) passes **63 assertions and one round**, with zero script/runtime failures and thirteen retained installed-resource errors. This qualifies compilation and normal-loop integration, **not physical mine delivery or placement**. The initial temporary-quota failure, verified recovery and [preservation evidence](evidence/zero-mine-resupply-2026-10-02/review.json) are retained. Existing missions, inherited work and the prior playtest package remain unchanged; the package predates this increment. Human play, real multiplayer, physical maintenance/resupply, comparative FPS and clean release remain unfinished.
|
||||
|
||||
**2 October 2026 — casualty and terminal-lifecycle fixture corrected:** the old death check incorrectly expected an ordinary protected prisoner to die. The repaired editor-only fixture first verifies living unconsciousness, then explicitly forces fatal loss on its exact registered actor to check spent-life spectator selection, native camera and all-dead defeat. Ordinary game/server casualty protection is unchanged. The [native run](evidence/native-2026-10-02-protected-fatal-lifecycle/report.json) passes **38 assertions and one round**, with zero script/runtime failures and thirteen retained installed-resource errors.
|
||||
|
||||
All **272 registered regression programs pass across a resumed run**, including the actual hitzone damage cap and deferred processing. Earlier failed native attempts and validation environment failures are preserved; the historical premature Workbench reload was not reproduced and remains unexplained. Tests stayed hidden/muted with confirmed cleanup. Original missions, all inherited working changes and the existing playtest package are preserved. [Repair, independent review and exact limits](evidence/death-fixture-repair-2026-10-02/review.json). Human play, real multiplayer, physical maintenance/mine operations, comparative FPS and clean release remain unfinished.
|
||||
|
||||
**1 October 2026 — automatic local restart and readmission verified:** the current combined source completes two distinct scripted Everon escape rounds: first victory/results, inherited native world restart, fresh prisoner preload/admission, then the full second route and victory. The [sealed native archive](evidence/native-2026-10-01-two-round-restart/report.json) records **126 assertions, two completions, zero script/runtime failures and thirteen retained installed-resource errors**. An independent raw-log review confirms separate world instances rather than duplicate completion markers. [Sequence and preservation](evidence/native-2026-10-01-two-round-restart/review.json).
|
||||
|
||||
All 400 authored files match the existing convoy-stock candidate. Hidden/muted execution and cleanup are confirmed; original missions, inherited changes and the candidate are unchanged. This qualifies local automatic restart/readmission only: human play, death/spectators, exhaustive cleanup, real multiplayer, comparative FPS and clean release remain pending. No production code changed for this check.
|
||||
|
||||
**1 October 2026 — refreshed development playtest candidate:** the [separate convoy-stock handoff](../.build/playtest-2026-10-01-convoy-stock/README.md) packages the current combined successor: **400 authored files, 343 exact PAK payloads and three runtime files**, with matching editable source. It includes the recent finite mine systems and loaded-truck inventory correction. [Artifact hashes and packaging limits](evidence/package-2026-10-01-convoy-stock/handoff.json).
|
||||
|
||||
A [fresh normal Everon route](evidence/native-2026-10-01-convoy-stock/report.json) completes **63 assertions through extraction/results**, with zero script/runtime failures and thirteen retained installed-resource errors. [Ordinary startup of the exact package](evidence/packed-2026-10-01-convoy-stock/archive-review.json) verifies the normal mission and local prisoner, with zero script/runtime failures and seventeen retained installed-resource errors. The existing 271-regression pass and 202-assertion mine-stock result match this unchanged source. Strict packaging/startup failure verdicts are retained; this is **not a qualified release**.
|
||||
|
||||
Radio-document recovery and restart cleanup audits found no demonstrated new bug; one stale historical fixture heading was corrected. The unexplained death/restart Workbench reload was not rerun or worked around. Full human escape, real multiplayer, mine transfer/placement, maintenance/mounted interactions, comparative FPS and clean release remain unfinished. All native sessions stayed hidden/muted with confirmed cleanup. Original missions, 61 inherited unstaged paths and prior candidates are unchanged; nothing was committed or published. [Review](evidence/playtest-refresh-2026-10-01-convoy-stock/review.json).
|
||||
|
||||
**1 October 2026 — loaded convoy sampling fixed; physical mine stock observed:** native diagnostics identified deposited cargo exhausting the mounted sampler's shared 128-node queue. Separate structural/cargo budgets now preserve bounded inspection without misreporting cargo as mounted weapons. All **271 registered regression programs pass**, including failing-before/passing-after cases and independent mutations of every budget guard. [Fix and preservation](evidence/mounted-traversal-2026-10-01/review.json).
|
||||
|
||||
The [corrected hidden/muted native run](evidence/native-2026-10-01-mounted-traversal-fixed/report.json) completes **202 assertions and one fixture round**, with zero script/runtime failures and thirteen retained installed-resource errors. One original automatic convoy contains **two callback-proved inactive PMN4s**, whose exact identities and physical custody remain unchanged through real mounted-ammunition radio delivery; 64 primary cargo callbacks also remain settled and unchanged. The earlier diagnosed failure remains archived. Both sessions have confirmed cleanup and unchanged inputs.
|
||||
|
||||
This establishes initial mine stock in one convoy, **not walking resupply, mine transfer or placement**. The prior field-update package is unchanged. Original missions and all 61 inherited unstaged paths are preserved; no commit or publication was made. Full human escape, true multiplayer, maintenance/mounted interactions, comparative FPS and clean release remain unfinished.
|
||||
|
||||
**1 October 2026 — bounded convoy mine-stock check:** the new optional read-only fixture preserves the original convoy/batch and checks exact PMN4 callback identities and physical custody around normal radio delivery. All **271 registered regression programs pass** (counted from the current runner). Independent negative controls reject empty stock and missing callback proof. [Review and preservation](evidence/convoy-mine-native-2026-10-01/review.json).
|
||||
|
||||
The single [hidden/muted native run](evidence/native-2026-10-01-convoy-mine-stock/report.json) compiles and passes **39 assertions**, then fails the existing ammunition-truck mounted snapshot completeness check **before the mine assertions**. Two test failures and thirteen underlying installed-resource errors remain recorded. **Native mine insertion and transfer are still unverified.** Source and external inputs are unchanged, cleanup is confirmed, and no second native attempt was made.
|
||||
|
||||
RHS: Status Quo, WCS Armaments and WCS BMP-1 remain declared dependencies. A separate installed-catalog/equipment audit found no reproduced automatic-equipment mine duplication defect. Original missions, inherited working changes and the packaged candidate are preserved. Human play, multiplayer, physical maintenance/mounted/mine interactions, FPS and release qualification remain unfinished.
|
||||
|
||||
**1 October 2026 — finite mine top-up integration:** HQ can now authorize one original truck PMN4 for an original carrier with exactly one usable mine, using fresh delivered status and the existing radio/rendezvous controller. Infantry and mounted ammunition retain priority. Startup grants must settle first; uncertain moves retain both claims so another truck cannot duplicate a late delivery. [Behavior and limits](infantry-resupply.md#finite-mine-top-ups-1-october-2026).
|
||||
|
||||
All **268 regression programs pass**. Independent mutation controls demonstrate the startup, one-mine entitlement and cross-truck quarantine guards. The [hidden/muted native normal route from frozen source](evidence/native-2026-10-01-mine-resupply-frozen/report.json) compiles and completes **63 assertions and one round**, with zero script/runtime failures and thirteen retained installed-resource errors. This qualifies compilation/base-loop integration only; actual mine approach/transfer remains unverified. [Review and preserved inputs](evidence/mine-resupply-2026-10-01/review.json).
|
||||
|
||||
Original missions and the existing packaged candidate are preserved. Concurrent automatic-equipment edits are retained; the first native run was invalidated by source changes, so the repeated check used a frozen combined-source copy. Its evidence does not silently qualify later source edits. No extra mine grant, stock refill or placement reset was added. Depleted-zero resupply, repeated placement, full human escape, true multiplayer, maintenance/mounted interactions, comparative FPS and clean release remain unfinished; the field-update package predates this source change.
|
||||
|
||||
**1 October 2026 — finite optional convoy mine cargo:** each original ammunition truck now attempts up to two PMN4s once, after its primary weapons and ammunition have settled. Separate callbacks keep ordinary stock initialization independent. Exact initial mine identities are frozen with ownership/custody checks; failures, late callbacks and looting never refill the truck. [Behavior and remaining delivery work](supply-convoys.md#optional-finite-mine-cargo-1-october-2026).
|
||||
|
||||
All **265 regression programs pass**, including independent review and a failing mutation that attempts to adopt preexisting stock. The [hidden/muted native normal route](evidence/native-2026-10-01-mine-stock/report.json) compiles and completes **63 assertions and one round**, with zero script/runtime failures and thirteen retained installed-resource errors. This proves base-loop integration, not physical mine insertion or delivery. [Evidence and preservation](evidence/convoy-mine-stock-2026-10-01/review.json).
|
||||
|
||||
No original mission or inherited working change was altered. The existing field-update package is preserved and predates this source addition. A separate radio-to-extraction eligibility audit found no reproduced progression bug. Human escape, real multiplayer, physical maintenance/mounted/mine interactions, comparative FPS and clean release qualification remain unfinished.
|
||||
|
||||
**1 October 2026 — carried mine capability reaches HQ:** formation status now carries independent, bounded counts of exact inactive PMN4s from the original owned roster. Unknown inventory/custody stays unknown. Counts and completeness travel through the normal radio route, remain detached in delivered history and appear in the private HQ status journal. Mine scarcity alone creates no extra urgent call, task or replacement stock. [Behavior and scope](hq-ammunition.md#carried-mine-reports-1-october-2026).
|
||||
|
||||
All **264 regression programs pass**, including actual inventory/snapshot methods, interrupted/stale delivery and no-extra-urgency checks. The [native normal route](evidence/native-2026-10-01-mine-status/report.json) compiles and completes **63 assertions and one round**, with zero script/runtime failures and thirteen retained installed-resource errors. This is base-loop integration evidence; native mine reporting/placement, replenishment and multiplayer remain unqualified. [Independent review, regression evidence and preservation](evidence/carried-mine-status-2026-10-01/review.json).
|
||||
|
||||
The native run waited for another private test's lock, then stayed hidden/muted with confirmed cleanup and unchanged inputs. Existing missions, unrelated working changes and the packaged field-update candidate are preserved; that package predates this addition. The prior death/restart reload remains unexplained after comparison with exact historical source; no workaround was applied. Full human escape, multiplayer, maintenance/mounted interactions, FPS and clean release qualification remain unfinished.
|
||||
|
||||
**1 October 2026 — terminal cargo loss releases convoy holds:** a submitted mounted pickup now settles uncertainty when its exact incoming entity is deleted. A swap requires both original exchange entities to be deleted; damage, capture or one surviving item retain quarantine. Stock stays spent and matching holds can release for later requests using surviving original cargo. [Fix, independent review and preservation](evidence/mounted-terminal-loss-2026-10-01/review.json).
|
||||
|
||||
All **263 regression programs pass**, including failing-before/passing-after actual-method checks. The [integrated normal escape route](evidence/native-2026-10-01-supply-loss/report.json) completes **63 assertions and one round**, with zero script/runtime failures and thirteen retained installed-resource errors. This verifies compilation and base-loop integration, not physical mounted rearming or terminal deletion.
|
||||
|
||||
A separate pre-fix [death/restart check](evidence/native-2026-10-01-player-death-timeout/review.json) timed out after 30 setup assertions: Workbench reloaded before death/spectator checks, for an unknown reason. Neither death nor restart is qualified by that run. Both sessions stayed hidden/muted with confirmed cleanup and unchanged inputs. Original missions, prior working changes and the packaged field-update candidate remain preserved; the package predates this correction. Human play, real multiplayer, maintenance/mine/mounted interactions, FPS and clean release qualification remain outstanding.
|
||||
|
||||
**1 October 2026 — bounded maintenance follow-up:** one hidden/muted run of the unchanged field-update source passes **60 assertions**, including original-can pickup and held equip, then loses the exact-held support-station condition after the fixture's scripted approach. It stops before tank depletion or refuel action; **fuel transfer remains unverified**. Two diagnostic failures and thirteen underlying installed-resource errors are retained, with confirmed cleanup and unchanged inputs. No guard was relaxed and no second attempt was made. [Result and preservation](evidence/native-2026-10-01-refuel-snapshot/review.json).
|
||||
|
||||
Three parallel bounded reviews of HQ memory, base progression and owned-AI settings/equipment found no demonstrated new defect; ten focused regression programs passed. The verified development candidate below remains unchanged. Human play, real multiplayer, maintenance/mine/mounted interactions, FPS and clean release qualification remain outstanding.
|
||||
|
||||
**1 October 2026 — field-update playtest candidate:** the [new separate handoff](../.build/playtest-2026-10-01-field-update/README.md) packages recovered mine warnings, recent HQ pursuit/cooldown corrections and consistent Stinger Random commands: **392 authored files, 336 exact PAK payloads and three runtime files**, with matching editable source. All **263 regression programs pass**. The [exact-source normal route](evidence/native-2026-10-01-field-update/report.json) completes **63 assertions and one round** through extraction/results, with zero script/runtime failures and thirteen retained installed-resource errors.
|
||||
|
||||
[Ordinary packed startup](evidence/packed-2026-10-01-field-update/archive-review.json) verifies the normal mission and local prisoner, with zero script/runtime failures and seventeen retained installed-resource errors. Native packaging retains its strict failed verdict despite exact output and exit zero. All sessions stayed hidden/muted with confirmed cleanup and unchanged inputs. Existing missions, prior working changes and previous candidates remain preserved; nothing was published.
|
||||
|
||||
The legacy `hq stinger` alias now accepts/displays Random through the shared parser without rerolling existing equipment. The optional refuel fixture's corrected range reaches the native context, then fails before transfer on its node snapshot. Subsequent snapshot bounds/detachment is regression-tested and compiled by the normal route; **fuel transfer remains unverified**. [Fixes, initial test failure, native failure and review](evidence/field-update-2026-10-01/review.json). Human play, real multiplayer, maintenance/mine/mounted interactions, comparative FPS and release qualification remain unfinished.
|
||||
|
||||
**1 October 2026 — HQ can replace unavailable pursuit squads:** losing the only assigned squad no longer leaves its abandoned long-distance order blocking other available forces for up to 13 minutes. HQ releases that work, retains surviving active/pending orders and recomputes the hunt's delay. Completed-search quiet intervals remain remembered across later losses, replacement orders and either cleanup order; capacity trims and already shorter holds are preserved. No force or player observation is created.
|
||||
|
||||
Actual-method regressions reproduce the original bug and review-found expiry/order boundaries; all **263 regression programs pass**. The [integrated normal route](evidence/native-2026-10-01-hq-force-loss/report.json) compiles and completes **63 assertions and one escape round**, with zero script/runtime failures and thirteen retained installed-resource errors. This is normal-loop integration evidence, not native qualification of force-loss replacement. [Changes, independent review and preservation](evidence/hq-force-loss-2026-10-01/review.json).
|
||||
|
||||
The separate [bounded refuel run](evidence/native-2026-10-01-refuel-clock/review.json) now confirms original-can pickup, callback/slot custody and held equip, then times out before any refuel action. Its optional reach check is stricter than the inspected native interaction-retention logic; ordinary refuelling failure is **not** demonstrated. Fuel transfer, repair, human play, multiplayer, mounted rearming, comparative FPS and release qualification remain pending. Both native sessions stayed hidden/muted with confirmed cleanup and unchanged inputs. Original missions, prior working changes and the existing packaged candidate are preserved.
|
||||
|
||||
**1 October 2026 — optional refuel diagnostic corrected:** RHS: Status Quo, WCS Armaments and WCS BMP-1 remain declared external dependencies. The corrected native action-context fixture compiles, but its [one hidden/muted run](evidence/native-2026-10-01-refuel-context/report.json) stops after 54 passing assertions at its first clock check, before fuel selection or transfer. It retains two script test failures and thirteen underlying installed-resource errors, with confirmed cleanup and unchanged inputs.
|
||||
|
||||
The fixture had reconstructed its start time by adding/subtracting 120000 milliseconds; float rounding could put that value after the current tick. It now stores the original start directly. Actual clock initialization fails before the fix and passes afterward across fractional timestamps. All **263 regression programs pass**. The timestamp fix has not been rerun natively; refuelling, interruption/depletion and repair consumption remain unverified. The fixture is opt-in and does not change ordinary gameplay. Original missions, existing working changes and the packaged handoff are preserved. [Evidence and scope](evidence/refuel-context-2026-10-01/review.json).
|
||||
|
||||
**1 October 2026 — recovered mine warnings:** successful engineer arming can seal a historical 500 m mine warning into the same generic intel folder already carried when that job began. Recovering that exact document adds a persistent warning alongside its existing site clue; objective documents and normal spending remain unchanged. Unknown records stay server-local, and recovery never refreshes live mine or soldier positions. The service is bounded to 32 records and 128 folder bindings. [Behavior and limits](road-interception.md#recovered-mine-warnings).
|
||||
|
||||
All **262 regression programs pass**, including actual sealing/recovery, caps, marker lifecycle and controller/discovery integration methods. Review caught and corrected contradictory exhausted-intel feedback and marker cleanup after list shrinkage. The [integrated normal route](evidence/native-2026-10-01-mine-intel/report.json) compiles and completes **63 assertions through extraction/results**, with zero script/runtime failures and thirteen retained installed-resource errors. That route does **not** execute physical mine/intel interactions or qualify warning rendering/remote replication. [Review and preservation evidence](evidence/mine-intel-2026-10-01/review.json).
|
||||
|
||||
The run remained hidden and muted, with confirmed cleanup and unchanged inputs. Existing missions and the last packaged handoff are preserved; that package predates this source addition. Human play, multiplayer, physical mine placement/arming, mounted rearming, comparative FPS and release packaging remain unfinished.
|
||||
|
||||
|
||||
**1 October 2026 — refreshed dependency-enabled playtest:** the [new separate candidate](../.build/playtest-2026-10-01-dependency-review/README.md) includes Southern maintenance supplies, HQ reservation/cooldown corrections and finite engineer mines: **388 authored files, 332 exact PAK payloads and three runtime files**, with matching source. RHS, WCS and BMP remain declared dependencies.
|
||||
|
||||
Independent reviews fixed observed foreign mine custody being reaccepted after a nearby redrop, and redundant intel folders flooding global chat. Both have failing-before/passing-after actual-method regressions. All **260 regression programs pass**. The [fresh normal route](evidence/native-2026-10-01-dependency-review/report.json) completes **63 assertions through extraction/results**, with zero script/runtime failures and thirteen retained installed-resource errors. [Review and preservation checks](evidence/dependency-review-2026-10-01/review.json).
|
||||
|
||||
[Ordinary packaged startup](evidence/packed-2026-10-01-dependency-review/archive-review.json) verifies the mission and local prisoner, with zero script/runtime failures and seventeen unchanged installed-resource errors. Native packaging retains its strict failure despite matching output and exit zero. An initial native-tool crash produced no package; [its evidence](evidence/package-2026-10-01-dependency-review-failed/review.json) is retained alongside the fresh retry. All native checks stayed hidden/muted with confirmed cleanup and unchanged inputs. Physical mine placement/arming, mounted rearming, human escape, multiplayer, FPS improvement and release qualification remain unfinished. Previous handoffs and original missions are preserved.
|
||||
|
||||
|
||||
**1 October 2026 — finite engineer mine behavior integrated:** an existing squad
|
||||
holding a delivered HQ road-interception order can use one original carried PMN4.
|
||||
The engineer approaches, prepares for ten continuous seconds, submits one tracked
|
||||
inventory drop and withdraws before guarded native pressure arming. Original
|
||||
actor/task/item ownership, combat cancellation, friendly clearance and retained
|
||||
late callbacks are enforced. HQ permits two simultaneous jobs, 32 retained jobs
|
||||
per round and one new road-site query per tick. No mines or forces are created.
|
||||
[Behavior and limits](road-interception.md#finite-engineer-mines--1-october-2026).
|
||||
|
||||
All **260 repository regression programs pass**. The [final integrated normal route](evidence/native-2026-10-01-engineer-mines-final/report.json)
|
||||
compiles and completes **63 scripted assertions through extraction/results** with
|
||||
zero script/runtime failures and thirteen retained installed-resource errors.
|
||||
**Physical engineer placement/arming and multiplayer are not yet demonstrated**;
|
||||
this route proves base-gameplay integration, not that interaction. Both native
|
||||
runs stayed hidden and muted with confirmed cleanup and unchanged inputs. Original
|
||||
missions, 53 prior unstaged paths and the existing packaged handoff remain preserved.
|
||||
[Independent review and exact evidence](evidence/engineer-mines-2026-10-01/review.json).
|
||||
|
||||
|
||||
**1 October 2026 — interrupted HQ orders release their unused delay:** failed or
|
||||
expired radio retasks no longer prolong pursuit cooldowns using an order that
|
||||
never arrived. Active and pending surviving orders keep their own deadlines and
|
||||
waypoints. Two actual-method regressions fail before the correction; all **257
|
||||
repository programs pass** afterward. The [current-source normal escape route](evidence/native-2026-10-01-hq-lost-retask-route/report.json)
|
||||
completes **63 assertions through extraction/results**, with zero script/runtime
|
||||
failures and thirteen retained installed-resource errors.
|
||||
|
||||
The separate [HQ awareness check](evidence/native-2026-10-01-hq-lost-retask/report.json)
|
||||
compiles and passes 53 assertions, then times out waiting to queue its completed-sweep
|
||||
fixture report; that failed qualification is retained. Both runs stayed hidden and
|
||||
muted, with confirmed cleanup and unchanged inputs. The original missions and
|
||||
existing packaged handoff remain unchanged. [Fix, review and limits](evidence/hq-lost-retask-2026-10-01/review.json).
|
||||
|
||||
|
||||
**1 October 2026 — bounded maintenance test retained as a failure:** the optional
|
||||
fuel-transfer fixture did not compile because the installed fuel manager has no
|
||||
`GetOwner` method. It executed no gameplay assertions. The entire experimental
|
||||
fixture and integration were removed, restoring the earlier playable source;
|
||||
existing finite maintenance stock and HQ retasking remain unchanged. Native fuel
|
||||
transfer and repair consumption remain unverified. The failed launch and its
|
||||
source snapshot are [retained](evidence/native-2026-10-01-maintenance-refuel/report.json).
|
||||
All 257 repository checks pass again after restoration. No additional native
|
||||
retry was made; the private muted runtime was cleaned up.
|
||||
|
||||
|
||||
**1 October 2026 — live maintenance supplies and safer HQ retasking:** the Southern cache now carries **one finite repair kit (20 supplies) and two fuel cans (five litres each)** alongside its existing weapons and radio documents. The hidden/muted [normal route](evidence/native-2026-10-01-southern-maintenance/report.json) verifies the exact original stock and completes **63 assertions through extraction/results**. Held repair/refuel consumption remains unverified. [Player behavior and scope](vehicle-maintenance.md).
|
||||
|
||||
HQ now reserves a squad's active destination and pending replacement together, preventing another search from taking the old cell while a radio retask is in transit. It retains the active approach bearing during retask admission and still counts each squad once. The bug and a review-found bearing gap both have red-before/green-after actual-method evidence. All **257 repository regression programs pass**. The [integrated-source native awareness/radio run](evidence/native-2026-10-01-hq-dual-reservations/report.json) completes **77 assertions**; only the two HQ files differ from the earlier maintenance-route snapshot. Both runs have zero script/runtime failures and thirteen retained installed-resource errors, confirmed cleanup and unchanged inputs. [Implementation, review and limits](evidence/maintenance-hq-2026-10-01/review.json).
|
||||
|
||||
The packaged candidate below remains unchanged and predates these source improvements. Original reference files and all previous working changes are preserved. Manual play, multiplayer, mounted rearming, FPS and release qualification remain unfinished.
|
||||
|
||||
**1 October 2026 — integrated playtest handoff refreshed:** the [new isolated candidate](../.build/playtest-2026-10-01-base-integrated/README.md) now includes the recent admission, HQ evidence, finite-stock and mounted courier changes: **384 authored files, 329 exact PAK payloads and three runtime files** with matching editable source. All **256 regression programs pass**. Its unchanged addon source exactly matches the retained [55-assertion normal generated escape route](evidence/native-2026-10-01-mounted-courier-normal-route/report.json); no redundant route run was needed. [Artifact hashes and scope](evidence/package-2026-10-01-base-integrated/handoff.json).
|
||||
|
||||
A fresh [ordinary packed startup](evidence/packed-2026-10-01-base-integrated/archive-review.json) verifies normal modules, exact dependency mounts, mission readiness and a local prisoner with zero script/runtime failures. Its seventeen installed-resource errors match the preceding handoff and retain strict failure. Native packaging also retains localization/shutdown and completion-semantics failures despite exit 0 and matching output. All runs stayed hidden/muted with confirmed cleanup and unchanged inputs. The player guide now names the precise gate and vehicle actions. **Mounted physical rearming, full human escape, multiplayer, FPS improvement and release qualification remain unfinished.** Previous packages, the original reference workspace and pre-existing working changes are preserved.
|
||||
|
||||
|
||||
**1 October 2026 — mounted courier integration:** finite mounted resupply is now connected to the existing HQ planner and original convoy stock, with shared infantry reservations, radio-delivered holds, one original non-driver courier, bounded pickup/swap/reboarding and retained uncertain operations. The 256-program regression suite passes; final changed-method checks also pass. The [normal generated escape route](evidence/native-2026-10-01-mounted-courier-normal-route/report.json) completes **55 assertions and one round**, with zero script/runtime failures and thirteen retained installed-resource errors. **Physical mounted rearming is not yet demonstrated:** one native trip failed at pickup, another timed out approaching cargo; both journals record original-seat return and hold release. All failures, compiler fixes, source/dependency invariance and cleanup are retained in the [review](evidence/mounted-courier-2026-10-01/review.json). Existing missions and packaged handoffs remain unchanged. [Behavior and remaining work](hq-ammunition.md#mounted-courier-integration-1-october-2026).
|
||||
|
||||
Current source now uses one combined addon. Open `addons/core/addon.gproj` and
|
||||
`Missions/ERR_Everon.conf`; see [single-mod migration](single-mod.md). The older
|
||||
five-addon checkpoints below retain their original scope and do not qualify the
|
||||
merged source.
|
||||
**1 October 2026 — admission timeout and physical HQ evidence:** a delayed preload can no longer bypass the server's admission deadline. HQ rejects stale containment after radio transit, plans only from valid movement headings, reports exact original vehicle positions, and requires an original soldier physically present before reporting a negative search. **251 regression programs pass**. The hidden/muted [normal generated escape route](evidence/native-2026-10-01-mission-hq-fixes/report.json) completes **55 assertions and one round** with zero script/runtime failures; thirteen installed-resource errors retain strict failure. Source/dependency invariance and cleanup are confirmed. A reviewed mounted-transfer second-leg proposal is retained but remains unapplied until the physical courier/HQ coordinator exists. [Changes, evidence and limits](mission-hq-fixes-2026-10-01.md). Existing missions and packaged handoffs remain untouched.
|
||||
|
||||
**1 October 2026 — finite mounted stock and native eligibility:** convoy startup now requests a small, once-only stock matching exact originally installed mounted magazines, after the existing infantry cargo priority. Original identity, callback settlement and physical headroom checks prevent delayed replacement seeding or extra overbooking. Independent review caught and fixed the late-original-callback case. **250 regression programs pass**. The [hidden/muted native run](evidence/native-2026-10-01-mounted-initial-stock/report.json) completes **34 assertions and one round**, finds a real compatible PKM box and gets a successful read-only swap-eligibility result with both slots unchanged. No worker is on foot at the required location and no transfer occurs. Zero script/runtime failures; thirteen installed-resource errors retain strict failure. Cleanup and unchanged source/dependency inputs are confirmed. [Implementation and limits](supply-convoys.md#finite-initial-mounted-stock-1-october-2026). The packaged candidate remains unchanged; mounted physical rearming, multiplayer and release qualification remain unfinished.
|
||||
|
||||
**1 October 2026 — native mounted delivery and cheaper refused convoy startup:** the [production mounted-report fixture](evidence/native-2026-10-01-mounted-delivery/report.json) now completes **56 assertions and one round**, proving original six-root ownership, cargo exclusion and a detached matching snapshot delivered through the real radio path. UAZs report one installed gun each; BMP counts remain explicitly incomplete. One convoy deployed, not the configured three. Zero script/runtime failures and thirteen installed-resource errors are retained.
|
||||
|
||||
New-convoy startup now skips terrain surveys when its source cannot fit the shared body allowance, while reusing already reserved original receipts correctly. **249 regression programs pass**, including actual pool/startup red-before/green-after evidence; no measured FPS gain is claimed. A separate [read-only mounted-slot probe](evidence/native-2026-10-01-mounted-swap-unavailable/report.json) verifies the original PKM loaded slot, muzzle and storage owner, then stops because no eligible compatible cargo candidate is found. It retains 32 passing assertions, two fixture failures and thirteen installed-resource errors; **CanSwap was not called and no transfer occurred**. Final completion wording now keeps eligibility separate from radio proof; its post-run change has executable focused regression evidence. [Review and scope](evidence/mounted-budget-2026-10-01/review.json).
|
||||
|
||||
Both native runs were hidden/muted and confirm cleanup plus unchanged source/external inputs. All 52 pre-existing unstaged file contents are retained apart from explicit test/runner additions; 533 reference sources and previous packages remain unchanged. Physical mounted rearming, manual escape, multiplayer, full-fleet reliability, FPS and release qualification remain unfinished.
|
||||
|
||||
**1 October 2026 — consistent fire-support memory and finite logistics ownership:** a reproduced bug allowed fire-support contacts to infer 30 m/s on-foot motion that HQ memory rejected. Contacts now use the same accepted delivered history as pursuit, retain the original time/position, and leave radio reports unchanged. Infantry transfer now consumes a shared finite-magazine reservation; mounted sampling consumes a read-only original-root query while preserving permanent loss/capture observation. These are physical-rearming prerequisites, not mounted rearming. [Behavior and regression review](evidence/hq-contact-reservations-2026-10-01/review.json).
|
||||
|
||||
All **247 repository regression programs pass**. The hidden/muted [native awareness run](evidence/native-2026-10-01-hq-contact-memory/report.json) completes **61 scripted assertions and one round**, with zero script/runtime failures and thirteen retained installed-resource errors. It verifies compilation and the existing physical radio/memory path; the new movement edge cases have actual-method regression evidence. Cleanup, source/external invariance, all 52 pre-existing unstaged file contents (apart from the added test registration), and 533 reference sources are verified. The packaged alarm-memory handoff below remains unchanged and predates this source checkpoint. Manual play, multiplayer, mounted rearming, FPS and release qualification remain unfinished.
|
||||
|
||||
**1 October 2026 — refreshed combined development handoff:** a [new isolated playtest build](../.build/playtest-2026-10-01-alarm-memory/README.md) now contains matching editable source and package for all recent memory, mounted-reporting and alarm fixes: **377 authored files, 322 exact PAK payloads and three runtime files**. Current source completes **55 normal-route scripted checks** through extraction/result display, with zero script/runtime failures and thirteen installed-resource errors. [Normal-route evidence](evidence/native-2026-10-01-normal-alarm-memory/report.json), [artifact hashes](evidence/package-2026-10-01-alarm-memory/handoff.json).
|
||||
|
||||
[Ordinary packed startup](evidence/packed-2026-10-01-alarm-memory/packed-startup-report.json) verifies the exact dependency mounts, normal modules, ready mission and local prisoner with zero script/runtime failures; the same seventeen installed-resource errors retain its strict failed verdict. Native packaging also retains its localization/shutdown failures despite exit 0 and complete hash-matched output. All native runs remain hidden/muted, with confirmed cleanup and unchanged inputs. The [playtest guide](playtest-build.md) now uses the combined addon and current scenario identity. All 246 regression programs pass for this unchanged source; independent resupply and object-lifetime reviews found no new defect. Existing handoffs, existing missions and all 533 reference sources remain unchanged. Manual play, multiplayer, mounted rearming, performance and release qualification remain unfinished.
|
||||
|
||||
**1 October 2026 — native alarm delivery and mounted low-stock check-ins:** an existing AI witness now demonstrably hears the native alarm event and sends its original-time, coarse anonymous report through the actual radio route into HQ memory. The hidden/muted controlled run completes **55 scripted assertions and one round**, with **zero script/runtime failures** and thirteen installed-resource errors. The earlier active-scene attempt exposed a real memory-ingestion lifetime crash; retaining the sanitized report through ingestion fixes that path, and its failed evidence remains archived. [Native result](evidence/native-2026-10-01-alarm-hearing-retained/report.json), [arrangement and limits](vehicle-security.md#native-alarm-delivery-and-memory-lifetime-correction).
|
||||
|
||||
Complete low mounted magazines can also request early status through the existing scan, shared cooldown and radio gate, without entering carried-ammunition totals or authorizing a refill. All **246 repository programs pass**; independent review found no additional demonstrated base-loop defect. [Mounted behavior and remaining rearming work](hq-ammunition.md#early-mounted-ammunition-check-ins-1-october-2026), [regression/review evidence](evidence/mounted-urgency-2026-10-01/review.json). Human breach input, audible and remote presentation, physical alarm investigation, mounted rearming, multiplayer and FPS remain unqualified. Existing packaged handoffs and all 533 reference sources are unchanged.
|
||||
|
||||
**1 October 2026 — conservative movement memory and bounded diagnostics:** HQ no longer infers a stationary/forward track by skipping a contradictory recent sighting. Mounted sampling normalizes exact native slot wrappers to their physical gun before counting it, and convoy startup reports the actual shared-body budget and refusal reason. All **246 repository programs pass**. The first alarm fixture incidentally records mounted UAZ magazines and a convoy refusal at **134/135 bodies, 25 required**; full mounted snapshot/radio proof is still outstanding. [Review and evidence](evidence/hq-followup-2026-10-01/review.json), [memory correction](hq-chronology-and-admission-2026-09-30.md#contradictory-recent-sightings), [mounted correction](hq-ammunition.md#native-slot-wrapper-deduplication-1-october-2026).
|
||||
|
||||
The current-source hidden/muted alarm diagnostic compiles, then correctly refuses emission because the relocated witness is **inactive at native LOD 10**, despite valid group, binding, distance and danger-event configuration. It passes 34 assertions and retains two fixture failures plus thirteen installed-resource errors. No event was emitted in that retry, so native hearing and radio delivery remain unqualified. Both attempts preserve failures, exact source/external inputs and confirmed cleanup. [Alarm fixture limits and next step](vehicle-security.md#native-alarm-hearing-fixture-1-october-2026). The latest packaged handoff below predates these changes and remains untouched; all 533 reference sources are unchanged. No multiplayer, FPS or release qualification is claimed.
|
||||
|
||||
**30 September 2026 — current-source handoff and installed-slot correction:** mounted weapons/magazines now use their exact native weapon-slot or muzzle ownership when ordinary inventory storage is unavailable. The same check protects structural seat admission, while retaining cargo exclusion, original crew/ledger checks and traversal bounds. All **245 repository programs pass**. An independent lifecycle/objective review found no demonstrated additional bug. [Implementation and remaining native scope](hq-ammunition.md#installed-weapon-slots-and-shared-structural-admission), [review record](evidence/installed-slot-2026-09-30/review.json).
|
||||
|
||||
The integrated source again completes **55 normal-route scripted assertions** through extraction/result display with zero script/runtime failures and thirteen installed-resource errors. A [fresh separate development handoff](../.build/playtest-2026-09-30-installed-slot/README.md) contains matching source and PAK: 376 authored files, 321 exact PAK payloads and three verified runtime files. [Ordinary packaged startup](evidence/packed-2026-09-30-installed-slot/packed-startup-report.json) verifies the normal mission and local prisoner, with zero script/runtime failures; seventeen installed-resource errors retain its strict failed verdict. [Native packaging](evidence/package-2026-09-30-installed-slot/package-report.json) also retains localization/shutdown failures despite native exit 0 and confirmed cleanup. All runs remain hidden/muted with unchanged inputs. The bounded mounted fixture still does **not** qualify installed counts or delivery: no production convoy appeared within its 180-second window. Native alarm hearing, mounted rearming, fleet reliability, manual play, multiplayer and measured FPS remain unfinished. Earlier handoffs and all 533 reference sources are unchanged.
|
||||
|
||||
**30 September 2026 — local alarm intelligence and structural vehicle sampling:** successful vehicle alarms now emit one tagged native horn event. Eligible nearby enemy witnesses retain the original observation time and send a coarse, targetless report through ordinary radio delivery. HQ sanitizes that evidence and can assign one existing mobile search group; it cannot turn an alarm into a tracked player, road interception or fire-support target. Native compilation succeeds; actual native hearing and remote delivery remain unqualified. All **245 repository programs pass**. [Alarm behavior](vehicle-security.md#local-alarm-evidence-for-hq-30-september-2026), [regression and review record](evidence/alarm-intelligence-2026-09-30/review.json).
|
||||
|
||||
Mounted vehicle eligibility now traverses structural seats without descending into soldiers' carried inventories or deposited cargo; exact original crew/ledger guards remain. The latest [production-fleet test](evidence/native-2026-09-30-mounted-structural/report.json) passes 48 assertions, including all six original roots and exclusion of eight actual cargo weapons, but fails to observe installed weapon magazines. It does not reach radio-delivery proof. Earlier compilation and production-fixture failures remain archived. Thirteen installed-resource errors and two final fixture failures remain explicit; hidden/muted cleanup and unchanged source/external inputs pass. No armed-count, three-convoy reliability, rearming, multiplayer or FPS qualification is claimed. Existing packaged handoffs remain unchanged.
|
||||
|
||||
**30 September 2026 — separate mounted-ammunition reports:** admitted convoy crews now report bounded original-vehicle ammunition snapshots through normal radio delivery, separate from carried infantry stock. Capture, foreign crew, lost roots or changed ledger ownership invalidate mounted sampling; deposited cargo is excluded. All 242 repository programs pass, with focused checks after the final diagnostic phase fix. [Behavior and remaining scope](hq-ammunition.md#mounted-convoy-reporting-30-september-2026), [regression/review evidence](evidence/mounted-ammunition-2026-09-30/review.json). Native compilation succeeds, but direct mounted sampling remains unproved: the [first convoy fixture](evidence/native-2026-09-30-mounted-initial/report.json) deadlocked waiting for HQ during prison; its checked escape transition is now fixed. The [second run](evidence/native-2026-09-30-mounted-ready/report.json) passes 33 assertions and road survey, then rejects canonical convoy dispatch before sampling. Both failures and the thirteen installed-resource errors are preserved; both confirm hidden/muted cleanup and unchanged inputs. Mounted rearming, real depletion/delivery, multiplayer and performance qualification remain unfinished. Existing packaged handoffs are unchanged.
|
||||
|
||||
**30 September 2026 — one-shot vehicle horn alarm:** successful UAZ lock breach now starts a replicated eight-second alarm with one owned audio handle. Duplicate state cannot replay it; expiry, destruction, mission inactivity and deletion clean up. Dedicated servers skip playback. All 240 repository programs pass, including final focused audio-query regressions. The hidden/muted native vehicle run completes **135 assertions**, observes the playing handle and fixed stop/no-replay behavior, and retains thirteen installed-resource errors with zero script/runtime failures. The earlier failed diagnostic interpretation is preserved. [Implementation, evidence and limits](vehicle-security.md). Audible/spatial presentation, remote clients and AI-hearing/radio integration remain unqualified or absent. The matching normal-route handoff below predates this alarm source change and remains untouched.
|
||||
|
||||
**30 September 2026 — normal generated-route checkpoint:** the ordinary Everon catalog now completes the scripted prison → physical clues → interrupted/resumed radio defence → helicopter extraction → victory/result-screen path, with **55 assertions and zero script/runtime failures**. The Southern optional UAZ passes its parking/readiness checks and starts locked; safe omission remains regression-tested. Generated sites were retained, unlike the older historical route fixture. Thirteen installed-resource errors still prevent strict qualification. Source/external hashes and hidden/muted cleanup are verified. [Native evidence](evidence/native-2026-09-30-normal-route/report.json), [transport scope](ground-transport.md). The earlier 236-program check and occupied-prefix refusal remain preserved. A [fresh matching development handoff](../.build/playtest-2026-09-30-normal-route/README.md) contains 373 authored files, 318 verified PAK payloads and three runtime files. [Ordinary packed startup](evidence/packed-2026-09-30-normal-route/packed-startup-report.json) verifies normal modules, mission readiness and a local prisoner with zero script/runtime failures; seventeen installed-resource errors retain its strict failure. The [packaging report](evidence/package-2026-09-30-normal-route/package-report.json) also retains localization, Steam stats and resource-leak errors despite native exit 0 and confirmed cleanup. Ordinary human escape, driving, multiplayer and FPS qualification remain pending; older handoffs below remain untouched.
|
||||
|
||||
**30 September 2026 — normal-route guidance and editable handoff:** in-game objectives and the [player guide](player-route.md) now match the prison backpack and normal Southern-cache/Field-hospital-1 clue route. The Western cache/locked UAZ is legacy-fixture content, not a normal starting option. A [verified updated source handoff](../.build/playtest-2026-09-30-source-update/README.md) contains the latest integrated changes; only the guidance strings differ from the last native escape snapshot, and focused feedback checks pass. Native packaging was deferred by its existing-game guard; the active user play session and older packages were left untouched. [Source hashes and refusal records](evidence/source-2026-09-30-guidance/handoff.json).
|
||||
|
||||
**30 September 2026 — empty-magazine return:** ground resupply can now return one exact unused compatible empty magazine to its original truck when inventory capacity blocks incoming ammunition. Separate callbacks and ownership proof guard both moves; failure or shutdown retains uncertain operations without retries. All 234 repository programs pass, and hidden/muted native compilation plus the 52-assertion scripted escape completes with zero script/runtime failures. The thirteen installed-resource errors remain; the empty-return branch itself still needs native validation. [Implementation, provenance and limits](empty-magazine-return.md). The [original feature ledger](original-feature-coverage.md) now distinguishes implemented systems from absent behavior and unfinished qualification. Existing packaged candidates remain unchanged.
|
||||
|
||||
**30 September 2026 — report chronology and retry ownership:** delayed negative reports about another target no longer overwrite newer positive sightings in a shared HQ search cell; old admission callbacks cannot consume a reconnected controller's retry budget; completed Intel reroll entries no longer consume native-work slots. All 234 repository programs pass. The focused hidden/muted HQ awareness run completes 61 scripted assertions with zero script/runtime failures; thirteen installed-resource errors remain. The separately failed legacy convoy/memory fixture is retained. [Changes, evidence and limits](hq-chronology-and-admission-2026-09-30.md). The packaged candidate remains the older snapshot.
|
||||
|
||||
**30 September 2026 — all-convoy infantry resupply:** HQ can now use every existing finite convoy's original ammo truck, up to the configured twenty, rather than only the first. Per-truck stock stays separate; shared report/cooldown history prevents cross-truck replay, and planning rotates donors with at most one new trip per five-second cadence. All 234 repository regression programs pass. A hidden/muted native run initializes three independent 56-magazine stocks and completes the 52-check scripted escape with zero script/runtime failures; the thirteen installed-resource errors remain. No actual multi-truck delivery was exercised. [Implementation and evidence](multiconvoy-resupply.md). The packaged development candidate below predates this source change and remains untouched.
|
||||
|
||||
**30 September 2026 — combined development candidate:** a fresh [single-addon handoff](../.build/playtest-2026-09-30-current/README.md) contains matching editable source and native PAK. The focused combined-mission escape fixture completes 52 assertions through victory and the result screen, with zero script/runtime failures. Ordinary packaged startup independently loads the exact ten engine/vanilla/owned/dependency mounts and verifies a local prisoner in the ready mission. Strict qualification still fails on installed-resource errors and the retained packaging verdict. [Evidence, scope and build details](combined-candidate-2026-09-30.md).
|
||||
|
||||
**30 September 2026 — earlier settings checkpoint:** the complete repository check now passes all 232 registered regression programs, including the settings-save recovery correction and full-route fixture budget. The subsequent route-selector and cleanup changes pass their focused regressions; the older 231-program, 191-program and 101-assertion results below are historical checkpoints, not acceptance for the current tree. [Latest fixes and preserved native attempts](mission-checkpoint-2026-09-30.md).
|
||||
|
||||
RHS Status Quo, WCS Armaments and WCS BMP-1 are current mission dependencies, alongside the separately authorized Parachute Framework and their supporting packs. Infantry resupply now waits for both real convoy cargo phases and captures faction-independent finite magazine identities. The hidden, muted infantry run compiled and captured 56 original magazines, but failed to select an eligible compatible patrol recipient before transfer. Cleanup and unchanged source/external inputs were confirmed. Thirteen existing resource/property/localization errors also remain. [Changes, failed evidence and remaining scope](resupply-fixes-2026-09-30.md).
|
||||
|
||||
The later empty-weapon ammunition fix now derives cargo from the native carried-weapon default when the last magazine has been removed, while preserving loaded variants and excluding auxiliary launcher rounds. Actual-method and neighboring policy regressions pass. The later radio fixture compiled the combined source and completed seven scripted assertions with zero script/runtime failures; native ammunition delivery remains unverified. Review confirmed that the earlier unavailable recipient was a fixture population limitation, not a demonstrated support-reservation defect.
|
||||
|
||||
A failed first settings save no longer leaves a rejected primary file that disables changes after restart; existing backups and runtime settings remain preserved. Two earlier combined route/administrator-stress attempts are retained as failures: the first reached interrupted radio defence before its old total deadline; the bounded retry completed the 129-actor, 100-percent intel reroll but exhausted the separate two-batch reroll budget. Neither completed extraction; the later route-only fixture does complete it without claiming the administrator stress passed. All runs used hidden/muted private profiles; the sealed attempts confirm unchanged source/external inputs and cleanup. The thirteen installed-resource errors remain explicit.
|
||||
|
||||
Use the updated [player route guide](player-route.md) for the single combined scenario. A full ordinary escape, multiplayer acceptance and an equivalent-workload FPS improvement are still unverified. Prison input automation and experimental AI helicopter flight remain paused. Existing September 29 medical, spectator, mortar and body-recovery work remains preserved in the working tree; no release or Workshop publication is implied.
|
||||
|
||||
**20 September 2026 — report-driven road interception:** HQ can now use fresh delivered movement history to select a forward point on an authored road and order an existing infantry group to hold it temporarily. The bounded selector respects reserved destinations, physical clearance and elevated-road geometry; old or weak evidence falls back to search. Existing radio delivery, force limits, home guards and absolute task expiry remain in charge. No barricades, vehicles, mines or new troops are created. [Implementation and scope](road-interception.md).
|
||||
|
||||
All repository checks pass. The [native113607 raw checkpoint](evidence/native-2026-09-20-113607-road-interception-raw/README.md) completes101 assertions/one round with zero script/runtime failures, including an actual Everon road selection and stale-belief refusal from arranged private-memory reports. Four external localization errors remain. A process-exit race prevented the runner's final cleanup seal; its failed verdict is retained. A later independent read-only check found the reported PID absent, the private prefix idle and source bytes unchanged. This is not infantry-arrival, natural-interception, multiplayer or FPS evidence. The [refreshed development handoff](../.build/playtest-2026-09-20-road-interception/README.md) now contains all five packages and matching editable source:261 authored files,222 exact PAK payload entries and15 verified runtime files. [Packed Core](evidence/packed-core-2026-09-20-road-interception/report.json) starts cleanly. [Full external startup](evidence/raw-packed-chat-external-2026-09-20-road-interception/README.md) verifies the13-addon paths, ordinary modules, mission header and local prisoner admission without script/runtime failures, but remains failed on four external localization errors appearing twice. Both packed runs confirm unchanged inputs and hidden/muted cleanup. [Build/handoff record](evidence/package-2026-09-20-road-interception/handoff.json). All533 reference sources are unchanged; previous handoffs remain intact. Native packaging shutdown failures, full human escape, multiplayer and FPS acceptance remain unqualified.
|
||||
|
||||
**20 September 2026 — nearby sighting handoff and resupply approach:** A squad without a usable own radio route can now pass its fresh visual report through an original member to a living friendly radio carrier within 100 m. Original source, position and timestamp remain intact; HQ learns only after radio delivery. Shared callers cannot overlap their originating calls, and interrupted or repeated sightings cannot bypass delivery. The [native checkpoint](evidence/native-2026-09-20-101306-local-handoff/report.json) completes one round/81 assertions without script/runtime failures: an arranged snapshot reaches HQ unchanged, while removing the second caller's radio prevents the next snapshot from arriving. The fixture deliberately removes radios and positions a witness after startup fitting settles; it is not natural perception or multiplayer proof. [Details and retained setup failure](hq-local-handoff.md). Four external localization errors remain, with source/external fingerprints and hidden/muted cleanup confirmed.
|
||||
|
||||
Resupply now waits through unsubmitted geometry/capacity failures instead of spending that magazine and aborting the trip. A submitted native attempt remains strictly once-only. Move/hold radii also no longer accept an approach five metres from the reported truck position. Actual-method regressions reproduce and fix both issues; full native walking rendezvous remains unproved. Full repository checks pass, with the final fixture adjustment covered by focused tests and native compilation/execution. All 533 reference sources remain unchanged. An updated editable source bundle is recorded [here](evidence/source-2026-09-20-handoff-resupply.json); packaged playtests remain older snapshots. Manual play, multiplayer, packaging and FPS qualification are still unfinished.
|
||||
|
||||
**20 September 2026 — native finite magazine transfer:** Before moving a magazine, infantry now need unobstructed physical reach to a root-owned authored truck storage context. The [native transfer checkpoint](evidence/native-2026-09-20-091854-infantry-transfer/report.json) completes one round and 43 assertions, with zero script/runtime failures: one original magazine moves from the automatic convoy's original ammo truck to an original patrol actor, preserving ammunition count and the force ledger. This fixture deliberately positions the recipient and waits for its native pose update; it does **not** prove autonomous rendezvous. Four installed external localization errors still prevent strict qualification. [Access and retained diagnostic failures](infantry-resupply-access.md). Actual-method tests cover obstructions, stock identity, report consumption, reservations, native submission and interrupted fixture cleanup. Source/external input fingerprints and hidden/muted cleanup are confirmed. Full walking resupply, multiplayer, FPS and refreshed packaging remain unfinished; existing handoffs are unchanged.
|
||||
|
||||
**20 September 2026 — automatic convoy and result feedback:** The full AI scenario now defaults to one automatic initial convoy after a 30-second startup grace and existing-force admission. Automatic and manual requests share the same finite receipt, with no automatic retry or replacement. `/esc hq convoy auto set 0|1` saves the next-round choice; old disabled convoy settings migrate correctly. [Startup details](convoy-startup.md). Original physical turret occupants receive scoped skill100, while other enemy crew retain at least80. The [native checkpoint](evidence/native-2026-09-20-081658-automatic-convoy/report.json) completes 93 assertions and one round, proving six automatic vehicles, 19 original seated crew, five turret specializations and duplicate-dispatch rejection, plus the existing HQ radio-memory tests. Zero script/runtime failures; four external localization errors remain. All repository checks pass, and 533 tracked reference sources remain unchanged. Hidden/muted cleanup and unchanged input fingerprints are confirmed. Defeat screens now refresh a late replicated end reason; callback/lifecycle tests pass, but real remote-client timing remains untested. Existing packaged handoffs remain older snapshots; native logistics, multiplayer and FPS qualification remain unfinished.
|
||||
|
||||
**20 September 2026 — finite nearby infantry resupply:** HQ now uses delivered low-ammunition reports to reserve an existing patrol and the manually dispatched convoy's original ammo truck. Separate radio orders stop the truck, request its stopped-position report and send infantry to a nearby rendezvous. Existing captured magazine identities transfer at most once; no replacement stock is created. Low-stock reporting uses 30-second local scans and a 60-second urgent-call cooldown. [Scope and limits](infantry-resupply.md). The [current native run](evidence/native-2026-09-20-072839-infantry-resupply/report.json) compiles the complete integration and completes 59 HQ-memory assertions/one round with zero script/runtime failures and verified hidden/muted cleanup; four external localization errors remain. The first native compile failure is retained and corrected. Direct native resupply/navigation, automatic dispatch, broad logistics parity and multiplayer remain unfinished. All repository checks pass and all 533 tracked reference sources remain unchanged. The existing packaged handoff remains the older `915476f` snapshot.
|
||||
|
||||
**20 September 2026 — radio and finite maintenance:** Enemy groups now use bounded one-time radio fitting, preserving existing radios and excluding mortar-owned allocations. Uplinks hold their original caller for three seconds before network hops and fail on live consciousness/ownership loss. The [native radio/HQ-memory checkpoint](evidence/native-2026-09-20-062203-radio-call-memory/report.json) completes 59 assertions and one round, with zero script/runtime failures; four installed external localization errors remain. All six tested groups were already equipped, so native insertion remains unproved. The western supply cache now holds one finite repair kit and two fuel cans. Its [native stock/transport checkpoint](evidence/native-2026-09-20-062011-maintenance-stock/report.json) passes 131 assertions with zero captured errors, confirming 20 supply units and two five-litre cans plus prior lock/vehicle-loss behavior. Ordinary repair/refuel consumption remains untested. Both runs preserve exact sources and confirm hidden/muted cleanup. Current external packaging has a separate [explicit v3 development workflow](packed-external-development.md); the matching separate handoff is `.build/playtest-2026-09-20-radio-maintenance`. All five PAKs match their authored payloads; [Core ordinary startup](evidence/packed-core-2026-09-20-radio-maintenance/report.json) passes without captured errors. Full packed Chat verifies the exact thirteen-addon closure but remains failed on installed localization errors and did not establish participant readiness before its diagnostic ended. Native build shutdown failures remain; older handoffs are unchanged. All repository checks pass and 533 tracked reference files remain unchanged.
|
||||
|
||||
**20 September 2026 — optics and base interaction follow-up:** Startup optics fitting now uses verified vanilla/RHS resources, preserves existing attachments and remains independent of finite Stinger processing. The supply UAZ has a successor-owned [held lock-breach action and scoped entry guards](vehicle-security.md); the [native supply-vehicle checkpoint](evidence/native-2026-09-20-052915-supply-vehicle-security/report.json) completes 124 assertions with zero captured errors, including lock rejection, one-time unlocking, native driver availability with its declared door context, scripted seating, fuel depletion and no replacement after loss. Ordinary held input and multiplayer verification remain pending. Player guidance now explains pilot responsibility and whole-round extraction consequences, and repeats the current objective after a controlled-body change. [The native convoy diagnostic](evidence/native-2026-09-20-050906-convoy-seat-diagnostic/report.json) compiled the optics integration but failed a combined gunner consciousness/seat/identity check after 170 passing assertions; it did not reach the new radio HOLD/RESUME test. The [second run](evidence/native-2026-09-20-051505-convoy-cover-diagnostic/report.json) passed those driving/seat checks but received no qualifying cover sighting before a combined preservation guard failed. Native HOLD/RESUME remains unverified; more precise diagnostics are included without weakening either guard. The [final full-addon run](evidence/native-2026-09-20-053057-optics-security-hq-integration/report.json) compiles all current source changes and completes 56 HQ-memory assertions with no script/runtime failures; the four known external localization errors remain. All repository checks pass, and all 533 tracked reference sources are unchanged. Existing packaged playtests remain older snapshots.
|
||||
|
||||
**20 September 2026 — delivered ammunition and convoy cover:** HQ now receives detached small-arms ammunition counts with real radio status and avoids new armed assignments only when fresh, complete evidence proves the squad empty. Per-vehicle convoy HOLD/RESUME commands share the original crews' radio downlinks and preserve route/crew/cargo identity. The [ammunition run](evidence/native-2026-09-20-040857-hq-ammunition/report.json) completes 49 assertions; the [current convoy driving recheck](evidence/native-2026-09-20-041150-convoy-cover-driving/report.json) completes 181. Both have zero script/runtime failures and confirmed cleanup, with four external localization errors retained. Native combat HOLD/RESUME and depletion still need direct tests; general resupply, multiplayer/FPS qualification and updated packaged playtests remain unfinished. See [ammunition scope](hq-ammunition.md) and [convoy scope](convoy-migration.md#delivered-hq-mounted-cover-follow-up).
|
||||
|
||||
**20 September 2026 — delivered casualty follow-up:** HQ now merges body and squad-status evidence by immutable original member identity. A [native corpse/radio test](evidence/native-2026-09-20-030533-body-radio-casualties/report.json) completes45 assertions: actual visual observation, no knowledge before delivery, real overlapping status and no double-counting. Transfer-before-death and deleted-corpse safeguards are covered by focused regressions. Four external localization errors remain; packaged playtest binaries have not been refreshed.
|
||||
|
||||
**20 September 2026 — HQ memory and external dependencies:** The editable successor now includes the [AI migration checkpoint](ai-migration-progress.md): bounded report-derived memory/prediction, infantry task selection, delivered negative-search coverage, routine check-ins and missing-patrol investigations, local body observation, finite Stinger grants and the Core force ledger. RHS/WCS/BMP are [declared and audited](external-addons.md). Native memory (56 assertions) and actual-sighting HQ response (35 assertions) complete with zero script/runtime failures; four external localization errors keep strict qualification failed. The older playtest below has not been rebuilt with these changes. The [convoy checkpoint](convoy-migration.md) now proves exact nineteen-person native seating, finite physical truck cargo and duplicate-dispatch rejection. The native driving follow-up completes181 assertions: all six vehicles move at least20m and the lead over100m, preserving exact crew and rejecting repeat dispatch. Combat tactics, unloading and long-route reliability remain unfinished.
|
||||
|
||||
**20 September 2026 — refreshed playtest ready:** `.build/playtest-2026-09-20` now contains the mission-owned Chat menu and current owned AI/Intel behavior from source `5e74269`. All 216 authored source files and all five native PAK payloads match; fifteen runtime files are verified. [Core](evidence/packed-core-2026-09-20-playtest/report.json) and [full scenario](evidence/packed-chat-2026-09-20-playtest/report.json) pass ordinary packaged startup with zero captured errors, unchanged inputs and confirmed hidden/muted cleanup. [Build record](evidence/playtest-2026-09-20/build.json) and [launch/route instructions](playtest-build.md). Separate muted manual launchers and local profiles/runtime are prepared; no visible launcher was run. The old handoff and 533 original reference files are unchanged. The packager's shutdown failures remain, while a narrowly fixed disappearing-audio-stream race passes44 tests and its separate Chat retry produces matching artifacts. Human full escape, multiplayer and FPS remain unqualified.
|
||||
|
||||
**19 September 2026 — mission-owned chat administration:** Core now owns `/esc`, the native settings/HQ/journal menu, authenticated sessions and player tools in dedicated classes. AI and Intel register optional providers; Chat is only the existing full-scenario/development wrapper. Open with `/esc menu`. [Implementation and command reference](chat-integration.md). [Final native regression](evidence/native-2026-09-19-234618-chat-complete/report.json): one full scripted escape round, 101 assertions, zero captured errors, unchanged source and verified private cleanup; checks include actual menu/owner RPCs, saved settings, god-state restoration, visible journal text and scrolling to the newest entry. Earlier Core and two-round full-scenario runs are linked in the implementation notes. All repository checks pass. Original 533 reference files remain unchanged. The frozen playtest package has not been rebuilt; multiplayer and release acceptance remain pending.
|
||||
|
||||
**19 September 2026, 22:59 — owned AI/Intel migration:** Added admin Intel summary/reroll commands, native-operation callbacks and bounded retry handling, coalesced team discovery notifications, and fair per-squad reporting of multiple current visual contacts. [Change details](owned-ai-intel-migration.md). The updated five-addon source passes [two native escape/restart rounds](evidence/native-2026-09-19-225422-owned-ai-intel/report.json), **186 assertions**, zero captured errors, unchanged source and confirmed hidden/muted test cleanup. All repository checks pass. The frozen playtest package below remains its earlier snapshot; these source changes have not been repackaged. Human/multiplayer and release qualification remain pending.
|
||||
|
||||
Updated **19 September 2026,22:12**. The prison and the complete intended base sequence are implemented: prisoner spawning, physical intel/scavenging, radio defence, player-flown helicopter extraction, individual results and restart. Five independent successor projects use vanilla assets without the original mod. Scripted local integration and ordinary startup have native evidence. This is an implemented development build awaiting gameplay qualification, not a completed multiplayer release.
|
||||
|
||||
**Priority correction from the user:** stop spending disproportionate time on automated prison keypress proof and experimental AI aircraft flight. Both experiments are paused. Active work now targets concrete base gameplay bugs, missing user-visible behavior and companion integration. The reproduced first-admission deadlock is fixed, and casualty loading now gives denial/failure feedback to its initiating rescuer. Each clue cache carries one finite replacement map. Manual play and real multiplayer remain necessary, but absence of automated input proof does not mean the prison is still being built.
|
||||
|
||||
The frozen202-file playtest source now passes [two Core escape/restart rounds](evidence/native-2026-09-19-215437-playtest-core-loops/report.json),616 assertions, zero captured errors and confirmed cleanup. All repository checks pass. The [development playtest handoff](playtest-build.md) is ready in `.build/playtest-2026-09-19`: exact-source native packages and editable source, separate user-run `play-full.sh`/`play-core.sh`, prepared isolated local profiles/runtime and a seven-step route guide. [Packed Core](evidence/packed-core-2026-09-19-playtest/report.json) and [full five-addon startup](evidence/packed-chat-2026-09-19-playtest/report.json) both pass with verified cleanup and unchanged artifacts. Workbench packaging errors remain recorded separately; this is a development candidate for human testing, not a qualified release.
|
||||
|
||||
Recent retained checkpoints:
|
||||
|
||||
- [Ordinary coarse approach/facing/lock selection](evidence/game-2026-09-19-212117-coarse-facing-selection/runner.json.txt) passed using actual private mouse/W input and one wheel pair. Facing took2.726seconds; no F was sent. The [first opt-in held-action attempt](evidence/game-2026-09-19-214138-held-prerequisite-refusal/runner.json.txt) later refused its independent facing prerequisite before wheel/F, confirmed all releases and cleaned up. Further input automation is paused.
|
||||
- [Typed aircraft service20m route](evidence/native-2026-09-19-210233-typed-service-route/report.json) passed40 assertions, destination hold, contact landing and shutdown at its201-file snapshot. The100m survey experiments found terrain/building/tree obstructions before allocating an aircraft; the [last survey](evidence/native-2026-09-19-213726-field-workshop-refusal/report.json) records the workshop bounds. There is no100m flight or operational HQ aircraft qualification. A reviewed contact check prevents ground friction receiving airborne-braking credit; its focused policy checks pass, native validation remains pending.
|
||||
- All repository checks passed after integrating the optional held-action helper and independent validators. The subsequent narrow contact fix has focused regressions. These are development checks, not manual gameplay or release acceptance.
|
||||
|
||||
**All seventeen first-release acceptance cases remain pending.** Full ordinary escape, real multiplayer, improved FPS and clean native packaging are unqualified. The [empty-addon packaging control](evidence/package-control-2026-09-19-201532-exit-after-init/review.json) still reproduces25 shutdown errors. Tests remain hidden/muted, and the original533 reference files were verified unchanged at21:42.
|
||||
|
||||
The [route gain comparison](evidence/route-comparison-2026-09-19-192238/comparison.json) measures one native20m route per gain: translation through arrival hold improved155.365→69.293seconds, and final target error improved0.130→0.099m. The candidate passed38assertions, physical contact landing and engine shutdown. This is an isolated flight-controller result, not an FPS comparison or operational HQ air support; the production callback bridge has separate native evidence, while the later retained-service route/Stop passes are separate historical snapshots and useful field-length routes remain pending.
|
||||
|
||||
[Ordinary prison approach191750](evidence/game-2026-09-19-191750-prison-approach/runner.json.txt) now passes end to end using actual private mouse/W input:14turns,9walking pulses,4.741m path,27.199s native interval, stationary0.490m from the interior waypoint. A disposable2560x720 viewport provides pointer travel while retaining every containment/ownership check. No gate action was sent; the exact lock/context remains unselected from the final view. Earlier pointer-edge, cross-position-API, calibration-return and legacy-summary failures remain archived. The first physically completed route191342 has a separate hashed raw-log review, not a rewritten runner verdict. The later [194128 alignment attempt](evidence/alignment-review-2026-09-19-194128/review.json) acquires the native gate context with the lock available, but does not select the lock; it remains failed. Read-only selected-action diagnostics precede any action cycling or heldF proof.
|
||||
|
||||
The [relative-look observer](ordinary-look-observer.md) now passes an [ordinary Chat run](evidence/game-2026-09-19-183944-relative-look/runner.json.txt): actual +24/−24 pixel input produced a measured 1.935° yaw response and return within 0.149°, with stationary body, then verified W/Tab input. Zero captured errors, source unchanged and cleanup confirmed. The earlier run remains failed because its independent checker assumed identical SAMPLE/READY milliseconds; its [separate corrected review](evidence/look-review-2026-09-19-183353/review.json) preserves the raw archive. The current-source Core attempt reached 292 assertions without errors but exhausted an undersized 180-second budget; its [timeout](evidence/native-2026-09-19-183622-core-budget/runner.json.txt) remains a failure. The later 184647 run used a 600-second budget and completed both rounds with614 assertions; the earlier timeout remains failed. No gate interaction or full normal-input escape is qualified.
|
||||
|
||||
The primary deliverable is an independently authored replacement for the abandoned Escapists base mission, with companion behavior integrated through its interfaces. Five successor addon projects have their own identities, authored Everon sites and vanilla asset references. The first release targets up to twelve players completing prison → scavenging/intel → radio defence → helicopter extraction without the original mod or dependent extensions. Scripted development checkpoints exist; a dependable, manually playable multiplayer release is still unfinished.
|
||||
|
||||
## Established development checkpoints
|
||||
|
||||
| Area | Evidence | Practical limit |
|
||||
| --- | --- | --- |
|
||||
| Integrated base loop | [Core 130347](evidence/native-2026-09-19-130347-core-loops/report.json) completes two rounds, 612 assertions and zero errors, including canonical participant rejection/restored document recovery, rough/exact native markers, radio feedback, extraction and restart. [Companion 131041](evidence/native-2026-09-19-131041-companion-loops/report.json) completes two rounds, 96 assertions and zero errors at its source snapshot. | Scripted local integration with deliberate state/position changes, not a normal-input escape. These earlier archives share their captured source snapshot; the new Core/companion/ordinary runs linked above qualify the later native-end correction. The earlier flight mechanism remains separately source-bound. Future addon edits require fresh qualification. Earlier failures remain archived. |
|
||||
| Ordinary game startup | [Chat 125906](evidence/game-2026-09-19-125906-integrated-prison/report.json) loads all five addons in the regular game, verifies the header/MissionSystems and admits the real local controller to a living canonical prisoner, then observes a clean ready interval. Native screenshots show the real prisoner view and the correct escape objective; the stock-scale yard decal creates a larger irregular bare patch, with substantial wheat remaining. | Explicit diagnostic noSplash and a scoped standalone round-local identity; no complete ordinary route or remote identity proof. The latest bounded keyboard cycle described above passes with visible inventory, while the earlier failed cycles remain archived. [Admission design](local-singleplayer-admission.md). |
|
||||
| Packed addon consumption | [Packed Core 110729](evidence/packed-core-2026-09-19-110729/report.json) passes ordinary startup from the archived project/PAK/resource database plus installed vanilla: exactly three expected addons, real canonical prisoner, a 15-second ready interval and zero captured errors. Package and log hashes are retained. | Artifact-bound startup with explicit noSplash; no loose successor addon was loaded. The artifact predates current mortar edits. [Archived packed Chat 131942](evidence/packed-chat-2026-09-19-131942-current/report.json) passes startup from all five [1317 packages](evidence/package-2026-09-19-1317-all/review.json), with no loose successor source, a real prisoner and zero captured errors. All 151 PAK entries match the captured 183-file addon snapshot before the native-end correction; all fifteen runtime artifacts retain exact hashes. Native packaging remains unqualified: an [empty-addon control](native-packaging-control.md) reproduces the same UI resource-leak errors, without fixing or suppressing them. |
|
||||
| Native game-over | [Preparation 133847](evidence/native-2026-09-19-133847-native-end-preparing/report.json) and [active 134044](evidence/native-2026-09-19-134044-native-end-active/report.json) each pass two rounds/21 assertions: actual inherited game-over, unchanged native data, one shutdown, cancelled preparation/tick/binding, inert stale callbacks and vanilla restart. | Local fixture; pending native preloads and real clients are not arranged. Existing successor extraction results remain covered by normal escape/restart regressions. |
|
||||
| Prison and scavenging | [Prisoner capacity](evidence/native-2026-09-19-063949/report.json) uses one real player plus eleven physical characters, exact starter kits and native clue transfers. [Prison boundary 100148](evidence/native-2026-09-19-100148/report.json) covers the gate/progression corrections. | Extra physical actors are not twelve connected clients. Native action completion and deliberately repositioned boundary crossings do not prove held input or walking through the gate/debris. Equipment scarcity and combat balance need playtesting. |
|
||||
| Medicine and extraction casualties | [Medical treatment](evidence/native-2026-09-19-062406/report.json) demonstrates finite supplies and native recovery at its earlier snapshot. [Casualty 102037](evidence/native-2026-09-19-102037/report.json) passes 101 clean assertions at the committed checkpoint: grounded-aircraft checks, real incapacitation, helper rejection, seat/LOS constraints, one owner-handshake load and idempotent stop. [Native removal](evidence/native-2026-09-19-080058/report.json) proves the inherited exit mechanism. | Casualty loading explicitly adapts helper membership and invokes action completion. Held input, real remote ownership, competing rescuers and disconnect/death/deletion races remain separate. The older medical snapshot retains its historical catalog errors. |
|
||||
| Infantry and HQ | [Actual perception response](evidence/native-2026-09-19-092237/report.json) carries an original soldier's observation through both physical radio legs and HQ to a different original squad, which physically moves. Patrol/preemption/resumption are implemented. | The prisoner is arranged and temporarily protected. Broader combat and interrupted/captured support require additional qualification; no response force is created for this test. |
|
||||
| Finite support | [Mortar expiry](evidence/native-2026-09-19-091306/report.json) verifies fresh native commitments followed by stale-report withholding without duplicate orders. [Courier 095513](evidence/native-2026-09-19-095513/report.json) passes 154 clean assertions through actual radio, original-patrol walking, exact depot-shell delivery and patrol restoration. | Mortar observations are synthetic; impact accuracy and genuine late callbacks remain unproved. The new refresh now passes the bounded 112900 fixture: three actual radio updates, eight physical launches, native event completion, 19 surviving original shells and 25 seconds without replay. The current [114751 expiry regression](evidence/native-2026-09-19-114751-mortar-expiry/report.json) also passes 48 clean assertions. [115232 crew registration](evidence/native-2026-09-19-115232-intel-readiness/report.json) proves all four physical crew receive their one Intel carrying roll after setup, then exercises inventory depletion/loss; broader support-loss checks remain separate. Courier depletion is arranged by physically sequestering the original 27 rounds, not firing or replacing them. Broader losses and multiplayer remain unqualified. |
|
||||
| Aircraft mechanism | [Flight 114504](evidence/native-2026-09-19-114504-powered-flight/report.json) passes 81 assertions with zero captured errors: signed actor-local collective consumption, native autohover, powered takeoff, five-second 7–9m hover, stable contact landing and an engine-off check with finite fuel. The same aircraft and living AI pilot remain inside the original physical limits. | [Translation 120245](evidence/native-2026-09-19-120245-powered-translation/report.json) additionally passes 85 clean assertions for a fixed four-metre target, five-second hold and landing. The reusable production controller separately passes [123439](evidence/native-2026-09-19-123439-aircraft-controller/report.json), 37 assertions including actual post-spawn qualification and its own complete vertical operation. [Airborne cancellation 124915](evidence/native-2026-09-19-124915-aircraft-cancel/report.json) passes 39 assertions with retained control through contact landing and engine-off. The same reusable controller then passes [fixed-target movement 130038](evidence/native-2026-09-19-130038-aircraft-target/report.json), 38 assertions including a physical 2.9m translation and landing. These are isolated flight mechanisms; rotors still coast after engine shutdown. [The fixed 20 m route](evidence/native-2026-09-19-155909-aircraft-route/report.json) now passes one unloaded flight, target hold, contact landing and engine-off with 38 assertions. Useful field-length navigation, operational HQ support, repeated-flight reliability and manual/multiplayer piloting remain unqualified. Earlier input, drift, hover and shutdown failures remain archived. |
|
||||
| Shared field map | [Map ownership 120633](evidence/native-2026-09-19-120633-map-ownership/report.json) passes native replacement-view, delayed-callback, mode-clear and spare/interrupted deletion checks. The fixture observes actual cleanup and waits for native component references to expire. | Camera restore authorization is observed; no public native render-state getter exists. Visible held-map usability, previously focused stock gadget callbacks and remote presentation remain separate. |
|
||||
| Independent runtime controls | [Archived packed Linux Chat 132456](evidence/dedicated-2026-09-19-132456-packed-chat/review.json) compiles the integrated game scripts, loads all five packages and prepares the empty prison mission in an isolated network namespace. Its four resource errors also occur in the earlier vanilla control. All fifteen packed inputs remain unchanged. [Vanilla ordinary 102533](evidence/vanilla-game-2026-09-19-102533/report.json) reproduces the initial splash unknown-class error with exactly two vanilla addons and no successor. | No real dedicated client joined. The vanilla ordinary control remains failed despite entering the menu; it does not test scenario reload or input. [Splash diagnosis](normal-splash-audit.md). |
|
||||
|
||||
## Immediate work
|
||||
|
||||
1. Play the frozen development candidate through the normal route and fix reported blockers. First-spawn exhaustion, silent casualty-loading failures and missing spare maps have been addressed; do not resume disproportionate input/flight automation.
|
||||
2. Review normal-player guidance and supplies across the authored escape route. Fix evidenced usability defects with proportionate checks.
|
||||
3. Distinguish genuinely absent base behavior from existing behavior awaiting playtesting. Pre-round setup UI, broader island population and vehicle break-in/alarm behavior are potential remaining features; the narrow escape sequence already exists. Keep later-scope feature parity separate.
|
||||
4. Prepare and validate the playable development build. Ordinary manual play, real multiplayer, packaging and equivalent-workload FPS tests remain release work. Do not resume elaborate gate-input or experimental aircraft automation at the expense of those priorities.
|
||||
|
||||
## First-release qualification
|
||||
|
||||
The [acceptance ledger](acceptance.json) still requires the complete ordinary escape loop, death/unconsciousness/recovery, reconnect/respawn/spectators, partial escape, defeat/restart, interrupted/stale reports, support/ammunition losses and duplicate-free cleanup with up to twelve connected players. A passed development checkpoint does not promote those pending cases.
|
||||
|
||||
Collect matched original/successor workloads with repeated client-frame and server-tick measurements. **No FPS improvement is demonstrated**; the [comparison tool](performance-comparison.md) has synthetic regression evidence only. Complete provenance/dependency review, obtain a clean native build and satisfy the [release checker](release-qualification.md). The [packed Core startup](packed-core-startup.md) is now demonstrated for its exact archived PAK, while the [packaging shutdown/control failures](native-packaging-control.md) remain unresolved and unqualified. The [development source bundle](development-source-bundle.md) provides editable projects; it is separate from that native candidate and from a qualified release. No release package is published.
|
||||
|
||||
[Private test cleanup](evidence/private-prefix-cleanup-2026-09-19-1631/review.json) now verifies Proton’s trailing-slash prefix spelling, checks idle state under the shared lock, and reaps only positively identified adopted test-device helpers after owned shutdown. The latest companion and ordinary runs record verified cleanup. Earlier strict-byte idle checks could miss those helpers; their historical logs are retained unchanged.
|
||||
|
||||
Original missions remain untouched. Engine tests use private profiles/prefixes, hidden displays and muted test audio. RHS/WCS/BMP are now authorized dependencies for AI/full integration. Additional terrains, complete original feature parity, alternate starts and distant-unit materialization remain unfinished. The [validation ledger](validation.md) preserves the detailed historical checkpoints and failures.
|
||||
|
||||
## 2026-10-04 — Terrain hunter fallback and convoy search
|
||||
|
||||
Live Nogova logs showed both successful three-UAZ rounds and rounds where an exhausted three-way opening scan permanently blocked all independent hunters. Initial deployment now falls back to checked friendly-objective roads with the existing finite force allowance and player exclusion, plus opening-center and active-hunter clearance. Failed placement retries after ten seconds.
|
||||
|
||||
Convoy infantry keeps hunting for three minutes after the last fresh sighting and can sweep twice farther around opposite flanks once each prior sector is reached. Route allocation failure preserves working flank orders, and duplicate reports cannot restart the hunt. Normal road travel still uses the column; combat retains independent infantry and escort orders.
|
||||
|
||||
All 314 registered checks passed. An isolated native Nogova run compiled without script errors, spawned three independent radio-equipped hunter UAZs through a forced opening failure, observed native patrol driving over 25 metres, and physically dismounted both convoy infantry teams with flank/search orders after one synthetic contact. Full organic combat and other terrains remain playtest coverage. No Workshop publish or live server changes. [Evidence](evidence/hunter-search-2026-10-04/review.json).
|
||||
|
||||
## 2026-10-04 — Civilian road traffic
|
||||
|
||||
Added ordinary unarmed CIV drivers in S105 cars and S1203 vans, separate from military HQ, intel and equipment systems. The Factions admin page exposes `civilianTrafficCount` (0–6, default 3) through the existing authenticated settings service and unified profile. Zero prevents new traffic; existing traffic retires only when safe.
|
||||
|
||||
Road routes use the current terrain, with side exits available where an opposite endpoint would cross water. Spawns require 1,000 m clearance from all known player bodies/spectator targets and blocked sight lines. Cleanup requires both car and driver to remain at least 1,500 m away and hidden for a sampled 60-second grace period. Unknown views and open editor cameras veto both actions. Native garbage collection is held while traffic owns a car/driver. Player entry permanently releases traffic ownership; foreign occupants or control also release it. Claimed cars retain their slot for the round. See [civilian traffic](civilian-traffic.md) for bounded attempts and lifecycle details.
|
||||
|
||||
All 315 registered repository checks passed on the final source. The final isolated native Nogova run matched the workspace and passed four checks: native garbage refusal, neutral/unarmed seated driver and hidden distant start, more than 25 m of actual driving, and unclaimed retirement after observer departure and the production grace period. Earlier runs also observed three cars and retained-claim survival. A random coastal fixture withheld all spawns rather than bypassing safety; this motivated the bounded side-exit search. The private observer fixture is not multiplayer or visual-menu qualification. No live server modification or publishing. [Evidence](evidence/civilian-traffic-2026-10-04/review.json).
|
||||
|
||||
## 2026-10-04 — Post-defeat loading display
|
||||
|
||||
The Chernarus playtest logs show approximately 30 seconds of native postgame delay, 40 seconds reloading the terrain, then procedural preparation. Escape now rebinds the native loading updater after replacing a terrain's respawn manager; previously the cached component could leave the spinner and preparation text without frame updates. Terminal phases and stale owners release held spawn-loading overlays. Active spawn acknowledgement and terrain-generation safeguards remain unchanged.
|
||||
|
||||
The native auto-reload default is ten seconds, with server CLI overrides preserved. The complete repository check and eight focused regression suites pass; the isolated Nogova engine checks pass binding recovery, actual frame delivery and the new prefab delay with zero script errors. Client rendering and a multiplayer death/restart remain playtest checks. No live-server edits or publication. [Evidence](evidence/restart-loading-2026-10-04/README.md).
|
||||
|
||||
## 2026-10-08 — optional Cessna reconnaissance
|
||||
|
||||
Implemented optional Cessna 172/PFC detection, a next-round HQ menu switch,
|
||||
background airport departure survey, native aircrew/flight-control autopilot,
|
||||
ordinary crew-sighting reports to HQ, loss replacement and takeover release.
|
||||
No Cessna/PFC dependency was added to the project. Dedicated-server takeoff,
|
||||
120-second patrol, delivered sighting, replacement and input restoration passed
|
||||
in the isolated engine fixture; addon-absent compilation and relevant menu,
|
||||
settings and registration checks passed. See [details](cessna-reconnaissance.md)
|
||||
and [evidence/limits](evidence/cessna-recon-2026-10-08/README.md). The busy native
|
||||
fixture also logged two optional-site guard-preparation failures; this is not a
|
||||
claim that the entire mission is free of errors. Live server and publication
|
||||
remain unchanged.
|
||||
|
||||
### Cessna menu configuration
|
||||
|
||||
HQ → Configure Cessna now groups the saved enabled state, terrain-clearance
|
||||
altitude, minimum replacement delay and patrol-area interval. Defaults preserve
|
||||
the flight behavior tested above. All four values are captured for the round;
|
||||
mid-round edits do not change the current plane or its replacements. Existing
|
||||
profiles migrate automatically. Focused menu routing/layout, setting boundaries,
|
||||
migration checks and isolated Reforger 1.8 script compilation passed. The new page
|
||||
has not been visually checked in a connected game, and non-default flight
|
||||
altitudes have not received the earlier full flight fixture.
|
||||
|
||||
## 2026-10-08 — guard work spikes and bounded aircraft preparation
|
||||
|
||||
The live populated-session measurements showed up to 856 ms in the combined
|
||||
garrison scope and 981 ms between updates, versus 7 ms for HQ journal flushing.
|
||||
Town/object guard discovery now caches small terrain cells, placement searches
|
||||
resume across background callbacks, and resources/soldiers are created one per
|
||||
slice. Immediate pre/post-spawn distance checks and fresh placement clearance
|
||||
remain enforced. The separate performance file now records background guard
|
||||
work and its own preceding flush duration.
|
||||
|
||||
The isolated Everon/RHS component run admitted two town squads safely, peaked
|
||||
at 19 ms across 1,349 guard work slices, and flew the Cessna. This is not a matched
|
||||
comparison with live Chernarus. Repeated Cessna preparation failures now stop
|
||||
after three attempts per round and identify the failing gate; the original live
|
||||
startup cause was not reproduced. See [evidence and limits](evidence/garrison-slicing-2026-10-08/README.md).
|
||||
@@ -0,0 +1,370 @@
|
||||
# Automatic Escape on added terrains
|
||||
|
||||
For a universal starting scenario, select **Co10 Escape Reintroduced — Automatic
|
||||
terrain** from this mod:
|
||||
|
||||
```text
|
||||
{C1E20667DCE324ED}Missions/ERR_Everon.conf
|
||||
```
|
||||
|
||||
This is the existing full Escape scenario with its original resource ID and path,
|
||||
now named for its role as the universal launcher. Existing server configurations
|
||||
using that ID continue to work. The duplicate Base diagnostic header is no longer
|
||||
shipped. Servers using its retired `{AD62322D5213C440}` ID must select the main
|
||||
entry above; the diagnostic tools already use it. It starts on Everon when no terrain override is
|
||||
saved, so administrators can always reach the Escape menu. Add the desired terrain
|
||||
to the server's mods, select one of its scenarios in **Terrains**, save, and restart.
|
||||
The existing saved selection loads that map and Escape creates its mission there.
|
||||
No AMP-specific settings, external startup helper, connector addon or changes by
|
||||
the terrain author are needed.
|
||||
|
||||
The published scenario name and description now identify Escape itself. After a
|
||||
terrain switch the public browser can retain **Automatic terrain**; this entry
|
||||
intentionally does not name a map that may no longer be running. It is not a fix
|
||||
for dynamic backend metadata refresh. The runtime title on a taken-over terrain
|
||||
still follows the loaded map. Server owners currently starting with a terrain's
|
||||
Exploration/Game Master scenario must select the Escape entry once to use this
|
||||
registration identity. An addon update cannot change that choice for them.
|
||||
|
||||
[Launcher validation](evidence/automatic-launcher-2026-10-04/report.json) reached
|
||||
the prison phase both on default Everon and after following a saved Nogova
|
||||
selection. The native title callback returned the terrain-neutral launcher name
|
||||
before switching. These private tests used no backend; public listing and
|
||||
Workshop metadata still need verification after publication.
|
||||
|
||||
The original direct-terrain route remains supported: add Escape and a terrain,
|
||||
then select an existing scenario supplied by that terrain. For Nogova that is:
|
||||
|
||||
```text
|
||||
{469880DFE1B48F95}Missions/Nogova_TerrainTest.conf
|
||||
```
|
||||
|
||||
In a standard server configuration, the selected entry is `game.scenarioId`.
|
||||
Select a mission header (`Missions/*.conf`), not the terrain's world resource.
|
||||
Installing multiple terrains does not choose one automatically. With no saved
|
||||
selection, the server's configured scenario remains the default; only the
|
||||
Automatic terrain entry defaults to Everon. Workshop 0.0.45 predates automatic
|
||||
takeover. Publish the updated Escape core to expose the new launcher name and
|
||||
description; the mission resource ID is unchanged.
|
||||
|
||||
Before publishing the updated core, reopen/rescan the project in Workbench so
|
||||
`Prefabs/ERR/TerrainTakeover.et` and its metadata enter the resource index. An old
|
||||
cache can include the script but still fail to register the replicated prefab.
|
||||
This is a publishing check, not a server-admin setup requirement.
|
||||
|
||||
## In-game terrain selection
|
||||
|
||||
Game Master keeps Reforger's normal administrator permissions after takeover.
|
||||
Escape transfers the editor core's player registration, disconnect, spawn,
|
||||
death, deletion and role-change listeners from the original game mode to the
|
||||
replacement before replaying admissions. Without this transfer, an admin on an
|
||||
exploration scenario could have a disabled Game Master button because the editor
|
||||
still listened to the removed mode. The transfer retains existing editor managers
|
||||
and does not grant Game Master to ordinary players.
|
||||
After replaying admissions, Escape also checks already-connected players, creates only missing editor managers, and reapplies native role-derived modes. This covers registration that happened before the new game mode attached its listeners. The repair now waits for a valid, distinct controller replication identity (a dedicated server’s temporary local identity is not a player). Editor creation is idempotent during takeover, so the subsequent native registration event reuses the manager instead of registering it twice. Missing managers are retried up to 80 times at 250 ms intervals; retries touch only missing editors and are cancelled at detach/world shutdown. A later registration may start another repair window. The pause menu refreshes the Game Master button from native editor availability: vanilla can leave it disabled when an administrator's mode arrives while the menu is already open. These repairs do not assign administrator roles or preserve a login that the server revoked during restart.
|
||||
|
||||
The native loading-screen updater also follows the replacement respawn manager. This keeps the spinner and mission-preparation text updating after takeover, including when the original scenario disabled its deploy-menu updater. A pending spawn-loading overlay releases on victory/defeat and cannot hold the result screen underneath it.
|
||||
|
||||
Escape's default end-of-round reload delay is 120 seconds. The native server `-autoreload` override still applies, including disabling automatic reload. Terrain loading and procedural preparation happen after that delay and can take substantially longer on large islands.
|
||||
|
||||
|
||||
The [editor handover check](evidence/terrain-editor-2026-10-03/report.json)
|
||||
passed five native Nogova checks and the focused regression tests. It exercises
|
||||
event delivery on a playerless server; a connected administrator clicking the
|
||||
pause-menu button remains an in-game verification step.
|
||||
|
||||
Open the Escape administration menu and choose **Terrains**. Select a scenario
|
||||
and press **Save terrain**. Saving leaves the current round running; the saved
|
||||
scenario takes effect after a normal mission restart or a full server restart.
|
||||
Changing terrain disconnects connected players without a ban: **rejoin after the
|
||||
new map has loaded**. Reforger otherwise makes connected clients reload the old
|
||||
world while the server loads the new one. Restarting on the same terrain does
|
||||
not use this extra disconnect.
|
||||
|
||||
The list is discovered on the server from enabled mods' scenario catalog and
|
||||
mounted `Missions/*.conf` resources. It lists scenario entry points, so an island
|
||||
can appear several times. Prefer an exploration or Escape scenario; discovery
|
||||
alone does not certify its navigation or compatibility. The selector does not
|
||||
download or enable additional mods. Add the terrain to the server first.
|
||||
|
||||
**Use server default**, then **Save terrain**, removes the override. With no
|
||||
selection, Escape continues using the server's configured scenario, including
|
||||
Nogova; its administration menu remains available after takeover. For a fresh
|
||||
server, select **Co10 Escape Reintroduced — Automatic terrain** as the initial entry point:
|
||||
|
||||
```text
|
||||
{C1E20667DCE324ED}Missions/ERR_Everon.conf
|
||||
```
|
||||
|
||||
The server still needs a valid initial scenario to start the engine. A script
|
||||
cannot provide a menu if startup fails before a world loads. Forcing Everon on
|
||||
all unconfigured servers would also replace an administrator's valid existing
|
||||
terrain selection unnecessarily.
|
||||
|
||||
The override is stored as `terrain.scenario` in `$profile:Escapists.json`
|
||||
(with a shared `.bak` backup).
|
||||
Only authenticated administrators can save a discovered scenario. A removed or
|
||||
unavailable saved scenario falls back to the configured server scenario and
|
||||
shows a warning. Corrupt preferences are preserved for inspection; removing or
|
||||
repairing the `terrain` section, then restarting, restores editing. See
|
||||
[unified configuration](configuration.md#one-server-configuration) for migration
|
||||
and backup recovery; do not remove the whole file just to clear a terrain choice. Startup
|
||||
redirects are bounded and do not repeatedly reload an unreachable destination.
|
||||
|
||||
[Native test evidence](evidence/terrain-selection-2026-10-02/report.json) covers
|
||||
discovery, save authorization, persistence, restart, disconnect and rejoin on
|
||||
Everon. The menu screenshot uses a labeled offline presentation fixture.
|
||||
|
||||
## Placement and requirements
|
||||
|
||||
Escape surveys clear helicopter landing zones across the entire terrain from the
|
||||
first candidate, whether airports exist or not. There is no airport-first search
|
||||
or dedicated airport-discovery wait. Every candidate still passes terrain,
|
||||
navigation, slope, aircraft-clearance and rescue-fleet space checks. Searches
|
||||
have finite time and attempt budgets and never fall back to coordinates from
|
||||
another map.
|
||||
|
||||
Terrain-generated placement allows up to 48,000 candidates or 120 seconds per
|
||||
site, whichever comes first, keeping the existing cooperative 8 ms work slices.
|
||||
|
||||
Extraction pads do not use the camp-only 12 m road exclusion, and their initial
|
||||
ground survey uses the same 0.8 m height variation limit as the landing-zone
|
||||
survey. Camp footprints retain their 0.6 m limit and road exclusion. Aircraft
|
||||
clearance is tested at the centre's actual terrain height, matching pickup
|
||||
registration, rather than the lowest point sampled across the camp grid.
|
||||
Water, physical obstacles, guard/patrol ground and navigation, the 28 m landing
|
||||
footprint, overhead clearance and additional transport-pad checks still apply.
|
||||
|
||||
Dry ground is determined from the terrain's actual water surface, not a fixed
|
||||
world-altitude minimum. Site clearance queries water at every sampled terrain
|
||||
height instead of testing placeholder candidate heights. Dry terrain below
|
||||
one metre (including negative map elevations) can qualify; submerged terrain,
|
||||
invalid heights, excessive slopes and physical obstructions remain rejected.
|
||||
Site creation, character spawn slots, airfield pads and mortar setup use the
|
||||
same terrain-height water check, without the 10 cm character spawn lift.
|
||||
|
||||
On terrain-generated maps, prison-to-airport separation is 15% of the shorter
|
||||
world axis, clamped to 200–1,500 m (300 m on a 2 km map). This changes tactical
|
||||
spacing, not the physical footprint or slope allowance. Original authored Everon
|
||||
placement retains its 1,500 m airport buffer and existing search/fallback rules.
|
||||
Maps without sufficient clear ground or a working Soldiers navigation mesh can
|
||||
still fail preparation. See [placement validation](evidence/small-terrain-placement-2026-10-24/README.md).
|
||||
|
||||
Search diagnostics use the `Reintroduced [placement search]` log prefix. Each
|
||||
summary identifies the site, attempts and elapsed milliseconds, with counts for
|
||||
failed or deferred checks: water, uneven ground, obstacles, road/airport distance,
|
||||
site spacing, navigation and aircraft clearance. Summaries appear on completion,
|
||||
exhaustion, plus every 30 seconds during a long search.
|
||||
Counts describe checks rather than unique candidates: a candidate awaiting a
|
||||
navigation tile can be checked repeatedly. Mandatory placement failures also
|
||||
include the site and rejection summary directly on the loading screen, so no
|
||||
chat command is needed. The same detail remains available in mission status.
|
||||
|
||||
On startup failure, a local `ChimeraMenuBase` error menu provides **Return to
|
||||
main menu** and **Pause menu (Esc / Back)**. The loading placeholder is hidden
|
||||
while an interactive menu or dialog is available, so it cannot cover native
|
||||
pause/exit controls. Existing menus keep focus; ordinary preparation retains its
|
||||
loading overlay. Returning uses the native local gameplay-end transition and
|
||||
does not admit players or change the failed mission state. If the custom menu
|
||||
cannot open, the native pause menu is the fallback.
|
||||
|
||||
The selected scenario must supply `SCR_BaseGameMode`, a usable `Soldiers` navmesh,
|
||||
world bounds spanning 1–100 km on both axes, and enough clear navigable ground.
|
||||
Navigation remains the terrain author's responsibility. A plain exploration
|
||||
scenario is the recommended starting point. Arbitrary scripted scenarios can
|
||||
retain their own tasks and entities; saved campaigns and every third-party game
|
||||
mode are not qualified. Escape disables further saving when taking over; it does
|
||||
not delete existing saves. Existing authored Escape scenarios and editor worlds
|
||||
are left on their normal startup path.
|
||||
|
||||
## Displayed mission name and text
|
||||
|
||||
Automatic takeover reports **Co10 Escape Reintroduced - <terrain>** through the
|
||||
native server mission-name callback, for example **Co10 Escape Reintroduced -
|
||||
Armenhof**. Once takeover is confirmed, the running world and its root scene supply the terrain
|
||||
name, even if the source header still refers to the original island. Before confirmation,
|
||||
an incoming header cannot pick up the outgoing world’s name. Before loading, the header's world resource is used: parent containers are
|
||||
followed where available, with conventional scenario prefixes/suffixes removed
|
||||
when packed resources hide their parents. Internal `Eden` is displayed as Everon.
|
||||
Unknown custom naming can fall back to the world filename; the selected next-round
|
||||
terrain never replaces the current round's label. Once takeover succeeds, the server and clients
|
||||
receiving the Escape bootstrap also display that mission name and game mode
|
||||
`Escape` in their runtime header. The terrain's scenario ID, world, imagery and
|
||||
Workshop entry stay unchanged; those still identify the terrain scenario used to
|
||||
load the map. Existing authored Escape titles are preserved.
|
||||
|
||||
Presentation is refreshed every half second after confirmation, including when the
|
||||
same header already says `Escape` and its root scene only becomes available later.
|
||||
The native mission-name callback refreshes it too. Repeated refreshes compare
|
||||
world paths as strings: `GetWorldFile()` can return `$Addon:Worlds/...`, and
|
||||
calling `ResourceName.GetPath()` on that path each tick caused repeated zero-GUID
|
||||
resource warnings. GUID prefixes are stripped as text, and parent-resource
|
||||
resolution runs only when the cached terrain input changes.
|
||||
The [native comparison](evidence/terrain-lookup-loop-2026-10-04/report.json)
|
||||
reproduced 80 repeated warnings over 20 seconds before this correction and zero
|
||||
afterward, with the same terrain title and scenario resource. The loading screen refreshes
|
||||
its existing title and description widgets, so copying the header before the Escape bootstrap no
|
||||
longer leaves the original scenario name or instructions on screen. Confirmed takeover reads `m_sDescription` and `m_sDetails` from Escape’s authored `Missions/ERR_Everon.conf`, without copying its world or scenario identity. Details take precedence over the short description, matching native translation and the 1,000-character display limit. It accepts the current header
|
||||
or another copy of that same scenario; other incoming scenarios retain their own
|
||||
titles and descriptions. Loading progress, imagery and hints keep their native lifecycle. The authored Escape text is read once at takeover; resource-load failure leaves the source text intact.
|
||||
|
||||
The [31 October native widget checks](evidence/terrain-mission-text-2026-10-31/native-checks.log) verified that an already-created loading screen changes from terrain details to the authored Escape text, then restores the original text. The isolated Workbench world has no mission header, so the fixture supplies one at the header-read boundary; the resource loader, presentation methods and actual loading layout/component run in the engine. This is not remote multiplayer or initial connection timing acceptance. All focused presentation/takeover/selection/loading regressions passed. The final native run completed with unchanged inputs and confirmed cleanup; the strict runner reports 13 existing world/localization errors plus two empty-image errors from the synthetic header, with no script errors. The text assertions passed; this fixture does not qualify loading imagery. Earlier fixture setup failures are recorded in the evidence directory.
|
||||
|
||||
The original runtime name, game-mode label, description and details are restored on world cleanup, so
|
||||
restarting with takeover disabled cannot inherit Escape labels or instructions. Later text changes by another system are preserved. Clients wait
|
||||
for the actual Escape bootstrap instead of guessing from locally enabled mods.
|
||||
The public server-browser listing can retain the startup terrain after an in-process
|
||||
terrain redirect. A live RKS #2 check on 2026-10-04 confirmed Chernarus was loaded
|
||||
and its runtime title updated, while the browser still showed the initial Nogova
|
||||
scenario. The earlier runtime and loading-title checks did not prove public listing
|
||||
refresh. Starting the server directly with the selected terrain in `game.scenarioId`
|
||||
avoids this initial-terrain redirect; verify the public listing after changing it.
|
||||
See [live browser follow-up](evidence/terrain-live-title-2026-10-04/live-browser-followup.json). The
|
||||
[name-change evidence](evidence/terrain-name-2026-10-02/report.json) records server
|
||||
and client metadata across restart, including the retained respawn-order diagnostic.
|
||||
[Terrain suffix validation](evidence/terrain-browser-suffix-2026-10-02/report.json)
|
||||
checks the real Armenhof callback, Nogova/Everon resolution and title restoration.
|
||||
[Live-title refresh evidence](evidence/terrain-live-title-2026-10-04/report.json)
|
||||
adds native Nogova checks for an already-presented stale title and a stale Everon
|
||||
world header, plus executable loading-widget and late-root regression checks.
|
||||
This later run is headless; it does not visually qualify the loading screen or
|
||||
verify the public backend cache.
|
||||
|
||||
A subsequent [registration investigation](evidence/terrain-registration-2026-10-04/report.json)
|
||||
ran two isolated native experiments. Rehosting with
|
||||
`RequestPublicServerTransition` from gameplay was explicitly rejected as an
|
||||
unsupported transition. Writing a replacement `World` through a cloned header
|
||||
container did not change the engine's selected world. Neither experiment provides
|
||||
a universal registration fix. No supported scenario-registration setter was found
|
||||
in the inspected script interfaces. A portable pre-launch integration remains an
|
||||
external setup option to investigate; it is not implemented here and would not by
|
||||
itself replace the loader scenario's published Workshop metadata.
|
||||
|
||||
|
||||
## Optional overrides
|
||||
|
||||
To keep the original scenario while Escape remains loaded, pass
|
||||
`-errTerrainTakeover 0`, or set the mission-header field
|
||||
`m_bERR_EnableEscape` to `false`, then restart. The CLI override takes precedence;
|
||||
only its exact value `1` enables takeover when explicitly supplied. With no
|
||||
overrides, takeover is enabled.
|
||||
|
||||
Optional airport-centre hints use `-errAirfields "1525 5075"` or the header field
|
||||
`m_sERR_Airfields`. Use X/Z pairs separated by semicolons, up to 16 centres.
|
||||
Hints must be on dry land inside the terrain and do not bypass clearance checks.
|
||||
An explicitly supplied CLI hint takes precedence over the header. Empty hints
|
||||
use automatic discovery and the landing-zone fallback.
|
||||
|
||||
## Validation of the automatic default
|
||||
|
||||
Production-method regressions exercise default activation, editor/authority
|
||||
protection, opt-out precedence, airport discovery and bounded placement. Native
|
||||
Nogova server/client evidence is recorded in
|
||||
[evidence/automatic-terrain-takeover-2026-10-02](evidence/automatic-terrain-takeover-2026-10-02/).
|
||||
The no-flags Nogova test completed two takeovers and two prison phases across a
|
||||
connected restart, with all 16 sites and a supported, fueled helicopter in each
|
||||
round. Client manager checks passed with no client script errors. The evidence
|
||||
report retains server authentication refusals and installed-resource diagnostics;
|
||||
it is not a clean-release verdict. A freshly built package also reached the
|
||||
prison phase on Nogova without flags, loose Escape source, test probes or script
|
||||
errors. Its 351 payload files matched the authored source. Packaging's strict
|
||||
resource/shutdown failures remain recorded separately.
|
||||
Authenticated prisoner spawning, late joining and reconnecting still require a
|
||||
published-build multiplayer check; offline backend-disabled tests cannot prove
|
||||
account admission. Publication and live-server changes remain with the owner.
|
||||
|
||||
## Handover behavior and earlier validation
|
||||
|
||||
- Invalid airport syntax, terrain bounds, navigation or missing bootstrap assets
|
||||
are rejected before the original mode is stopped.
|
||||
- The old mode ends before deletion. Its catalog and data-collector references
|
||||
are released. Once native registrations clear, the replacement is created in
|
||||
the same update, avoiding a period with no mode to create joining players'
|
||||
controllers. A 10-second deadline bounds unexpectedly deferred registrations.
|
||||
- The original radio manager is retained, detached first if its parent is being
|
||||
removed. A missing radio manager is created from the standard game prefab.
|
||||
- The private `Prefabs/ERR/TerrainTakeover.et` triggers client cleanup. It releases
|
||||
only the captured original singleton components, waits for the new factions
|
||||
before catalog/identity initialization, and receives the server's faction
|
||||
delegates. The terrain's native chat service is retained on both peers, detached
|
||||
from any removed entity/replication parent, and never replaced or attached to
|
||||
the new mode. The ordinary authored connector retains its own chat service.
|
||||
If the terrain has no chat service, `TerrainTakeoverWithChat.et` supplies a
|
||||
non-streaming replicated chat child instead. Selection depends on service
|
||||
presence, not terrain name; both variants share the same takeover mode.
|
||||
- Arsenal, group, support-station and task managers release the original mode's
|
||||
cached instances on both peers. Task, map-marker and respawn getters resolve
|
||||
the current takeover mode even if an old destructor clears a shared cache.
|
||||
- Faction delegates use a paired serialization prefix to bind their faction
|
||||
before the base deserializer reads faction data. Both peers must load the same
|
||||
Escape build, including when using an ordinary authored Escape scenario.
|
||||
- Old faction delegates are removed explicitly because vanilla creates them as
|
||||
standalone entities. The new mode, managers and delegates are linked in the
|
||||
replication hierarchy so delegates cannot arrive before their prerequisites.
|
||||
- Native player admission events received during handover are held and replayed
|
||||
only for the same connected controller and account. No backend identity or
|
||||
authentication event is fabricated. Disconnect and world cleanup clear the queue.
|
||||
- Existing controllers resolve spawn handlers on the replacement Escape mode.
|
||||
- World cleanup clears the handover state and configured centres. Local native
|
||||
restart has passed in Workbench, on an empty Linux dedicated server, and with
|
||||
a separate connected Windows client. The connected test recreates the player's
|
||||
controller and verifies the replacement managers in both rounds.
|
||||
|
||||
On 14 October, the original Everon client log showed delayed removal of the
|
||||
original `ScriptedChatEntity` after the replacement registered, followed by
|
||||
`Cannot send message - ChatEntity is missing.` This blocked native chat commands,
|
||||
including administrator login, before authentication. `test_terrain_chat_retention.py`
|
||||
checks shared-service retention, nested parent detachment and fallback selection.
|
||||
The revised scripts compiled in Workbench; the authored-world native restart
|
||||
smoke completed two rounds and 21 assertions with no script/runtime failures.
|
||||
That run still reported existing engine/dependency errors, and the full repository
|
||||
check stopped on the existing missing root ID in `ERRM_AtlasLeaf.et`.
|
||||
Live remote login and takeover of both chat variants remain separate verification
|
||||
steps; the authored-world smoke does not exercise those paths.
|
||||
|
||||
The earlier isolated prototype passed a Nogova Workbench prisoner-spawn test with
|
||||
16 generated sites and zero script errors. See
|
||||
[prototype evidence](evidence/scenario-takeover-2026-10-01/report.json). The current
|
||||
feature has additional configuration, readiness and admission checks. It passed
|
||||
native offline spawning and an actual scenario restart: two prisoner spawns,
|
||||
16 sites per round, zero script errors, and all handover state cleared between
|
||||
rounds. Invalid configuration was also rejected before stopping the original mode.
|
||||
Repository checks passed. See the
|
||||
[feature test report](evidence/terrain-takeover-feature-2026-10-01/report.json).
|
||||
|
||||
Earlier opt-in builds required enable flags and airport hints. The following
|
||||
results describe those builds, before the automatic default and landing-zone fallback.
|
||||
|
||||
The command-line listen-server route did not apply either custom mission-header
|
||||
overrides or the standard `m_eSaveTypes` override. Its diagnostic read the original
|
||||
defaults and left Nogova's mode running. Consequently the example server JSON
|
||||
used in those tests still needs testing through the actual dedicated-server route. A read-only
|
||||
copy of the RKS 2 engine executables was subsequently authorized and completed.
|
||||
The dedicated JSON route could not complete addon/backend initialization with
|
||||
external networking disabled. The explicit CLI route did load Nogova, generate
|
||||
16 sites and reach the prison phase with zero script errors on the Linux server.
|
||||
The dedicated server also passed an actual scenario restart, cleared the takeover
|
||||
state and reached the prison phase again, with zero script errors. Both dedicated
|
||||
checks used an empty server.
|
||||
|
||||
Subsequent tests used the final takeover files on the same frozen core baseline,
|
||||
with a real Windows client joining the isolated Linux server through a localhost
|
||||
relay. Client manager replication, catalog/identity faction references and radio
|
||||
retention passed. A real scenario restart cleared both peers' takeover state,
|
||||
recreated the client's controller and reached the prison phase again. No client
|
||||
script errors occurred. The backend-disabled server correctly withheld soldier
|
||||
spawning for missing account identity, so these checks do **not** prove
|
||||
authenticated prisoner spawning. Native delayed-unregistration diagnostics and
|
||||
existing resource errors remain in the raw logs. No RKS 2 configuration or
|
||||
running process was changed.
|
||||
|
||||
A separate disconnect/reconnect test passed with two successive client launches
|
||||
against the same server and no client script errors. That run preceded the final
|
||||
replication-hierarchy change; the final hierarchy was then tested through a fresh
|
||||
client join and a connected restart. Radio preservation when attached to the old
|
||||
mode, and creation when missing, passed separate authority-only fixtures. These
|
||||
fixtures change the loaded test world in memory, not the terrain's source files.
|
||||
|
||||
The separate Nogova connector and authored integration remain available in
|
||||
[the existing integration instructions](terrain-adapters.md). Do not delete them
|
||||
from a deployment that still selects their mission header.
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"complete-inputs.json": "3e092dc0ddb9ea9f1ab9f35f7fc1f36affa139ca8c4ba031544427b4afcb37da",
|
||||
"documentation/README.md": "2b3a14b61f713b9cef8f303679f5437ff8322dcac1950f916135a26f0aad85be",
|
||||
"documentation/docs/current-status.md": "ffb9d63995600cbad91a035b6daf38bc1b072afed9cf5e85dac53239cdcb1eba",
|
||||
"documentation/docs/terrain-takeover.md": "f79fbead432e577557e7db71d93531f493725cbcc35a461a9ed85aa0d908e0c4",
|
||||
"identity-review.json": "9170e5630bdc532e961075362ef3ec69dc04deb843bdc0592a43059f02d4ee44",
|
||||
"intel-checks.json": "d931dfd227b8ab0fb7a8a6982a9ee70989fbbe28d95e7af7f6ea5064a0554846",
|
||||
"intel-review.json": "855f0a24f77cd2f3d1749373b39adfba68dd5ba9e8451a5b7fc413bf9581c0fa",
|
||||
"lifecycle-review.json": "f8e512fef33bced47887d3ccf33a4c7c811104e2fa6950b560749920c8d00faa",
|
||||
"observer-proposal/baseline/tests/test_observer_ownership.py": "d06efedfdf07861f82b0d2429f21db1d7e20945b74a8e9f7eca8f10374328771",
|
||||
"observer-proposal/baseline.log": "2ddd1eb6bfd32185cc5b085624908690f41fcf054af3edf811ce996b7df049de",
|
||||
"observer-proposal/finding.json": "3b06694aeb1562160fb9d3d8dd7dc4c9abb7d3b3fe507b7f011249d80ca8d120",
|
||||
"observer-proposal/fix.patch": "c76cd98979abb8b3372831955fbe4ddbcfe4d6869bcadaaa844d8e611b4c83ce",
|
||||
"observer-proposal/proposal.log": "359367fd4e4c429eca157de941b568ba6c66b18e27f64d95e057fe512c73e78d",
|
||||
"observer-proposal/source-manifest.json": "f8dc64da544b29cdb11b6c168b58eca769dd21eaa4d99317a4f6d807c1ef5a79",
|
||||
"observer-proposal/tests/test_observer_ownership.py": "ab6ce2a7f2e62659020c3f707806435c8baa94bfd95bc5cfdd1e4715a754d7aa",
|
||||
"prior-evidence-preservation.json": "460858b240ce3f431a861f794c6c5c4e9ed8bdadef43683626201223cac5a8aa",
|
||||
"radio-review.json": "8fee379a3e45f68c10dc826951ee240fa9d33a8e62f85891ade78b04a922b652",
|
||||
"reload-proposal/baseline/docs/terrain-takeover.md": "f2620e896a97aaa9280ca9fc1c32020dcfcbc2fdea57afe718f6ed5af845a732",
|
||||
"reload-proposal/baseline/tests/test_preparation_status.py": "3b1a7c30d12f0b6fcba36b57ecfcfefaec044735211205da844c65988ec60029",
|
||||
"reload-proposal/baseline.log": "bc4e19b78cf353d1e3a29a3a31a215e32467f5e720c6dd152e0b8b80f6ca8d35",
|
||||
"reload-proposal/docs/terrain-takeover.md": "f79fbead432e577557e7db71d93531f493725cbcc35a461a9ed85aa0d908e0c4",
|
||||
"reload-proposal/finding.json": "2114bc38bc293f5085d57c171926b5addf3239e6a932ba354fb33df204c22981",
|
||||
"reload-proposal/fix.patch": "cc18a3c88d43f31d0338b015da338fedd8caa9b1e6ee6df22cf4dfb63adb1f53",
|
||||
"reload-proposal/proposal.log": "bc6bbc9037fa44f86fdc5f3dc4b1a6e2b07c0b425d891e6fe53aa1b1e1026509",
|
||||
"reload-proposal/source-manifest.json": "902d614fc01e020843a01eea409e2a9b029a1e81cf5c4662dba6cbd342ec5b76",
|
||||
"reload-proposal/tests/test_preparation_status.py": "e9b2a3c5b6627573ff923dacc3e9aece0ef2d6829d243ccaaa65661fedf65b2e",
|
||||
"remaining-suite-result.json": "61419a83ca644cf2594c1074c38e0a9c3db2f9fa2c3f5cd5eec50b9c48d487e4",
|
||||
"remaining-suite.log": "7cba0ab12242dc06ff713bde978f6e30ac2a31b002b560d88ad3758aa0dde117",
|
||||
"report.json": "98b5d166c86ab12def969dabfa11680622634cf94e9d4e808b7093efa9edd323",
|
||||
"source/addons/core/Prefabs/ERR/GameMode.et": "a2b7e632714e646a7010592cc7ac75f0afff7da6c995bf91aaf65d9473a6af3f",
|
||||
"source/addons/core/Scripts/Game/ERR/00_Core/ERR_Observer.c": "7c478eff3575eb1bd8a85c08955d4ca7f63b57969cd7b2b76dfd6c42136de1af",
|
||||
"source/tests/test_observer_ownership.py": "ab6ce2a7f2e62659020c3f707806435c8baa94bfd95bc5cfdd1e4715a754d7aa",
|
||||
"source/tests/test_preparation_status.py": "e9b2a3c5b6627573ff923dacc3e9aece0ef2d6829d243ccaaa65661fedf65b2e",
|
||||
"suite-complete-result.json": "fb4bbeb41c11a0dd25706be20897fd56dc958446689ae44568a9c797f0ba2bb3",
|
||||
"suite-complete.log": "62b0a5e1b444d9d3402eb84adc709460faf0bfcf806d459381d71da0649f39e6",
|
||||
"suite-final-inputs.json": "e6ba4d033a3759d8f9f64b574047222dbdce2ae9c315e8fc3d2b56970ef03f33",
|
||||
"suite-final-result.json": "9d230cfd7689bd14b65dfc349da535de9bc3c6fd55810bb8893487234cc1bd80",
|
||||
"suite-final.log": "b7e9c34741e1e67b4f3ea4b826a0f18c6d7812a16d854c6fb9fe95d5a6bda689",
|
||||
"suite-inputs.json": "4460822b4b55e7428b4df04b3a3a08536be876cc24fd9c721ea1b2eb5e4e6ffd",
|
||||
"suite-local-sockets-result.json": "55dbf85c1c4d2bbeebaaf546166c7e2311acf43a46415331a0df0dcf8de4b5b9",
|
||||
"suite-local-sockets.log": "7c6ad4d388f7a7adc7fcdd090b367a5272d6d38c154ebb318118bb0252ca05ec",
|
||||
"suite-result.json": "3d64d3407a6ebbccd307040e108e02ffb438e4c820b8484fd41fbef8ecff9e4d",
|
||||
"suite.log": "cd749e43abada5a35a866b68fbf40601a337159a4a022a0e1f7e138ff4b91fbc",
|
||||
"test_intel_cleanup.py.log": "84cb6d38beeff29d9eb576ed154ed75c520999f666adcb4409b18517aeeb2e05",
|
||||
"test_intel_discovery_feedback.py.log": "5c9a019d6e6ed71905b424fd4cf56a2d2852058cbd83a442c65b5d66f1a7447d",
|
||||
"test_radio_intel.py.log": "0ba63f93a6077518aa4ebbc31b1571a085125577980f28d6eedb6970b2d41697"
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"finding": null,
|
||||
"verdict": "No demonstrated production identity fault in bounded current reconnect/admission/partial-victory review.",
|
||||
"traces": [
|
||||
{
|
||||
"path": "ERR_PlayerRoster.Bind/CurrentActor",
|
||||
"result": "Persistent account record separated from transient connection; occupied duplicate account refused; recycled ID disconnects prior binding; current actor requires reciprocal native control, connected used-life and exact body."
|
||||
},
|
||||
{
|
||||
"path": "ERR_PlayerReconnect.HandlePlayerReconnect/PrepareReplacement",
|
||||
"result": "Requires audited matching account, current roster body, no foreign owner or different controlled body. Failed native handoff restores reservation without extending expiry. Replacement requires real reconnect, no live controlled/reserved body and pre-extraction phase, consistent with current documented policy."
|
||||
},
|
||||
{
|
||||
"path": "ERR_SpawnLogic.RetrySpawn/ObserveAfterLoss/MayFinalizeSpawn",
|
||||
"result": "Delayed callbacks pin controller and account; finalization additionally pins round, request, exact actor and unused life before native possession."
|
||||
},
|
||||
{
|
||||
"path": "ERR_ExtractionService.Tick/ConnectedWinners + ERR_PlayerEscapeResult",
|
||||
"result": "Partial victory snapshots living actual transport occupants by account; connected winner IDs are rebuilt only from current reciprocal roster bindings. Personal result is mission-ID bound and does not use stale native winner IDs."
|
||||
}
|
||||
],
|
||||
"coverage_reviewed": "Existing reconnect actual-method cases cover account/body mismatch, occupied controller, expiry/death, failed handoff, duplicate audit and extraction restriction. Existing rescue test covers partial account snapshot; native result fixture source covers recycled winner ID presentation. No tests/fixture run in this review.",
|
||||
"limits": "Read-only source/test inspection is not multiplayer authentication, asynchronous native handoff or replication acceptance. No production patch proposed.",
|
||||
"files": {
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerRoster.c": "dc785a8a1d78a285fe55ce76f87b78a9f522eeb9f7d9655dfe9b5c4348a26a18",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerReconnect.c": "478fd041e8a13132df25202088f42d0810d36680060dd7a0424d8f40a5b1ca44",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnLogic.c": "6d9243f66b4ca8c53d53fedff9dea8986c815e90c1f97de58200cd759aa8b49f",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnFinalization.c": "6ec741f8d19ee316d3c67b0dd2216698584bf2cde3634a3d6a7c3cdc3a3935b8",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerEscapeResult.c": "3124ab4d2d6d471409a47aba0af528790734df53243c03fe0cdac3e407047c14",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_ExtractionService.c": "c48e79a117990f83839704ae221af05fc7995b956af2d4b4f9ed2a6b91ec335a",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeResultProbe.c": "c9a89cae067f221b9f33965b4d3ab311b78ba79ea383ca65032c4001df44b472",
|
||||
"tests/test_reconnect_recovery.py": "a951da374ef1d17bb28a164d0a6242e673bd956603af6bbdcc3185afd80b87a5",
|
||||
"tests/test_player_admission_policy.py": "745ec0a9e491ffcf5bec53ebf67ecee8333f4dcfa5d19bafbde31cbd1cad7f8b",
|
||||
"tests/test_participant_selection.py": "87052a9344b9a875c84f5ca1590d99ae9a23ecc0b16b33399c3761a1c73832ca",
|
||||
"tests/test_rescue_recovery.py": "ff690dc9530a6c378c30c32960ae479d608e7c512ca3d916b234fcc115d9acdc",
|
||||
"tests/test_progression_identity.py": "2c7af4d7d6250d47a4759479ed7e780cb137f42837ac1794a6ac50ecbfb87b80",
|
||||
"docs/player-lifecycle.md": "7b0172272427b268ad253d59d90395f580c8207bff7a762eeb6dfa0e61c68bc1"
|
||||
},
|
||||
"live_changes": false,
|
||||
"native_runs": false,
|
||||
"test_runs": false
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"path": "tests/test_radio_intel.py",
|
||||
"sha256": "e3cd012a7c3475c58e44f3940fc7b4798aed03e67e0b44b7df365705695b7012",
|
||||
"exit_code": 0,
|
||||
"log": "/tmp/erri-heartbeat-20261105-1052/test_radio_intel.py.log"
|
||||
},
|
||||
{
|
||||
"path": "tests/test_intel_cleanup.py",
|
||||
"sha256": "fbf347688344f154beae92ffd4d2a6e4087e9c41276024607034c77f29f17d80",
|
||||
"exit_code": 0,
|
||||
"log": "/tmp/erri-heartbeat-20261105-1052/test_intel_cleanup.py.log"
|
||||
},
|
||||
{
|
||||
"path": "tests/test_intel_discovery_feedback.py",
|
||||
"sha256": "ffdce25a6c753da12822bf3f1cc7a66d21207dadb0e024ba1f4035cb6971a74d",
|
||||
"exit_code": 0,
|
||||
"log": "/tmp/erri-heartbeat-20261105-1052/test_intel_discovery_feedback.py.log"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"result": "no demonstrated defect",
|
||||
"scope": "Current carried-document recovery, multiplayer shared identity/progression gates, consumption and cleanup; no optional-site audit repeated.",
|
||||
"head": "9418b6950a12610361d96a99d058e9e10de03713",
|
||||
"created_utc": "2026-11-05T10:54:22.330701+00:00",
|
||||
"source_sha256": {
|
||||
"AGENTS.md": "5f6b6364b02d9ba70664b78c1c28559e2071e3eee079d8db044a6df1e865448e",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_DocumentComponent.c": "885c8ab4fc9e64c3f8b40056536096c8c32b011cb340b25ca00353a96da15c69",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryService.c": "552d9e40f72a135f19d25a17fbecf475b8bba8d8b62ec6b6d055c65499a0b637",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_Location.c": "6323facd2d5b32382b466a2aa0140064632a8c1de0597e0738cb09a3fcfd7abb",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_SiteDiscoveryRules.c": "dcbce3b7aee89bfc47a50e9de89209758af1f1bb462b99af67a8ad7a26e9f229",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_SiteService.c": "2b283ad19b046fd6b33245d466b197bd05b4c472e128a747e6b1e725f4a34c2a",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_MissionRules.c": "17d1f48878b02a457eebbe5ff87c4267488d68d2a9b3121dda77a8bc8e69c8c6",
|
||||
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelService.c": "2911325c79a7a372628b18ffa0e110d11919ce2c2cd7b19277bfd608fdb03dfc",
|
||||
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelEvidence.c": "ff436bd3c7aa0fcd5c24e940430c1ffdda934889953f63e877ae418bc9557d26",
|
||||
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelDiscoveryFeedback.c": "741de1dbadfd46c154905a0918aad41386ddc139d843553db55d20d60700c020",
|
||||
"docs/player-route.md": "979d47b33b085a87bd589b327f772dff5bd84ffe743e2e4643f62d2718741e80"
|
||||
},
|
||||
"findings": [],
|
||||
"observations": [
|
||||
"Recovery requires a current living friendly player body. A shared spent-entity ledger prevents one recovered document granting again after transfer or repeated scans.",
|
||||
"Fixed objective radio documents remain unspent and are never queued for deletion while progression is locked; a later scan processes them after unlock.",
|
||||
"The radio requirement counts distinct fully identified eligible location IDs across the team, excludes automatically revealed starting clues, and caps for sparse terrain only after active world preparation ends.",
|
||||
"Ordinary folder cleanup follows current reciprocal player custody before submission; accepted operations are observed without duplicate submission, unknown completion remains quarantined, and terminal failure retry is bounded.",
|
||||
"A rough clue is deliberately one consumed document; a different document or direct physical observation can identify the site. Reusing the same folder is intentionally ineffective."
|
||||
],
|
||||
"checks": [
|
||||
{
|
||||
"path": "tests/test_radio_intel.py",
|
||||
"sha256": "e3cd012a7c3475c58e44f3940fc7b4798aed03e67e0b44b7df365705695b7012",
|
||||
"exit_code": 0,
|
||||
"log": "/tmp/erri-heartbeat-20261105-1052/test_radio_intel.py.log"
|
||||
},
|
||||
{
|
||||
"path": "tests/test_intel_cleanup.py",
|
||||
"sha256": "fbf347688344f154beae92ffd4d2a6e4087e9c41276024607034c77f29f17d80",
|
||||
"exit_code": 0,
|
||||
"log": "/tmp/erri-heartbeat-20261105-1052/test_intel_cleanup.py.log"
|
||||
},
|
||||
{
|
||||
"path": "tests/test_intel_discovery_feedback.py",
|
||||
"sha256": "ffdce25a6c753da12822bf3f1cc7a66d21207dadb0e024ba1f4035cb6971a74d",
|
||||
"exit_code": 0,
|
||||
"log": "/tmp/erri-heartbeat-20261105-1052/test_intel_discovery_feedback.py.log"
|
||||
}
|
||||
],
|
||||
"limitations": [
|
||||
"Tests extract actual methods into C++ with explicit native boundary doubles; they do not establish native inventory callback semantics or multiplayer RPC/replication behavior.",
|
||||
"Read-only bounded audit; no gameplay source, original workspace, staging, publishing or native-engine changes."
|
||||
],
|
||||
"changes": "Only audit JSON and three focused test logs under /tmp/erri-heartbeat-20261105-1052."
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"finding": null,
|
||||
"scope": "Bounded current empty-server restart, preparation/background callbacks, native termination and terminal cleanup review. No demonstrated ordinary-gameplay defect.",
|
||||
"evidence": [
|
||||
"CheckEmptyServerRestart counts every native connection, precedes Active/tactical work, and latches before requesting native end.",
|
||||
"OnGameModeEnd and StopServices latch before listeners; shutdown removes queued preparation and server ticks, preserves native end data and existing terminal outcomes.",
|
||||
"StartScenario independently rejects stale invocation; BackgroundStep rejects inactive/wrong mode, StopBackground rolls back pending site, and SiteService.Activate refuses stopped service.",
|
||||
"Garage Step refuses stopped work and Stop removes callback. Extraction terminal snapshot survives release; radio completion latches before its callbacks.",
|
||||
"Existing empty-server and native-end actual-method tests cover boundary/duplicate/reentrant/stale-callback cases; inspected only, not executed."
|
||||
],
|
||||
"files": {
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_GameMode.c": "d26e665cf5b9c0e1dc6c5e2da200a99711ef9272718d330f5aa66b09cede40d1",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_ScenarioComponent.c": "ca6b20d5c4599e31957e5cb464d21bb3a4bac517dd539711f9d4f380e48a0e15",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_SiteService.c": "2b283ad19b046fd6b33245d466b197bd05b4c472e128a747e6b1e725f4a34c2a",
|
||||
"addons/core/Scripts/Game/ERR/10_AI/ERR_GarageVehicles.c": "f24f92d0f5d2e6f29c5c80562bf1ecf10c050433872de42956d578b329855bdf",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_ExtractionService.c": "c48e79a117990f83839704ae221af05fc7995b956af2d4b4f9ed2a6b91ec335a",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_RadioDefenceService.c": "f5f0bf1352141f933d0edb5630e30541e001dc07e1d2c8529b29cc159c126b13",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_RoundStatisticsLifecycle.c": "b813a9ccea9a61c9c6d7d4806cf18adfb323d483622ca1225930207ca2436d12",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_TelemetryLifecycle.c": "15d2d90d4457339dacd61c1bb23b619243b8af10731687c35ecc300125a642f5",
|
||||
"tests/test_empty_server_restart.py": "76826e3b4f60e0b3b7d7bb171507c59452fc57cd40d651f9e352106d6989b4c2",
|
||||
"tests/test_native_end_lifecycle.py": "7ed310fe62eeab3fe386f7ed9ba0f91d0b5df350f05a4c312ac3d760c5db7296"
|
||||
},
|
||||
"changes": "No live or original edits; no native, tests or compilers run. Existing uncommitted fixes preserved."
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
/tmp/err-policy-0ymhyzgr/check.cpp: In member function ‘void Controller::ERR_UpdateObserverClient()’:
|
||||
/tmp/err-policy-0ymhyzgr/check.cpp:99:21: error: ‘GetTickCount’ is not a member of ‘System’
|
||||
99 | int now = System::GetTickCount();
|
||||
| ^~~~~~~~~~~~
|
||||
/tmp/err-policy-0ymhyzgr/check.cpp:103:7: error: ‘m_ERRPendingRecoveryStatus’ was not declared in this scope; did you mean ‘m_ERRShownRecoveryStatus’?
|
||||
103 | if (m_ERRPendingRecoveryStatus != recovery || now < m_ERRRecoveryStatusSince)
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
| m_ERRShownRecoveryStatus
|
||||
/tmp/err-policy-0ymhyzgr/check.cpp:103:55: error: ‘m_ERRRecoveryStatusSince’ was not declared in this scope; did you mean ‘m_ERRRecoveryDeadline’?
|
||||
103 | if (m_ERRPendingRecoveryStatus != recovery || now < m_ERRRecoveryStatusSince)
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~
|
||||
| m_ERRRecoveryDeadline
|
||||
/tmp/err-policy-0ymhyzgr/check.cpp:108:72: error: ‘m_ERRRecoveryStatusSince’ was not declared in this scope; did you mean ‘m_ERRRecoveryDeadline’?
|
||||
108 | if (!contextChanged && m_ERRShownRecoveryStatus != recovery && now - m_ERRRecoveryStatusSince < 3000) return;
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~
|
||||
| m_ERRRecoveryDeadline
|
||||
/tmp/err-policy-0ymhyzgr/check.cpp:115:26: error: no matching function for call to ‘SCR_HintManagerComponent::ShowCustom(string&, const char [11], int, bool&)’
|
||||
115 | if (!hints->ShowCustom(message, "Spectating", 12, m_ERRObserverReady)) return;
|
||||
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
• there is 1 candidate
|
||||
• candidate 1: ‘bool SCR_HintManagerComponent::ShowCustom(string, string, int)’
|
||||
/tmp/err-policy-0ymhyzgr/check.cpp:26:144:
|
||||
26 | struct SCR_HintManagerComponent{int attempts=0;static SCR_HintManagerComponent*GetInstance(){static SCR_HintManagerComponent h;return &h;}bool ShowCustom(string,string,int){attempts++;return true;}};
|
||||
| ^~~~~~~~~~
|
||||
• candidate expects 3 arguments, 4 provided
|
||||
/tmp/err-policy-0ymhyzgr/check.cpp: In member function ‘void Controller::ERR_CloseObserverCamera()’:
|
||||
/tmp/err-policy-0ymhyzgr/check.cpp:149:3: error: ‘m_ERRPendingRecoveryStatus’ was not declared in this scope; did you mean ‘m_ERRShownRecoveryStatus’?
|
||||
149 | m_ERRPendingRecoveryStatus = "";
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
| m_ERRShownRecoveryStatus
|
||||
/tmp/err-policy-0ymhyzgr/check.cpp:150:3: error: ‘m_ERRRecoveryStatusSince’ was not declared in this scope; did you mean ‘m_ERRRecoveryDeadline’?
|
||||
150 | m_ERRRecoveryStatusSince = 0;
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~
|
||||
| m_ERRRecoveryDeadline
|
||||
Traceback (most recent call last):
|
||||
File "/tmp/erri-heartbeat-20261105-1015/observer-proposal/baseline/tests/test_observer_ownership.py", line 23, in <module>
|
||||
run(r'''#include <cassert>
|
||||
~~~^^^^^^^^^^^^^^^^^^^^^^^
|
||||
#include <set>
|
||||
^^^^^^^^^^^^^^
|
||||
...<120 lines>...
|
||||
}
|
||||
^
|
||||
''')
|
||||
^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/policy_harness.py", line 13, in run
|
||||
subprocess.run(['g++','-std=c++17','-Wall','-Werror',str(p/'check.cpp'),'-o',str(p/'check')],check=True)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/usr/lib/python3.14/subprocess.py", line 578, in run
|
||||
raise CalledProcessError(retcode, process.args,
|
||||
output=stdout, stderr=stderr)
|
||||
subprocess.CalledProcessError: Command '['g++', '-std=c++17', '-Wall', '-Werror', '/tmp/err-policy-0ymhyzgr/check.cpp', '-o', '/tmp/err-policy-0ymhyzgr/check']' returned non-zero exit status 1.
|
||||
+147
@@ -0,0 +1,147 @@
|
||||
"""Actual observer monitor/recovery/cleanup; native camera lifecycle is doubled."""
|
||||
import os,re
|
||||
from pathlib import Path
|
||||
from policy_harness import ROOT,body,run
|
||||
p=Path(os.environ.get('ERR_OBSERVER_SOURCE',ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_Observer.c'))
|
||||
game_mode=Path(os.environ.get('ERR_GAME_MODE_SOURCE',ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_GameMode.c'))
|
||||
binder=body(game_mode,'protected void BindLocalObserver(')
|
||||
binder=binder.replace('protected ', '').replace('SCR_PlayerController controller = SCR_PlayerController.Cast(GetGame().GetPlayerController());','Controller* controller = static_cast<Controller*>(GetGame()->GetPlayerController());')
|
||||
binder=binder.replace('GetGame().','GetGame()->').replace('GetCallqueue().','GetCallqueue()->').replace('Remove(BindLocalObserver)','Remove(this)').replace('controller.','controller->')
|
||||
def cpp(s):
|
||||
s=s.replace('protected ','').replace('null','nullptr')
|
||||
for n in ('ERR_GameMode','ERR_Actors','ERR_ObserverRules','ERR_ObserverGuidance','SCR_HintManagerComponent','SCR_RespawnSystemComponent','SCR_EditorManagerEntity','Resource','SCR_ManualCamera','RplId','ETransformMode','LogLevel','System'):
|
||||
s=s.replace(n+'.',n+'::')
|
||||
for n in ('ERR_GameMode','SCR_HintManagerComponent','SCR_RespawnSystemComponent','SCR_EditorManagerEntity','Resource','CameraManager','CameraBase'):
|
||||
s=re.sub(r'\b'+n+r' (\w+)',n+r'* \1',s)
|
||||
for n in ('mode','hints','respawn','editor','resource','manager','m_ERRObserverCamera'):
|
||||
s=s.replace(n+'.',n+'->')
|
||||
s=s.replace('GetGame().','GetGame()->').replace('GetWorld().','GetWorld()->').replace('GetCallqueue().','GetCallqueue()->')
|
||||
s=s.replace('Remove(ERR_UpdateObserverClient)','Remove(this)').replace('CallLater(ERR_UpdateObserverClient, 250, true)','CallLater(this, 250, true)')
|
||||
s=s.replace('EntitySpawnParams params = new EntitySpawnParams();','EntitySpawnParams params;')
|
||||
return s
|
||||
methods='\n'.join(cpp(body(p,n)) for n in ('void ERR_StartObserverMonitor(', 'protected void ERR_UpdateObserverClient(', 'protected void ERR_UpdateRecoveryCamera(', 'protected void ERR_CloseObserverCamera('))
|
||||
run(r'''#include <cassert>
|
||||
#include <set>
|
||||
#include <string>
|
||||
struct string:std::string {using std::string::string;using std::string::operator=;string(std::string s):std::string(s){}bool IsEmpty()const{return empty();}};
|
||||
struct Actor {bool alive=true,conscious=true;};using IEntity=Actor*;
|
||||
struct ERR_Actors {static bool Alive(IEntity a){return a&&a->alive;}static bool CanFight(IEntity a){return Alive(a)&&a->conscious;}};
|
||||
struct ERR_GameMode {string RecoveryStatus(){return "";}bool active=true;static ERR_GameMode*current;static ERR_GameMode*Get(){return current;}bool Active(){return active;}} mode;
|
||||
ERR_GameMode*ERR_GameMode::current=&mode;
|
||||
struct ERR_ObserverRules {static bool View(int reason,bool active,bool alive,bool conscious){return active&&((reason==4&&alive&&!conscious)||(reason!=0&&!alive));}};
|
||||
struct ERR_ObserverGuidance {static bool Refresh(bool ready,int oldReason,int reason,bool oldAvailable,bool available){return !ready||oldReason!=reason||oldAvailable!=available;}static string Message(int,bool){return "spectating";}};
|
||||
struct Vec{Vec operator+(const char*)const{return {};}};
|
||||
struct EntitySpawnParams{int TransformMode=0;Vec Transform[4];};namespace ETransformMode{enum{WORLD};}
|
||||
struct Resource{static Resource*Load(const char*){static Resource r;return &r;}bool IsValid(){return true;}};
|
||||
struct CameraBase{virtual ~CameraBase()=default;};
|
||||
struct CameraManager{CameraBase*current=nullptr;int sets=0;CameraBase*CurrentCamera(){return current;}void SetCamera(CameraBase*c){current=c;sets++;}} manager;
|
||||
int terminated=0,deleted=0,explicitSwitch=0;
|
||||
struct SCR_ManualCamera:CameraBase{
|
||||
CameraBase*previous=nullptr;bool ended=false;
|
||||
static SCR_ManualCamera*Cast(SCR_ManualCamera*c){return c;}
|
||||
void TrySwitchToControlledEntityCamera(){explicitSwitch++;}
|
||||
void Terminate(){if(!ended){ended=true;terminated++;}}
|
||||
// SDK SCR_ManualCamera destructor invokes SwitchToPreviousCamera, which
|
||||
// changes only its own currently selected camera, never a foreign current one.
|
||||
~SCR_ManualCamera(){Terminate();if(manager.current==this&&previous)manager.SetCamera(previous);deleted++;}
|
||||
};
|
||||
struct SCR_HintManagerComponent{int attempts=0;static SCR_HintManagerComponent*GetInstance(){static SCR_HintManagerComponent h;return &h;}bool ShowCustom(string,string,int){attempts++;return true;}};
|
||||
struct SCR_RespawnSystemComponent{int clears=0;static SCR_RespawnSystemComponent*GetInstance(){static SCR_RespawnSystemComponent r;return &r;}void DestroyLoadingPlaceholder(){clears++;}};
|
||||
struct SCR_EditorManagerEntity{bool opened=false;int closes=0;static SCR_EditorManagerEntity*GetInstance(){static SCR_EditorManagerEntity e;return &e;}bool IsOpened(){return opened;}void Close(bool){opened=false;closes++;}};
|
||||
struct RplId{static int Invalid(){return -1;}};namespace LogLevel{enum{WARNING};}void Print(const char*,int){}
|
||||
namespace System{bool IsConsoleApp(){return false;}}
|
||||
struct Queue{std::set<void*>owners;int added=0;void CallLater(void*owner,int,bool){owners.insert(owner);added++;}void Remove(void*owner){owners.erase(owner);}} queue;
|
||||
struct World{float now=1;float GetWorldTime(){return now;}} world;
|
||||
struct Game{void*local=nullptr;int spawns=0;void*GetPlayerController(){return local;}Queue*GetCallqueue(){return &queue;}World*GetWorld(){return &world;}CameraManager*GetCameraManager(){return &manager;}
|
||||
SCR_ManualCamera*SpawnEntityPrefabLocal(Resource*,World*,EntitySpawnParams){spawns++;auto*c=new SCR_ManualCamera();c->previous=manager.current;manager.SetCamera(c);return c;}} game;
|
||||
bool gameAvailable=true;Game*GetGame(){return gameAvailable?&game:nullptr;}
|
||||
struct Controller{
|
||||
string ERR_SelfEpinephrineHint(){return "";}
|
||||
IEntity actor=nullptr,m_ERRRecoveryBody=nullptr;float m_ERRRecoveryDeadline=-1;
|
||||
bool m_ERRObserverMonitor=false,m_ERRObserverReady=false,m_ERRShownObserverAvailable=false;
|
||||
string m_ERRShownRecoveryStatus;
|
||||
int m_ERRObserverReason=0,m_ERRShownObserverReason=0,m_ERRObservedId=1,starts=0;
|
||||
Vec m_ERRObserverAnchor;SCR_ManualCamera*m_ERRObserverCamera=nullptr;CameraBase*playerCamera=nullptr;
|
||||
IEntity GetControlledEntity(){return actor;}CameraBase*GetPlayerCamera(){return playerCamera;}
|
||||
void ERR_OnObserverMonitorStarted(){starts++;}
|
||||
'''+methods+r'''
|
||||
};
|
||||
struct Binder {bool m_Stopped=false,m_NativeEndHandled=false;
|
||||
'''+binder+r'''
|
||||
};
|
||||
int main(){
|
||||
// The real repeating binder must survive the first controller and gaps.
|
||||
Binder binder;Controller first,replacement;queue.owners.insert(&binder);
|
||||
game.local=nullptr;binder.BindLocalObserver();assert(queue.owners.count(&binder)&&queue.added==0);
|
||||
game.local=&first;binder.BindLocalObserver();
|
||||
assert(first.m_ERRObserverMonitor&&first.starts==1&&queue.owners.count(&first));
|
||||
assert(queue.owners.count(&binder));
|
||||
binder.BindLocalObserver();assert(first.starts==1&&queue.added==1);
|
||||
game.local=nullptr;binder.BindLocalObserver();assert(queue.owners.count(&binder));
|
||||
game.local=&replacement;binder.BindLocalObserver();
|
||||
assert(replacement.m_ERRObserverMonitor&&replacement.starts==1&&queue.owners.count(&replacement));
|
||||
first.ERR_UpdateObserverClient();
|
||||
assert(!first.m_ERRObserverMonitor&&!queue.owners.count(&first)&&queue.owners.count(&replacement));
|
||||
binder.BindLocalObserver();assert(replacement.starts==1&&queue.added==2);
|
||||
binder.m_Stopped=true;binder.BindLocalObserver();assert(!queue.owners.count(&binder)&&queue.owners.count(&replacement));
|
||||
binder.m_Stopped=false;binder.m_NativeEndHandled=true;queue.owners.insert(&binder);binder.BindLocalObserver();
|
||||
assert(!queue.owners.count(&binder)&&queue.owners.count(&replacement)&&queue.added==2);
|
||||
queue.owners.clear();queue.added=0;game.local=nullptr;
|
||||
|
||||
Actor body;CameraBase formerBodyCamera,newBodyCamera;
|
||||
Controller former,current;former.actor=&body;former.playerCamera=&formerBodyCamera;
|
||||
game.local=&former;manager.current=&formerBodyCamera;former.ERR_StartObserverMonitor();
|
||||
body.conscious=false;former.m_ERRObserverReason=4;former.ERR_UpdateObserverClient();
|
||||
assert(former.m_ERRRecoveryBody==&body&&former.m_ERRObserverCamera&&queue.owners.count(&former));
|
||||
SCR_ManualCamera*oldOwned=former.m_ERRObserverCamera;
|
||||
// New controller owns a separate spectator camera; old body wakes meanwhile.
|
||||
current.playerCamera=&newBodyCamera;current.m_ERRObserverReason=1;game.local=¤t;current.ERR_StartObserverMonitor();current.ERR_UpdateObserverClient();
|
||||
SCR_ManualCamera*newOwned=current.m_ERRObserverCamera;assert(newOwned&&newOwned!=oldOwned&&manager.current==newOwned);
|
||||
auto*editor=SCR_EditorManagerEntity::GetInstance();editor->opened=true;body.conscious=true;
|
||||
int beforeClears=SCR_RespawnSystemComponent::GetInstance()->clears;
|
||||
int beforeSets=manager.sets,beforeHints=SCR_HintManagerComponent::GetInstance()->attempts,beforeSpawns=game.spawns,beforeDeleted=deleted;
|
||||
former.ERR_UpdateObserverClient();
|
||||
assert(manager.current==newOwned&&manager.sets==beforeSets&&editor->opened&&editor->closes==0);
|
||||
assert(!former.m_ERRRecoveryBody&&former.m_ERRRecoveryDeadline==-1&&!former.m_ERRObserverMonitor&&!former.m_ERRObserverCamera);
|
||||
assert(deleted==beforeDeleted+1&&terminated==deleted&&explicitSwitch==0);
|
||||
assert(current.m_ERRObserverCamera==newOwned&&queue.owners.count(¤t)==1&&queue.owners.count(&former)==0);
|
||||
assert(SCR_HintManagerComponent::GetInstance()->attempts==beforeHints&&game.spawns==beforeSpawns&&SCR_RespawnSystemComponent::GetInstance()->clears==beforeClears);
|
||||
// Even a queued stale spectator callback cannot create a camera or a hint.
|
||||
former.actor=nullptr;former.m_ERRObserverReason=1;former.ERR_UpdateObserverClient();
|
||||
assert(game.spawns==beforeSpawns&&manager.current==newOwned&&SCR_HintManagerComponent::GetInstance()->attempts==beforeHints);
|
||||
// Start is still local-only; reacquisition restarts exactly one owned timer.
|
||||
int added=queue.added;former.ERR_StartObserverMonitor();assert(queue.added==added);
|
||||
game.local=&former;former.actor=&body;former.m_ERRObserverReason=0;former.ERR_StartObserverMonitor();former.ERR_StartObserverMonitor();
|
||||
assert(queue.added==added+1&&former.starts==2&&queue.owners.count(¤t)==1);
|
||||
// Normal recovery still closes the editor and returns this controller's body.
|
||||
body.conscious=false;former.ERR_UpdateObserverClient();assert(former.m_ERRRecoveryBody==&body);
|
||||
body.conscious=true;former.ERR_UpdateObserverClient();assert(manager.current==&formerBodyCamera&&!editor->opened&&editor->closes==1&&!former.m_ERRRecoveryBody);
|
||||
// Foreign current camera survives this controller's retained camera cleanup.
|
||||
game.local=¤t;manager.current=&newBodyCamera;current.ERR_CloseObserverCamera();assert(manager.current==&newBodyCamera&&deleted==beforeDeleted+2);
|
||||
// If the old owned camera is still current at replacement, its native
|
||||
// destructor may restore its own previous camera; no new-controller camera is deleted.
|
||||
Controller abandoned;abandoned.m_ERRObserverReason=1;game.local=&abandoned;manager.current=&newBodyCamera;
|
||||
abandoned.ERR_StartObserverMonitor();abandoned.ERR_UpdateObserverClient();assert(manager.current==abandoned.m_ERRObserverCamera);
|
||||
game.local=¤t;beforeSets=manager.sets;beforeDeleted=deleted;abandoned.ERR_UpdateObserverClient();
|
||||
assert(!abandoned.m_ERRObserverCamera&&manager.current==&newBodyCamera&&manager.sets==beforeSets+1&&deleted==beforeDeleted+1);
|
||||
assert(queue.owners.count(&abandoned)==0&&queue.owners.count(¤t)==1);
|
||||
// Solo death may leave the controlled corpse assigned; restore the orbit
|
||||
// camera if the native death camera replaces it on a later tick.
|
||||
Controller solo;Actor corpse;corpse.alive=false;corpse.conscious=false;
|
||||
solo.actor=&corpse;solo.m_ERRObserverReason=1;game.local=&solo;editor->opened=false;
|
||||
solo.ERR_UpdateObserverClient();auto*corpseCamera=solo.m_ERRObserverCamera;
|
||||
assert(corpseCamera&&manager.current==corpseCamera);
|
||||
manager.current=&newBodyCamera;beforeClears=SCR_RespawnSystemComponent::GetInstance()->clears;beforeSpawns=game.spawns;
|
||||
solo.ERR_UpdateObserverClient();
|
||||
assert(manager.current==corpseCamera&&game.spawns==beforeSpawns&&SCR_RespawnSystemComponent::GetInstance()->clears==beforeClears+1);
|
||||
// Game Master remains usable during spectating, including before first camera creation.
|
||||
editor->opened=true;manager.current=&newBodyCamera;solo.ERR_UpdateObserverClient();
|
||||
assert(manager.current==&newBodyCamera&&game.spawns==beforeSpawns);
|
||||
solo.ERR_CloseObserverCamera();solo.ERR_UpdateObserverClient();
|
||||
assert(!solo.m_ERRObserverCamera&&manager.current==&newBodyCamera&&game.spawns==beforeSpawns);
|
||||
editor->opened=false;solo.ERR_UpdateObserverClient();assert(solo.m_ERRObserverCamera&&manager.current==solo.m_ERRObserverCamera);
|
||||
solo.ERR_CloseObserverCamera();
|
||||
gameAvailable=false;former.ERR_UpdateObserverClient();gameAvailable=true;
|
||||
}
|
||||
''')
|
||||
print('PASS: actual observer monitor/recovery/cleanup rejects retained old controller, preserves new camera/editor/hints/timer, restarts once and retains normal recovery; native effects modeled from SDK, no runtime claim')
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"scope": "Test double compatibility only; no production edits.",
|
||||
"changes": "Add current debounce state, controllable System.GetTickCount, and fourth ShowCustom quiet flag (same API as test_hint_delivery). All ownership test cases and assertions unchanged.",
|
||||
"limits": "Baseline fails compilation, not a demonstrated production regression. Proposal actual-method harness passes; no native run. Existing hint_delivery owns debounce behavioral coverage."
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
--- a/tests/test_observer_ownership.py
|
||||
+++ b/tests/test_observer_ownership.py
|
||||
@@ -45,11 +45,11 @@
|
||||
// changes only its own currently selected camera, never a foreign current one.
|
||||
~SCR_ManualCamera(){Terminate();if(manager.current==this&&previous)manager.SetCamera(previous);deleted++;}
|
||||
};
|
||||
-struct SCR_HintManagerComponent{int attempts=0;static SCR_HintManagerComponent*GetInstance(){static SCR_HintManagerComponent h;return &h;}bool ShowCustom(string,string,int){attempts++;return true;}};
|
||||
+struct SCR_HintManagerComponent{int attempts=0;bool silent=false;static SCR_HintManagerComponent*GetInstance(){static SCR_HintManagerComponent h;return &h;}bool ShowCustom(string,string,int,bool quiet=false){attempts++;silent=quiet;return true;}};
|
||||
struct SCR_RespawnSystemComponent{int clears=0;static SCR_RespawnSystemComponent*GetInstance(){static SCR_RespawnSystemComponent r;return &r;}void DestroyLoadingPlaceholder(){clears++;}};
|
||||
struct SCR_EditorManagerEntity{bool opened=false;int closes=0;static SCR_EditorManagerEntity*GetInstance(){static SCR_EditorManagerEntity e;return &e;}bool IsOpened(){return opened;}void Close(bool){opened=false;closes++;}};
|
||||
struct RplId{static int Invalid(){return -1;}};namespace LogLevel{enum{WARNING};}void Print(const char*,int){}
|
||||
-namespace System{bool IsConsoleApp(){return false;}}
|
||||
+namespace System{int now=0;int GetTickCount(){return now;}bool IsConsoleApp(){return false;}}
|
||||
struct Queue{std::set<void*>owners;int added=0;void CallLater(void*owner,int,bool){owners.insert(owner);added++;}void Remove(void*owner){owners.erase(owner);}} queue;
|
||||
struct World{float now=1;float GetWorldTime(){return now;}} world;
|
||||
struct Game{void*local=nullptr;int spawns=0;void*GetPlayerController(){return local;}Queue*GetCallqueue(){return &queue;}World*GetWorld(){return &world;}CameraManager*GetCameraManager(){return &manager;}
|
||||
@@ -59,7 +59,8 @@
|
||||
string ERR_SelfEpinephrineHint(){return "";}
|
||||
IEntity actor=nullptr,m_ERRRecoveryBody=nullptr;float m_ERRRecoveryDeadline=-1;
|
||||
bool m_ERRObserverMonitor=false,m_ERRObserverReady=false,m_ERRShownObserverAvailable=false;
|
||||
- string m_ERRShownRecoveryStatus;
|
||||
+ string m_ERRShownRecoveryStatus,m_ERRPendingRecoveryStatus;
|
||||
+ int m_ERRRecoveryStatusSince=0;
|
||||
int m_ERRObserverReason=0,m_ERRShownObserverReason=0,m_ERRObservedId=1,starts=0;
|
||||
Vec m_ERRObserverAnchor;SCR_ManualCamera*m_ERRObserverCamera=nullptr;CameraBase*playerCamera=nullptr;
|
||||
IEntity GetControlledEntity(){return actor;}CameraBase*GetPlayerCamera(){return playerCamera;}
|
||||
@@ -0,0 +1 @@
|
||||
PASS: actual observer monitor/recovery/cleanup rejects retained old controller, preserves new camera/editor/hints/timer, restarts once and retains normal recovery; native effects modeled from SDK, no runtime claim
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"files": {
|
||||
"tests/test_observer_ownership.py": {
|
||||
"before_sha256": "d06efedfdf07861f82b0d2429f21db1d7e20945b74a8e9f7eca8f10374328771",
|
||||
"after_sha256": "ab6ce2a7f2e62659020c3f707806435c8baa94bfd95bc5cfdd1e4715a754d7aa"
|
||||
}
|
||||
},
|
||||
"patch_sha256": "c76cd98979abb8b3372831955fbe4ddbcfe4d6869bcadaaa844d8e611b4c83ce",
|
||||
"validation": {
|
||||
"baseline_exit": 1,
|
||||
"baseline_failure": "Compilation: missing clock/debounce fields and four-argument ShowCustom",
|
||||
"proposal_exit": 0,
|
||||
"assertions_preserved": "Entire int main() suffix byte-identical",
|
||||
"baseline_log_sha256": "2ddd1eb6bfd32185cc5b085624908690f41fcf054af3edf811ce996b7df049de",
|
||||
"proposal_log_sha256": "359367fd4e4c429eca157de941b568ba6c66b18e27f64d95e057fe512c73e78d"
|
||||
},
|
||||
"production_source_sha256": "7c478eff3575eb1bd8a85c08955d4ca7f63b57969cd7b2b76dfd6c42136de1af"
|
||||
}
|
||||
+148
@@ -0,0 +1,148 @@
|
||||
"""Actual observer monitor/recovery/cleanup; native camera lifecycle is doubled."""
|
||||
import os,re
|
||||
from pathlib import Path
|
||||
from policy_harness import ROOT,body,run
|
||||
p=Path(os.environ.get('ERR_OBSERVER_SOURCE',ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_Observer.c'))
|
||||
game_mode=Path(os.environ.get('ERR_GAME_MODE_SOURCE',ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_GameMode.c'))
|
||||
binder=body(game_mode,'protected void BindLocalObserver(')
|
||||
binder=binder.replace('protected ', '').replace('SCR_PlayerController controller = SCR_PlayerController.Cast(GetGame().GetPlayerController());','Controller* controller = static_cast<Controller*>(GetGame()->GetPlayerController());')
|
||||
binder=binder.replace('GetGame().','GetGame()->').replace('GetCallqueue().','GetCallqueue()->').replace('Remove(BindLocalObserver)','Remove(this)').replace('controller.','controller->')
|
||||
def cpp(s):
|
||||
s=s.replace('protected ','').replace('null','nullptr')
|
||||
for n in ('ERR_GameMode','ERR_Actors','ERR_ObserverRules','ERR_ObserverGuidance','SCR_HintManagerComponent','SCR_RespawnSystemComponent','SCR_EditorManagerEntity','Resource','SCR_ManualCamera','RplId','ETransformMode','LogLevel','System'):
|
||||
s=s.replace(n+'.',n+'::')
|
||||
for n in ('ERR_GameMode','SCR_HintManagerComponent','SCR_RespawnSystemComponent','SCR_EditorManagerEntity','Resource','CameraManager','CameraBase'):
|
||||
s=re.sub(r'\b'+n+r' (\w+)',n+r'* \1',s)
|
||||
for n in ('mode','hints','respawn','editor','resource','manager','m_ERRObserverCamera'):
|
||||
s=s.replace(n+'.',n+'->')
|
||||
s=s.replace('GetGame().','GetGame()->').replace('GetWorld().','GetWorld()->').replace('GetCallqueue().','GetCallqueue()->')
|
||||
s=s.replace('Remove(ERR_UpdateObserverClient)','Remove(this)').replace('CallLater(ERR_UpdateObserverClient, 250, true)','CallLater(this, 250, true)')
|
||||
s=s.replace('EntitySpawnParams params = new EntitySpawnParams();','EntitySpawnParams params;')
|
||||
return s
|
||||
methods='\n'.join(cpp(body(p,n)) for n in ('void ERR_StartObserverMonitor(', 'protected void ERR_UpdateObserverClient(', 'protected void ERR_UpdateRecoveryCamera(', 'protected void ERR_CloseObserverCamera('))
|
||||
run(r'''#include <cassert>
|
||||
#include <set>
|
||||
#include <string>
|
||||
struct string:std::string {using std::string::string;using std::string::operator=;string(std::string s):std::string(s){}bool IsEmpty()const{return empty();}};
|
||||
struct Actor {bool alive=true,conscious=true;};using IEntity=Actor*;
|
||||
struct ERR_Actors {static bool Alive(IEntity a){return a&&a->alive;}static bool CanFight(IEntity a){return Alive(a)&&a->conscious;}};
|
||||
struct ERR_GameMode {string RecoveryStatus(){return "";}bool active=true;static ERR_GameMode*current;static ERR_GameMode*Get(){return current;}bool Active(){return active;}} mode;
|
||||
ERR_GameMode*ERR_GameMode::current=&mode;
|
||||
struct ERR_ObserverRules {static bool View(int reason,bool active,bool alive,bool conscious){return active&&((reason==4&&alive&&!conscious)||(reason!=0&&!alive));}};
|
||||
struct ERR_ObserverGuidance {static bool Refresh(bool ready,int oldReason,int reason,bool oldAvailable,bool available){return !ready||oldReason!=reason||oldAvailable!=available;}static string Message(int,bool){return "spectating";}};
|
||||
struct Vec{Vec operator+(const char*)const{return {};}};
|
||||
struct EntitySpawnParams{int TransformMode=0;Vec Transform[4];};namespace ETransformMode{enum{WORLD};}
|
||||
struct Resource{static Resource*Load(const char*){static Resource r;return &r;}bool IsValid(){return true;}};
|
||||
struct CameraBase{virtual ~CameraBase()=default;};
|
||||
struct CameraManager{CameraBase*current=nullptr;int sets=0;CameraBase*CurrentCamera(){return current;}void SetCamera(CameraBase*c){current=c;sets++;}} manager;
|
||||
int terminated=0,deleted=0,explicitSwitch=0;
|
||||
struct SCR_ManualCamera:CameraBase{
|
||||
CameraBase*previous=nullptr;bool ended=false;
|
||||
static SCR_ManualCamera*Cast(SCR_ManualCamera*c){return c;}
|
||||
void TrySwitchToControlledEntityCamera(){explicitSwitch++;}
|
||||
void Terminate(){if(!ended){ended=true;terminated++;}}
|
||||
// SDK SCR_ManualCamera destructor invokes SwitchToPreviousCamera, which
|
||||
// changes only its own currently selected camera, never a foreign current one.
|
||||
~SCR_ManualCamera(){Terminate();if(manager.current==this&&previous)manager.SetCamera(previous);deleted++;}
|
||||
};
|
||||
struct SCR_HintManagerComponent{int attempts=0;bool silent=false;static SCR_HintManagerComponent*GetInstance(){static SCR_HintManagerComponent h;return &h;}bool ShowCustom(string,string,int,bool quiet=false){attempts++;silent=quiet;return true;}};
|
||||
struct SCR_RespawnSystemComponent{int clears=0;static SCR_RespawnSystemComponent*GetInstance(){static SCR_RespawnSystemComponent r;return &r;}void DestroyLoadingPlaceholder(){clears++;}};
|
||||
struct SCR_EditorManagerEntity{bool opened=false;int closes=0;static SCR_EditorManagerEntity*GetInstance(){static SCR_EditorManagerEntity e;return &e;}bool IsOpened(){return opened;}void Close(bool){opened=false;closes++;}};
|
||||
struct RplId{static int Invalid(){return -1;}};namespace LogLevel{enum{WARNING};}void Print(const char*,int){}
|
||||
namespace System{int now=0;int GetTickCount(){return now;}bool IsConsoleApp(){return false;}}
|
||||
struct Queue{std::set<void*>owners;int added=0;void CallLater(void*owner,int,bool){owners.insert(owner);added++;}void Remove(void*owner){owners.erase(owner);}} queue;
|
||||
struct World{float now=1;float GetWorldTime(){return now;}} world;
|
||||
struct Game{void*local=nullptr;int spawns=0;void*GetPlayerController(){return local;}Queue*GetCallqueue(){return &queue;}World*GetWorld(){return &world;}CameraManager*GetCameraManager(){return &manager;}
|
||||
SCR_ManualCamera*SpawnEntityPrefabLocal(Resource*,World*,EntitySpawnParams){spawns++;auto*c=new SCR_ManualCamera();c->previous=manager.current;manager.SetCamera(c);return c;}} game;
|
||||
bool gameAvailable=true;Game*GetGame(){return gameAvailable?&game:nullptr;}
|
||||
struct Controller{
|
||||
string ERR_SelfEpinephrineHint(){return "";}
|
||||
IEntity actor=nullptr,m_ERRRecoveryBody=nullptr;float m_ERRRecoveryDeadline=-1;
|
||||
bool m_ERRObserverMonitor=false,m_ERRObserverReady=false,m_ERRShownObserverAvailable=false;
|
||||
string m_ERRShownRecoveryStatus,m_ERRPendingRecoveryStatus;
|
||||
int m_ERRRecoveryStatusSince=0;
|
||||
int m_ERRObserverReason=0,m_ERRShownObserverReason=0,m_ERRObservedId=1,starts=0;
|
||||
Vec m_ERRObserverAnchor;SCR_ManualCamera*m_ERRObserverCamera=nullptr;CameraBase*playerCamera=nullptr;
|
||||
IEntity GetControlledEntity(){return actor;}CameraBase*GetPlayerCamera(){return playerCamera;}
|
||||
void ERR_OnObserverMonitorStarted(){starts++;}
|
||||
'''+methods+r'''
|
||||
};
|
||||
struct Binder {bool m_Stopped=false,m_NativeEndHandled=false;
|
||||
'''+binder+r'''
|
||||
};
|
||||
int main(){
|
||||
// The real repeating binder must survive the first controller and gaps.
|
||||
Binder binder;Controller first,replacement;queue.owners.insert(&binder);
|
||||
game.local=nullptr;binder.BindLocalObserver();assert(queue.owners.count(&binder)&&queue.added==0);
|
||||
game.local=&first;binder.BindLocalObserver();
|
||||
assert(first.m_ERRObserverMonitor&&first.starts==1&&queue.owners.count(&first));
|
||||
assert(queue.owners.count(&binder));
|
||||
binder.BindLocalObserver();assert(first.starts==1&&queue.added==1);
|
||||
game.local=nullptr;binder.BindLocalObserver();assert(queue.owners.count(&binder));
|
||||
game.local=&replacement;binder.BindLocalObserver();
|
||||
assert(replacement.m_ERRObserverMonitor&&replacement.starts==1&&queue.owners.count(&replacement));
|
||||
first.ERR_UpdateObserverClient();
|
||||
assert(!first.m_ERRObserverMonitor&&!queue.owners.count(&first)&&queue.owners.count(&replacement));
|
||||
binder.BindLocalObserver();assert(replacement.starts==1&&queue.added==2);
|
||||
binder.m_Stopped=true;binder.BindLocalObserver();assert(!queue.owners.count(&binder)&&queue.owners.count(&replacement));
|
||||
binder.m_Stopped=false;binder.m_NativeEndHandled=true;queue.owners.insert(&binder);binder.BindLocalObserver();
|
||||
assert(!queue.owners.count(&binder)&&queue.owners.count(&replacement)&&queue.added==2);
|
||||
queue.owners.clear();queue.added=0;game.local=nullptr;
|
||||
|
||||
Actor body;CameraBase formerBodyCamera,newBodyCamera;
|
||||
Controller former,current;former.actor=&body;former.playerCamera=&formerBodyCamera;
|
||||
game.local=&former;manager.current=&formerBodyCamera;former.ERR_StartObserverMonitor();
|
||||
body.conscious=false;former.m_ERRObserverReason=4;former.ERR_UpdateObserverClient();
|
||||
assert(former.m_ERRRecoveryBody==&body&&former.m_ERRObserverCamera&&queue.owners.count(&former));
|
||||
SCR_ManualCamera*oldOwned=former.m_ERRObserverCamera;
|
||||
// New controller owns a separate spectator camera; old body wakes meanwhile.
|
||||
current.playerCamera=&newBodyCamera;current.m_ERRObserverReason=1;game.local=¤t;current.ERR_StartObserverMonitor();current.ERR_UpdateObserverClient();
|
||||
SCR_ManualCamera*newOwned=current.m_ERRObserverCamera;assert(newOwned&&newOwned!=oldOwned&&manager.current==newOwned);
|
||||
auto*editor=SCR_EditorManagerEntity::GetInstance();editor->opened=true;body.conscious=true;
|
||||
int beforeClears=SCR_RespawnSystemComponent::GetInstance()->clears;
|
||||
int beforeSets=manager.sets,beforeHints=SCR_HintManagerComponent::GetInstance()->attempts,beforeSpawns=game.spawns,beforeDeleted=deleted;
|
||||
former.ERR_UpdateObserverClient();
|
||||
assert(manager.current==newOwned&&manager.sets==beforeSets&&editor->opened&&editor->closes==0);
|
||||
assert(!former.m_ERRRecoveryBody&&former.m_ERRRecoveryDeadline==-1&&!former.m_ERRObserverMonitor&&!former.m_ERRObserverCamera);
|
||||
assert(deleted==beforeDeleted+1&&terminated==deleted&&explicitSwitch==0);
|
||||
assert(current.m_ERRObserverCamera==newOwned&&queue.owners.count(¤t)==1&&queue.owners.count(&former)==0);
|
||||
assert(SCR_HintManagerComponent::GetInstance()->attempts==beforeHints&&game.spawns==beforeSpawns&&SCR_RespawnSystemComponent::GetInstance()->clears==beforeClears);
|
||||
// Even a queued stale spectator callback cannot create a camera or a hint.
|
||||
former.actor=nullptr;former.m_ERRObserverReason=1;former.ERR_UpdateObserverClient();
|
||||
assert(game.spawns==beforeSpawns&&manager.current==newOwned&&SCR_HintManagerComponent::GetInstance()->attempts==beforeHints);
|
||||
// Start is still local-only; reacquisition restarts exactly one owned timer.
|
||||
int added=queue.added;former.ERR_StartObserverMonitor();assert(queue.added==added);
|
||||
game.local=&former;former.actor=&body;former.m_ERRObserverReason=0;former.ERR_StartObserverMonitor();former.ERR_StartObserverMonitor();
|
||||
assert(queue.added==added+1&&former.starts==2&&queue.owners.count(¤t)==1);
|
||||
// Normal recovery still closes the editor and returns this controller's body.
|
||||
body.conscious=false;former.ERR_UpdateObserverClient();assert(former.m_ERRRecoveryBody==&body);
|
||||
body.conscious=true;former.ERR_UpdateObserverClient();assert(manager.current==&formerBodyCamera&&!editor->opened&&editor->closes==1&&!former.m_ERRRecoveryBody);
|
||||
// Foreign current camera survives this controller's retained camera cleanup.
|
||||
game.local=¤t;manager.current=&newBodyCamera;current.ERR_CloseObserverCamera();assert(manager.current==&newBodyCamera&&deleted==beforeDeleted+2);
|
||||
// If the old owned camera is still current at replacement, its native
|
||||
// destructor may restore its own previous camera; no new-controller camera is deleted.
|
||||
Controller abandoned;abandoned.m_ERRObserverReason=1;game.local=&abandoned;manager.current=&newBodyCamera;
|
||||
abandoned.ERR_StartObserverMonitor();abandoned.ERR_UpdateObserverClient();assert(manager.current==abandoned.m_ERRObserverCamera);
|
||||
game.local=¤t;beforeSets=manager.sets;beforeDeleted=deleted;abandoned.ERR_UpdateObserverClient();
|
||||
assert(!abandoned.m_ERRObserverCamera&&manager.current==&newBodyCamera&&manager.sets==beforeSets+1&&deleted==beforeDeleted+1);
|
||||
assert(queue.owners.count(&abandoned)==0&&queue.owners.count(¤t)==1);
|
||||
// Solo death may leave the controlled corpse assigned; restore the orbit
|
||||
// camera if the native death camera replaces it on a later tick.
|
||||
Controller solo;Actor corpse;corpse.alive=false;corpse.conscious=false;
|
||||
solo.actor=&corpse;solo.m_ERRObserverReason=1;game.local=&solo;editor->opened=false;
|
||||
solo.ERR_UpdateObserverClient();auto*corpseCamera=solo.m_ERRObserverCamera;
|
||||
assert(corpseCamera&&manager.current==corpseCamera);
|
||||
manager.current=&newBodyCamera;beforeClears=SCR_RespawnSystemComponent::GetInstance()->clears;beforeSpawns=game.spawns;
|
||||
solo.ERR_UpdateObserverClient();
|
||||
assert(manager.current==corpseCamera&&game.spawns==beforeSpawns&&SCR_RespawnSystemComponent::GetInstance()->clears==beforeClears+1);
|
||||
// Game Master remains usable during spectating, including before first camera creation.
|
||||
editor->opened=true;manager.current=&newBodyCamera;solo.ERR_UpdateObserverClient();
|
||||
assert(manager.current==&newBodyCamera&&game.spawns==beforeSpawns);
|
||||
solo.ERR_CloseObserverCamera();solo.ERR_UpdateObserverClient();
|
||||
assert(!solo.m_ERRObserverCamera&&manager.current==&newBodyCamera&&game.spawns==beforeSpawns);
|
||||
editor->opened=false;solo.ERR_UpdateObserverClient();assert(solo.m_ERRObserverCamera&&manager.current==solo.m_ERRObserverCamera);
|
||||
solo.ERR_CloseObserverCamera();
|
||||
gameAvailable=false;former.ERR_UpdateObserverClient();gameAvailable=true;
|
||||
}
|
||||
''')
|
||||
print('PASS: actual observer monitor/recovery/cleanup rejects retained old controller, preserves new camera/editor/hints/timer, restarts once and retains normal recovery; native effects modeled from SDK, no runtime claim')
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"hq-recovery-reserve-2026-11-05": {
|
||||
"files": 36,
|
||||
"seal_sha256": "b3e8335d47e2cb4c3fe00b50666caf3e2acebfbbfe9506980fae9ba471a6bcee",
|
||||
"valid": true
|
||||
},
|
||||
"objective-guidance-2026-11-05": {
|
||||
"files": 15,
|
||||
"seal_sha256": "1d5d93dd0d3642d0ff9f7befdee7ae828df4f0c9ede8602761ab4d29ced2ee95",
|
||||
"valid": true
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"conclusion": "No concrete radio-defence eligibility/reset defect demonstrated in bounded current-source audit. No patch proposed.",
|
||||
"findings": [
|
||||
"Each server Tick clears and rebuilds defender count from native currently controlled living player entities; CanDefend additionally requires canonical CurrentActor account/connection/body identity, player faction and conscious CanFight. Dead, unconscious, disconnected, replaced or nonparticipant actors cannot sustain a sampled interval.",
|
||||
"Zero defenders resets Since to -1 before DefenceComplete. Remaining eligible teammate preserves continuity; restored coverage begins a fresh interval. Backwards clock resets, strict radius is less than60m. Completion requires current positive coverage and latches before callbacks.",
|
||||
"With empty restart disabled/not due, ServerTick still executes radio Tick before its later empty tactical-work return; ConnectedPlayers==0 resets progress. If empty restart triggers first, it requests native round end and blocks further ordinary ticks; native end calls StopServices and registered radio Stop.",
|
||||
"RadioStarted stops service if transition refuses; terminal phase change stops active service. RadioCompleted requires exact registered service location and completed state in RADIO_DEFENCE."
|
||||
],
|
||||
"validation": "Reviewed existing test_radio_defence_policy.py, test_radio_feedback_policy.py and test_empty_server_restart.py coverage. Did not rerun tests during parent full suite; no native or source edits.",
|
||||
"limits": "Coverage is sampled at repeating1000ms ordinary server tick. No claim about sub-tick event continuity or unobserved native scheduling/replication; no concrete reachable missed event established.",
|
||||
"source_sha256": {
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_RadioDefenceService.c": "f5f0bf1352141f933d0edb5630e30541e001dc07e1d2c8529b29cc159c126b13",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_Actors.c": "7258b838f8365e4fa575c4f2ccc8532e22a33946405ebb490120534d5ca65607",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerRoster.c": "dc785a8a1d78a285fe55ce76f87b78a9f522eeb9f7d9655dfe9b5c4348a26a18",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_GameMode.c": "d26e665cf5b9c0e1dc6c5e2da200a99711ef9272718d330f5aa66b09cede40d1",
|
||||
"addons/core/Scripts/Game/ERR/00_Core/ERR_MissionRules.c": "17d1f48878b02a457eebbe5ff87c4267488d68d2a9b3121dda77a8bc8e69c8c6"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
PASS: actual preparation status scope, persistent updates, spinner restoration, placeholder replacement/deletion/destruction, native observation persistence/timeout; rendering remains native-pending
|
||||
Traceback (most recent call last):
|
||||
File "/tmp/erri-heartbeat-20261105-1052/reload-proposal/baseline/tests/test_preparation_status.py", line 126, in <module>
|
||||
assert 'm_fAutoReloadTime 10' in prefab
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
AssertionError
|
||||
+370
@@ -0,0 +1,370 @@
|
||||
# Automatic Escape on added terrains
|
||||
|
||||
For a universal starting scenario, select **Co10 Escape Reintroduced — Automatic
|
||||
terrain** from this mod:
|
||||
|
||||
```text
|
||||
{C1E20667DCE324ED}Missions/ERR_Everon.conf
|
||||
```
|
||||
|
||||
This is the existing full Escape scenario with its original resource ID and path,
|
||||
now named for its role as the universal launcher. Existing server configurations
|
||||
using that ID continue to work. The duplicate Base diagnostic header is no longer
|
||||
shipped. Servers using its retired `{AD62322D5213C440}` ID must select the main
|
||||
entry above; the diagnostic tools already use it. It starts on Everon when no terrain override is
|
||||
saved, so administrators can always reach the Escape menu. Add the desired terrain
|
||||
to the server's mods, select one of its scenarios in **Terrains**, save, and restart.
|
||||
The existing saved selection loads that map and Escape creates its mission there.
|
||||
No AMP-specific settings, external startup helper, connector addon or changes by
|
||||
the terrain author are needed.
|
||||
|
||||
The published scenario name and description now identify Escape itself. After a
|
||||
terrain switch the public browser can retain **Automatic terrain**; this entry
|
||||
intentionally does not name a map that may no longer be running. It is not a fix
|
||||
for dynamic backend metadata refresh. The runtime title on a taken-over terrain
|
||||
still follows the loaded map. Server owners currently starting with a terrain's
|
||||
Exploration/Game Master scenario must select the Escape entry once to use this
|
||||
registration identity. An addon update cannot change that choice for them.
|
||||
|
||||
[Launcher validation](evidence/automatic-launcher-2026-10-04/report.json) reached
|
||||
the prison phase both on default Everon and after following a saved Nogova
|
||||
selection. The native title callback returned the terrain-neutral launcher name
|
||||
before switching. These private tests used no backend; public listing and
|
||||
Workshop metadata still need verification after publication.
|
||||
|
||||
The original direct-terrain route remains supported: add Escape and a terrain,
|
||||
then select an existing scenario supplied by that terrain. For Nogova that is:
|
||||
|
||||
```text
|
||||
{469880DFE1B48F95}Missions/Nogova_TerrainTest.conf
|
||||
```
|
||||
|
||||
In a standard server configuration, the selected entry is `game.scenarioId`.
|
||||
Select a mission header (`Missions/*.conf`), not the terrain's world resource.
|
||||
Installing multiple terrains does not choose one automatically. With no saved
|
||||
selection, the server's configured scenario remains the default; only the
|
||||
Automatic terrain entry defaults to Everon. Workshop 0.0.45 predates automatic
|
||||
takeover. Publish the updated Escape core to expose the new launcher name and
|
||||
description; the mission resource ID is unchanged.
|
||||
|
||||
Before publishing the updated core, reopen/rescan the project in Workbench so
|
||||
`Prefabs/ERR/TerrainTakeover.et` and its metadata enter the resource index. An old
|
||||
cache can include the script but still fail to register the replicated prefab.
|
||||
This is a publishing check, not a server-admin setup requirement.
|
||||
|
||||
## In-game terrain selection
|
||||
|
||||
Game Master keeps Reforger's normal administrator permissions after takeover.
|
||||
Escape transfers the editor core's player registration, disconnect, spawn,
|
||||
death, deletion and role-change listeners from the original game mode to the
|
||||
replacement before replaying admissions. Without this transfer, an admin on an
|
||||
exploration scenario could have a disabled Game Master button because the editor
|
||||
still listened to the removed mode. The transfer retains existing editor managers
|
||||
and does not grant Game Master to ordinary players.
|
||||
After replaying admissions, Escape also checks already-connected players, creates only missing editor managers, and reapplies native role-derived modes. This covers registration that happened before the new game mode attached its listeners. The repair now waits for a valid, distinct controller replication identity (a dedicated server’s temporary local identity is not a player). Editor creation is idempotent during takeover, so the subsequent native registration event reuses the manager instead of registering it twice. Missing managers are retried up to 80 times at 250 ms intervals; retries touch only missing editors and are cancelled at detach/world shutdown. A later registration may start another repair window. The pause menu refreshes the Game Master button from native editor availability: vanilla can leave it disabled when an administrator's mode arrives while the menu is already open. These repairs do not assign administrator roles or preserve a login that the server revoked during restart.
|
||||
|
||||
The native loading-screen updater also follows the replacement respawn manager. This keeps the spinner and mission-preparation text updating after takeover, including when the original scenario disabled its deploy-menu updater. A pending spawn-loading overlay releases on victory/defeat and cannot hold the result screen underneath it.
|
||||
|
||||
Escape's default end-of-round reload delay is ten seconds. The native server `-autoreload` override still applies, including disabling automatic reload. Terrain loading and procedural preparation happen after that delay and can take substantially longer on large islands.
|
||||
|
||||
|
||||
The [editor handover check](evidence/terrain-editor-2026-10-03/report.json)
|
||||
passed five native Nogova checks and the focused regression tests. It exercises
|
||||
event delivery on a playerless server; a connected administrator clicking the
|
||||
pause-menu button remains an in-game verification step.
|
||||
|
||||
Open the Escape administration menu and choose **Terrains**. Select a scenario
|
||||
and press **Save terrain**. Saving leaves the current round running; the saved
|
||||
scenario takes effect after a normal mission restart or a full server restart.
|
||||
Changing terrain disconnects connected players without a ban: **rejoin after the
|
||||
new map has loaded**. Reforger otherwise makes connected clients reload the old
|
||||
world while the server loads the new one. Restarting on the same terrain does
|
||||
not use this extra disconnect.
|
||||
|
||||
The list is discovered on the server from enabled mods' scenario catalog and
|
||||
mounted `Missions/*.conf` resources. It lists scenario entry points, so an island
|
||||
can appear several times. Prefer an exploration or Escape scenario; discovery
|
||||
alone does not certify its navigation or compatibility. The selector does not
|
||||
download or enable additional mods. Add the terrain to the server first.
|
||||
|
||||
**Use server default**, then **Save terrain**, removes the override. With no
|
||||
selection, Escape continues using the server's configured scenario, including
|
||||
Nogova; its administration menu remains available after takeover. For a fresh
|
||||
server, select **Co10 Escape Reintroduced — Automatic terrain** as the initial entry point:
|
||||
|
||||
```text
|
||||
{C1E20667DCE324ED}Missions/ERR_Everon.conf
|
||||
```
|
||||
|
||||
The server still needs a valid initial scenario to start the engine. A script
|
||||
cannot provide a menu if startup fails before a world loads. Forcing Everon on
|
||||
all unconfigured servers would also replace an administrator's valid existing
|
||||
terrain selection unnecessarily.
|
||||
|
||||
The override is stored as `terrain.scenario` in `$profile:Escapists.json`
|
||||
(with a shared `.bak` backup).
|
||||
Only authenticated administrators can save a discovered scenario. A removed or
|
||||
unavailable saved scenario falls back to the configured server scenario and
|
||||
shows a warning. Corrupt preferences are preserved for inspection; removing or
|
||||
repairing the `terrain` section, then restarting, restores editing. See
|
||||
[unified configuration](configuration.md#one-server-configuration) for migration
|
||||
and backup recovery; do not remove the whole file just to clear a terrain choice. Startup
|
||||
redirects are bounded and do not repeatedly reload an unreachable destination.
|
||||
|
||||
[Native test evidence](evidence/terrain-selection-2026-10-02/report.json) covers
|
||||
discovery, save authorization, persistence, restart, disconnect and rejoin on
|
||||
Everon. The menu screenshot uses a labeled offline presentation fixture.
|
||||
|
||||
## Placement and requirements
|
||||
|
||||
Escape surveys clear helicopter landing zones across the entire terrain from the
|
||||
first candidate, whether airports exist or not. There is no airport-first search
|
||||
or dedicated airport-discovery wait. Every candidate still passes terrain,
|
||||
navigation, slope, aircraft-clearance and rescue-fleet space checks. Searches
|
||||
have finite time and attempt budgets and never fall back to coordinates from
|
||||
another map.
|
||||
|
||||
Terrain-generated placement allows up to 48,000 candidates or 120 seconds per
|
||||
site, whichever comes first, keeping the existing cooperative 8 ms work slices.
|
||||
|
||||
Extraction pads do not use the camp-only 12 m road exclusion, and their initial
|
||||
ground survey uses the same 0.8 m height variation limit as the landing-zone
|
||||
survey. Camp footprints retain their 0.6 m limit and road exclusion. Aircraft
|
||||
clearance is tested at the centre's actual terrain height, matching pickup
|
||||
registration, rather than the lowest point sampled across the camp grid.
|
||||
Water, physical obstacles, guard/patrol ground and navigation, the 28 m landing
|
||||
footprint, overhead clearance and additional transport-pad checks still apply.
|
||||
|
||||
Dry ground is determined from the terrain's actual water surface, not a fixed
|
||||
world-altitude minimum. Site clearance queries water at every sampled terrain
|
||||
height instead of testing placeholder candidate heights. Dry terrain below
|
||||
one metre (including negative map elevations) can qualify; submerged terrain,
|
||||
invalid heights, excessive slopes and physical obstructions remain rejected.
|
||||
Site creation, character spawn slots, airfield pads and mortar setup use the
|
||||
same terrain-height water check, without the 10 cm character spawn lift.
|
||||
|
||||
On terrain-generated maps, prison-to-airport separation is 15% of the shorter
|
||||
world axis, clamped to 200–1,500 m (300 m on a 2 km map). This changes tactical
|
||||
spacing, not the physical footprint or slope allowance. Original authored Everon
|
||||
placement retains its 1,500 m airport buffer and existing search/fallback rules.
|
||||
Maps without sufficient clear ground or a working Soldiers navigation mesh can
|
||||
still fail preparation. See [placement validation](evidence/small-terrain-placement-2026-10-24/README.md).
|
||||
|
||||
Search diagnostics use the `Reintroduced [placement search]` log prefix. Each
|
||||
summary identifies the site, attempts and elapsed milliseconds, with counts for
|
||||
failed or deferred checks: water, uneven ground, obstacles, road/airport distance,
|
||||
site spacing, navigation and aircraft clearance. Summaries appear on completion,
|
||||
exhaustion, plus every 30 seconds during a long search.
|
||||
Counts describe checks rather than unique candidates: a candidate awaiting a
|
||||
navigation tile can be checked repeatedly. Mandatory placement failures also
|
||||
include the site and rejection summary directly on the loading screen, so no
|
||||
chat command is needed. The same detail remains available in mission status.
|
||||
|
||||
On startup failure, a local `ChimeraMenuBase` error menu provides **Return to
|
||||
main menu** and **Pause menu (Esc / Back)**. The loading placeholder is hidden
|
||||
while an interactive menu or dialog is available, so it cannot cover native
|
||||
pause/exit controls. Existing menus keep focus; ordinary preparation retains its
|
||||
loading overlay. Returning uses the native local gameplay-end transition and
|
||||
does not admit players or change the failed mission state. If the custom menu
|
||||
cannot open, the native pause menu is the fallback.
|
||||
|
||||
The selected scenario must supply `SCR_BaseGameMode`, a usable `Soldiers` navmesh,
|
||||
world bounds spanning 1–100 km on both axes, and enough clear navigable ground.
|
||||
Navigation remains the terrain author's responsibility. A plain exploration
|
||||
scenario is the recommended starting point. Arbitrary scripted scenarios can
|
||||
retain their own tasks and entities; saved campaigns and every third-party game
|
||||
mode are not qualified. Escape disables further saving when taking over; it does
|
||||
not delete existing saves. Existing authored Escape scenarios and editor worlds
|
||||
are left on their normal startup path.
|
||||
|
||||
## Displayed mission name and text
|
||||
|
||||
Automatic takeover reports **Co10 Escape Reintroduced - <terrain>** through the
|
||||
native server mission-name callback, for example **Co10 Escape Reintroduced -
|
||||
Armenhof**. Once takeover is confirmed, the running world and its root scene supply the terrain
|
||||
name, even if the source header still refers to the original island. Before confirmation,
|
||||
an incoming header cannot pick up the outgoing world’s name. Before loading, the header's world resource is used: parent containers are
|
||||
followed where available, with conventional scenario prefixes/suffixes removed
|
||||
when packed resources hide their parents. Internal `Eden` is displayed as Everon.
|
||||
Unknown custom naming can fall back to the world filename; the selected next-round
|
||||
terrain never replaces the current round's label. Once takeover succeeds, the server and clients
|
||||
receiving the Escape bootstrap also display that mission name and game mode
|
||||
`Escape` in their runtime header. The terrain's scenario ID, world, imagery and
|
||||
Workshop entry stay unchanged; those still identify the terrain scenario used to
|
||||
load the map. Existing authored Escape titles are preserved.
|
||||
|
||||
Presentation is refreshed every half second after confirmation, including when the
|
||||
same header already says `Escape` and its root scene only becomes available later.
|
||||
The native mission-name callback refreshes it too. Repeated refreshes compare
|
||||
world paths as strings: `GetWorldFile()` can return `$Addon:Worlds/...`, and
|
||||
calling `ResourceName.GetPath()` on that path each tick caused repeated zero-GUID
|
||||
resource warnings. GUID prefixes are stripped as text, and parent-resource
|
||||
resolution runs only when the cached terrain input changes.
|
||||
The [native comparison](evidence/terrain-lookup-loop-2026-10-04/report.json)
|
||||
reproduced 80 repeated warnings over 20 seconds before this correction and zero
|
||||
afterward, with the same terrain title and scenario resource. The loading screen refreshes
|
||||
its existing title and description widgets, so copying the header before the Escape bootstrap no
|
||||
longer leaves the original scenario name or instructions on screen. Confirmed takeover reads `m_sDescription` and `m_sDetails` from Escape’s authored `Missions/ERR_Everon.conf`, without copying its world or scenario identity. Details take precedence over the short description, matching native translation and the 1,000-character display limit. It accepts the current header
|
||||
or another copy of that same scenario; other incoming scenarios retain their own
|
||||
titles and descriptions. Loading progress, imagery and hints keep their native lifecycle. The authored Escape text is read once at takeover; resource-load failure leaves the source text intact.
|
||||
|
||||
The [31 October native widget checks](evidence/terrain-mission-text-2026-10-31/native-checks.log) verified that an already-created loading screen changes from terrain details to the authored Escape text, then restores the original text. The isolated Workbench world has no mission header, so the fixture supplies one at the header-read boundary; the resource loader, presentation methods and actual loading layout/component run in the engine. This is not remote multiplayer or initial connection timing acceptance. All focused presentation/takeover/selection/loading regressions passed. The final native run completed with unchanged inputs and confirmed cleanup; the strict runner reports 13 existing world/localization errors plus two empty-image errors from the synthetic header, with no script errors. The text assertions passed; this fixture does not qualify loading imagery. Earlier fixture setup failures are recorded in the evidence directory.
|
||||
|
||||
The original runtime name, game-mode label, description and details are restored on world cleanup, so
|
||||
restarting with takeover disabled cannot inherit Escape labels or instructions. Later text changes by another system are preserved. Clients wait
|
||||
for the actual Escape bootstrap instead of guessing from locally enabled mods.
|
||||
The public server-browser listing can retain the startup terrain after an in-process
|
||||
terrain redirect. A live RKS #2 check on 2026-10-04 confirmed Chernarus was loaded
|
||||
and its runtime title updated, while the browser still showed the initial Nogova
|
||||
scenario. The earlier runtime and loading-title checks did not prove public listing
|
||||
refresh. Starting the server directly with the selected terrain in `game.scenarioId`
|
||||
avoids this initial-terrain redirect; verify the public listing after changing it.
|
||||
See [live browser follow-up](evidence/terrain-live-title-2026-10-04/live-browser-followup.json). The
|
||||
[name-change evidence](evidence/terrain-name-2026-10-02/report.json) records server
|
||||
and client metadata across restart, including the retained respawn-order diagnostic.
|
||||
[Terrain suffix validation](evidence/terrain-browser-suffix-2026-10-02/report.json)
|
||||
checks the real Armenhof callback, Nogova/Everon resolution and title restoration.
|
||||
[Live-title refresh evidence](evidence/terrain-live-title-2026-10-04/report.json)
|
||||
adds native Nogova checks for an already-presented stale title and a stale Everon
|
||||
world header, plus executable loading-widget and late-root regression checks.
|
||||
This later run is headless; it does not visually qualify the loading screen or
|
||||
verify the public backend cache.
|
||||
|
||||
A subsequent [registration investigation](evidence/terrain-registration-2026-10-04/report.json)
|
||||
ran two isolated native experiments. Rehosting with
|
||||
`RequestPublicServerTransition` from gameplay was explicitly rejected as an
|
||||
unsupported transition. Writing a replacement `World` through a cloned header
|
||||
container did not change the engine's selected world. Neither experiment provides
|
||||
a universal registration fix. No supported scenario-registration setter was found
|
||||
in the inspected script interfaces. A portable pre-launch integration remains an
|
||||
external setup option to investigate; it is not implemented here and would not by
|
||||
itself replace the loader scenario's published Workshop metadata.
|
||||
|
||||
|
||||
## Optional overrides
|
||||
|
||||
To keep the original scenario while Escape remains loaded, pass
|
||||
`-errTerrainTakeover 0`, or set the mission-header field
|
||||
`m_bERR_EnableEscape` to `false`, then restart. The CLI override takes precedence;
|
||||
only its exact value `1` enables takeover when explicitly supplied. With no
|
||||
overrides, takeover is enabled.
|
||||
|
||||
Optional airport-centre hints use `-errAirfields "1525 5075"` or the header field
|
||||
`m_sERR_Airfields`. Use X/Z pairs separated by semicolons, up to 16 centres.
|
||||
Hints must be on dry land inside the terrain and do not bypass clearance checks.
|
||||
An explicitly supplied CLI hint takes precedence over the header. Empty hints
|
||||
use automatic discovery and the landing-zone fallback.
|
||||
|
||||
## Validation of the automatic default
|
||||
|
||||
Production-method regressions exercise default activation, editor/authority
|
||||
protection, opt-out precedence, airport discovery and bounded placement. Native
|
||||
Nogova server/client evidence is recorded in
|
||||
[evidence/automatic-terrain-takeover-2026-10-02](evidence/automatic-terrain-takeover-2026-10-02/).
|
||||
The no-flags Nogova test completed two takeovers and two prison phases across a
|
||||
connected restart, with all 16 sites and a supported, fueled helicopter in each
|
||||
round. Client manager checks passed with no client script errors. The evidence
|
||||
report retains server authentication refusals and installed-resource diagnostics;
|
||||
it is not a clean-release verdict. A freshly built package also reached the
|
||||
prison phase on Nogova without flags, loose Escape source, test probes or script
|
||||
errors. Its 351 payload files matched the authored source. Packaging's strict
|
||||
resource/shutdown failures remain recorded separately.
|
||||
Authenticated prisoner spawning, late joining and reconnecting still require a
|
||||
published-build multiplayer check; offline backend-disabled tests cannot prove
|
||||
account admission. Publication and live-server changes remain with the owner.
|
||||
|
||||
## Handover behavior and earlier validation
|
||||
|
||||
- Invalid airport syntax, terrain bounds, navigation or missing bootstrap assets
|
||||
are rejected before the original mode is stopped.
|
||||
- The old mode ends before deletion. Its catalog and data-collector references
|
||||
are released. Once native registrations clear, the replacement is created in
|
||||
the same update, avoiding a period with no mode to create joining players'
|
||||
controllers. A 10-second deadline bounds unexpectedly deferred registrations.
|
||||
- The original radio manager is retained, detached first if its parent is being
|
||||
removed. A missing radio manager is created from the standard game prefab.
|
||||
- The private `Prefabs/ERR/TerrainTakeover.et` triggers client cleanup. It releases
|
||||
only the captured original singleton components, waits for the new factions
|
||||
before catalog/identity initialization, and receives the server's faction
|
||||
delegates. The terrain's native chat service is retained on both peers, detached
|
||||
from any removed entity/replication parent, and never replaced or attached to
|
||||
the new mode. The ordinary authored connector retains its own chat service.
|
||||
If the terrain has no chat service, `TerrainTakeoverWithChat.et` supplies a
|
||||
non-streaming replicated chat child instead. Selection depends on service
|
||||
presence, not terrain name; both variants share the same takeover mode.
|
||||
- Arsenal, group, support-station and task managers release the original mode's
|
||||
cached instances on both peers. Task, map-marker and respawn getters resolve
|
||||
the current takeover mode even if an old destructor clears a shared cache.
|
||||
- Faction delegates use a paired serialization prefix to bind their faction
|
||||
before the base deserializer reads faction data. Both peers must load the same
|
||||
Escape build, including when using an ordinary authored Escape scenario.
|
||||
- Old faction delegates are removed explicitly because vanilla creates them as
|
||||
standalone entities. The new mode, managers and delegates are linked in the
|
||||
replication hierarchy so delegates cannot arrive before their prerequisites.
|
||||
- Native player admission events received during handover are held and replayed
|
||||
only for the same connected controller and account. No backend identity or
|
||||
authentication event is fabricated. Disconnect and world cleanup clear the queue.
|
||||
- Existing controllers resolve spawn handlers on the replacement Escape mode.
|
||||
- World cleanup clears the handover state and configured centres. Local native
|
||||
restart has passed in Workbench, on an empty Linux dedicated server, and with
|
||||
a separate connected Windows client. The connected test recreates the player's
|
||||
controller and verifies the replacement managers in both rounds.
|
||||
|
||||
On 14 October, the original Everon client log showed delayed removal of the
|
||||
original `ScriptedChatEntity` after the replacement registered, followed by
|
||||
`Cannot send message - ChatEntity is missing.` This blocked native chat commands,
|
||||
including administrator login, before authentication. `test_terrain_chat_retention.py`
|
||||
checks shared-service retention, nested parent detachment and fallback selection.
|
||||
The revised scripts compiled in Workbench; the authored-world native restart
|
||||
smoke completed two rounds and 21 assertions with no script/runtime failures.
|
||||
That run still reported existing engine/dependency errors, and the full repository
|
||||
check stopped on the existing missing root ID in `ERRM_AtlasLeaf.et`.
|
||||
Live remote login and takeover of both chat variants remain separate verification
|
||||
steps; the authored-world smoke does not exercise those paths.
|
||||
|
||||
The earlier isolated prototype passed a Nogova Workbench prisoner-spawn test with
|
||||
16 generated sites and zero script errors. See
|
||||
[prototype evidence](evidence/scenario-takeover-2026-10-01/report.json). The current
|
||||
feature has additional configuration, readiness and admission checks. It passed
|
||||
native offline spawning and an actual scenario restart: two prisoner spawns,
|
||||
16 sites per round, zero script errors, and all handover state cleared between
|
||||
rounds. Invalid configuration was also rejected before stopping the original mode.
|
||||
Repository checks passed. See the
|
||||
[feature test report](evidence/terrain-takeover-feature-2026-10-01/report.json).
|
||||
|
||||
Earlier opt-in builds required enable flags and airport hints. The following
|
||||
results describe those builds, before the automatic default and landing-zone fallback.
|
||||
|
||||
The command-line listen-server route did not apply either custom mission-header
|
||||
overrides or the standard `m_eSaveTypes` override. Its diagnostic read the original
|
||||
defaults and left Nogova's mode running. Consequently the example server JSON
|
||||
used in those tests still needs testing through the actual dedicated-server route. A read-only
|
||||
copy of the RKS 2 engine executables was subsequently authorized and completed.
|
||||
The dedicated JSON route could not complete addon/backend initialization with
|
||||
external networking disabled. The explicit CLI route did load Nogova, generate
|
||||
16 sites and reach the prison phase with zero script errors on the Linux server.
|
||||
The dedicated server also passed an actual scenario restart, cleared the takeover
|
||||
state and reached the prison phase again, with zero script errors. Both dedicated
|
||||
checks used an empty server.
|
||||
|
||||
Subsequent tests used the final takeover files on the same frozen core baseline,
|
||||
with a real Windows client joining the isolated Linux server through a localhost
|
||||
relay. Client manager replication, catalog/identity faction references and radio
|
||||
retention passed. A real scenario restart cleared both peers' takeover state,
|
||||
recreated the client's controller and reached the prison phase again. No client
|
||||
script errors occurred. The backend-disabled server correctly withheld soldier
|
||||
spawning for missing account identity, so these checks do **not** prove
|
||||
authenticated prisoner spawning. Native delayed-unregistration diagnostics and
|
||||
existing resource errors remain in the raw logs. No RKS 2 configuration or
|
||||
running process was changed.
|
||||
|
||||
A separate disconnect/reconnect test passed with two successive client launches
|
||||
against the same server and no client script errors. That run preceded the final
|
||||
replication-hierarchy change; the final hierarchy was then tested through a fresh
|
||||
client join and a connected restart. Radio preservation when attached to the old
|
||||
mode, and creation when missing, passed separate authority-only fixtures. These
|
||||
fixtures change the loaded test world in memory, not the terrain's source files.
|
||||
|
||||
The separate Nogova connector and authored integration remain available in
|
||||
[the existing integration instructions](terrain-adapters.md). Do not delete them
|
||||
from a deployment that still selects their mission header.
|
||||
+127
@@ -0,0 +1,127 @@
|
||||
"""Execute loading presentation/cleanup and native observation bodies with UI adapters.
|
||||
No native layout rendering, multiplayer, or real startup-failure claim.
|
||||
"""
|
||||
from policy_harness import ROOT, body, run
|
||||
SOURCE=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_PreparationStatus.c'
|
||||
def cpp(s):
|
||||
s=s.replace('protected ','').replace('override ','').replace('null','nullptr')
|
||||
s=s.replace('ERR_GameMode mode = ERR_GameMode.Get();','ERR_GameMode* mode = ERR_GameMode::Get();')
|
||||
s=s.replace('ERR_GameMode current = ERR_GameMode::Get();','ERR_GameMode* current = ERR_GameMode::Get();')
|
||||
s=s.replace('ERR_GameMode current = ERR_GameMode.Get();','ERR_GameMode* current = ERR_GameMode::Get();')
|
||||
s=s.replace('current.Phase()', 'current->Phase()')
|
||||
s=s.replace('ERR_GameMode mode,','ERR_GameMode* mode,')
|
||||
s=s.replace('ERR_GameMode mode)', 'ERR_GameMode* mode)')
|
||||
for name in ['System','ERR_GameMode','ERR_Phase','ERR_ObjectiveText','ERR_MissionRules','ERR_PreparationFailureMenu']:s=s.replace(name+'.',name+'::')
|
||||
s=s.replace('TextWidget.Cast(','CastText(').replace('Widget widget)', 'Widget* widget)').replace('widget.', 'widget->')
|
||||
for name in ['mode','m_wLoadingPlaceholder','m_ERRPreparationSpinner','m_ERRPreparationRoot','m_ERRPreparationTitle','m_ERRPreparationDescription']:
|
||||
s=s.replace(name+'.',name+'->')
|
||||
s=s.replace('GetGame().','GetGame()->').replace('GetWorkspace().','GetWorkspace()->').replace('.IsEmpty()','.empty()')
|
||||
return s.replace('super.','Native::')
|
||||
methods='\n'.join(cpp(body(SOURCE,key)) for key in ('void ERR_KeepSpawnSceneLoading(', 'void ERR_ShowSpawnSceneLoading(', 'protected string ERR_PreparationDescription(', 'protected void ERR_ClearPreparationStatus(', 'override void UpdateLoadingPlaceholder(', 'override void DestroyLoadingPlaceholder(', 'protected bool ERR_PreparationWidgetVisible(', 'bool ERR_ProbePreparationVisible('))
|
||||
run(r'''
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <map>
|
||||
using string=std::string;
|
||||
namespace System{bool console=false;bool IsConsoleApp(){return console;}}
|
||||
namespace ERR_Phase{enum{PREPARING,PRISON,RADIO_SEARCH,RADIO_DEFENCE,EXTRACTION,VICTORY,DEFEAT};}
|
||||
namespace ERR_MissionRules{bool Terminal(int p){return p==ERR_Phase::VICTORY||p==ERR_Phase::DEFEAT;}}
|
||||
struct ERR_GameMode{static ERR_GameMode* current;int phase=ERR_Phase::PREPARING;string error;static ERR_GameMode* Get(){return current;}int Phase(){return phase;}bool Active(){return phase>=ERR_Phase::PRISON&&phase<=ERR_Phase::EXTRACTION;}string PreparationError(){return error;}};ERR_GameMode* ERR_GameMode::current=nullptr;
|
||||
namespace ERR_PreparationFailureMenu{bool shown=false;bool Show(ERR_GameMode*){return shown;}bool Visible(ERR_GameMode*){return shown;}};
|
||||
namespace ERR_ObjectiveText{string Description(ERR_GameMode* mode,bool){return mode->error.empty()?"Preparing sites":"Mission failed; ask an administrator to correct and restart";}}
|
||||
struct Widget{Widget* parent=nullptr;bool visible=true,removed=false,textWidget=false;string text;int textWrites=0,visibilityWrites=0;float width=900,height=170;std::map<string,Widget*> children;
|
||||
void GetScreenSize(float& w,float& h){w=width;h=height;}Widget* GetParent(){return parent;}void RemoveFromHierarchy(){removed=true;parent=nullptr;}void SetVisible(bool value){visible=value;visibilityWrites++;}bool IsVisible(){return visible;}
|
||||
Widget* FindAnyWidget(string name){return children.count(name)?children[name]:nullptr;}void SetText(string value){text=value;textWrites++;}string GetText(){return text;}};
|
||||
Widget* CastText(Widget* w){return w&&w->textWidget?w:nullptr;}
|
||||
struct Workspace{int creates=0;bool fail=false,missingText=false;Widget* CreateWidgets(const char*,Widget* parent){creates++;if(fail)return nullptr;auto root=new Widget;root->parent=parent;for(string name:{"ERR_PreparationTitle","ERR_PreparationDescription"}){auto child=new Widget;child->parent=root;child->textWidget=true;root->children[name]=child;}if(missingText)root->children.erase("ERR_PreparationTitle");return root;}};
|
||||
struct Game{Workspace workspace;Workspace* GetWorkspace(){return &workspace;}};Game game;Game* GetGame(){return &game;}
|
||||
struct Native{Widget* m_wLoadingPlaceholder=nullptr;ERR_GameMode* m_pGameMode=nullptr;int nativeUpdates=0,destroys=0;void CreateLoadingPlaceholder(){m_wLoadingPlaceholder=new Widget;}void UpdateLoadingPlaceholder(float){nativeUpdates++;}void DestroyLoadingPlaceholder(){destroys++;if(m_wLoadingPlaceholder)m_wLoadingPlaceholder->RemoveFromHierarchy();m_wLoadingPlaceholder=nullptr;}};
|
||||
struct Probe:Native{
|
||||
Widget *m_ERRPreparationParent=nullptr,*m_ERRPreparationRoot=nullptr,*m_ERRPreparationTitle=nullptr,*m_ERRPreparationDescription=nullptr,*m_ERRPreparationSpinner=nullptr;
|
||||
bool m_ERRKeepSpawnSceneLoading=false,m_ERRPreparationSpinnerHidden=false,m_ERRPreparationSpinnerWasVisible=false;string m_ERRPreparationLastTitle,m_ERRPreparationLastDescription;
|
||||
'''+methods+r'''
|
||||
};
|
||||
struct Fixture{ERR_GameMode mode;Widget parent,spinner;Probe p;Fixture(){game.workspace={};System::console=false;ERR_PreparationFailureMenu::shown=false;ERR_GameMode::current=&mode;p.m_pGameMode=&mode;p.m_wLoadingPlaceholder=&parent;parent.children["Spinner"]=&spinner;spinner.parent=&parent;}};
|
||||
int main(){
|
||||
{Fixture f;f.mode.error="bad";ERR_PreparationFailureMenu::shown=true;f.p.UpdateLoadingPlaceholder(.1f);assert(!f.parent.visible&&f.p.ERR_ProbePreparationVisible(&f.mode,true));}
|
||||
{Fixture f;f.mode.phase=ERR_Phase::PRISON;f.p.ERR_ShowSpawnSceneLoading();auto root=f.p.m_ERRPreparationRoot;f.p.ERR_KeepSpawnSceneLoading(true);f.p.DestroyLoadingPlaceholder();assert(!root->removed&&!f.parent.removed&&f.p.destroys==0);f.p.ERR_KeepSpawnSceneLoading(false);f.p.DestroyLoadingPlaceholder();assert(root->removed&&f.p.destroys==1);f.p.ERR_ShowSpawnSceneLoading();assert(f.p.m_wLoadingPlaceholder&&f.p.ERR_ProbePreparationVisible(&f.mode,false));}
|
||||
{Fixture f;f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.nativeUpdates==1&&game.workspace.creates==1&&f.p.ERR_ProbePreparationVisible(&f.mode,false));
|
||||
Widget* root=f.p.m_ERRPreparationRoot;auto title=f.p.m_ERRPreparationTitle;auto description=f.p.m_ERRPreparationDescription;
|
||||
for(int i=0;i<200;i++){f.p.UpdateLoadingPlaceholder(.1f);}assert(game.workspace.creates==1&&title->textWrites==1&&description->textWrites==1);
|
||||
f.mode.error="invalid catalog";f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.ERR_ProbePreparationVisible(&f.mode,true)&&!f.spinner.visible);
|
||||
for(int i=0;i<200;i++){f.p.UpdateLoadingPlaceholder(.1f);}assert(f.p.m_ERRPreparationRoot==root&&title->textWrites==2&&description->textWrites==2&&f.spinner.visibilityWrites==1);
|
||||
title->width=0;assert(!f.p.ERR_ProbePreparationVisible(&f.mode,true));title->width=900;f.mode.error.clear();f.p.UpdateLoadingPlaceholder(.1f);assert(f.spinner.visible&&f.p.ERR_ProbePreparationVisible(&f.mode,false));
|
||||
f.mode.phase=ERR_Phase::PRISON;f.p.UpdateLoadingPlaceholder(.1f);assert(!root->removed&&!f.parent.removed&&f.spinner.visible&&f.p.ERR_ProbePreparationVisible(&f.mode,false));
|
||||
assert(description->text=="Please wait while your spawn area and equipment finish loading. You will take control when preparation is complete.");
|
||||
for(int phase=ERR_Phase::PRISON;phase<=ERR_Phase::EXTRACTION;phase++){f.mode.phase=phase;for(int i=0;i<200;i++)f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.m_ERRPreparationRoot==root&&f.p.ERR_ProbePreparationVisible(&f.mode,false));}
|
||||
f.mode.phase=ERR_Phase::VICTORY;f.p.UpdateLoadingPlaceholder(.1f);assert(root->removed&&f.parent.removed&&f.spinner.visible&&!f.p.m_ERRPreparationRoot&&f.p.destroys==1);
|
||||
}
|
||||
for(int phase : {ERR_Phase::VICTORY,ERR_Phase::DEFEAT}){Fixture f;f.p.UpdateLoadingPlaceholder(.1f);f.p.ERR_KeepSpawnSceneLoading(true);f.mode.phase=phase;f.p.UpdateLoadingPlaceholder(.1f);assert(f.parent.removed&&!f.p.m_ERRKeepSpawnSceneLoading&&f.p.destroys==1);}
|
||||
{Fixture f;f.p.ERR_KeepSpawnSceneLoading(true);ERR_GameMode replacement;ERR_GameMode::current=&replacement;f.p.DestroyLoadingPlaceholder();assert(f.parent.removed&&f.p.destroys==1);}
|
||||
{Fixture f;f.p.ERR_KeepSpawnSceneLoading(true);ERR_GameMode::current=nullptr;f.p.DestroyLoadingPlaceholder();assert(f.parent.removed&&f.p.destroys==1);}
|
||||
for(int mismatch=0;mismatch<6;mismatch++){Fixture f;ERR_GameMode other;if(mismatch==0)ERR_GameMode::current=nullptr;if(mismatch==1)f.p.m_pGameMode=&other;if(mismatch==2)f.mode.phase=-1;if(mismatch==3)System::console=true;if(mismatch==4)f.p.m_wLoadingPlaceholder=nullptr;if(mismatch==5)f.p.m_pGameMode=nullptr;f.p.UpdateLoadingPlaceholder(.1f);assert(game.workspace.creates==0&&f.p.nativeUpdates==1&&!f.parent.removed&&f.spinner.visibilityWrites==0);}
|
||||
{Fixture f;f.mode.phase=ERR_Phase::PRISON;f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.ERR_ProbePreparationVisible(&f.mode,false));Widget* root=f.p.m_ERRPreparationRoot;f.p.DestroyLoadingPlaceholder();assert(root->removed&&f.parent.removed&&!f.p.m_ERRPreparationRoot&&f.p.destroys==1);f.p.UpdateLoadingPlaceholder(.1f);assert(game.workspace.creates==1);}
|
||||
{Fixture f;f.mode.error="bad";f.spinner.visible=false;f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.ERR_ProbePreparationVisible(&f.mode,true));f.p.ERR_ClearPreparationStatus();assert(!f.spinner.visible);}
|
||||
{Fixture f;f.mode.error="bad";f.p.UpdateLoadingPlaceholder(.1f);Widget* old=f.p.m_ERRPreparationRoot;Widget newParent,newSpinner;newParent.children["Spinner"]=&newSpinner;newSpinner.parent=&newParent;f.p.m_wLoadingPlaceholder=&newParent;f.p.UpdateLoadingPlaceholder(.1f);assert(old->removed&&f.spinner.visible&&!newSpinner.visible&&f.p.m_ERRPreparationParent==&newParent&&game.workspace.creates==2);f.p.DestroyLoadingPlaceholder();assert(newParent.removed&&!f.parent.removed&&newSpinner.visible&&!f.p.m_ERRPreparationRoot&&f.p.destroys==1);}
|
||||
{Fixture f;f.mode.error="bad";f.p.UpdateLoadingPlaceholder(.1f);f.p.m_ERRPreparationParent=nullptr;f.p.m_ERRPreparationRoot=nullptr;f.p.m_ERRPreparationTitle=nullptr;f.p.m_ERRPreparationDescription=nullptr;f.p.m_ERRPreparationSpinner=nullptr;f.p.m_wLoadingPlaceholder=nullptr;f.p.UpdateLoadingPlaceholder(.1f);assert(!f.p.m_ERRPreparationSpinnerHidden);}
|
||||
{Fixture f;game.workspace.fail=true;f.p.UpdateLoadingPlaceholder(.1f);assert(!f.p.m_ERRPreparationRoot&&f.spinner.visibilityWrites==0);game.workspace.fail=false;f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.ERR_ProbePreparationVisible(&f.mode,false));}
|
||||
{Fixture f;game.workspace.missingText=true;f.p.UpdateLoadingPlaceholder(.1f);assert(!f.p.m_ERRPreparationRoot&&f.spinner.visibilityWrites==0);}
|
||||
{Fixture f;f.p.UpdateLoadingPlaceholder(.1f);Widget other;Widget* moved=f.p.m_ERRPreparationRoot;moved->parent=&other;f.p.UpdateLoadingPlaceholder(.1f);assert(moved->removed&&f.p.m_ERRPreparationRoot!=moved&&f.p.m_ERRPreparationParent==&f.parent);}
|
||||
}
|
||||
''')
|
||||
probe=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_NativePreparationStatusProbe.c'
|
||||
s=body(probe,'static int Tick(').replace('ERR_GameMode mode,','ERR_GameMode* mode,').replace('ERR_GameMode.Get()','ERR_GameMode::Get()').replace('ERR_Phase.PREPARING','PREPARING').replace('mode.','mode->').replace('.IsEmpty()','.empty()').replace('SCR_RespawnSystemComponent respawn','SCR_RespawnSystemComponent* respawn').replace('SCR_RespawnSystemComponent.GetInstance()','SCR_RespawnSystemComponent::GetInstance()').replace('respawn.','respawn->').replace('System.MakeScreenshot','System::MakeScreenshot')
|
||||
run(r'''
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
using string=std::string;const int PREPARING=0;
|
||||
struct ERR_GameMode{static ERR_GameMode* current;int phase=0;string error="bad";static ERR_GameMode* Get(){return current;}int Phase(){return phase;}string PreparationError(){return error;}};ERR_GameMode* ERR_GameMode::current=nullptr;
|
||||
struct SCR_RespawnSystemComponent{bool visible=true;static SCR_RespawnSystemComponent instance;static SCR_RespawnSystemComponent* GetInstance(){return &instance;}bool ERR_ProbePreparationVisible(ERR_GameMode*,bool failed){assert(failed);return visible;}};SCR_RespawnSystemComponent SCR_RespawnSystemComponent::instance;
|
||||
namespace System{int captures=0;void MakeScreenshot(const char*){captures++;}}void Print(const char*){}
|
||||
struct Probe{static ERR_GameMode* s_Mode;static float s_Deadline,s_Since,s_Last,s_CaptureAt;
|
||||
'''+s+r'''
|
||||
};ERR_GameMode* Probe::s_Mode=nullptr;float Probe::s_Deadline=0,Probe::s_Since=-1,Probe::s_Last=-1,Probe::s_CaptureAt=-1;
|
||||
int main(){ERR_GameMode mode;ERR_GameMode::current=&mode;
|
||||
for(int i=0;i<=33;i++){assert(Probe::Tick(&mode,i*500)==0);}assert(System::captures==0);assert(Probe::Tick(&mode,17000)==0&&System::captures==1);assert(Probe::Tick(&mode,17500)==1&&System::captures==1);
|
||||
ERR_GameMode next;ERR_GameMode::current=&next;assert(Probe::Tick(&next,20000)==0);assert(Probe::Tick(&next,22000)==0&&Probe::s_Since==22000);SCR_RespawnSystemComponent::instance.visible=false;assert(Probe::Tick(&next,22500)==0&&Probe::s_Since==-1);assert(Probe::Tick(&next,50000)==-1);
|
||||
}
|
||||
''')
|
||||
text=SOURCE.read_text()
|
||||
prefab=(ROOT/'addons/core/Prefabs/ERR/GameMode.et').read_text()
|
||||
assert 'm_bUseSpawnPreload 1' in prefab and 'm_bUseSpawnPreload 0' not in prefab
|
||||
assert 'GetOwner(' not in text
|
||||
assert text.count('m_pGameMode != mode') == 3
|
||||
# m_pGameMode is the installed vanilla protected owner field, assigned by
|
||||
# SCR_RespawnSystemComponent.OnInit(IEntity owner). The adapter deliberately
|
||||
# exposes that field rather than inventing a ScriptComponent.GetOwner API.
|
||||
for forbidden in ('CallLater(', 'SetCamera(', 'SpawnEntity', 'SetControlledEntity(', 'Transition(', 'PreparationError() ='):
|
||||
assert forbidden not in text,forbidden
|
||||
native=probe.read_text()
|
||||
for forbidden in ('CreateWidgets(', 'UpdateLoadingPlaceholder(', 'SetText(', 'SetVisible('):assert forbidden not in native
|
||||
base=(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_NativeBaseSmoke.c').read_text()
|
||||
assert 'ERR_NativePreparationStatusProbe.Tick(this, now)' in base
|
||||
assert 'native-end-active' in base and 'native-end-preparing' in base
|
||||
print('PASS: actual preparation status scope, persistent updates, spinner restoration, placeholder replacement/deletion/destruction, native observation persistence/timeout; rendering remains native-pending')
|
||||
|
||||
# Execute the production world-system rebind that restores frame delivery.
|
||||
source=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverManagers.c'
|
||||
bind=body(source,'void ERR_BindEscapeRespawn(').replace('SCR_RespawnSystemComponent respawn','Respawn* respawn').replace('ERR_GameMode mode = ERR_GameMode.Get();','Mode* mode = Mode::current;').replace('SCR_RespawnSystemComponent.Cast(mode.FindComponent(SCR_RespawnSystemComponent))','mode->respawn')
|
||||
run(r"""
|
||||
#include <cassert>
|
||||
struct Respawn{int frames=0;};struct Mode{inline static Mode* current=nullptr;Respawn* respawn=nullptr;};void Print(const char*){}
|
||||
struct System{Respawn* m_RespawnSystem=nullptr;bool m_bReady=true,enabled=false;int enables=0;void Enable(bool value){enabled=value;enables++;}
|
||||
"""+bind+r"""
|
||||
void Frame(){if(enabled&&m_RespawnSystem)m_RespawnSystem->frames++;}
|
||||
};
|
||||
int main(){System system;Mode mode;Respawn original,replacement,unrelated;Mode::current=&mode;mode.respawn=&replacement;system.m_RespawnSystem=&original;
|
||||
system.ERR_BindEscapeRespawn(&unrelated);assert(system.enables==0&&system.m_RespawnSystem==&original);
|
||||
system.ERR_BindEscapeRespawn(nullptr);assert(system.enables==0);
|
||||
system.ERR_BindEscapeRespawn(&replacement);assert(system.enabled&&!system.m_bReady&&system.m_RespawnSystem==&replacement);system.Frame();assert(replacement.frames==1&&original.frames==0);
|
||||
system.m_bReady=true;system.ERR_BindEscapeRespawn(&replacement);assert(system.m_bReady); // Idempotent: keep current deploy readiness.
|
||||
Mode::current=nullptr;system.ERR_BindEscapeRespawn(&original);assert(system.m_RespawnSystem==&replacement);
|
||||
}
|
||||
""")
|
||||
create=body(SOURCE,'protected override void CreateLoadingPlaceholder(')
|
||||
assert create.index('super.CreateLoadingPlaceholder()') < create.index('ERR_BindEscapeRespawn(this)')
|
||||
assert 'm_fAutoReloadTime 10' in prefab
|
||||
print('PASS: replaced respawn system receives frame updates, disabled updater wakes, stale/non-Escape binding refused; terminal and stale preload leases release black overlay')
|
||||
@@ -0,0 +1,370 @@
|
||||
# Automatic Escape on added terrains
|
||||
|
||||
For a universal starting scenario, select **Co10 Escape Reintroduced — Automatic
|
||||
terrain** from this mod:
|
||||
|
||||
```text
|
||||
{C1E20667DCE324ED}Missions/ERR_Everon.conf
|
||||
```
|
||||
|
||||
This is the existing full Escape scenario with its original resource ID and path,
|
||||
now named for its role as the universal launcher. Existing server configurations
|
||||
using that ID continue to work. The duplicate Base diagnostic header is no longer
|
||||
shipped. Servers using its retired `{AD62322D5213C440}` ID must select the main
|
||||
entry above; the diagnostic tools already use it. It starts on Everon when no terrain override is
|
||||
saved, so administrators can always reach the Escape menu. Add the desired terrain
|
||||
to the server's mods, select one of its scenarios in **Terrains**, save, and restart.
|
||||
The existing saved selection loads that map and Escape creates its mission there.
|
||||
No AMP-specific settings, external startup helper, connector addon or changes by
|
||||
the terrain author are needed.
|
||||
|
||||
The published scenario name and description now identify Escape itself. After a
|
||||
terrain switch the public browser can retain **Automatic terrain**; this entry
|
||||
intentionally does not name a map that may no longer be running. It is not a fix
|
||||
for dynamic backend metadata refresh. The runtime title on a taken-over terrain
|
||||
still follows the loaded map. Server owners currently starting with a terrain's
|
||||
Exploration/Game Master scenario must select the Escape entry once to use this
|
||||
registration identity. An addon update cannot change that choice for them.
|
||||
|
||||
[Launcher validation](evidence/automatic-launcher-2026-10-04/report.json) reached
|
||||
the prison phase both on default Everon and after following a saved Nogova
|
||||
selection. The native title callback returned the terrain-neutral launcher name
|
||||
before switching. These private tests used no backend; public listing and
|
||||
Workshop metadata still need verification after publication.
|
||||
|
||||
The original direct-terrain route remains supported: add Escape and a terrain,
|
||||
then select an existing scenario supplied by that terrain. For Nogova that is:
|
||||
|
||||
```text
|
||||
{469880DFE1B48F95}Missions/Nogova_TerrainTest.conf
|
||||
```
|
||||
|
||||
In a standard server configuration, the selected entry is `game.scenarioId`.
|
||||
Select a mission header (`Missions/*.conf`), not the terrain's world resource.
|
||||
Installing multiple terrains does not choose one automatically. With no saved
|
||||
selection, the server's configured scenario remains the default; only the
|
||||
Automatic terrain entry defaults to Everon. Workshop 0.0.45 predates automatic
|
||||
takeover. Publish the updated Escape core to expose the new launcher name and
|
||||
description; the mission resource ID is unchanged.
|
||||
|
||||
Before publishing the updated core, reopen/rescan the project in Workbench so
|
||||
`Prefabs/ERR/TerrainTakeover.et` and its metadata enter the resource index. An old
|
||||
cache can include the script but still fail to register the replicated prefab.
|
||||
This is a publishing check, not a server-admin setup requirement.
|
||||
|
||||
## In-game terrain selection
|
||||
|
||||
Game Master keeps Reforger's normal administrator permissions after takeover.
|
||||
Escape transfers the editor core's player registration, disconnect, spawn,
|
||||
death, deletion and role-change listeners from the original game mode to the
|
||||
replacement before replaying admissions. Without this transfer, an admin on an
|
||||
exploration scenario could have a disabled Game Master button because the editor
|
||||
still listened to the removed mode. The transfer retains existing editor managers
|
||||
and does not grant Game Master to ordinary players.
|
||||
After replaying admissions, Escape also checks already-connected players, creates only missing editor managers, and reapplies native role-derived modes. This covers registration that happened before the new game mode attached its listeners. The repair now waits for a valid, distinct controller replication identity (a dedicated server’s temporary local identity is not a player). Editor creation is idempotent during takeover, so the subsequent native registration event reuses the manager instead of registering it twice. Missing managers are retried up to 80 times at 250 ms intervals; retries touch only missing editors and are cancelled at detach/world shutdown. A later registration may start another repair window. The pause menu refreshes the Game Master button from native editor availability: vanilla can leave it disabled when an administrator's mode arrives while the menu is already open. These repairs do not assign administrator roles or preserve a login that the server revoked during restart.
|
||||
|
||||
The native loading-screen updater also follows the replacement respawn manager. This keeps the spinner and mission-preparation text updating after takeover, including when the original scenario disabled its deploy-menu updater. A pending spawn-loading overlay releases on victory/defeat and cannot hold the result screen underneath it.
|
||||
|
||||
Escape's default end-of-round reload delay is 120 seconds. The native server `-autoreload` override still applies, including disabling automatic reload. Terrain loading and procedural preparation happen after that delay and can take substantially longer on large islands.
|
||||
|
||||
|
||||
The [editor handover check](evidence/terrain-editor-2026-10-03/report.json)
|
||||
passed five native Nogova checks and the focused regression tests. It exercises
|
||||
event delivery on a playerless server; a connected administrator clicking the
|
||||
pause-menu button remains an in-game verification step.
|
||||
|
||||
Open the Escape administration menu and choose **Terrains**. Select a scenario
|
||||
and press **Save terrain**. Saving leaves the current round running; the saved
|
||||
scenario takes effect after a normal mission restart or a full server restart.
|
||||
Changing terrain disconnects connected players without a ban: **rejoin after the
|
||||
new map has loaded**. Reforger otherwise makes connected clients reload the old
|
||||
world while the server loads the new one. Restarting on the same terrain does
|
||||
not use this extra disconnect.
|
||||
|
||||
The list is discovered on the server from enabled mods' scenario catalog and
|
||||
mounted `Missions/*.conf` resources. It lists scenario entry points, so an island
|
||||
can appear several times. Prefer an exploration or Escape scenario; discovery
|
||||
alone does not certify its navigation or compatibility. The selector does not
|
||||
download or enable additional mods. Add the terrain to the server first.
|
||||
|
||||
**Use server default**, then **Save terrain**, removes the override. With no
|
||||
selection, Escape continues using the server's configured scenario, including
|
||||
Nogova; its administration menu remains available after takeover. For a fresh
|
||||
server, select **Co10 Escape Reintroduced — Automatic terrain** as the initial entry point:
|
||||
|
||||
```text
|
||||
{C1E20667DCE324ED}Missions/ERR_Everon.conf
|
||||
```
|
||||
|
||||
The server still needs a valid initial scenario to start the engine. A script
|
||||
cannot provide a menu if startup fails before a world loads. Forcing Everon on
|
||||
all unconfigured servers would also replace an administrator's valid existing
|
||||
terrain selection unnecessarily.
|
||||
|
||||
The override is stored as `terrain.scenario` in `$profile:Escapists.json`
|
||||
(with a shared `.bak` backup).
|
||||
Only authenticated administrators can save a discovered scenario. A removed or
|
||||
unavailable saved scenario falls back to the configured server scenario and
|
||||
shows a warning. Corrupt preferences are preserved for inspection; removing or
|
||||
repairing the `terrain` section, then restarting, restores editing. See
|
||||
[unified configuration](configuration.md#one-server-configuration) for migration
|
||||
and backup recovery; do not remove the whole file just to clear a terrain choice. Startup
|
||||
redirects are bounded and do not repeatedly reload an unreachable destination.
|
||||
|
||||
[Native test evidence](evidence/terrain-selection-2026-10-02/report.json) covers
|
||||
discovery, save authorization, persistence, restart, disconnect and rejoin on
|
||||
Everon. The menu screenshot uses a labeled offline presentation fixture.
|
||||
|
||||
## Placement and requirements
|
||||
|
||||
Escape surveys clear helicopter landing zones across the entire terrain from the
|
||||
first candidate, whether airports exist or not. There is no airport-first search
|
||||
or dedicated airport-discovery wait. Every candidate still passes terrain,
|
||||
navigation, slope, aircraft-clearance and rescue-fleet space checks. Searches
|
||||
have finite time and attempt budgets and never fall back to coordinates from
|
||||
another map.
|
||||
|
||||
Terrain-generated placement allows up to 48,000 candidates or 120 seconds per
|
||||
site, whichever comes first, keeping the existing cooperative 8 ms work slices.
|
||||
|
||||
Extraction pads do not use the camp-only 12 m road exclusion, and their initial
|
||||
ground survey uses the same 0.8 m height variation limit as the landing-zone
|
||||
survey. Camp footprints retain their 0.6 m limit and road exclusion. Aircraft
|
||||
clearance is tested at the centre's actual terrain height, matching pickup
|
||||
registration, rather than the lowest point sampled across the camp grid.
|
||||
Water, physical obstacles, guard/patrol ground and navigation, the 28 m landing
|
||||
footprint, overhead clearance and additional transport-pad checks still apply.
|
||||
|
||||
Dry ground is determined from the terrain's actual water surface, not a fixed
|
||||
world-altitude minimum. Site clearance queries water at every sampled terrain
|
||||
height instead of testing placeholder candidate heights. Dry terrain below
|
||||
one metre (including negative map elevations) can qualify; submerged terrain,
|
||||
invalid heights, excessive slopes and physical obstructions remain rejected.
|
||||
Site creation, character spawn slots, airfield pads and mortar setup use the
|
||||
same terrain-height water check, without the 10 cm character spawn lift.
|
||||
|
||||
On terrain-generated maps, prison-to-airport separation is 15% of the shorter
|
||||
world axis, clamped to 200–1,500 m (300 m on a 2 km map). This changes tactical
|
||||
spacing, not the physical footprint or slope allowance. Original authored Everon
|
||||
placement retains its 1,500 m airport buffer and existing search/fallback rules.
|
||||
Maps without sufficient clear ground or a working Soldiers navigation mesh can
|
||||
still fail preparation. See [placement validation](evidence/small-terrain-placement-2026-10-24/README.md).
|
||||
|
||||
Search diagnostics use the `Reintroduced [placement search]` log prefix. Each
|
||||
summary identifies the site, attempts and elapsed milliseconds, with counts for
|
||||
failed or deferred checks: water, uneven ground, obstacles, road/airport distance,
|
||||
site spacing, navigation and aircraft clearance. Summaries appear on completion,
|
||||
exhaustion, plus every 30 seconds during a long search.
|
||||
Counts describe checks rather than unique candidates: a candidate awaiting a
|
||||
navigation tile can be checked repeatedly. Mandatory placement failures also
|
||||
include the site and rejection summary directly on the loading screen, so no
|
||||
chat command is needed. The same detail remains available in mission status.
|
||||
|
||||
On startup failure, a local `ChimeraMenuBase` error menu provides **Return to
|
||||
main menu** and **Pause menu (Esc / Back)**. The loading placeholder is hidden
|
||||
while an interactive menu or dialog is available, so it cannot cover native
|
||||
pause/exit controls. Existing menus keep focus; ordinary preparation retains its
|
||||
loading overlay. Returning uses the native local gameplay-end transition and
|
||||
does not admit players or change the failed mission state. If the custom menu
|
||||
cannot open, the native pause menu is the fallback.
|
||||
|
||||
The selected scenario must supply `SCR_BaseGameMode`, a usable `Soldiers` navmesh,
|
||||
world bounds spanning 1–100 km on both axes, and enough clear navigable ground.
|
||||
Navigation remains the terrain author's responsibility. A plain exploration
|
||||
scenario is the recommended starting point. Arbitrary scripted scenarios can
|
||||
retain their own tasks and entities; saved campaigns and every third-party game
|
||||
mode are not qualified. Escape disables further saving when taking over; it does
|
||||
not delete existing saves. Existing authored Escape scenarios and editor worlds
|
||||
are left on their normal startup path.
|
||||
|
||||
## Displayed mission name and text
|
||||
|
||||
Automatic takeover reports **Co10 Escape Reintroduced - <terrain>** through the
|
||||
native server mission-name callback, for example **Co10 Escape Reintroduced -
|
||||
Armenhof**. Once takeover is confirmed, the running world and its root scene supply the terrain
|
||||
name, even if the source header still refers to the original island. Before confirmation,
|
||||
an incoming header cannot pick up the outgoing world’s name. Before loading, the header's world resource is used: parent containers are
|
||||
followed where available, with conventional scenario prefixes/suffixes removed
|
||||
when packed resources hide their parents. Internal `Eden` is displayed as Everon.
|
||||
Unknown custom naming can fall back to the world filename; the selected next-round
|
||||
terrain never replaces the current round's label. Once takeover succeeds, the server and clients
|
||||
receiving the Escape bootstrap also display that mission name and game mode
|
||||
`Escape` in their runtime header. The terrain's scenario ID, world, imagery and
|
||||
Workshop entry stay unchanged; those still identify the terrain scenario used to
|
||||
load the map. Existing authored Escape titles are preserved.
|
||||
|
||||
Presentation is refreshed every half second after confirmation, including when the
|
||||
same header already says `Escape` and its root scene only becomes available later.
|
||||
The native mission-name callback refreshes it too. Repeated refreshes compare
|
||||
world paths as strings: `GetWorldFile()` can return `$Addon:Worlds/...`, and
|
||||
calling `ResourceName.GetPath()` on that path each tick caused repeated zero-GUID
|
||||
resource warnings. GUID prefixes are stripped as text, and parent-resource
|
||||
resolution runs only when the cached terrain input changes.
|
||||
The [native comparison](evidence/terrain-lookup-loop-2026-10-04/report.json)
|
||||
reproduced 80 repeated warnings over 20 seconds before this correction and zero
|
||||
afterward, with the same terrain title and scenario resource. The loading screen refreshes
|
||||
its existing title and description widgets, so copying the header before the Escape bootstrap no
|
||||
longer leaves the original scenario name or instructions on screen. Confirmed takeover reads `m_sDescription` and `m_sDetails` from Escape’s authored `Missions/ERR_Everon.conf`, without copying its world or scenario identity. Details take precedence over the short description, matching native translation and the 1,000-character display limit. It accepts the current header
|
||||
or another copy of that same scenario; other incoming scenarios retain their own
|
||||
titles and descriptions. Loading progress, imagery and hints keep their native lifecycle. The authored Escape text is read once at takeover; resource-load failure leaves the source text intact.
|
||||
|
||||
The [31 October native widget checks](evidence/terrain-mission-text-2026-10-31/native-checks.log) verified that an already-created loading screen changes from terrain details to the authored Escape text, then restores the original text. The isolated Workbench world has no mission header, so the fixture supplies one at the header-read boundary; the resource loader, presentation methods and actual loading layout/component run in the engine. This is not remote multiplayer or initial connection timing acceptance. All focused presentation/takeover/selection/loading regressions passed. The final native run completed with unchanged inputs and confirmed cleanup; the strict runner reports 13 existing world/localization errors plus two empty-image errors from the synthetic header, with no script errors. The text assertions passed; this fixture does not qualify loading imagery. Earlier fixture setup failures are recorded in the evidence directory.
|
||||
|
||||
The original runtime name, game-mode label, description and details are restored on world cleanup, so
|
||||
restarting with takeover disabled cannot inherit Escape labels or instructions. Later text changes by another system are preserved. Clients wait
|
||||
for the actual Escape bootstrap instead of guessing from locally enabled mods.
|
||||
The public server-browser listing can retain the startup terrain after an in-process
|
||||
terrain redirect. A live RKS #2 check on 2026-10-04 confirmed Chernarus was loaded
|
||||
and its runtime title updated, while the browser still showed the initial Nogova
|
||||
scenario. The earlier runtime and loading-title checks did not prove public listing
|
||||
refresh. Starting the server directly with the selected terrain in `game.scenarioId`
|
||||
avoids this initial-terrain redirect; verify the public listing after changing it.
|
||||
See [live browser follow-up](evidence/terrain-live-title-2026-10-04/live-browser-followup.json). The
|
||||
[name-change evidence](evidence/terrain-name-2026-10-02/report.json) records server
|
||||
and client metadata across restart, including the retained respawn-order diagnostic.
|
||||
[Terrain suffix validation](evidence/terrain-browser-suffix-2026-10-02/report.json)
|
||||
checks the real Armenhof callback, Nogova/Everon resolution and title restoration.
|
||||
[Live-title refresh evidence](evidence/terrain-live-title-2026-10-04/report.json)
|
||||
adds native Nogova checks for an already-presented stale title and a stale Everon
|
||||
world header, plus executable loading-widget and late-root regression checks.
|
||||
This later run is headless; it does not visually qualify the loading screen or
|
||||
verify the public backend cache.
|
||||
|
||||
A subsequent [registration investigation](evidence/terrain-registration-2026-10-04/report.json)
|
||||
ran two isolated native experiments. Rehosting with
|
||||
`RequestPublicServerTransition` from gameplay was explicitly rejected as an
|
||||
unsupported transition. Writing a replacement `World` through a cloned header
|
||||
container did not change the engine's selected world. Neither experiment provides
|
||||
a universal registration fix. No supported scenario-registration setter was found
|
||||
in the inspected script interfaces. A portable pre-launch integration remains an
|
||||
external setup option to investigate; it is not implemented here and would not by
|
||||
itself replace the loader scenario's published Workshop metadata.
|
||||
|
||||
|
||||
## Optional overrides
|
||||
|
||||
To keep the original scenario while Escape remains loaded, pass
|
||||
`-errTerrainTakeover 0`, or set the mission-header field
|
||||
`m_bERR_EnableEscape` to `false`, then restart. The CLI override takes precedence;
|
||||
only its exact value `1` enables takeover when explicitly supplied. With no
|
||||
overrides, takeover is enabled.
|
||||
|
||||
Optional airport-centre hints use `-errAirfields "1525 5075"` or the header field
|
||||
`m_sERR_Airfields`. Use X/Z pairs separated by semicolons, up to 16 centres.
|
||||
Hints must be on dry land inside the terrain and do not bypass clearance checks.
|
||||
An explicitly supplied CLI hint takes precedence over the header. Empty hints
|
||||
use automatic discovery and the landing-zone fallback.
|
||||
|
||||
## Validation of the automatic default
|
||||
|
||||
Production-method regressions exercise default activation, editor/authority
|
||||
protection, opt-out precedence, airport discovery and bounded placement. Native
|
||||
Nogova server/client evidence is recorded in
|
||||
[evidence/automatic-terrain-takeover-2026-10-02](evidence/automatic-terrain-takeover-2026-10-02/).
|
||||
The no-flags Nogova test completed two takeovers and two prison phases across a
|
||||
connected restart, with all 16 sites and a supported, fueled helicopter in each
|
||||
round. Client manager checks passed with no client script errors. The evidence
|
||||
report retains server authentication refusals and installed-resource diagnostics;
|
||||
it is not a clean-release verdict. A freshly built package also reached the
|
||||
prison phase on Nogova without flags, loose Escape source, test probes or script
|
||||
errors. Its 351 payload files matched the authored source. Packaging's strict
|
||||
resource/shutdown failures remain recorded separately.
|
||||
Authenticated prisoner spawning, late joining and reconnecting still require a
|
||||
published-build multiplayer check; offline backend-disabled tests cannot prove
|
||||
account admission. Publication and live-server changes remain with the owner.
|
||||
|
||||
## Handover behavior and earlier validation
|
||||
|
||||
- Invalid airport syntax, terrain bounds, navigation or missing bootstrap assets
|
||||
are rejected before the original mode is stopped.
|
||||
- The old mode ends before deletion. Its catalog and data-collector references
|
||||
are released. Once native registrations clear, the replacement is created in
|
||||
the same update, avoiding a period with no mode to create joining players'
|
||||
controllers. A 10-second deadline bounds unexpectedly deferred registrations.
|
||||
- The original radio manager is retained, detached first if its parent is being
|
||||
removed. A missing radio manager is created from the standard game prefab.
|
||||
- The private `Prefabs/ERR/TerrainTakeover.et` triggers client cleanup. It releases
|
||||
only the captured original singleton components, waits for the new factions
|
||||
before catalog/identity initialization, and receives the server's faction
|
||||
delegates. The terrain's native chat service is retained on both peers, detached
|
||||
from any removed entity/replication parent, and never replaced or attached to
|
||||
the new mode. The ordinary authored connector retains its own chat service.
|
||||
If the terrain has no chat service, `TerrainTakeoverWithChat.et` supplies a
|
||||
non-streaming replicated chat child instead. Selection depends on service
|
||||
presence, not terrain name; both variants share the same takeover mode.
|
||||
- Arsenal, group, support-station and task managers release the original mode's
|
||||
cached instances on both peers. Task, map-marker and respawn getters resolve
|
||||
the current takeover mode even if an old destructor clears a shared cache.
|
||||
- Faction delegates use a paired serialization prefix to bind their faction
|
||||
before the base deserializer reads faction data. Both peers must load the same
|
||||
Escape build, including when using an ordinary authored Escape scenario.
|
||||
- Old faction delegates are removed explicitly because vanilla creates them as
|
||||
standalone entities. The new mode, managers and delegates are linked in the
|
||||
replication hierarchy so delegates cannot arrive before their prerequisites.
|
||||
- Native player admission events received during handover are held and replayed
|
||||
only for the same connected controller and account. No backend identity or
|
||||
authentication event is fabricated. Disconnect and world cleanup clear the queue.
|
||||
- Existing controllers resolve spawn handlers on the replacement Escape mode.
|
||||
- World cleanup clears the handover state and configured centres. Local native
|
||||
restart has passed in Workbench, on an empty Linux dedicated server, and with
|
||||
a separate connected Windows client. The connected test recreates the player's
|
||||
controller and verifies the replacement managers in both rounds.
|
||||
|
||||
On 14 October, the original Everon client log showed delayed removal of the
|
||||
original `ScriptedChatEntity` after the replacement registered, followed by
|
||||
`Cannot send message - ChatEntity is missing.` This blocked native chat commands,
|
||||
including administrator login, before authentication. `test_terrain_chat_retention.py`
|
||||
checks shared-service retention, nested parent detachment and fallback selection.
|
||||
The revised scripts compiled in Workbench; the authored-world native restart
|
||||
smoke completed two rounds and 21 assertions with no script/runtime failures.
|
||||
That run still reported existing engine/dependency errors, and the full repository
|
||||
check stopped on the existing missing root ID in `ERRM_AtlasLeaf.et`.
|
||||
Live remote login and takeover of both chat variants remain separate verification
|
||||
steps; the authored-world smoke does not exercise those paths.
|
||||
|
||||
The earlier isolated prototype passed a Nogova Workbench prisoner-spawn test with
|
||||
16 generated sites and zero script errors. See
|
||||
[prototype evidence](evidence/scenario-takeover-2026-10-01/report.json). The current
|
||||
feature has additional configuration, readiness and admission checks. It passed
|
||||
native offline spawning and an actual scenario restart: two prisoner spawns,
|
||||
16 sites per round, zero script errors, and all handover state cleared between
|
||||
rounds. Invalid configuration was also rejected before stopping the original mode.
|
||||
Repository checks passed. See the
|
||||
[feature test report](evidence/terrain-takeover-feature-2026-10-01/report.json).
|
||||
|
||||
Earlier opt-in builds required enable flags and airport hints. The following
|
||||
results describe those builds, before the automatic default and landing-zone fallback.
|
||||
|
||||
The command-line listen-server route did not apply either custom mission-header
|
||||
overrides or the standard `m_eSaveTypes` override. Its diagnostic read the original
|
||||
defaults and left Nogova's mode running. Consequently the example server JSON
|
||||
used in those tests still needs testing through the actual dedicated-server route. A read-only
|
||||
copy of the RKS 2 engine executables was subsequently authorized and completed.
|
||||
The dedicated JSON route could not complete addon/backend initialization with
|
||||
external networking disabled. The explicit CLI route did load Nogova, generate
|
||||
16 sites and reach the prison phase with zero script errors on the Linux server.
|
||||
The dedicated server also passed an actual scenario restart, cleared the takeover
|
||||
state and reached the prison phase again, with zero script errors. Both dedicated
|
||||
checks used an empty server.
|
||||
|
||||
Subsequent tests used the final takeover files on the same frozen core baseline,
|
||||
with a real Windows client joining the isolated Linux server through a localhost
|
||||
relay. Client manager replication, catalog/identity faction references and radio
|
||||
retention passed. A real scenario restart cleared both peers' takeover state,
|
||||
recreated the client's controller and reached the prison phase again. No client
|
||||
script errors occurred. The backend-disabled server correctly withheld soldier
|
||||
spawning for missing account identity, so these checks do **not** prove
|
||||
authenticated prisoner spawning. Native delayed-unregistration diagnostics and
|
||||
existing resource errors remain in the raw logs. No RKS 2 configuration or
|
||||
running process was changed.
|
||||
|
||||
A separate disconnect/reconnect test passed with two successive client launches
|
||||
against the same server and no client script errors. That run preceded the final
|
||||
replication-hierarchy change; the final hierarchy was then tested through a fresh
|
||||
client join and a connected restart. Radio preservation when attached to the old
|
||||
mode, and creation when missing, passed separate authority-only fixtures. These
|
||||
fixtures change the loaded test world in memory, not the terrain's source files.
|
||||
|
||||
The separate Nogova connector and authored integration remain available in
|
||||
[the existing integration instructions](terrain-adapters.md). Do not delete them
|
||||
from a deployment that still selects their mission header.
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"cause": "Test and one current-default documentation sentence were not updated when committed default changed. No production defect demonstrated.",
|
||||
"intent_commit": "681d5e5eae880c5aae692d51b9cf526469409d37",
|
||||
"intent": "Extend results countdown and stabilize spectator hints; record Workshop 0.0.128. Commit explicitly changed m_fAutoReloadTime 10 to 120 and added configuration.md explanation of 120 seconds with command-line override.",
|
||||
"fix": "Test requires exact stripped prefab line m_fAutoReloadTime 120, rather than accepting substring10 or either default. Documentation current-default sentence now120seconds; historical evidence untouched.",
|
||||
"evidence": "docs/evidence/community-statistics-2026-10-30/readable-end-results.json reports configured120s/native13assertions and explicitly does not claim two minutes elapsed waiting.",
|
||||
"limits": "No engine/native test or timing qualification this turn. Existing test actual-method programs and all other assertions unchanged."
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
--- a/tests/test_preparation_status.py
|
||||
+++ b/tests/test_preparation_status.py
|
||||
@@ -123,5 +123,5 @@
|
||||
""")
|
||||
create=body(SOURCE,'protected override void CreateLoadingPlaceholder(')
|
||||
assert create.index('super.CreateLoadingPlaceholder()') < create.index('ERR_BindEscapeRespawn(this)')
|
||||
-assert 'm_fAutoReloadTime 10' in prefab
|
||||
+assert 'm_fAutoReloadTime 120' in [line.strip() for line in prefab.splitlines()]
|
||||
print('PASS: replaced respawn system receives frame updates, disabled updater wakes, stale/non-Escape binding refused; terminal and stale preload leases release black overlay')
|
||||
--- a/docs/terrain-takeover.md
|
||||
+++ b/docs/terrain-takeover.md
|
||||
@@ -65,7 +65,7 @@
|
||||
|
||||
The native loading-screen updater also follows the replacement respawn manager. This keeps the spinner and mission-preparation text updating after takeover, including when the original scenario disabled its deploy-menu updater. A pending spawn-loading overlay releases on victory/defeat and cannot hold the result screen underneath it.
|
||||
|
||||
-Escape's default end-of-round reload delay is ten seconds. The native server `-autoreload` override still applies, including disabling automatic reload. Terrain loading and procedural preparation happen after that delay and can take substantially longer on large islands.
|
||||
+Escape's default end-of-round reload delay is 120 seconds. The native server `-autoreload` override still applies, including disabling automatic reload. Terrain loading and procedural preparation happen after that delay and can take substantially longer on large islands.
|
||||
|
||||
|
||||
The [editor handover check](evidence/terrain-editor-2026-10-03/report.json)
|
||||
@@ -0,0 +1,2 @@
|
||||
PASS: actual preparation status scope, persistent updates, spinner restoration, placeholder replacement/deletion/destruction, native observation persistence/timeout; rendering remains native-pending
|
||||
PASS: replaced respawn system receives frame updates, disabled updater wakes, stale/non-Escape binding refused; terminal and stale preload leases release black overlay
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"files": {
|
||||
"tests/test_preparation_status.py": {
|
||||
"before_sha256": "3b1a7c30d12f0b6fcba36b57ecfcfefaec044735211205da844c65988ec60029",
|
||||
"after_sha256": "e9b2a3c5b6627573ff923dacc3e9aece0ef2d6829d243ccaaa65661fedf65b2e"
|
||||
},
|
||||
"docs/terrain-takeover.md": {
|
||||
"before_sha256": "f2620e896a97aaa9280ca9fc1c32020dcfcbc2fdea57afe718f6ed5af845a732",
|
||||
"after_sha256": "f79fbead432e577557e7db71d93531f493725cbcc35a461a9ed85aa0d908e0c4"
|
||||
}
|
||||
},
|
||||
"patch_sha256": "cc18a3c88d43f31d0338b015da338fedd8caa9b1e6ee6df22cf4dfb63adb1f53",
|
||||
"validation": {
|
||||
"baseline_exit": 1,
|
||||
"baseline_failure": "Actual-method programs complete; stale final prefab assertion expects 10.",
|
||||
"proposal_exit": 0,
|
||||
"baseline_log_sha256": "bc4e19b78cf353d1e3a29a3a31a215e32467f5e720c6dd152e0b8b80f6ca8d35",
|
||||
"proposal_log_sha256": "bc6bbc9037fa44f86fdc5f3dc4b1a6e2b07c0b425d891e6fe53aa1b1e1026509"
|
||||
},
|
||||
"prefab_sha256": "a2b7e632714e646a7010592cc7ac75f0afff7da6c995bf91aaf65d9473a6af3f"
|
||||
}
|
||||
+127
@@ -0,0 +1,127 @@
|
||||
"""Execute loading presentation/cleanup and native observation bodies with UI adapters.
|
||||
No native layout rendering, multiplayer, or real startup-failure claim.
|
||||
"""
|
||||
from policy_harness import ROOT, body, run
|
||||
SOURCE=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_PreparationStatus.c'
|
||||
def cpp(s):
|
||||
s=s.replace('protected ','').replace('override ','').replace('null','nullptr')
|
||||
s=s.replace('ERR_GameMode mode = ERR_GameMode.Get();','ERR_GameMode* mode = ERR_GameMode::Get();')
|
||||
s=s.replace('ERR_GameMode current = ERR_GameMode::Get();','ERR_GameMode* current = ERR_GameMode::Get();')
|
||||
s=s.replace('ERR_GameMode current = ERR_GameMode.Get();','ERR_GameMode* current = ERR_GameMode::Get();')
|
||||
s=s.replace('current.Phase()', 'current->Phase()')
|
||||
s=s.replace('ERR_GameMode mode,','ERR_GameMode* mode,')
|
||||
s=s.replace('ERR_GameMode mode)', 'ERR_GameMode* mode)')
|
||||
for name in ['System','ERR_GameMode','ERR_Phase','ERR_ObjectiveText','ERR_MissionRules','ERR_PreparationFailureMenu']:s=s.replace(name+'.',name+'::')
|
||||
s=s.replace('TextWidget.Cast(','CastText(').replace('Widget widget)', 'Widget* widget)').replace('widget.', 'widget->')
|
||||
for name in ['mode','m_wLoadingPlaceholder','m_ERRPreparationSpinner','m_ERRPreparationRoot','m_ERRPreparationTitle','m_ERRPreparationDescription']:
|
||||
s=s.replace(name+'.',name+'->')
|
||||
s=s.replace('GetGame().','GetGame()->').replace('GetWorkspace().','GetWorkspace()->').replace('.IsEmpty()','.empty()')
|
||||
return s.replace('super.','Native::')
|
||||
methods='\n'.join(cpp(body(SOURCE,key)) for key in ('void ERR_KeepSpawnSceneLoading(', 'void ERR_ShowSpawnSceneLoading(', 'protected string ERR_PreparationDescription(', 'protected void ERR_ClearPreparationStatus(', 'override void UpdateLoadingPlaceholder(', 'override void DestroyLoadingPlaceholder(', 'protected bool ERR_PreparationWidgetVisible(', 'bool ERR_ProbePreparationVisible('))
|
||||
run(r'''
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <map>
|
||||
using string=std::string;
|
||||
namespace System{bool console=false;bool IsConsoleApp(){return console;}}
|
||||
namespace ERR_Phase{enum{PREPARING,PRISON,RADIO_SEARCH,RADIO_DEFENCE,EXTRACTION,VICTORY,DEFEAT};}
|
||||
namespace ERR_MissionRules{bool Terminal(int p){return p==ERR_Phase::VICTORY||p==ERR_Phase::DEFEAT;}}
|
||||
struct ERR_GameMode{static ERR_GameMode* current;int phase=ERR_Phase::PREPARING;string error;static ERR_GameMode* Get(){return current;}int Phase(){return phase;}bool Active(){return phase>=ERR_Phase::PRISON&&phase<=ERR_Phase::EXTRACTION;}string PreparationError(){return error;}};ERR_GameMode* ERR_GameMode::current=nullptr;
|
||||
namespace ERR_PreparationFailureMenu{bool shown=false;bool Show(ERR_GameMode*){return shown;}bool Visible(ERR_GameMode*){return shown;}};
|
||||
namespace ERR_ObjectiveText{string Description(ERR_GameMode* mode,bool){return mode->error.empty()?"Preparing sites":"Mission failed; ask an administrator to correct and restart";}}
|
||||
struct Widget{Widget* parent=nullptr;bool visible=true,removed=false,textWidget=false;string text;int textWrites=0,visibilityWrites=0;float width=900,height=170;std::map<string,Widget*> children;
|
||||
void GetScreenSize(float& w,float& h){w=width;h=height;}Widget* GetParent(){return parent;}void RemoveFromHierarchy(){removed=true;parent=nullptr;}void SetVisible(bool value){visible=value;visibilityWrites++;}bool IsVisible(){return visible;}
|
||||
Widget* FindAnyWidget(string name){return children.count(name)?children[name]:nullptr;}void SetText(string value){text=value;textWrites++;}string GetText(){return text;}};
|
||||
Widget* CastText(Widget* w){return w&&w->textWidget?w:nullptr;}
|
||||
struct Workspace{int creates=0;bool fail=false,missingText=false;Widget* CreateWidgets(const char*,Widget* parent){creates++;if(fail)return nullptr;auto root=new Widget;root->parent=parent;for(string name:{"ERR_PreparationTitle","ERR_PreparationDescription"}){auto child=new Widget;child->parent=root;child->textWidget=true;root->children[name]=child;}if(missingText)root->children.erase("ERR_PreparationTitle");return root;}};
|
||||
struct Game{Workspace workspace;Workspace* GetWorkspace(){return &workspace;}};Game game;Game* GetGame(){return &game;}
|
||||
struct Native{Widget* m_wLoadingPlaceholder=nullptr;ERR_GameMode* m_pGameMode=nullptr;int nativeUpdates=0,destroys=0;void CreateLoadingPlaceholder(){m_wLoadingPlaceholder=new Widget;}void UpdateLoadingPlaceholder(float){nativeUpdates++;}void DestroyLoadingPlaceholder(){destroys++;if(m_wLoadingPlaceholder)m_wLoadingPlaceholder->RemoveFromHierarchy();m_wLoadingPlaceholder=nullptr;}};
|
||||
struct Probe:Native{
|
||||
Widget *m_ERRPreparationParent=nullptr,*m_ERRPreparationRoot=nullptr,*m_ERRPreparationTitle=nullptr,*m_ERRPreparationDescription=nullptr,*m_ERRPreparationSpinner=nullptr;
|
||||
bool m_ERRKeepSpawnSceneLoading=false,m_ERRPreparationSpinnerHidden=false,m_ERRPreparationSpinnerWasVisible=false;string m_ERRPreparationLastTitle,m_ERRPreparationLastDescription;
|
||||
'''+methods+r'''
|
||||
};
|
||||
struct Fixture{ERR_GameMode mode;Widget parent,spinner;Probe p;Fixture(){game.workspace={};System::console=false;ERR_PreparationFailureMenu::shown=false;ERR_GameMode::current=&mode;p.m_pGameMode=&mode;p.m_wLoadingPlaceholder=&parent;parent.children["Spinner"]=&spinner;spinner.parent=&parent;}};
|
||||
int main(){
|
||||
{Fixture f;f.mode.error="bad";ERR_PreparationFailureMenu::shown=true;f.p.UpdateLoadingPlaceholder(.1f);assert(!f.parent.visible&&f.p.ERR_ProbePreparationVisible(&f.mode,true));}
|
||||
{Fixture f;f.mode.phase=ERR_Phase::PRISON;f.p.ERR_ShowSpawnSceneLoading();auto root=f.p.m_ERRPreparationRoot;f.p.ERR_KeepSpawnSceneLoading(true);f.p.DestroyLoadingPlaceholder();assert(!root->removed&&!f.parent.removed&&f.p.destroys==0);f.p.ERR_KeepSpawnSceneLoading(false);f.p.DestroyLoadingPlaceholder();assert(root->removed&&f.p.destroys==1);f.p.ERR_ShowSpawnSceneLoading();assert(f.p.m_wLoadingPlaceholder&&f.p.ERR_ProbePreparationVisible(&f.mode,false));}
|
||||
{Fixture f;f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.nativeUpdates==1&&game.workspace.creates==1&&f.p.ERR_ProbePreparationVisible(&f.mode,false));
|
||||
Widget* root=f.p.m_ERRPreparationRoot;auto title=f.p.m_ERRPreparationTitle;auto description=f.p.m_ERRPreparationDescription;
|
||||
for(int i=0;i<200;i++){f.p.UpdateLoadingPlaceholder(.1f);}assert(game.workspace.creates==1&&title->textWrites==1&&description->textWrites==1);
|
||||
f.mode.error="invalid catalog";f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.ERR_ProbePreparationVisible(&f.mode,true)&&!f.spinner.visible);
|
||||
for(int i=0;i<200;i++){f.p.UpdateLoadingPlaceholder(.1f);}assert(f.p.m_ERRPreparationRoot==root&&title->textWrites==2&&description->textWrites==2&&f.spinner.visibilityWrites==1);
|
||||
title->width=0;assert(!f.p.ERR_ProbePreparationVisible(&f.mode,true));title->width=900;f.mode.error.clear();f.p.UpdateLoadingPlaceholder(.1f);assert(f.spinner.visible&&f.p.ERR_ProbePreparationVisible(&f.mode,false));
|
||||
f.mode.phase=ERR_Phase::PRISON;f.p.UpdateLoadingPlaceholder(.1f);assert(!root->removed&&!f.parent.removed&&f.spinner.visible&&f.p.ERR_ProbePreparationVisible(&f.mode,false));
|
||||
assert(description->text=="Please wait while your spawn area and equipment finish loading. You will take control when preparation is complete.");
|
||||
for(int phase=ERR_Phase::PRISON;phase<=ERR_Phase::EXTRACTION;phase++){f.mode.phase=phase;for(int i=0;i<200;i++)f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.m_ERRPreparationRoot==root&&f.p.ERR_ProbePreparationVisible(&f.mode,false));}
|
||||
f.mode.phase=ERR_Phase::VICTORY;f.p.UpdateLoadingPlaceholder(.1f);assert(root->removed&&f.parent.removed&&f.spinner.visible&&!f.p.m_ERRPreparationRoot&&f.p.destroys==1);
|
||||
}
|
||||
for(int phase : {ERR_Phase::VICTORY,ERR_Phase::DEFEAT}){Fixture f;f.p.UpdateLoadingPlaceholder(.1f);f.p.ERR_KeepSpawnSceneLoading(true);f.mode.phase=phase;f.p.UpdateLoadingPlaceholder(.1f);assert(f.parent.removed&&!f.p.m_ERRKeepSpawnSceneLoading&&f.p.destroys==1);}
|
||||
{Fixture f;f.p.ERR_KeepSpawnSceneLoading(true);ERR_GameMode replacement;ERR_GameMode::current=&replacement;f.p.DestroyLoadingPlaceholder();assert(f.parent.removed&&f.p.destroys==1);}
|
||||
{Fixture f;f.p.ERR_KeepSpawnSceneLoading(true);ERR_GameMode::current=nullptr;f.p.DestroyLoadingPlaceholder();assert(f.parent.removed&&f.p.destroys==1);}
|
||||
for(int mismatch=0;mismatch<6;mismatch++){Fixture f;ERR_GameMode other;if(mismatch==0)ERR_GameMode::current=nullptr;if(mismatch==1)f.p.m_pGameMode=&other;if(mismatch==2)f.mode.phase=-1;if(mismatch==3)System::console=true;if(mismatch==4)f.p.m_wLoadingPlaceholder=nullptr;if(mismatch==5)f.p.m_pGameMode=nullptr;f.p.UpdateLoadingPlaceholder(.1f);assert(game.workspace.creates==0&&f.p.nativeUpdates==1&&!f.parent.removed&&f.spinner.visibilityWrites==0);}
|
||||
{Fixture f;f.mode.phase=ERR_Phase::PRISON;f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.ERR_ProbePreparationVisible(&f.mode,false));Widget* root=f.p.m_ERRPreparationRoot;f.p.DestroyLoadingPlaceholder();assert(root->removed&&f.parent.removed&&!f.p.m_ERRPreparationRoot&&f.p.destroys==1);f.p.UpdateLoadingPlaceholder(.1f);assert(game.workspace.creates==1);}
|
||||
{Fixture f;f.mode.error="bad";f.spinner.visible=false;f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.ERR_ProbePreparationVisible(&f.mode,true));f.p.ERR_ClearPreparationStatus();assert(!f.spinner.visible);}
|
||||
{Fixture f;f.mode.error="bad";f.p.UpdateLoadingPlaceholder(.1f);Widget* old=f.p.m_ERRPreparationRoot;Widget newParent,newSpinner;newParent.children["Spinner"]=&newSpinner;newSpinner.parent=&newParent;f.p.m_wLoadingPlaceholder=&newParent;f.p.UpdateLoadingPlaceholder(.1f);assert(old->removed&&f.spinner.visible&&!newSpinner.visible&&f.p.m_ERRPreparationParent==&newParent&&game.workspace.creates==2);f.p.DestroyLoadingPlaceholder();assert(newParent.removed&&!f.parent.removed&&newSpinner.visible&&!f.p.m_ERRPreparationRoot&&f.p.destroys==1);}
|
||||
{Fixture f;f.mode.error="bad";f.p.UpdateLoadingPlaceholder(.1f);f.p.m_ERRPreparationParent=nullptr;f.p.m_ERRPreparationRoot=nullptr;f.p.m_ERRPreparationTitle=nullptr;f.p.m_ERRPreparationDescription=nullptr;f.p.m_ERRPreparationSpinner=nullptr;f.p.m_wLoadingPlaceholder=nullptr;f.p.UpdateLoadingPlaceholder(.1f);assert(!f.p.m_ERRPreparationSpinnerHidden);}
|
||||
{Fixture f;game.workspace.fail=true;f.p.UpdateLoadingPlaceholder(.1f);assert(!f.p.m_ERRPreparationRoot&&f.spinner.visibilityWrites==0);game.workspace.fail=false;f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.ERR_ProbePreparationVisible(&f.mode,false));}
|
||||
{Fixture f;game.workspace.missingText=true;f.p.UpdateLoadingPlaceholder(.1f);assert(!f.p.m_ERRPreparationRoot&&f.spinner.visibilityWrites==0);}
|
||||
{Fixture f;f.p.UpdateLoadingPlaceholder(.1f);Widget other;Widget* moved=f.p.m_ERRPreparationRoot;moved->parent=&other;f.p.UpdateLoadingPlaceholder(.1f);assert(moved->removed&&f.p.m_ERRPreparationRoot!=moved&&f.p.m_ERRPreparationParent==&f.parent);}
|
||||
}
|
||||
''')
|
||||
probe=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_NativePreparationStatusProbe.c'
|
||||
s=body(probe,'static int Tick(').replace('ERR_GameMode mode,','ERR_GameMode* mode,').replace('ERR_GameMode.Get()','ERR_GameMode::Get()').replace('ERR_Phase.PREPARING','PREPARING').replace('mode.','mode->').replace('.IsEmpty()','.empty()').replace('SCR_RespawnSystemComponent respawn','SCR_RespawnSystemComponent* respawn').replace('SCR_RespawnSystemComponent.GetInstance()','SCR_RespawnSystemComponent::GetInstance()').replace('respawn.','respawn->').replace('System.MakeScreenshot','System::MakeScreenshot')
|
||||
run(r'''
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
using string=std::string;const int PREPARING=0;
|
||||
struct ERR_GameMode{static ERR_GameMode* current;int phase=0;string error="bad";static ERR_GameMode* Get(){return current;}int Phase(){return phase;}string PreparationError(){return error;}};ERR_GameMode* ERR_GameMode::current=nullptr;
|
||||
struct SCR_RespawnSystemComponent{bool visible=true;static SCR_RespawnSystemComponent instance;static SCR_RespawnSystemComponent* GetInstance(){return &instance;}bool ERR_ProbePreparationVisible(ERR_GameMode*,bool failed){assert(failed);return visible;}};SCR_RespawnSystemComponent SCR_RespawnSystemComponent::instance;
|
||||
namespace System{int captures=0;void MakeScreenshot(const char*){captures++;}}void Print(const char*){}
|
||||
struct Probe{static ERR_GameMode* s_Mode;static float s_Deadline,s_Since,s_Last,s_CaptureAt;
|
||||
'''+s+r'''
|
||||
};ERR_GameMode* Probe::s_Mode=nullptr;float Probe::s_Deadline=0,Probe::s_Since=-1,Probe::s_Last=-1,Probe::s_CaptureAt=-1;
|
||||
int main(){ERR_GameMode mode;ERR_GameMode::current=&mode;
|
||||
for(int i=0;i<=33;i++){assert(Probe::Tick(&mode,i*500)==0);}assert(System::captures==0);assert(Probe::Tick(&mode,17000)==0&&System::captures==1);assert(Probe::Tick(&mode,17500)==1&&System::captures==1);
|
||||
ERR_GameMode next;ERR_GameMode::current=&next;assert(Probe::Tick(&next,20000)==0);assert(Probe::Tick(&next,22000)==0&&Probe::s_Since==22000);SCR_RespawnSystemComponent::instance.visible=false;assert(Probe::Tick(&next,22500)==0&&Probe::s_Since==-1);assert(Probe::Tick(&next,50000)==-1);
|
||||
}
|
||||
''')
|
||||
text=SOURCE.read_text()
|
||||
prefab=(ROOT/'addons/core/Prefabs/ERR/GameMode.et').read_text()
|
||||
assert 'm_bUseSpawnPreload 1' in prefab and 'm_bUseSpawnPreload 0' not in prefab
|
||||
assert 'GetOwner(' not in text
|
||||
assert text.count('m_pGameMode != mode') == 3
|
||||
# m_pGameMode is the installed vanilla protected owner field, assigned by
|
||||
# SCR_RespawnSystemComponent.OnInit(IEntity owner). The adapter deliberately
|
||||
# exposes that field rather than inventing a ScriptComponent.GetOwner API.
|
||||
for forbidden in ('CallLater(', 'SetCamera(', 'SpawnEntity', 'SetControlledEntity(', 'Transition(', 'PreparationError() ='):
|
||||
assert forbidden not in text,forbidden
|
||||
native=probe.read_text()
|
||||
for forbidden in ('CreateWidgets(', 'UpdateLoadingPlaceholder(', 'SetText(', 'SetVisible('):assert forbidden not in native
|
||||
base=(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_NativeBaseSmoke.c').read_text()
|
||||
assert 'ERR_NativePreparationStatusProbe.Tick(this, now)' in base
|
||||
assert 'native-end-active' in base and 'native-end-preparing' in base
|
||||
print('PASS: actual preparation status scope, persistent updates, spinner restoration, placeholder replacement/deletion/destruction, native observation persistence/timeout; rendering remains native-pending')
|
||||
|
||||
# Execute the production world-system rebind that restores frame delivery.
|
||||
source=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverManagers.c'
|
||||
bind=body(source,'void ERR_BindEscapeRespawn(').replace('SCR_RespawnSystemComponent respawn','Respawn* respawn').replace('ERR_GameMode mode = ERR_GameMode.Get();','Mode* mode = Mode::current;').replace('SCR_RespawnSystemComponent.Cast(mode.FindComponent(SCR_RespawnSystemComponent))','mode->respawn')
|
||||
run(r"""
|
||||
#include <cassert>
|
||||
struct Respawn{int frames=0;};struct Mode{inline static Mode* current=nullptr;Respawn* respawn=nullptr;};void Print(const char*){}
|
||||
struct System{Respawn* m_RespawnSystem=nullptr;bool m_bReady=true,enabled=false;int enables=0;void Enable(bool value){enabled=value;enables++;}
|
||||
"""+bind+r"""
|
||||
void Frame(){if(enabled&&m_RespawnSystem)m_RespawnSystem->frames++;}
|
||||
};
|
||||
int main(){System system;Mode mode;Respawn original,replacement,unrelated;Mode::current=&mode;mode.respawn=&replacement;system.m_RespawnSystem=&original;
|
||||
system.ERR_BindEscapeRespawn(&unrelated);assert(system.enables==0&&system.m_RespawnSystem==&original);
|
||||
system.ERR_BindEscapeRespawn(nullptr);assert(system.enables==0);
|
||||
system.ERR_BindEscapeRespawn(&replacement);assert(system.enabled&&!system.m_bReady&&system.m_RespawnSystem==&replacement);system.Frame();assert(replacement.frames==1&&original.frames==0);
|
||||
system.m_bReady=true;system.ERR_BindEscapeRespawn(&replacement);assert(system.m_bReady); // Idempotent: keep current deploy readiness.
|
||||
Mode::current=nullptr;system.ERR_BindEscapeRespawn(&original);assert(system.m_RespawnSystem==&replacement);
|
||||
}
|
||||
""")
|
||||
create=body(SOURCE,'protected override void CreateLoadingPlaceholder(')
|
||||
assert create.index('super.CreateLoadingPlaceholder()') < create.index('ERR_BindEscapeRespawn(this)')
|
||||
assert 'm_fAutoReloadTime 120' in [line.strip() for line in prefab.splitlines()]
|
||||
print('PASS: replaced respawn system receives frame updates, disabled updater wakes, stale/non-Escape binding refused; terminal and stale preload leases release black overlay')
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"programs": 85,
|
||||
"failed": [],
|
||||
"seconds": 60.85,
|
||||
"native_run": false
|
||||
}
|
||||
@@ -0,0 +1,291 @@
|
||||
RUN test_hint_delivery.py
|
||||
PASS: actual guide ownership and scoped timer cancellation, current-controller preservation/reacquisition, hint retry/dedup and observer boundaries; native UI not exercised
|
||||
RUN test_native_end_lifecycle.py
|
||||
PASS: actual native-end shutdown, existing terminal snapshots, reentrancy, unchanged native end data and stale preparation guards
|
||||
RUN test_native_end_runner.py
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 1.188s
|
||||
|
||||
OK
|
||||
RUN test_escape_result_wording.py
|
||||
PASS: actual three-state result wording and UI refresh; stale winner IDs never manufacture escape
|
||||
RUN test_native_stats.py
|
||||
...........
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 0.096s
|
||||
|
||||
OK
|
||||
RUN test_aircraft_translation.py
|
||||
PASS: actual immutable target, bounded autohover demand, drift refusal, five-second hold and unchanged qualification/deadline
|
||||
RUN test_spawn_retry_budget.py
|
||||
PASS: actual admission attempt budget bounds blocked/missing prerequisites; preparation, spent life and async pending remain protected
|
||||
PASS: delayed admission retry retains controller ownership across same-account recycled connection IDs
|
||||
RUN test_spawn_preload_timeout.py
|
||||
PASS: actual scene deadline overrides delayed native preload only for rejection; late completion cannot assign, ordinary verified admission preserved
|
||||
RUN test_action_feedback.py
|
||||
PASS: actual action permission matrix unchanged; useful phase/intel/consciousness denials, stale reason cleared, native door denial preserved; no native UI claim
|
||||
RUN test_native_aircraft_control.py
|
||||
.....
|
||||
----------------------------------------------------------------------
|
||||
Ran 5 tests in 0.192s
|
||||
|
||||
OK
|
||||
RUN test_aircraft_flight_policy.py
|
||||
PASS: actual aircraft cancellation/stage rules, ground-only completion, expiry/capture faults, input ownership and no physical shortcuts
|
||||
RUN test_aircraft_flight_envelope.py
|
||||
PASS: actual exact-instance single-use qualification, native-clock staleness/movement refusal, footprint bounds and ownership-safe ground/fault cleanup
|
||||
RUN test_ordinary_screenshot.py
|
||||
PASS: actual optional screenshot helper flag/identity/world/life revalidation, one queued attempt, delayed capture and mission/world cleanup; no native image/presentation claim
|
||||
PASS: actual yard diagnostic exact registered prison ownership, eight native-bound corner projections, no root-sibling escape, bounded duplicate/deep/wide hierarchy traversal; native projection/mask still unmeasured
|
||||
RUN test_participant_selection.py
|
||||
PASS: actual CurrentActor, SpawnPosition and observer-selection methods reject pending/unregistered/replaced/recycled/foreign bodies; canonical live selection and roster-corpse cycling, unconscious following and prison/geometry fallback preserved; native boundaries adapted
|
||||
RUN test_native_shared_map_ownership.py
|
||||
PASS: actual native-map fixture ownership, cleanup and callback evidence fail closed; native execution remains separate
|
||||
RUN test_shared_map_ownership.py
|
||||
PASS: actual shared-map callbacks bind exact map/config/root, preserve replacement UI/camera, defer focus, and remove only owned delayed work
|
||||
RUN test_intel_registration.py
|
||||
PASS: actual Intel/HQ methods and one-shot qualified readiness handoff deliver late actors once; duplicate readiness, accepted spawn, pickup/drop, death and original negative rolls do not mint assignments
|
||||
PASS: Workbench-only read accessor rejects unknown/nonserver identities; Chat observes all distinct ready crew before existing shell-depletion mutation
|
||||
RUN test_mortar_activity_completion.py
|
||||
PASS: actual native-event latch survives deselection, requires exact activity/order, detaches before cleanup, preserves failure/timeout and never infers completion from physical shot count
|
||||
RUN test_packed_chat_game.py
|
||||
.........
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 0.102s
|
||||
|
||||
OK
|
||||
RUN test_native_mortar_refresh.py
|
||||
PASS: actual refresh-fixture gates pin immutable observations/actual downlinks/original activity, reject unaccepted or relabelled commits, stop queueing early and require all queued contacts claimed before replay
|
||||
RUN test_archive_packed.py
|
||||
..........................
|
||||
----------------------------------------------------------------------
|
||||
Ran 26 tests in 0.196s
|
||||
|
||||
OK
|
||||
RUN test_mortar_refresh.py
|
||||
PASS: actual refresh scheduler/delivery/cancellation/projectile methods reject interrupted or replayed reports, retain committed ownership, preserve immutable snapshots/aim geometry and isolate stopped or replaced orders; native radio/crew behavior remains separate
|
||||
RUN test_packed_core_game.py
|
||||
.....................
|
||||
----------------------------------------------------------------------
|
||||
Ran 21 tests in 0.033s
|
||||
|
||||
OK
|
||||
RUN test_pak_inventory.py
|
||||
...........
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 0.033s
|
||||
|
||||
OK
|
||||
RUN test_native_mortar_salvo.py
|
||||
PASS: actual full-salvo gates require eight fresh committed physical launches, natural closure and exact finite inventory; reject partial/extra/replayed events
|
||||
RUN test_spectator_guidance.py
|
||||
PASS: actual reason/availability guidance and refresh matrix; no-target copy omits cycling, hint retry retained, existing command/admin paths unchanged; native UI pending
|
||||
PASS: actual client camera policy closes immediately on healing or mission end; late unconscious metadata cannot keep the view active
|
||||
RUN test_spectator_recovery.py
|
||||
PASS: actual open-chat capture/context renewal and camera/menu priority, text-entry isolation, held-key release; actual revival camera handoff with editor close/retry, missing camera, replacement body and stopped round
|
||||
RUN test_native_package.py
|
||||
................usage: test_native_package.py [-h] [--project {core}] --session SESSION
|
||||
--compat COMPAT [--steam STEAM]
|
||||
[--timeout TIMEOUT]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
[--silent-workbench | --exit-after-init]
|
||||
[--continue-on-failure]
|
||||
test_native_package.py: error: argument --exit-after-init: not allowed with argument --silent-workbench
|
||||
................................
|
||||
----------------------------------------------------------------------
|
||||
Ran 48 tests in 21.949s
|
||||
|
||||
OK
|
||||
RUN test_item_station_teardown.py
|
||||
.......
|
||||
----------------------------------------------------------------------
|
||||
Ran 7 tests in 0.202s
|
||||
|
||||
OK
|
||||
RUN test_source_bundle.py
|
||||
..................
|
||||
----------------------------------------------------------------------
|
||||
Ran 18 tests in 5.657s
|
||||
|
||||
OK
|
||||
RUN test_native_flight_footprint.py
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.247s
|
||||
|
||||
OK
|
||||
RUN test_native_flight_input_diagnostics.py
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.048s
|
||||
|
||||
OK
|
||||
RUN test_mortar_logistics.py
|
||||
PASS: actual finite-courier age, token, exact ownership/callback and delivered-status admission reject stale, replayed, captured, canceled and ambiguous work
|
||||
PASS: actual native-gun ownership gate rejects player/foreign/replaced/dead occupant, faction change, missing seat and missing registry
|
||||
PASS: four-battery courier selection preserves pending trip/report/transfer identity, skips unavailable crews, and selects the next depleted battery without new stock
|
||||
RUN test_mortar_courier_storage.py
|
||||
PASS: 64 bounded distinct storage candidates; native gates, five-store barrier and finite-stock ownership retained; native placement pending
|
||||
RUN test_powered_flight_pad.py
|
||||
PASS: 128 coarse+80 local refinement+169 airport grid candidates retain all native clearance gates; real terrain untested
|
||||
RUN test_prison_escape_policy.py
|
||||
PASS: actual prison registration/crossing policies reject missing/duplicate/destroyed initial gate, incomplete ownership/scan, outside-only body, jumps and stale samples; physical exit independent of later gate damage
|
||||
PASS: actual prison door execution blocks direct AI/UI bypass while locked and delegates unchanged native action once after unlock and permission approval
|
||||
RUN test_powered_flight_policy.py
|
||||
..................
|
||||
----------------------------------------------------------------------
|
||||
Ran 18 tests in 1.687s
|
||||
|
||||
OK
|
||||
RUN test_flight_action_runner.py
|
||||
.....
|
||||
----------------------------------------------------------------------
|
||||
Ran 5 tests in 1.038s
|
||||
|
||||
OK
|
||||
RUN test_native_local_admission_probe.py
|
||||
PASS: native local-admission snapshot rejects changed life/key/body/participant/pending state; authentication is not simulated
|
||||
RUN test_mortar_report_ledger.py
|
||||
PASS: actual mortar report ledger prevents duplicate response after cancellation, expiry and interleaved reports; native scheduler separate
|
||||
RUN test_dedicated_native.py
|
||||
.........
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 0.013s
|
||||
|
||||
OK
|
||||
RUN test_native_mortar_transfer.py
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.123s
|
||||
|
||||
OK
|
||||
RUN test_mortar_aim_renewal.py
|
||||
PASS: actual aim renewal requires fresh same-report solve and original-command equivalence; native firing untested
|
||||
RUN test_dedicated_preflight.py
|
||||
.........
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 0.057s
|
||||
|
||||
OK
|
||||
RUN test_mortar_transactions.py
|
||||
PASS: actual startup/generation/ownership/timeout/callback policies and native-counter wait; integration preserves one-shot allocation and pending-crew cancellation
|
||||
PASS: rapid mortar cycle counts eight physical rounds once and waits for native completion without a ninth aim or shell
|
||||
RUN test_native_mortar_probe.py
|
||||
PASS: actual probe binds native events to fresh immutable commits, permits delayed emission, rejects unrelated expiry closure and premature stop
|
||||
RUN test_diagnostic_no_splash.py
|
||||
PASS: actual noSplash Load body requires both explicit diagnostic and noSplash, preserves vanilla otherwise, and handles repeated Load/reload
|
||||
RUN test_casualty_incapacitation.py
|
||||
PASS: actual fixture method permits one native resilience operation and restores either prior protection state, including failure paths
|
||||
RUN test_casualty_remove_probe.py
|
||||
PASS: actual safe-exit boundary policy, native action/door selection, stop/cache cleanup, separate old mechanism and opt-in runner contracts
|
||||
RUN test_extraction_placement_policy.py
|
||||
PASS: actual one-shot deadline/stability policies and preparation ownership, fuel, cleanup integration contracts
|
||||
RUN test_guard_cancellation_policy.py
|
||||
PASS: pending-only cancellation retires copied instance intent, preserves physical/control actors, and stops once
|
||||
RUN test_casualty_ground_policy.py
|
||||
PASS: actual short-cast hit, upward support normal, no self support and no dynamic support
|
||||
RUN test_casualty_reservation_death.py
|
||||
PASS: actual committed-ticket structure preserves reservation after death, rejects missing bodies/seats and ends at observation expiry
|
||||
PASS: actual pending callback expires an empty-server reservation once, preserves its full lease, and cancels on completion/Stop
|
||||
RUN test_casualty_loading_policy.py
|
||||
PASS: rescue lease expiry/reordering, fresh five-second settling, independent rescue ranges and grounded upright aircraft motion boundaries
|
||||
RUN test_initial_guard_policy.py
|
||||
PASS: requested guard population requires complete physical conscious membership before deadline
|
||||
RUN test_headless_game_runner.py
|
||||
......................................
|
||||
----------------------------------------------------------------------
|
||||
Ran 38 tests in 0.018s
|
||||
|
||||
OK
|
||||
RUN test_vanilla_game_control.py
|
||||
..........
|
||||
----------------------------------------------------------------------
|
||||
Ran 10 tests in 0.002s
|
||||
|
||||
OK
|
||||
RUN test_archive_game_control.py
|
||||
.....
|
||||
----------------------------------------------------------------------
|
||||
Ran 5 tests in 0.839s
|
||||
|
||||
OK
|
||||
RUN test_site_discovery_policy.py
|
||||
PASS: authored radio/optional-site bounds and physical horizontal/vertical boundaries
|
||||
RUN test_faction_catalog_scope.py
|
||||
...
|
||||
----------------------------------------------------------------------
|
||||
Ran 3 tests in 0.001s
|
||||
|
||||
OK
|
||||
RUN test_mission_rules.py
|
||||
PASS: all phase transitions, terminal states, defence boundaries, stale/future observations, intel discovery
|
||||
RUN test_admin_setting_policy.py
|
||||
PASS: Core document-discovery alias, companion-only alias exclusion, strict integer parsing and setting boundaries
|
||||
RUN test_player_admission_policy.py
|
||||
PASS: player admission phase/life/identity/controller matrix, preload displacement limits, pending reservation overlap and owner exclusion
|
||||
RUN test_progression_identity.py
|
||||
PASS: actual gate and pre-inventory document guards reject noncanonical/faction/life/disconnect/server mismatches; canonical reconnect and unconscious carried intel preserved
|
||||
PASS: WB-only native fault injection restores both body mutations before checks/returns and requires eligible held-document negative/positive proof; runtime pending
|
||||
RUN test_discovery_map_position.py
|
||||
PASS: actual discovery coordinates disclose stable 500m cell center until identified, then exact point, including negative/boundary coordinates
|
||||
RUN test_site_map_visibility.py
|
||||
PASS: hidden/anonymous/rough/identified markers, toggle transitions, prepared sites, no identity leakage, intel discovery and replicated authority wiring
|
||||
RUN test_local_admission.py
|
||||
PASS: actual local admission context/selection/latch, same-round late identity, replacement/mode failure, fresh round and untouched network path
|
||||
RUN test_prison_placement_policy.py
|
||||
PASS: prison search packs 16 unique 3m-spaced inside-wall centers, prioritizes inner/edge positions and never bypasses clearance
|
||||
PASS: physical body occupancy rejects overlap, permits diagonal neighboring slots, and excludes own body and unrelated broad-phase bounds
|
||||
RUN test_recovery_policy.py
|
||||
PASS: recovery state excludes dead bodies, preserves reservations, requires controlled rescuers and distinguishes empty/all-dead teams
|
||||
RUN test_native_inventory_hitzone.py
|
||||
PASS: actual native-probe lifecycle/counters with doubled boundaries; fixed deadline, exact seven sources, true forwarding, async close, no late updates and selector wiring
|
||||
RUN test_inventory_hitzone_compat.py
|
||||
PASS: actual one-argument adapter, explicit refresh, native initialization flag, duplicate/blood ownership, rebind/detach/destruction and foreign-mode transparency
|
||||
RUN test_player_medical.py
|
||||
PASS: authority-scoped slow recovery, bleeding pauses resilience, medicine unaffected, player-only lethal damage cap without healing
|
||||
PASS: bleeding severity survives low health, retains armour, causes no knockout and restores the actual damage/blood-loss cap
|
||||
PASS: viable passive recovery survives native delay; bleeding, disabled/full effects and low-blood resilience do not block defeat
|
||||
RUN test_time_policy.py
|
||||
PASS: every minute round-trips, malformed clocks rejected, defaults limited to added keys, progression bounds and day duration aligned
|
||||
RUN test_environment_policy.py
|
||||
PASS: native settings policy matches calendar boundaries 1900-2050, date/profile parsing is strict, authored defaults preserve old worlds
|
||||
RUN test_view_distance.py
|
||||
PASS: view-distance bounds, default, save failures, command parsing, temporary ownership, server/platform limits and lifecycle wiring
|
||||
RUN test_environment_restart_runner.py
|
||||
.....
|
||||
----------------------------------------------------------------------
|
||||
Ran 5 tests in 0.516s
|
||||
|
||||
OK
|
||||
RUN test_inventory_enumeration_policy.py
|
||||
.
|
||||
----------------------------------------------------------------------
|
||||
Ran 1 test in 0.318s
|
||||
|
||||
OK
|
||||
RUN test_radio_defence_policy.py
|
||||
PASS: radio authorization/discovery/phase matrix, exact distance limits, defender handover, interruption, empty samples, clock regression and duration boundary
|
||||
RUN test_radio_feedback_policy.py
|
||||
PASS: actual radio feedback policy, initial wait, interruption persistence, resumption and terminal/new-round reset
|
||||
RUN test_performance_comparison.py
|
||||
...............
|
||||
----------------------------------------------------------------------
|
||||
Ran 15 tests in 2.030s
|
||||
|
||||
OK
|
||||
RUN test_release_check.py
|
||||
..............................................
|
||||
----------------------------------------------------------------------
|
||||
Ran 46 tests in 0.806s
|
||||
|
||||
OK
|
||||
RUN test_settings_migration.py
|
||||
PASS: legacy values preserved, unsupported fields reported, invalid data rejected, existing files protected, runtime bounds aligned
|
||||
PASS: failed initial settings promotion leaves defaults writable after restart; prior/fallback saves survive copy, readback and mismatch faults
|
||||
RUN hq_network_regression.py
|
||||
PASS: real-carrier shortest-hop paths, 500m boundary, three-hop cap, no-manpack failure, three-second originating-call interruption, unchanged downlink hop timing, completed-hop survival, interrupted final uplink, radio loss, capture, motion, timeout, reset and network bounds
|
||||
RUN helicopter_availability_regression.py
|
||||
PASS: migrated aircraft availability policy (controller migration still pending)
|
||||
RUN mortar_salvo_regression.py
|
||||
PASS: migrated salvo offsets are deterministic, spread and bounded (native firing and complete salvo qualification are separate)
|
||||
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"date": "2026-11-05",
|
||||
"head": "9418b6950a12610361d96a99d058e9e10de03713",
|
||||
"result": {
|
||||
"exit_code": 0,
|
||||
"seconds": 272.98,
|
||||
"input_files": 1229,
|
||||
"changed_inputs": [],
|
||||
"native_run": false,
|
||||
"local_socket_tests_allowed": true
|
||||
},
|
||||
"changes": [
|
||||
"Observer ownership test doubles now support the already committed hint clock, debounce state and silent ShowCustom parameter; all behavioral assertions unchanged.",
|
||||
"Preparation status test expects the already committed 120-second results delay using exact line equality; current terrain-takeover documentation agrees."
|
||||
],
|
||||
"initial_failures": [
|
||||
"Default sandbox denied loopback sockets for synthetic speech test; resolved by scoped elevated offline test execution.",
|
||||
"Observer ownership test compilation used stale native doubles.",
|
||||
"After observer repair, preparation status test expected obsolete10second prefab default."
|
||||
],
|
||||
"independent_reviews": [
|
||||
"Intel discovery and shared spent-document custody: no demonstrated defect; three existing checks pass.",
|
||||
"Radio defence conscious/canonical eligibility and empty-server reset: no demonstrated defect; read-only review.",
|
||||
"Reconnect identity and partial results: no demonstrated defect; read-only review.",
|
||||
"Earlier lifecycle/terminal cleanup review: no demonstrated defect."
|
||||
],
|
||||
"production_changed_this_continuation": false,
|
||||
"native_run": false,
|
||||
"installed_or_published_by_this_continuation": false,
|
||||
"original_workspace_modified_by_this_continuation": false,
|
||||
"limits": [
|
||||
"Offline source and policy validation only; native APIs are doubled in many tests.",
|
||||
"No new engine compilation, manual gameplay, multiplayer, packaging or comparative FPS qualification.",
|
||||
"Existing HQ recovery and objective guidance corrections retained."
|
||||
],
|
||||
"index_unchanged": true
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
ERR_GameMode : "{0F307326459A1395}Prefabs/MP/Modes/GameMode_Base.et" {
|
||||
ID "17B3CC49610F4ADE"
|
||||
components {
|
||||
SCR_GameOverScreenManagerComponent "{56DEC646298AD219}" {
|
||||
m_GameOverScreenConfig SCR_GameOverScreenConfig "{56DEC6462FFDD82D}" : "{F6633922A25F9441}Configs/ERR/GameOverScreens.conf" {}
|
||||
}
|
||||
ERR_ScenarioComponent "{B78E910E88DE30D2}" {
|
||||
m_Definition "{BC310DC0CD27F523}Configs/ERR/EveronSites.conf"
|
||||
}
|
||||
SCR_RespawnSystemComponent "{56B2B4793051E7C9}" {
|
||||
m_SpawnLogic ERR_SpawnLogic "{79AD722B2EFD595F}" {}
|
||||
}
|
||||
}
|
||||
m_fAutoReloadTime 120
|
||||
m_bUseSpawnPreload 1
|
||||
}
|
||||
+546
@@ -0,0 +1,546 @@
|
||||
enum ERR_ObserverReason
|
||||
{
|
||||
NONE,
|
||||
SPENT_LIFE,
|
||||
LATE_EXTRACTION,
|
||||
SPAWN_UNAVAILABLE,
|
||||
UNCONSCIOUS
|
||||
}
|
||||
|
||||
class ERR_ObserverRules
|
||||
{
|
||||
static int Cycle(bool enabled, bool left, bool right, bool previousLeft, bool previousRight)
|
||||
{
|
||||
if (!enabled || left == right) return 0;
|
||||
if (left && !previousLeft) return -1;
|
||||
if (right && !previousRight) return 1;
|
||||
return 0;
|
||||
}
|
||||
static bool Toggle(bool enabled, bool pressed, bool previous)
|
||||
{
|
||||
return enabled && pressed && !previous;
|
||||
}
|
||||
static bool Casualty(bool active, bool currentBody, bool alive, bool conscious)
|
||||
{
|
||||
return active && currentBody && alive && !conscious;
|
||||
}
|
||||
static bool View(int reason, bool active, bool alive, bool conscious)
|
||||
{
|
||||
if (!active || reason == ERR_ObserverReason.NONE) return false;
|
||||
if (reason == ERR_ObserverReason.UNCONSCIOUS) return alive && !conscious;
|
||||
return !alive;
|
||||
}
|
||||
}
|
||||
|
||||
// Presentation only. Existing server admission and observer selection own state.
|
||||
class ERR_ObserverGuidance
|
||||
{
|
||||
static string Message(int reason, bool survivorAvailable)
|
||||
{
|
||||
if (reason == ERR_ObserverReason.NONE) return "";
|
||||
string message = "You are spectating until the next round.";
|
||||
if (reason == ERR_ObserverReason.SPENT_LIFE)
|
||||
message = "Your life for this round has been used. You can play again next round.";
|
||||
else if (reason == ERR_ObserverReason.LATE_EXTRACTION)
|
||||
message = "Extraction has started. New prisoners can join next round.";
|
||||
else if (reason == ERR_ObserverReason.SPAWN_UNAVAILABLE)
|
||||
message = "Your prisoner could not be spawned. You are spectating until the next round.";
|
||||
else if (reason == ERR_ObserverReason.UNCONSCIOUS)
|
||||
{
|
||||
message = "You are unconscious. Your body remains where you fell and teammates can still treat you. Your view returns automatically when you wake up.";
|
||||
if (!survivorAvailable) return message + " No conscious teammate is currently available; the camera stays near your body. Use camera look controls to orbit and zoom controls to change distance.";
|
||||
}
|
||||
if (!survivorAvailable)
|
||||
return message + " No teammate or body is currently available to follow. Use camera look controls to orbit the last known position and zoom controls to change distance.";
|
||||
return message + " Press Left / Right arrow to change teammate or body, including your own (or /esc spectate next / /esc spectate previous). Press Enter to switch between third-person and the living teammate's camera. Player view waits in third-person if no live camera stream is available. Use camera look controls to orbit and zoom controls to change distance in third-person.";
|
||||
}
|
||||
static bool Refresh(bool shown, int previousReason, int reason, bool previousAvailable, bool survivorAvailable)
|
||||
{
|
||||
return reason != ERR_ObserverReason.NONE && (!shown || previousReason != reason || previousAvailable != survivorAvailable);
|
||||
}
|
||||
}
|
||||
|
||||
class ERR_ObserverCameraClass : SCR_ManualCameraClass {}
|
||||
|
||||
// Retain the native config registration when extending this serialized core.
|
||||
[BaseContainerProps(configRoot: true)]
|
||||
modded class SCR_ChatPanelManager
|
||||
{
|
||||
bool ERR_HasOpenChatPanel()
|
||||
{
|
||||
foreach (SCR_ChatPanel panel : m_aChatPanels)
|
||||
if (panel && panel.IsOpen()) return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
class ERR_ObserverChatInput
|
||||
{
|
||||
static bool Capture()
|
||||
{
|
||||
SCR_ChatPanelManager manager = SCR_ChatPanelManager.GetInstance();
|
||||
bool chatOpen = manager && manager.ERR_HasOpenChatPanel();
|
||||
bool editing;
|
||||
Widget focused = GetGame().GetWorkspace().GetFocusedWidget();
|
||||
while (focused)
|
||||
{
|
||||
// A HUD stopping drawing can unregister a panel before its focused edit
|
||||
// widget closes. Keep that still-open native panel's send action available.
|
||||
SCR_ChatPanel panel = SCR_ChatPanel.Cast(focused.FindHandler(SCR_ChatPanel));
|
||||
if (panel && panel.IsOpen()) chatOpen = true;
|
||||
if (EditBoxWidget.Cast(focused)) editing = true;
|
||||
focused = focused.GetParent();
|
||||
}
|
||||
InputManager input = GetGame().GetInputManager();
|
||||
// IsOpen is immediate; vanilla refreshes ChatContext later in its HUD update.
|
||||
// Renew only for an actual open chat, never for an unrelated password box.
|
||||
if (chatOpen) input.ActivateContext("ChatContext", 1);
|
||||
return chatOpen || editing || input.IsContextActive("ChatContext");
|
||||
}
|
||||
}
|
||||
|
||||
// Gate before SCR_ManualCamera activates its context: disabling only the follow
|
||||
// component is too late, since the camera context can already consume chat keys.
|
||||
class ERR_ObserverCamera : SCR_ManualCamera
|
||||
{
|
||||
override protected bool IsDisabledByMenu()
|
||||
{
|
||||
if (super.IsDisabledByMenu()) return true;
|
||||
return ERR_ObserverChatInput.Capture();
|
||||
}
|
||||
}
|
||||
|
||||
// A local follow camera. It never possesses its target or offers free flight.
|
||||
[BaseContainerProps(), SCR_BaseManualCameraComponentTitle()]
|
||||
class ERR_FollowSurvivorCameraComponent : SCR_BaseManualCameraComponent
|
||||
{
|
||||
protected IEntity m_Target;
|
||||
protected IEntity m_Vehicle;
|
||||
protected float m_Yaw = 180;
|
||||
protected float m_Pitch = 20;
|
||||
protected float m_Distance = 5;
|
||||
protected bool m_LeftDown, m_RightDown, m_EnterDown;
|
||||
protected int m_InputResumeFrames;
|
||||
protected bool m_PlayerView;
|
||||
protected ref ERR_ObserverHeadVisibility m_ViewHead = new ERR_ObserverHeadVisibility();
|
||||
protected float m_OrbitFov, m_OrbitNear;
|
||||
protected ref ERR_ObserverScopeDisplay m_ScopeDisplay = new ERR_ObserverScopeDisplay();
|
||||
protected ref ERR_ObserverPIPDisplay m_PIPDisplay = new ERR_ObserverPIPDisplay();
|
||||
protected bool m_InputContextActive;
|
||||
protected bool m_SpaceDown;
|
||||
bool InputContextActive() { return m_InputContextActive; }
|
||||
bool IsPlayerView() { return m_PlayerView; }
|
||||
// Process one edge per press; menus still consume the state so holding a key
|
||||
// while closing a menu cannot unexpectedly change the followed teammate.
|
||||
void Input(bool enabled, bool left, bool right, bool enter, bool space = false)
|
||||
{
|
||||
// An inactive context reports zero even while a physical key is held. Let
|
||||
// the reactivated context settle, then require release before accepting keys.
|
||||
if (!enabled) m_InputResumeFrames = 2;
|
||||
else if (m_InputResumeFrames > 0)
|
||||
{
|
||||
enabled = false;
|
||||
if (m_InputResumeFrames > 1 || (!left && !right && !enter && !space)) m_InputResumeFrames--;
|
||||
}
|
||||
SCR_PlayerController controller = SCR_PlayerController.Cast(GetGame().GetPlayerController());
|
||||
int cycle = ERR_ObserverRules.Cycle(enabled, left, right, m_LeftDown, m_RightDown);
|
||||
if (controller && cycle != 0) controller.ERR_CycleObserver(cycle);
|
||||
if (ERR_ObserverRules.Toggle(enabled, enter, m_EnterDown)) m_PlayerView = !m_PlayerView;
|
||||
if (controller && ERR_ObserverRules.Toggle(enabled, space, m_SpaceDown)) controller.ERR_UseSelfEpinephrine();
|
||||
m_SpaceDown = space;
|
||||
m_LeftDown = left; m_RightDown = right; m_EnterDown = enter;
|
||||
}
|
||||
override bool EOnCameraInit()
|
||||
{
|
||||
// Release a held jump key after knockout before accepting self-injection.
|
||||
m_InputResumeFrames = 2;
|
||||
m_OrbitFov = GetCameraEntity().GetVerticalFOV();
|
||||
m_OrbitNear = GetCameraEntity().GetNearPlane();
|
||||
return true;
|
||||
}
|
||||
override void EOnCameraExit() { m_PIPDisplay.Close(); m_ScopeDisplay.Close(); m_ViewHead.Restore(); }
|
||||
override void EOnCameraFrame(SCR_ManualCameraParam param)
|
||||
{
|
||||
SCR_PlayerController controller = SCR_PlayerController.Cast(GetGame().GetPlayerController());
|
||||
if (!controller || GetGame().GetCameraManager().CurrentCamera() != GetCameraEntity()) { m_PIPDisplay.Close(); m_ScopeDisplay.Close(); m_ViewHead.Restore(); return; }
|
||||
m_InputContextActive = GetInputManager().IsContextActive("ERR_ObserverContext");
|
||||
Input(param.isManualInputEnabled, GetInputManager().GetActionValue("ERR_ObserverPrevious") > 0.5, GetInputManager().GetActionValue("ERR_ObserverNext") > 0.5, GetInputManager().GetActionValue("ERR_ObserverView") > 0.5, GetInputManager().GetActionValue("ERR_SelfEpinephrine") > 0.5);
|
||||
IEntity target = controller.ERR_ObservedEntity();
|
||||
float fov, nearPlane;
|
||||
if (m_PlayerView && controller.ERR_ReadPlayerView(target, param.timeSlice, param.transform, fov, nearPlane))
|
||||
{
|
||||
param.fov = fov; GetCameraEntity().SetNearPlane(nearPlane);
|
||||
RplId scopeWeapon; vector scopeData;
|
||||
controller.ERR_ReadScope(scopeWeapon, scopeData);
|
||||
SCR_2DOpticsComponent optic = ERR_ObserverScope.Resolve(target, scopeWeapon, scopeData);
|
||||
IEntity weapon;
|
||||
if (optic)
|
||||
{
|
||||
RplComponent weaponRpl = RplComponent.Cast(Replication.FindItem(scopeWeapon));
|
||||
if (weaponRpl) weapon = weaponRpl.GetEntity();
|
||||
}
|
||||
vector eye[4], geometry;
|
||||
float eyeFov, eyeNear, pipFov, vignette;
|
||||
// Read both timelines every camera frame, including the 2D fallback, so
|
||||
// enabling PiP cannot resume an eye camera from a different time.
|
||||
bool haveEye = controller.ERR_ReadPlayerEye(target, param.timeSlice, eye, eyeFov, eyeNear, pipFov, geometry, vignette);
|
||||
bool pip = haveEye && param.isManualInputEnabled && optic && weapon;
|
||||
if (pip) pip = m_PIPDisplay.Render(optic, param.transform, eye, fov, pipFov, scopeData, geometry, vignette);
|
||||
if (pip)
|
||||
{
|
||||
m_ScopeDisplay.Close();
|
||||
Math3D.MatrixCopy(eye, param.transform);
|
||||
param.fov = eyeFov; GetCameraEntity().SetNearPlane(eyeNear);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_PIPDisplay.Close();
|
||||
if (!param.isManualInputEnabled || !optic || !weapon || !m_ScopeDisplay.RenderScope(optic, weapon, fov, scopeData)) m_ScopeDisplay.Close();
|
||||
}
|
||||
m_ViewHead.Update(target, param.transform[3]);
|
||||
param.isDirty = true;
|
||||
return;
|
||||
}
|
||||
// No estimated head camera: corpses, streaming gaps and expired samples use
|
||||
// the stable follow view until an authenticated live camera stream arrives.
|
||||
m_PIPDisplay.Close(); m_ScopeDisplay.Close();
|
||||
m_ViewHead.Restore();
|
||||
param.fov = m_OrbitFov; GetCameraEntity().SetNearPlane(m_OrbitNear);
|
||||
vector aim = controller.ERR_ObserverAnchor() + "0 1.5 0";
|
||||
IEntity exclude = target;
|
||||
IEntity vehicle;
|
||||
if (target)
|
||||
{
|
||||
vehicle = CompartmentAccessComponent.GetVehicleIn(target);
|
||||
vector transform[4];
|
||||
if (vehicle)
|
||||
{
|
||||
vehicle.GetWorldTransform(transform);
|
||||
vector lower, upper;
|
||||
vehicle.GetWorldBounds(lower, upper);
|
||||
aim = (lower + upper) * 0.5;
|
||||
exclude = vehicle;
|
||||
}
|
||||
else
|
||||
{
|
||||
target.GetWorldTransform(transform);
|
||||
aim = transform[3] + "0 1.5 0";
|
||||
if (!ERR_Actors.CanFight(target)) aim = transform[3] + "0 0.4 0";
|
||||
}
|
||||
if (target != m_Target || vehicle != m_Vehicle)
|
||||
{
|
||||
vector angles = transform[2].VectorToAngles();
|
||||
m_Yaw = angles[0] + 180; m_Pitch = 20; m_Distance = 5;
|
||||
if (vehicle) m_Distance = 12;
|
||||
m_Target = target; m_Vehicle = vehicle;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// A lone casualty, an all-down squad or an entity still streaming can have
|
||||
// only an anchor. Keep orbit controls and forget the previous vehicle limits.
|
||||
m_Target = null; m_Vehicle = null;
|
||||
m_Distance = Math.Clamp(m_Distance, 2, 12);
|
||||
}
|
||||
if ((!m_PlayerView || !target || !ERR_Actors.CanFight(target)) && param.isManualInputEnabled)
|
||||
{
|
||||
m_Yaw += GetInputManager().GetActionValue("ManualCameraRotateYaw") * 90 * param.timeSlice;
|
||||
m_Pitch = Math.Clamp(m_Pitch - GetInputManager().GetActionValue("ManualCameraRotatePitch") * 90 * param.timeSlice, 5, 75);
|
||||
float scale = Math.Clamp(1 + GetInputManager().GetActionValue("ManualCameraZoom") * 12 * param.timeSlice, 0.5, 1.5);
|
||||
float minimum = 2, maximum = 12;
|
||||
if (vehicle) { minimum = 6; maximum = 25; }
|
||||
m_Distance = Math.Clamp(m_Distance * scale, minimum, maximum);
|
||||
}
|
||||
float yaw = m_Yaw * Math.DEG2RAD, pitch = m_Pitch * Math.DEG2RAD;
|
||||
vector offset = Vector(Math.Sin(yaw) * Math.Cos(pitch), Math.Sin(pitch), Math.Cos(yaw) * Math.Cos(pitch));
|
||||
vector position = aim + offset * m_Distance;
|
||||
TraceParam trace = new TraceParam();
|
||||
trace.Start = aim;
|
||||
trace.End = position;
|
||||
trace.Flags = TraceFlags.WORLD | TraceFlags.ENTS;
|
||||
trace.LayerMask = TRACE_LAYER_CAMERA;
|
||||
trace.Exclude = exclude;
|
||||
float fraction = GetCameraEntity().GetWorld().TraceMove(trace, null);
|
||||
if (fraction < 1) position = vector.Lerp(aim, position, Math.Max(0.05, fraction - 0.05));
|
||||
Math3D.DirectionAndUpMatrix(vector.Direction(position, aim), "0 1 0", param.transform);
|
||||
param.transform[3] = position;
|
||||
param.isDirty = true;
|
||||
}
|
||||
}
|
||||
|
||||
modded class SCR_PlayerController
|
||||
{
|
||||
[RplProp()]
|
||||
protected ERR_ObserverReason m_ERRObserverReason;
|
||||
[RplProp()]
|
||||
protected RplId m_ERRObservedId = RplId.Invalid();
|
||||
[RplProp()]
|
||||
protected vector m_ERRObserverAnchor;
|
||||
protected IEntity m_ERRServerObserved;
|
||||
protected IEntity m_ERRServerObservedVehicle;
|
||||
protected SCR_ManualCamera m_ERRObserverCamera;
|
||||
protected bool m_ERRObserverMonitor;
|
||||
protected bool m_ERRObserverReady;
|
||||
protected ERR_ObserverReason m_ERRShownObserverReason;
|
||||
protected bool m_ERRShownObserverAvailable;
|
||||
protected string m_ERRShownRecoveryStatus;
|
||||
protected string m_ERRPendingRecoveryStatus;
|
||||
protected int m_ERRRecoveryStatusSince;
|
||||
protected float m_ERRLastCycle = -1000;
|
||||
protected IEntity m_ERRRecoveryBody;
|
||||
protected float m_ERRRecoveryDeadline = -1;
|
||||
|
||||
// Optional casualty action is implemented by the self-epinephrine extension.
|
||||
string ERR_SelfEpinephrineHint() { return ""; }
|
||||
void ERR_UseSelfEpinephrine() {}
|
||||
ERR_ObserverReason ERR_ObserverState() { return m_ERRObserverReason; }
|
||||
vector ERR_ObserverAnchor() { return m_ERRObserverAnchor; }
|
||||
IEntity ERR_ObservedEntity()
|
||||
{
|
||||
RplComponent component = RplComponent.Cast(Replication.FindItem(m_ERRObservedId));
|
||||
if (!component) return null;
|
||||
return component.GetEntity();
|
||||
}
|
||||
bool ERR_HasObserverCamera() { return m_ERRObserverCamera != null; }
|
||||
|
||||
void ERR_SetObserver(ERR_ObserverReason reason)
|
||||
{
|
||||
if (!Replication.IsServer()) return;
|
||||
if (reason != ERR_ObserverReason.NONE && ERR_Actors.Alive(GetControlledEntity()) && reason != ERR_ObserverReason.UNCONSCIOUS) return;
|
||||
m_ERRObserverReason = reason;
|
||||
ERR_GameMode mode = ERR_GameMode.Get();
|
||||
if (mode && reason != ERR_ObserverReason.NONE) m_ERRObserverAnchor = mode.PrisonPosition();
|
||||
if (reason == ERR_ObserverReason.NONE) ERR_ReleaseObserved();
|
||||
Replication.BumpMe();
|
||||
ERR_UpdateObserverServer();
|
||||
}
|
||||
|
||||
protected void ERR_StreamObserved(IEntity entity, bool normalStreaming)
|
||||
{
|
||||
RplIdentity identity = GetRplIdentity();
|
||||
if (!identity.IsValid() || identity == RplIdentity.Local() || !entity) return;
|
||||
RplComponent component = RplComponent.Cast(entity.FindComponent(RplComponent));
|
||||
if (component) component.EnableStreamingConNode(identity, normalStreaming);
|
||||
}
|
||||
protected void ERR_ReleaseObserved()
|
||||
{
|
||||
ERR_StreamObserved(m_ERRServerObserved, true);
|
||||
ERR_StreamObserved(m_ERRServerObservedVehicle, true);
|
||||
m_ERRServerObserved = null;
|
||||
m_ERRServerObservedVehicle = null;
|
||||
m_ERRObservedId = RplId.Invalid();
|
||||
}
|
||||
void ERR_UpdateObserverServer(int direction = 0)
|
||||
{
|
||||
if (!Replication.IsServer()) return;
|
||||
ERR_GameMode mode = ERR_GameMode.Get();
|
||||
IEntity body = GetControlledEntity();
|
||||
bool casualty = mode && ERR_ObserverRules.Casualty(mode.Active(), mode.Players() && mode.Players().CurrentActor(body) != null, ERR_Actors.Alive(body), ERR_Actors.CanFight(body));
|
||||
if (casualty && m_ERRObserverReason != ERR_ObserverReason.UNCONSCIOUS)
|
||||
{
|
||||
m_ERRObserverReason = ERR_ObserverReason.UNCONSCIOUS;
|
||||
m_ERRObserverAnchor = body.GetOrigin();
|
||||
}
|
||||
if (m_ERRObserverReason == ERR_ObserverReason.UNCONSCIOUS && !ERR_Actors.Alive(body)) m_ERRObserverReason = ERR_ObserverReason.SPENT_LIFE;
|
||||
// Death can leave the controller attached to its corpse, so entity-lost is
|
||||
// not a reliable trigger (especially with the last/only player).
|
||||
ERR_PlayerLife life;
|
||||
if (mode && mode.Players()) life = mode.Players().Get(GetPlayerId());
|
||||
if (mode && mode.Active() && life && life.UsedLife && life.Actor && !ERR_Actors.Alive(life.Actor) && !ERR_Actors.Alive(body) && m_ERRObserverReason == ERR_ObserverReason.NONE)
|
||||
{
|
||||
m_ERRObserverReason = ERR_ObserverReason.SPENT_LIFE;
|
||||
m_ERRObserverAnchor = life.Actor.GetOrigin();
|
||||
}
|
||||
if (m_ERRObserverReason == ERR_ObserverReason.NONE) return;
|
||||
if (!mode || !mode.Active() || (ERR_Actors.Alive(body) && !casualty) || (m_ERRObserverReason == ERR_ObserverReason.UNCONSCIOUS && !casualty))
|
||||
{
|
||||
m_ERRObserverReason = ERR_ObserverReason.NONE;
|
||||
ERR_ReleaseObserved();
|
||||
Replication.BumpMe();
|
||||
return;
|
||||
}
|
||||
array<IEntity> survivors = {};
|
||||
ERR_Actors.Players(survivors);
|
||||
Faction friendly = mode.PlayerFaction();
|
||||
for (int i = survivors.Count() - 1; i >= 0; i--)
|
||||
if (survivors[i] == body || (casualty && !ERR_Actors.CanFight(survivors[i])) || !friendly || !mode.Players() || !mode.Players().CurrentActor(survivors[i]) || SCR_FactionManager.SGetFaction(survivors[i]) != friendly) survivors.RemoveOrdered(i);
|
||||
// Dead teammates remain selectable alongside survivors, including our own body.
|
||||
ERR_ObserverTargets.Bodies(mode, survivors);
|
||||
// Lethal damage normally leaves a treatable casualty, not a native corpse.
|
||||
// Keep that player's own canonical body in the cycle without possessing it.
|
||||
if (casualty && !survivors.Contains(body)) survivors.Insert(body);
|
||||
int index = survivors.Find(m_ERRServerObserved);
|
||||
if (index < 0)
|
||||
{
|
||||
if (!casualty && life && life.Actor) index = survivors.Find(life.Actor);
|
||||
if (index < 0) index = 0;
|
||||
}
|
||||
else index += direction;
|
||||
if (index < 0) index = survivors.Count() - 1;
|
||||
if (index >= survivors.Count()) index = 0;
|
||||
IEntity target;
|
||||
if (!survivors.IsEmpty()) target = survivors[index];
|
||||
if (target != m_ERRServerObserved)
|
||||
{
|
||||
ERR_ReleaseObserved();
|
||||
m_ERRServerObserved = target;
|
||||
if (target)
|
||||
{
|
||||
RplComponent component = RplComponent.Cast(target.FindComponent(RplComponent));
|
||||
if (component) m_ERRObservedId = component.Id();
|
||||
ERR_StreamObserved(target, false);
|
||||
}
|
||||
}
|
||||
if (target)
|
||||
{
|
||||
m_ERRObserverAnchor = target.GetOrigin();
|
||||
IEntity vehicle = CompartmentAccessComponent.GetVehicleIn(target);
|
||||
if (vehicle != m_ERRServerObservedVehicle)
|
||||
{
|
||||
ERR_StreamObserved(m_ERRServerObservedVehicle, true);
|
||||
m_ERRServerObservedVehicle = vehicle;
|
||||
ERR_StreamObserved(vehicle, false);
|
||||
}
|
||||
}
|
||||
else if (casualty) m_ERRObserverAnchor = body.GetOrigin();
|
||||
Replication.BumpMe();
|
||||
}
|
||||
void ERR_CycleObserver(int direction)
|
||||
{
|
||||
if (this == GetGame().GetPlayerController()) Rpc(ERR_RequestObserverCycle, direction);
|
||||
}
|
||||
[RplRpc(RplChannel.Reliable, RplRcver.Server)]
|
||||
protected void ERR_RequestObserverCycle(int direction)
|
||||
{
|
||||
if (!Replication.IsServer() || (direction != -1 && direction != 1)) return;
|
||||
float now = GetGame().GetWorld().GetWorldTime();
|
||||
if (now - m_ERRLastCycle < 250) return;
|
||||
m_ERRLastCycle = now;
|
||||
ERR_UpdateObserverServer(direction);
|
||||
}
|
||||
|
||||
void ERR_StartObserverMonitor()
|
||||
{
|
||||
if (this != GetGame().GetPlayerController() || System.IsConsoleApp() || m_ERRObserverMonitor) return;
|
||||
m_ERRObserverMonitor = true;
|
||||
ERR_OnObserverMonitorStarted();
|
||||
GetGame().GetCallqueue().CallLater(ERR_UpdateObserverClient, 250, true);
|
||||
}
|
||||
protected void ERR_OnObserverMonitorStarted() {}
|
||||
protected void ERR_UpdateObserverClient()
|
||||
{
|
||||
if (!GetGame()) return;
|
||||
if (this != GetGame().GetPlayerController())
|
||||
{
|
||||
// A replaced controller may retain its timer until native destruction.
|
||||
// Release only its presentation; never restore its old body camera.
|
||||
GetGame().GetCallqueue().Remove(ERR_UpdateObserverClient);
|
||||
m_ERRObserverMonitor = false;
|
||||
m_ERRRecoveryBody = null; m_ERRRecoveryDeadline = -1;
|
||||
ERR_CloseObserverCamera();
|
||||
return;
|
||||
}
|
||||
ERR_GameMode mode = ERR_GameMode.Get();
|
||||
ERR_UpdateRecoveryCamera(mode);
|
||||
bool observe = mode && ERR_ObserverRules.View(m_ERRObserverReason, mode.Active(), ERR_Actors.Alive(GetControlledEntity()), ERR_Actors.CanFight(GetControlledEntity()));
|
||||
if (!observe)
|
||||
{
|
||||
ERR_CloseObserverCamera();
|
||||
return;
|
||||
}
|
||||
SCR_EditorManagerEntity editor = SCR_EditorManagerEntity.GetInstance();
|
||||
if (editor && editor.IsOpened()) return;
|
||||
if (!m_ERRObserverCamera)
|
||||
{
|
||||
Resource resource = Resource.Load("{EB1210AAE1BB8F54}Prefabs/ERR/SpectatorCamera.et");
|
||||
if (!resource || !resource.IsValid()) return;
|
||||
EntitySpawnParams params = new EntitySpawnParams();
|
||||
params.TransformMode = ETransformMode.WORLD;
|
||||
params.Transform[3] = m_ERRObserverAnchor + "0 5 -6";
|
||||
m_ERRObserverCamera = SCR_ManualCamera.Cast(GetGame().SpawnEntityPrefabLocal(resource, GetGame().GetWorld(), params));
|
||||
if (!m_ERRObserverCamera) return;
|
||||
}
|
||||
CameraManager manager = GetGame().GetCameraManager();
|
||||
if (!manager) return;
|
||||
// Native death/respawn camera changes can arrive after our camera is created.
|
||||
if (manager.CurrentCamera() != m_ERRObserverCamera) manager.SetCamera(m_ERRObserverCamera);
|
||||
if (manager.CurrentCamera() != m_ERRObserverCamera) return;
|
||||
SCR_RespawnSystemComponent respawn = SCR_RespawnSystemComponent.GetInstance();
|
||||
if (respawn) respawn.DestroyLoadingPlaceholder();
|
||||
// The server-selected replicated ID distinguishes no target from a target
|
||||
// whose local entity is still streaming. Never imply no survivors from delay.
|
||||
bool survivorAvailable = m_ERRObservedId != RplId.Invalid();
|
||||
string recovery = mode.RecoveryStatus();
|
||||
string selfEpiHint = ERR_SelfEpinephrineHint();
|
||||
if (!selfEpiHint.IsEmpty()) recovery += "\n" + selfEpiHint;
|
||||
bool contextChanged = ERR_ObserverGuidance.Refresh(m_ERRObserverReady, m_ERRShownObserverReason, m_ERRObserverReason, m_ERRShownObserverAvailable, survivorAvailable);
|
||||
int now = System.GetTickCount();
|
||||
// Medical samples can alternate between improving and stalled. Keep the
|
||||
// accepted hint readable until the new status has remained stable for 3s.
|
||||
// This affects presentation only, never the authoritative defeat timer.
|
||||
if (m_ERRPendingRecoveryStatus != recovery || now < m_ERRRecoveryStatusSince)
|
||||
{
|
||||
m_ERRPendingRecoveryStatus = recovery;
|
||||
m_ERRRecoveryStatusSince = now;
|
||||
}
|
||||
if (!contextChanged && m_ERRShownRecoveryStatus != recovery && now - m_ERRRecoveryStatusSince < 3000) return;
|
||||
if (contextChanged || m_ERRShownRecoveryStatus != recovery)
|
||||
{
|
||||
SCR_HintManagerComponent hints = SCR_HintManagerComponent.GetInstance();
|
||||
if (!hints) return; // retry on the existing monitor; do not lose the first hint
|
||||
string message = ERR_ObserverGuidance.Message(m_ERRObserverReason, survivorAvailable);
|
||||
if (!recovery.IsEmpty()) message += "\n" + recovery;
|
||||
if (!hints.ShowCustom(message, "Spectating", 12, m_ERRObserverReady)) return;
|
||||
m_ERRObserverReady = true;
|
||||
m_ERRShownObserverReason = m_ERRObserverReason;
|
||||
m_ERRShownObserverAvailable = survivorAvailable;
|
||||
m_ERRShownRecoveryStatus = recovery;
|
||||
}
|
||||
}
|
||||
// Track the actual local body even when an editor/other camera owns the view.
|
||||
// Run once per recovery, with retries for asynchronous editor close/camera setup.
|
||||
protected void ERR_UpdateRecoveryCamera(ERR_GameMode mode)
|
||||
{
|
||||
IEntity body = GetControlledEntity();
|
||||
if (!mode || !mode.Active() || !ERR_Actors.Alive(body))
|
||||
{ m_ERRRecoveryBody = null; m_ERRRecoveryDeadline = -1; return; }
|
||||
if (!ERR_Actors.CanFight(body))
|
||||
{ m_ERRRecoveryBody = body; m_ERRRecoveryDeadline = -1; return; }
|
||||
if (!m_ERRRecoveryBody) return;
|
||||
if (body != m_ERRRecoveryBody)
|
||||
{ m_ERRRecoveryBody = null; m_ERRRecoveryDeadline = -1; return; }
|
||||
float now = GetGame().GetWorld().GetWorldTime();
|
||||
if (m_ERRRecoveryDeadline < 0) m_ERRRecoveryDeadline = now + 10000;
|
||||
SCR_EditorManagerEntity editor = SCR_EditorManagerEntity.GetInstance();
|
||||
if (editor && editor.IsOpened()) editor.Close(false);
|
||||
CameraManager manager = GetGame().GetCameraManager();
|
||||
CameraBase playerCamera = GetPlayerCamera();
|
||||
if (manager && playerCamera) manager.SetCamera(playerCamera);
|
||||
if ((manager && playerCamera && manager.CurrentCamera() == playerCamera && (!editor || !editor.IsOpened())) || now >= m_ERRRecoveryDeadline)
|
||||
{
|
||||
if (now >= m_ERRRecoveryDeadline) Print("Reintroduced [spectator]: recovery camera return timed out waiting for editor/camera; player body remains controlled", LogLevel.WARNING);
|
||||
m_ERRRecoveryBody = null; m_ERRRecoveryDeadline = -1;
|
||||
}
|
||||
}
|
||||
protected void ERR_CloseObserverCamera()
|
||||
{
|
||||
m_ERRObserverReady = false;
|
||||
m_ERRShownRecoveryStatus = "";
|
||||
m_ERRPendingRecoveryStatus = "";
|
||||
m_ERRRecoveryStatusSince = 0;
|
||||
if (!m_ERRObserverCamera) return;
|
||||
if (GetGame().GetPlayerController() == this) m_ERRObserverCamera.TrySwitchToControlledEntityCamera();
|
||||
m_ERRObserverCamera.Terminate();
|
||||
delete m_ERRObserverCamera;
|
||||
m_ERRObserverCamera = null;
|
||||
}
|
||||
void ~SCR_PlayerController()
|
||||
{
|
||||
if (GetGame())
|
||||
{
|
||||
GetGame().GetCallqueue().Remove(ERR_UpdateObserverClient);
|
||||
ERR_CloseObserverCamera();
|
||||
if (Replication.IsServer()) ERR_ReleaseObserved();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
"""Actual observer monitor/recovery/cleanup; native camera lifecycle is doubled."""
|
||||
import os,re
|
||||
from pathlib import Path
|
||||
from policy_harness import ROOT,body,run
|
||||
p=Path(os.environ.get('ERR_OBSERVER_SOURCE',ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_Observer.c'))
|
||||
game_mode=Path(os.environ.get('ERR_GAME_MODE_SOURCE',ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_GameMode.c'))
|
||||
binder=body(game_mode,'protected void BindLocalObserver(')
|
||||
binder=binder.replace('protected ', '').replace('SCR_PlayerController controller = SCR_PlayerController.Cast(GetGame().GetPlayerController());','Controller* controller = static_cast<Controller*>(GetGame()->GetPlayerController());')
|
||||
binder=binder.replace('GetGame().','GetGame()->').replace('GetCallqueue().','GetCallqueue()->').replace('Remove(BindLocalObserver)','Remove(this)').replace('controller.','controller->')
|
||||
def cpp(s):
|
||||
s=s.replace('protected ','').replace('null','nullptr')
|
||||
for n in ('ERR_GameMode','ERR_Actors','ERR_ObserverRules','ERR_ObserverGuidance','SCR_HintManagerComponent','SCR_RespawnSystemComponent','SCR_EditorManagerEntity','Resource','SCR_ManualCamera','RplId','ETransformMode','LogLevel','System'):
|
||||
s=s.replace(n+'.',n+'::')
|
||||
for n in ('ERR_GameMode','SCR_HintManagerComponent','SCR_RespawnSystemComponent','SCR_EditorManagerEntity','Resource','CameraManager','CameraBase'):
|
||||
s=re.sub(r'\b'+n+r' (\w+)',n+r'* \1',s)
|
||||
for n in ('mode','hints','respawn','editor','resource','manager','m_ERRObserverCamera'):
|
||||
s=s.replace(n+'.',n+'->')
|
||||
s=s.replace('GetGame().','GetGame()->').replace('GetWorld().','GetWorld()->').replace('GetCallqueue().','GetCallqueue()->')
|
||||
s=s.replace('Remove(ERR_UpdateObserverClient)','Remove(this)').replace('CallLater(ERR_UpdateObserverClient, 250, true)','CallLater(this, 250, true)')
|
||||
s=s.replace('EntitySpawnParams params = new EntitySpawnParams();','EntitySpawnParams params;')
|
||||
return s
|
||||
methods='\n'.join(cpp(body(p,n)) for n in ('void ERR_StartObserverMonitor(', 'protected void ERR_UpdateObserverClient(', 'protected void ERR_UpdateRecoveryCamera(', 'protected void ERR_CloseObserverCamera('))
|
||||
run(r'''#include <cassert>
|
||||
#include <set>
|
||||
#include <string>
|
||||
struct string:std::string {using std::string::string;using std::string::operator=;string(std::string s):std::string(s){}bool IsEmpty()const{return empty();}};
|
||||
struct Actor {bool alive=true,conscious=true;};using IEntity=Actor*;
|
||||
struct ERR_Actors {static bool Alive(IEntity a){return a&&a->alive;}static bool CanFight(IEntity a){return Alive(a)&&a->conscious;}};
|
||||
struct ERR_GameMode {string RecoveryStatus(){return "";}bool active=true;static ERR_GameMode*current;static ERR_GameMode*Get(){return current;}bool Active(){return active;}} mode;
|
||||
ERR_GameMode*ERR_GameMode::current=&mode;
|
||||
struct ERR_ObserverRules {static bool View(int reason,bool active,bool alive,bool conscious){return active&&((reason==4&&alive&&!conscious)||(reason!=0&&!alive));}};
|
||||
struct ERR_ObserverGuidance {static bool Refresh(bool ready,int oldReason,int reason,bool oldAvailable,bool available){return !ready||oldReason!=reason||oldAvailable!=available;}static string Message(int,bool){return "spectating";}};
|
||||
struct Vec{Vec operator+(const char*)const{return {};}};
|
||||
struct EntitySpawnParams{int TransformMode=0;Vec Transform[4];};namespace ETransformMode{enum{WORLD};}
|
||||
struct Resource{static Resource*Load(const char*){static Resource r;return &r;}bool IsValid(){return true;}};
|
||||
struct CameraBase{virtual ~CameraBase()=default;};
|
||||
struct CameraManager{CameraBase*current=nullptr;int sets=0;CameraBase*CurrentCamera(){return current;}void SetCamera(CameraBase*c){current=c;sets++;}} manager;
|
||||
int terminated=0,deleted=0,explicitSwitch=0;
|
||||
struct SCR_ManualCamera:CameraBase{
|
||||
CameraBase*previous=nullptr;bool ended=false;
|
||||
static SCR_ManualCamera*Cast(SCR_ManualCamera*c){return c;}
|
||||
void TrySwitchToControlledEntityCamera(){explicitSwitch++;}
|
||||
void Terminate(){if(!ended){ended=true;terminated++;}}
|
||||
// SDK SCR_ManualCamera destructor invokes SwitchToPreviousCamera, which
|
||||
// changes only its own currently selected camera, never a foreign current one.
|
||||
~SCR_ManualCamera(){Terminate();if(manager.current==this&&previous)manager.SetCamera(previous);deleted++;}
|
||||
};
|
||||
struct SCR_HintManagerComponent{int attempts=0;bool silent=false;static SCR_HintManagerComponent*GetInstance(){static SCR_HintManagerComponent h;return &h;}bool ShowCustom(string,string,int,bool quiet=false){attempts++;silent=quiet;return true;}};
|
||||
struct SCR_RespawnSystemComponent{int clears=0;static SCR_RespawnSystemComponent*GetInstance(){static SCR_RespawnSystemComponent r;return &r;}void DestroyLoadingPlaceholder(){clears++;}};
|
||||
struct SCR_EditorManagerEntity{bool opened=false;int closes=0;static SCR_EditorManagerEntity*GetInstance(){static SCR_EditorManagerEntity e;return &e;}bool IsOpened(){return opened;}void Close(bool){opened=false;closes++;}};
|
||||
struct RplId{static int Invalid(){return -1;}};namespace LogLevel{enum{WARNING};}void Print(const char*,int){}
|
||||
namespace System{int now=0;int GetTickCount(){return now;}bool IsConsoleApp(){return false;}}
|
||||
struct Queue{std::set<void*>owners;int added=0;void CallLater(void*owner,int,bool){owners.insert(owner);added++;}void Remove(void*owner){owners.erase(owner);}} queue;
|
||||
struct World{float now=1;float GetWorldTime(){return now;}} world;
|
||||
struct Game{void*local=nullptr;int spawns=0;void*GetPlayerController(){return local;}Queue*GetCallqueue(){return &queue;}World*GetWorld(){return &world;}CameraManager*GetCameraManager(){return &manager;}
|
||||
SCR_ManualCamera*SpawnEntityPrefabLocal(Resource*,World*,EntitySpawnParams){spawns++;auto*c=new SCR_ManualCamera();c->previous=manager.current;manager.SetCamera(c);return c;}} game;
|
||||
bool gameAvailable=true;Game*GetGame(){return gameAvailable?&game:nullptr;}
|
||||
struct Controller{
|
||||
string ERR_SelfEpinephrineHint(){return "";}
|
||||
IEntity actor=nullptr,m_ERRRecoveryBody=nullptr;float m_ERRRecoveryDeadline=-1;
|
||||
bool m_ERRObserverMonitor=false,m_ERRObserverReady=false,m_ERRShownObserverAvailable=false;
|
||||
string m_ERRShownRecoveryStatus,m_ERRPendingRecoveryStatus;
|
||||
int m_ERRRecoveryStatusSince=0;
|
||||
int m_ERRObserverReason=0,m_ERRShownObserverReason=0,m_ERRObservedId=1,starts=0;
|
||||
Vec m_ERRObserverAnchor;SCR_ManualCamera*m_ERRObserverCamera=nullptr;CameraBase*playerCamera=nullptr;
|
||||
IEntity GetControlledEntity(){return actor;}CameraBase*GetPlayerCamera(){return playerCamera;}
|
||||
void ERR_OnObserverMonitorStarted(){starts++;}
|
||||
'''+methods+r'''
|
||||
};
|
||||
struct Binder {bool m_Stopped=false,m_NativeEndHandled=false;
|
||||
'''+binder+r'''
|
||||
};
|
||||
int main(){
|
||||
// The real repeating binder must survive the first controller and gaps.
|
||||
Binder binder;Controller first,replacement;queue.owners.insert(&binder);
|
||||
game.local=nullptr;binder.BindLocalObserver();assert(queue.owners.count(&binder)&&queue.added==0);
|
||||
game.local=&first;binder.BindLocalObserver();
|
||||
assert(first.m_ERRObserverMonitor&&first.starts==1&&queue.owners.count(&first));
|
||||
assert(queue.owners.count(&binder));
|
||||
binder.BindLocalObserver();assert(first.starts==1&&queue.added==1);
|
||||
game.local=nullptr;binder.BindLocalObserver();assert(queue.owners.count(&binder));
|
||||
game.local=&replacement;binder.BindLocalObserver();
|
||||
assert(replacement.m_ERRObserverMonitor&&replacement.starts==1&&queue.owners.count(&replacement));
|
||||
first.ERR_UpdateObserverClient();
|
||||
assert(!first.m_ERRObserverMonitor&&!queue.owners.count(&first)&&queue.owners.count(&replacement));
|
||||
binder.BindLocalObserver();assert(replacement.starts==1&&queue.added==2);
|
||||
binder.m_Stopped=true;binder.BindLocalObserver();assert(!queue.owners.count(&binder)&&queue.owners.count(&replacement));
|
||||
binder.m_Stopped=false;binder.m_NativeEndHandled=true;queue.owners.insert(&binder);binder.BindLocalObserver();
|
||||
assert(!queue.owners.count(&binder)&&queue.owners.count(&replacement)&&queue.added==2);
|
||||
queue.owners.clear();queue.added=0;game.local=nullptr;
|
||||
|
||||
Actor body;CameraBase formerBodyCamera,newBodyCamera;
|
||||
Controller former,current;former.actor=&body;former.playerCamera=&formerBodyCamera;
|
||||
game.local=&former;manager.current=&formerBodyCamera;former.ERR_StartObserverMonitor();
|
||||
body.conscious=false;former.m_ERRObserverReason=4;former.ERR_UpdateObserverClient();
|
||||
assert(former.m_ERRRecoveryBody==&body&&former.m_ERRObserverCamera&&queue.owners.count(&former));
|
||||
SCR_ManualCamera*oldOwned=former.m_ERRObserverCamera;
|
||||
// New controller owns a separate spectator camera; old body wakes meanwhile.
|
||||
current.playerCamera=&newBodyCamera;current.m_ERRObserverReason=1;game.local=¤t;current.ERR_StartObserverMonitor();current.ERR_UpdateObserverClient();
|
||||
SCR_ManualCamera*newOwned=current.m_ERRObserverCamera;assert(newOwned&&newOwned!=oldOwned&&manager.current==newOwned);
|
||||
auto*editor=SCR_EditorManagerEntity::GetInstance();editor->opened=true;body.conscious=true;
|
||||
int beforeClears=SCR_RespawnSystemComponent::GetInstance()->clears;
|
||||
int beforeSets=manager.sets,beforeHints=SCR_HintManagerComponent::GetInstance()->attempts,beforeSpawns=game.spawns,beforeDeleted=deleted;
|
||||
former.ERR_UpdateObserverClient();
|
||||
assert(manager.current==newOwned&&manager.sets==beforeSets&&editor->opened&&editor->closes==0);
|
||||
assert(!former.m_ERRRecoveryBody&&former.m_ERRRecoveryDeadline==-1&&!former.m_ERRObserverMonitor&&!former.m_ERRObserverCamera);
|
||||
assert(deleted==beforeDeleted+1&&terminated==deleted&&explicitSwitch==0);
|
||||
assert(current.m_ERRObserverCamera==newOwned&&queue.owners.count(¤t)==1&&queue.owners.count(&former)==0);
|
||||
assert(SCR_HintManagerComponent::GetInstance()->attempts==beforeHints&&game.spawns==beforeSpawns&&SCR_RespawnSystemComponent::GetInstance()->clears==beforeClears);
|
||||
// Even a queued stale spectator callback cannot create a camera or a hint.
|
||||
former.actor=nullptr;former.m_ERRObserverReason=1;former.ERR_UpdateObserverClient();
|
||||
assert(game.spawns==beforeSpawns&&manager.current==newOwned&&SCR_HintManagerComponent::GetInstance()->attempts==beforeHints);
|
||||
// Start is still local-only; reacquisition restarts exactly one owned timer.
|
||||
int added=queue.added;former.ERR_StartObserverMonitor();assert(queue.added==added);
|
||||
game.local=&former;former.actor=&body;former.m_ERRObserverReason=0;former.ERR_StartObserverMonitor();former.ERR_StartObserverMonitor();
|
||||
assert(queue.added==added+1&&former.starts==2&&queue.owners.count(¤t)==1);
|
||||
// Normal recovery still closes the editor and returns this controller's body.
|
||||
body.conscious=false;former.ERR_UpdateObserverClient();assert(former.m_ERRRecoveryBody==&body);
|
||||
body.conscious=true;former.ERR_UpdateObserverClient();assert(manager.current==&formerBodyCamera&&!editor->opened&&editor->closes==1&&!former.m_ERRRecoveryBody);
|
||||
// Foreign current camera survives this controller's retained camera cleanup.
|
||||
game.local=¤t;manager.current=&newBodyCamera;current.ERR_CloseObserverCamera();assert(manager.current==&newBodyCamera&&deleted==beforeDeleted+2);
|
||||
// If the old owned camera is still current at replacement, its native
|
||||
// destructor may restore its own previous camera; no new-controller camera is deleted.
|
||||
Controller abandoned;abandoned.m_ERRObserverReason=1;game.local=&abandoned;manager.current=&newBodyCamera;
|
||||
abandoned.ERR_StartObserverMonitor();abandoned.ERR_UpdateObserverClient();assert(manager.current==abandoned.m_ERRObserverCamera);
|
||||
game.local=¤t;beforeSets=manager.sets;beforeDeleted=deleted;abandoned.ERR_UpdateObserverClient();
|
||||
assert(!abandoned.m_ERRObserverCamera&&manager.current==&newBodyCamera&&manager.sets==beforeSets+1&&deleted==beforeDeleted+1);
|
||||
assert(queue.owners.count(&abandoned)==0&&queue.owners.count(¤t)==1);
|
||||
// Solo death may leave the controlled corpse assigned; restore the orbit
|
||||
// camera if the native death camera replaces it on a later tick.
|
||||
Controller solo;Actor corpse;corpse.alive=false;corpse.conscious=false;
|
||||
solo.actor=&corpse;solo.m_ERRObserverReason=1;game.local=&solo;editor->opened=false;
|
||||
solo.ERR_UpdateObserverClient();auto*corpseCamera=solo.m_ERRObserverCamera;
|
||||
assert(corpseCamera&&manager.current==corpseCamera);
|
||||
manager.current=&newBodyCamera;beforeClears=SCR_RespawnSystemComponent::GetInstance()->clears;beforeSpawns=game.spawns;
|
||||
solo.ERR_UpdateObserverClient();
|
||||
assert(manager.current==corpseCamera&&game.spawns==beforeSpawns&&SCR_RespawnSystemComponent::GetInstance()->clears==beforeClears+1);
|
||||
// Game Master remains usable during spectating, including before first camera creation.
|
||||
editor->opened=true;manager.current=&newBodyCamera;solo.ERR_UpdateObserverClient();
|
||||
assert(manager.current==&newBodyCamera&&game.spawns==beforeSpawns);
|
||||
solo.ERR_CloseObserverCamera();solo.ERR_UpdateObserverClient();
|
||||
assert(!solo.m_ERRObserverCamera&&manager.current==&newBodyCamera&&game.spawns==beforeSpawns);
|
||||
editor->opened=false;solo.ERR_UpdateObserverClient();assert(solo.m_ERRObserverCamera&&manager.current==solo.m_ERRObserverCamera);
|
||||
solo.ERR_CloseObserverCamera();
|
||||
gameAvailable=false;former.ERR_UpdateObserverClient();gameAvailable=true;
|
||||
}
|
||||
''')
|
||||
print('PASS: actual observer monitor/recovery/cleanup rejects retained old controller, preserves new camera/editor/hints/timer, restarts once and retains normal recovery; native effects modeled from SDK, no runtime claim')
|
||||
@@ -0,0 +1,127 @@
|
||||
"""Execute loading presentation/cleanup and native observation bodies with UI adapters.
|
||||
No native layout rendering, multiplayer, or real startup-failure claim.
|
||||
"""
|
||||
from policy_harness import ROOT, body, run
|
||||
SOURCE=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_PreparationStatus.c'
|
||||
def cpp(s):
|
||||
s=s.replace('protected ','').replace('override ','').replace('null','nullptr')
|
||||
s=s.replace('ERR_GameMode mode = ERR_GameMode.Get();','ERR_GameMode* mode = ERR_GameMode::Get();')
|
||||
s=s.replace('ERR_GameMode current = ERR_GameMode::Get();','ERR_GameMode* current = ERR_GameMode::Get();')
|
||||
s=s.replace('ERR_GameMode current = ERR_GameMode.Get();','ERR_GameMode* current = ERR_GameMode::Get();')
|
||||
s=s.replace('current.Phase()', 'current->Phase()')
|
||||
s=s.replace('ERR_GameMode mode,','ERR_GameMode* mode,')
|
||||
s=s.replace('ERR_GameMode mode)', 'ERR_GameMode* mode)')
|
||||
for name in ['System','ERR_GameMode','ERR_Phase','ERR_ObjectiveText','ERR_MissionRules','ERR_PreparationFailureMenu']:s=s.replace(name+'.',name+'::')
|
||||
s=s.replace('TextWidget.Cast(','CastText(').replace('Widget widget)', 'Widget* widget)').replace('widget.', 'widget->')
|
||||
for name in ['mode','m_wLoadingPlaceholder','m_ERRPreparationSpinner','m_ERRPreparationRoot','m_ERRPreparationTitle','m_ERRPreparationDescription']:
|
||||
s=s.replace(name+'.',name+'->')
|
||||
s=s.replace('GetGame().','GetGame()->').replace('GetWorkspace().','GetWorkspace()->').replace('.IsEmpty()','.empty()')
|
||||
return s.replace('super.','Native::')
|
||||
methods='\n'.join(cpp(body(SOURCE,key)) for key in ('void ERR_KeepSpawnSceneLoading(', 'void ERR_ShowSpawnSceneLoading(', 'protected string ERR_PreparationDescription(', 'protected void ERR_ClearPreparationStatus(', 'override void UpdateLoadingPlaceholder(', 'override void DestroyLoadingPlaceholder(', 'protected bool ERR_PreparationWidgetVisible(', 'bool ERR_ProbePreparationVisible('))
|
||||
run(r'''
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <map>
|
||||
using string=std::string;
|
||||
namespace System{bool console=false;bool IsConsoleApp(){return console;}}
|
||||
namespace ERR_Phase{enum{PREPARING,PRISON,RADIO_SEARCH,RADIO_DEFENCE,EXTRACTION,VICTORY,DEFEAT};}
|
||||
namespace ERR_MissionRules{bool Terminal(int p){return p==ERR_Phase::VICTORY||p==ERR_Phase::DEFEAT;}}
|
||||
struct ERR_GameMode{static ERR_GameMode* current;int phase=ERR_Phase::PREPARING;string error;static ERR_GameMode* Get(){return current;}int Phase(){return phase;}bool Active(){return phase>=ERR_Phase::PRISON&&phase<=ERR_Phase::EXTRACTION;}string PreparationError(){return error;}};ERR_GameMode* ERR_GameMode::current=nullptr;
|
||||
namespace ERR_PreparationFailureMenu{bool shown=false;bool Show(ERR_GameMode*){return shown;}bool Visible(ERR_GameMode*){return shown;}};
|
||||
namespace ERR_ObjectiveText{string Description(ERR_GameMode* mode,bool){return mode->error.empty()?"Preparing sites":"Mission failed; ask an administrator to correct and restart";}}
|
||||
struct Widget{Widget* parent=nullptr;bool visible=true,removed=false,textWidget=false;string text;int textWrites=0,visibilityWrites=0;float width=900,height=170;std::map<string,Widget*> children;
|
||||
void GetScreenSize(float& w,float& h){w=width;h=height;}Widget* GetParent(){return parent;}void RemoveFromHierarchy(){removed=true;parent=nullptr;}void SetVisible(bool value){visible=value;visibilityWrites++;}bool IsVisible(){return visible;}
|
||||
Widget* FindAnyWidget(string name){return children.count(name)?children[name]:nullptr;}void SetText(string value){text=value;textWrites++;}string GetText(){return text;}};
|
||||
Widget* CastText(Widget* w){return w&&w->textWidget?w:nullptr;}
|
||||
struct Workspace{int creates=0;bool fail=false,missingText=false;Widget* CreateWidgets(const char*,Widget* parent){creates++;if(fail)return nullptr;auto root=new Widget;root->parent=parent;for(string name:{"ERR_PreparationTitle","ERR_PreparationDescription"}){auto child=new Widget;child->parent=root;child->textWidget=true;root->children[name]=child;}if(missingText)root->children.erase("ERR_PreparationTitle");return root;}};
|
||||
struct Game{Workspace workspace;Workspace* GetWorkspace(){return &workspace;}};Game game;Game* GetGame(){return &game;}
|
||||
struct Native{Widget* m_wLoadingPlaceholder=nullptr;ERR_GameMode* m_pGameMode=nullptr;int nativeUpdates=0,destroys=0;void CreateLoadingPlaceholder(){m_wLoadingPlaceholder=new Widget;}void UpdateLoadingPlaceholder(float){nativeUpdates++;}void DestroyLoadingPlaceholder(){destroys++;if(m_wLoadingPlaceholder)m_wLoadingPlaceholder->RemoveFromHierarchy();m_wLoadingPlaceholder=nullptr;}};
|
||||
struct Probe:Native{
|
||||
Widget *m_ERRPreparationParent=nullptr,*m_ERRPreparationRoot=nullptr,*m_ERRPreparationTitle=nullptr,*m_ERRPreparationDescription=nullptr,*m_ERRPreparationSpinner=nullptr;
|
||||
bool m_ERRKeepSpawnSceneLoading=false,m_ERRPreparationSpinnerHidden=false,m_ERRPreparationSpinnerWasVisible=false;string m_ERRPreparationLastTitle,m_ERRPreparationLastDescription;
|
||||
'''+methods+r'''
|
||||
};
|
||||
struct Fixture{ERR_GameMode mode;Widget parent,spinner;Probe p;Fixture(){game.workspace={};System::console=false;ERR_PreparationFailureMenu::shown=false;ERR_GameMode::current=&mode;p.m_pGameMode=&mode;p.m_wLoadingPlaceholder=&parent;parent.children["Spinner"]=&spinner;spinner.parent=&parent;}};
|
||||
int main(){
|
||||
{Fixture f;f.mode.error="bad";ERR_PreparationFailureMenu::shown=true;f.p.UpdateLoadingPlaceholder(.1f);assert(!f.parent.visible&&f.p.ERR_ProbePreparationVisible(&f.mode,true));}
|
||||
{Fixture f;f.mode.phase=ERR_Phase::PRISON;f.p.ERR_ShowSpawnSceneLoading();auto root=f.p.m_ERRPreparationRoot;f.p.ERR_KeepSpawnSceneLoading(true);f.p.DestroyLoadingPlaceholder();assert(!root->removed&&!f.parent.removed&&f.p.destroys==0);f.p.ERR_KeepSpawnSceneLoading(false);f.p.DestroyLoadingPlaceholder();assert(root->removed&&f.p.destroys==1);f.p.ERR_ShowSpawnSceneLoading();assert(f.p.m_wLoadingPlaceholder&&f.p.ERR_ProbePreparationVisible(&f.mode,false));}
|
||||
{Fixture f;f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.nativeUpdates==1&&game.workspace.creates==1&&f.p.ERR_ProbePreparationVisible(&f.mode,false));
|
||||
Widget* root=f.p.m_ERRPreparationRoot;auto title=f.p.m_ERRPreparationTitle;auto description=f.p.m_ERRPreparationDescription;
|
||||
for(int i=0;i<200;i++){f.p.UpdateLoadingPlaceholder(.1f);}assert(game.workspace.creates==1&&title->textWrites==1&&description->textWrites==1);
|
||||
f.mode.error="invalid catalog";f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.ERR_ProbePreparationVisible(&f.mode,true)&&!f.spinner.visible);
|
||||
for(int i=0;i<200;i++){f.p.UpdateLoadingPlaceholder(.1f);}assert(f.p.m_ERRPreparationRoot==root&&title->textWrites==2&&description->textWrites==2&&f.spinner.visibilityWrites==1);
|
||||
title->width=0;assert(!f.p.ERR_ProbePreparationVisible(&f.mode,true));title->width=900;f.mode.error.clear();f.p.UpdateLoadingPlaceholder(.1f);assert(f.spinner.visible&&f.p.ERR_ProbePreparationVisible(&f.mode,false));
|
||||
f.mode.phase=ERR_Phase::PRISON;f.p.UpdateLoadingPlaceholder(.1f);assert(!root->removed&&!f.parent.removed&&f.spinner.visible&&f.p.ERR_ProbePreparationVisible(&f.mode,false));
|
||||
assert(description->text=="Please wait while your spawn area and equipment finish loading. You will take control when preparation is complete.");
|
||||
for(int phase=ERR_Phase::PRISON;phase<=ERR_Phase::EXTRACTION;phase++){f.mode.phase=phase;for(int i=0;i<200;i++)f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.m_ERRPreparationRoot==root&&f.p.ERR_ProbePreparationVisible(&f.mode,false));}
|
||||
f.mode.phase=ERR_Phase::VICTORY;f.p.UpdateLoadingPlaceholder(.1f);assert(root->removed&&f.parent.removed&&f.spinner.visible&&!f.p.m_ERRPreparationRoot&&f.p.destroys==1);
|
||||
}
|
||||
for(int phase : {ERR_Phase::VICTORY,ERR_Phase::DEFEAT}){Fixture f;f.p.UpdateLoadingPlaceholder(.1f);f.p.ERR_KeepSpawnSceneLoading(true);f.mode.phase=phase;f.p.UpdateLoadingPlaceholder(.1f);assert(f.parent.removed&&!f.p.m_ERRKeepSpawnSceneLoading&&f.p.destroys==1);}
|
||||
{Fixture f;f.p.ERR_KeepSpawnSceneLoading(true);ERR_GameMode replacement;ERR_GameMode::current=&replacement;f.p.DestroyLoadingPlaceholder();assert(f.parent.removed&&f.p.destroys==1);}
|
||||
{Fixture f;f.p.ERR_KeepSpawnSceneLoading(true);ERR_GameMode::current=nullptr;f.p.DestroyLoadingPlaceholder();assert(f.parent.removed&&f.p.destroys==1);}
|
||||
for(int mismatch=0;mismatch<6;mismatch++){Fixture f;ERR_GameMode other;if(mismatch==0)ERR_GameMode::current=nullptr;if(mismatch==1)f.p.m_pGameMode=&other;if(mismatch==2)f.mode.phase=-1;if(mismatch==3)System::console=true;if(mismatch==4)f.p.m_wLoadingPlaceholder=nullptr;if(mismatch==5)f.p.m_pGameMode=nullptr;f.p.UpdateLoadingPlaceholder(.1f);assert(game.workspace.creates==0&&f.p.nativeUpdates==1&&!f.parent.removed&&f.spinner.visibilityWrites==0);}
|
||||
{Fixture f;f.mode.phase=ERR_Phase::PRISON;f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.ERR_ProbePreparationVisible(&f.mode,false));Widget* root=f.p.m_ERRPreparationRoot;f.p.DestroyLoadingPlaceholder();assert(root->removed&&f.parent.removed&&!f.p.m_ERRPreparationRoot&&f.p.destroys==1);f.p.UpdateLoadingPlaceholder(.1f);assert(game.workspace.creates==1);}
|
||||
{Fixture f;f.mode.error="bad";f.spinner.visible=false;f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.ERR_ProbePreparationVisible(&f.mode,true));f.p.ERR_ClearPreparationStatus();assert(!f.spinner.visible);}
|
||||
{Fixture f;f.mode.error="bad";f.p.UpdateLoadingPlaceholder(.1f);Widget* old=f.p.m_ERRPreparationRoot;Widget newParent,newSpinner;newParent.children["Spinner"]=&newSpinner;newSpinner.parent=&newParent;f.p.m_wLoadingPlaceholder=&newParent;f.p.UpdateLoadingPlaceholder(.1f);assert(old->removed&&f.spinner.visible&&!newSpinner.visible&&f.p.m_ERRPreparationParent==&newParent&&game.workspace.creates==2);f.p.DestroyLoadingPlaceholder();assert(newParent.removed&&!f.parent.removed&&newSpinner.visible&&!f.p.m_ERRPreparationRoot&&f.p.destroys==1);}
|
||||
{Fixture f;f.mode.error="bad";f.p.UpdateLoadingPlaceholder(.1f);f.p.m_ERRPreparationParent=nullptr;f.p.m_ERRPreparationRoot=nullptr;f.p.m_ERRPreparationTitle=nullptr;f.p.m_ERRPreparationDescription=nullptr;f.p.m_ERRPreparationSpinner=nullptr;f.p.m_wLoadingPlaceholder=nullptr;f.p.UpdateLoadingPlaceholder(.1f);assert(!f.p.m_ERRPreparationSpinnerHidden);}
|
||||
{Fixture f;game.workspace.fail=true;f.p.UpdateLoadingPlaceholder(.1f);assert(!f.p.m_ERRPreparationRoot&&f.spinner.visibilityWrites==0);game.workspace.fail=false;f.p.UpdateLoadingPlaceholder(.1f);assert(f.p.ERR_ProbePreparationVisible(&f.mode,false));}
|
||||
{Fixture f;game.workspace.missingText=true;f.p.UpdateLoadingPlaceholder(.1f);assert(!f.p.m_ERRPreparationRoot&&f.spinner.visibilityWrites==0);}
|
||||
{Fixture f;f.p.UpdateLoadingPlaceholder(.1f);Widget other;Widget* moved=f.p.m_ERRPreparationRoot;moved->parent=&other;f.p.UpdateLoadingPlaceholder(.1f);assert(moved->removed&&f.p.m_ERRPreparationRoot!=moved&&f.p.m_ERRPreparationParent==&f.parent);}
|
||||
}
|
||||
''')
|
||||
probe=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_NativePreparationStatusProbe.c'
|
||||
s=body(probe,'static int Tick(').replace('ERR_GameMode mode,','ERR_GameMode* mode,').replace('ERR_GameMode.Get()','ERR_GameMode::Get()').replace('ERR_Phase.PREPARING','PREPARING').replace('mode.','mode->').replace('.IsEmpty()','.empty()').replace('SCR_RespawnSystemComponent respawn','SCR_RespawnSystemComponent* respawn').replace('SCR_RespawnSystemComponent.GetInstance()','SCR_RespawnSystemComponent::GetInstance()').replace('respawn.','respawn->').replace('System.MakeScreenshot','System::MakeScreenshot')
|
||||
run(r'''
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
using string=std::string;const int PREPARING=0;
|
||||
struct ERR_GameMode{static ERR_GameMode* current;int phase=0;string error="bad";static ERR_GameMode* Get(){return current;}int Phase(){return phase;}string PreparationError(){return error;}};ERR_GameMode* ERR_GameMode::current=nullptr;
|
||||
struct SCR_RespawnSystemComponent{bool visible=true;static SCR_RespawnSystemComponent instance;static SCR_RespawnSystemComponent* GetInstance(){return &instance;}bool ERR_ProbePreparationVisible(ERR_GameMode*,bool failed){assert(failed);return visible;}};SCR_RespawnSystemComponent SCR_RespawnSystemComponent::instance;
|
||||
namespace System{int captures=0;void MakeScreenshot(const char*){captures++;}}void Print(const char*){}
|
||||
struct Probe{static ERR_GameMode* s_Mode;static float s_Deadline,s_Since,s_Last,s_CaptureAt;
|
||||
'''+s+r'''
|
||||
};ERR_GameMode* Probe::s_Mode=nullptr;float Probe::s_Deadline=0,Probe::s_Since=-1,Probe::s_Last=-1,Probe::s_CaptureAt=-1;
|
||||
int main(){ERR_GameMode mode;ERR_GameMode::current=&mode;
|
||||
for(int i=0;i<=33;i++){assert(Probe::Tick(&mode,i*500)==0);}assert(System::captures==0);assert(Probe::Tick(&mode,17000)==0&&System::captures==1);assert(Probe::Tick(&mode,17500)==1&&System::captures==1);
|
||||
ERR_GameMode next;ERR_GameMode::current=&next;assert(Probe::Tick(&next,20000)==0);assert(Probe::Tick(&next,22000)==0&&Probe::s_Since==22000);SCR_RespawnSystemComponent::instance.visible=false;assert(Probe::Tick(&next,22500)==0&&Probe::s_Since==-1);assert(Probe::Tick(&next,50000)==-1);
|
||||
}
|
||||
''')
|
||||
text=SOURCE.read_text()
|
||||
prefab=(ROOT/'addons/core/Prefabs/ERR/GameMode.et').read_text()
|
||||
assert 'm_bUseSpawnPreload 1' in prefab and 'm_bUseSpawnPreload 0' not in prefab
|
||||
assert 'GetOwner(' not in text
|
||||
assert text.count('m_pGameMode != mode') == 3
|
||||
# m_pGameMode is the installed vanilla protected owner field, assigned by
|
||||
# SCR_RespawnSystemComponent.OnInit(IEntity owner). The adapter deliberately
|
||||
# exposes that field rather than inventing a ScriptComponent.GetOwner API.
|
||||
for forbidden in ('CallLater(', 'SetCamera(', 'SpawnEntity', 'SetControlledEntity(', 'Transition(', 'PreparationError() ='):
|
||||
assert forbidden not in text,forbidden
|
||||
native=probe.read_text()
|
||||
for forbidden in ('CreateWidgets(', 'UpdateLoadingPlaceholder(', 'SetText(', 'SetVisible('):assert forbidden not in native
|
||||
base=(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_NativeBaseSmoke.c').read_text()
|
||||
assert 'ERR_NativePreparationStatusProbe.Tick(this, now)' in base
|
||||
assert 'native-end-active' in base and 'native-end-preparing' in base
|
||||
print('PASS: actual preparation status scope, persistent updates, spinner restoration, placeholder replacement/deletion/destruction, native observation persistence/timeout; rendering remains native-pending')
|
||||
|
||||
# Execute the production world-system rebind that restores frame delivery.
|
||||
source=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverManagers.c'
|
||||
bind=body(source,'void ERR_BindEscapeRespawn(').replace('SCR_RespawnSystemComponent respawn','Respawn* respawn').replace('ERR_GameMode mode = ERR_GameMode.Get();','Mode* mode = Mode::current;').replace('SCR_RespawnSystemComponent.Cast(mode.FindComponent(SCR_RespawnSystemComponent))','mode->respawn')
|
||||
run(r"""
|
||||
#include <cassert>
|
||||
struct Respawn{int frames=0;};struct Mode{inline static Mode* current=nullptr;Respawn* respawn=nullptr;};void Print(const char*){}
|
||||
struct System{Respawn* m_RespawnSystem=nullptr;bool m_bReady=true,enabled=false;int enables=0;void Enable(bool value){enabled=value;enables++;}
|
||||
"""+bind+r"""
|
||||
void Frame(){if(enabled&&m_RespawnSystem)m_RespawnSystem->frames++;}
|
||||
};
|
||||
int main(){System system;Mode mode;Respawn original,replacement,unrelated;Mode::current=&mode;mode.respawn=&replacement;system.m_RespawnSystem=&original;
|
||||
system.ERR_BindEscapeRespawn(&unrelated);assert(system.enables==0&&system.m_RespawnSystem==&original);
|
||||
system.ERR_BindEscapeRespawn(nullptr);assert(system.enables==0);
|
||||
system.ERR_BindEscapeRespawn(&replacement);assert(system.enabled&&!system.m_bReady&&system.m_RespawnSystem==&replacement);system.Frame();assert(replacement.frames==1&&original.frames==0);
|
||||
system.m_bReady=true;system.ERR_BindEscapeRespawn(&replacement);assert(system.m_bReady); // Idempotent: keep current deploy readiness.
|
||||
Mode::current=nullptr;system.ERR_BindEscapeRespawn(&original);assert(system.m_RespawnSystem==&replacement);
|
||||
}
|
||||
""")
|
||||
create=body(SOURCE,'protected override void CreateLoadingPlaceholder(')
|
||||
assert create.index('super.CreateLoadingPlaceholder()') < create.index('ERR_BindEscapeRespawn(this)')
|
||||
assert 'm_fAutoReloadTime 120' in [line.strip() for line in prefab.splitlines()]
|
||||
print('PASS: replaced respawn system receives frame updates, disabled updater wakes, stale/non-Escape binding refused; terminal and stale preload leases release black overlay')
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"exit_code": 0,
|
||||
"seconds": 272.98,
|
||||
"input_files": 1229,
|
||||
"changed_inputs": [],
|
||||
"native_run": false,
|
||||
"local_socket_tests_allowed": true
|
||||
}
|
||||
@@ -0,0 +1,938 @@
|
||||
Menu layouts and palette are up to date.
|
||||
.......
|
||||
----------------------------------------------------------------------
|
||||
Ran 7 tests in 0.050s
|
||||
|
||||
OK
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.000s
|
||||
|
||||
OK
|
||||
....../usr/lib/python3.14/tempfile.py:538: ResourceWarning: Implicitly cleaning up <HTTPError 429: 'limited'>
|
||||
_warnings.warn(self.warn_message, ResourceWarning)
|
||||
..........
|
||||
----------------------------------------------------------------------
|
||||
Ran 16 tests in 0.124s
|
||||
|
||||
OK
|
||||
PASS: authoritative kills/deaths, duplicate-event protection, friendly kills, suicide, GM and vehicle exclusions, down/recovery edges, disconnected escapees and terminal gates
|
||||
PASS: production roster reconciliation preserves disconnected names and reconnect counters, refuses connection-ID inheritance, freezes records and bounds retained participants
|
||||
PASS: held/tapped AI horn limits, half-second pulses, 30-second cooldown, clock reset, player/passenger/aircraft/replica exclusion and ended mission cleanup
|
||||
PASS: telemetry outcomes, exactly-once finish, opt-out gate, stale callbacks, HTTP status handling and bounded retry
|
||||
PASS: durable installation credential, restart/endpoint/identity isolation, write failure, corruption, bounded retention and disabled-send gates
|
||||
PASS: running dedicated configuration, automatic server config/lobby name, explicit override, startup absence, rename and payload bound
|
||||
PASS: map/server/mission/event/outcome validation, bounded counters, stale delivery exclusion, current-round refresh and unavailable recovery
|
||||
PASS: deployment init waits for mode, runs once, cancels on deletion/world change and bounds retries; respawn RPC registration stays immediate
|
||||
PASS: native chat retained on both peers, nested ownership detached, absent chat supplied by replicated fallback, authored mission chat preserved
|
||||
PASS: configurable independent restarts, idle clock reset and live setting changes; last disconnect, pending admission/spectator population, five-hour boundary, repeated empty rounds, preparation, authority and duplicate-end guards
|
||||
PASS: faction aircraft profiles provide 12+ cargo capacity; FIA/ION crew comes only from the selected faction
|
||||
PASS: fleet space is required before pickup registration; dispatch rechecks/replaces only the secondary within the original 48-candidate footprint budget
|
||||
Policy-only arrival from 90 m offset / 150 m height at 15 Hz: original 65.60s, rescue 32.20s
|
||||
Policy-only arrival from 90 m offset / 150 m height at 30 Hz: original 65.73s, rescue 32.30s
|
||||
Policy-only arrival from 90 m offset / 150 m height at 60 Hz: original 65.72s, rescue 32.33s
|
||||
Policy-only arrival from 90 m offset / 150 m height at 120 Hz: original 65.72s, rescue 32.33s
|
||||
PASS: faster rescue descent, continuous near-ground braking, alignment gate, unchanged recovery/escort/default profile, and bounded settling at 15/30/60/120 Hz
|
||||
PASS: split-fleet boarding, escort rejection, lost transport failure and both transports airborne for thirty seconds
|
||||
PASS: actual nearest usable registered-fleet selection, patient reservation priority, independent ranges, audited benches/skids and captured-aircraft handshake guards
|
||||
PASS: production Cessna boarding requires exact observed occupancy, activates before requesting, caps retries at three with 5s spacing, and preserves transition, ownership, health and seat restrictions; engine behavior is faked
|
||||
PASS: traffic distance/grace, all-observer veto, player claims, foreign custody, bounded spawn cadence, failure/stall retention and shutdown preserve nearby/claimed entities
|
||||
PASS: actual observer collection includes spectator targets and controlled bodies; missing views/controllers and open editor cameras veto spawn/cleanup
|
||||
PASS: civilian traffic defaults to three; menu command resolves to persisted 0..6 setting with zero disabling new cars
|
||||
PASS: bounded exit-road selection can turn along a coastline when the opposite road is unavailable; no-route case is withheld
|
||||
PASS: managed traffic pins both native garbage entries; release/retirement removes only those pins, including partial creation
|
||||
PASS: native garage families only; rubble/furniture/military garages rejected; oversized and invalid vehicle bounds rejected
|
||||
PASS: bodies and spectator targets are collected; unknown, nonfinite and editor views veto spawning/cleanup; no connected players yields an empty known view
|
||||
PASS: permanent entry/movement/occupancy claims; far hidden grace cleanup; proximity/visibility/unknown-view resets; one staged operation per update, no same-frame catch-up, stop and client guards
|
||||
PASS: saved garage menu settings configure the round once; unit conversion and cleanup radius scale correctly; count/chance zero disable startup; clients and stopped rounds do no work
|
||||
PASS: exhausted/blocked opening keeps configured radius; distant objective fallback rejected; bounds, player clearance, separation, force cap and retry delay retained
|
||||
PASS: separated rear vehicle approaches, opposite infantry sectors, radio-gated ownership, failed-order preservation, visual cover or bounded supported reconnaissance, bounded dismount/search/regroup and loss cleanup
|
||||
PASS: production dismount/boarding allocation, all crew allowances, waypoint ownership, one-time vehicle detach/restore and capture/teardown guards
|
||||
PASS: covering support requires the original conscious turret gunner, valid mounted driver, live crew and delivered assignment
|
||||
PASS: alternate positions exclude failed and occupied stages, roll back on failed planning/allocation, and preserve the total time budget
|
||||
PASS: blocked crew deadline survives combat interruptions, defers unsafe exits, resets after recovery; failed stages survive assignments with bounded expiry
|
||||
PASS: native-callback cleanup, bounded retries and budget, pending quarantine, objective/ownership/lifecycle protection, no evidence retirement or forced entity deletion
|
||||
PASS: radio intel boundary, exclusions, preparation cap, next-round configuration, sticky unlock, redirection/evidence, fixed retention, automatic recovery and lifecycle guards
|
||||
PASS: actual terrain refusal reasons, counted summaries, site/attempt/time context, 30-second rate limit and per-site reset
|
||||
PASS: actual low/negative dry terrain, height-correct shallow/lake/ocean/interior water refusal and downstream startup dry-ground gates
|
||||
PASS: failure-only menu, repeated-frame/dialog focus, pause fallback, exact error, Esc routing, single local exit, stale/recovered mode guards and listener cleanup; native rendering unverified
|
||||
PASS: only original fit loaded healthy uncaptured gunners stay mounted; driver can leave; infantry readiness excludes the retained gunner but regroup requires all survivors
|
||||
PASS: actual HQ allocator selects reachable reports, distinct cover/flanks, simultaneous fronts, bounded reservations and failed-radio/placement rollback
|
||||
PASS: shared own-force attack spacing, own-group refresh, exact release, expiry/deletion, finite capacity and fresh confirmed sighting-only flank permission
|
||||
PASS: actual convoy foot transport detachment is idempotent; regroup restores only its live friendly uncaptured original truck
|
||||
PASS: opposing native flank orders are transactional; arrived teams sweep twice, travelling/boarding teams retain orders, failed redirects retry and replayed contacts are ignored
|
||||
PASS: expired-report approach, arrival-only search, completion, newer/older/replayed reports, visual priority, interrupted search and bounded travel
|
||||
PASS: drone cooldown, capacity, freshness, replay, bounded retries, round cap, stop, optional API and radio boundaries
|
||||
PASS: production camera cone/range rejects behind-camera and distant actors; control directions, damping and limits
|
||||
PASS: production drone radio queue rejects wrong phase/authority/group, busy or unconscious radios and absent routes; snapshots only eligible observations
|
||||
PASS: target equipment counts as character contact; unrelated blockers and cyclic hierarchies stay blocked
|
||||
PASS: burial requires a conscious current player, actual held shovel, dead nearby unobstructed corpse and no vehicle; authority and duplicate deletion guards preserve player/tool
|
||||
PASS: nearest reported idle team, blocked teams, guards, active/pending orders, combat, radio routes, stale status and distance limit
|
||||
PASS: six editor listeners transferred idempotently, unrelated handlers retained, authority guard and lifecycle ordering
|
||||
PASS: takeover reconnect creates only missing managers, restores native roles, never grants non-admin access, skips stale/disconnected/client states
|
||||
PASS: Game Master button becomes enabled on native permission arrival and disabled on revocation; no permission bypass
|
||||
PASS: native creation called once per editor; pending/duplicate ownership waits, host works, retry is bounded and stale-world callbacks cannot create editors
|
||||
PASS: catalog-independent cleanup removes original subscriptions once, handles never-initialized/preload items, preserves live validation and opted-out/editor behavior
|
||||
PASS: shared config transaction rejects client writes, preserves first-save/prior/fallback state across open, write, backup, partial-copy, readback and mismatch failures
|
||||
PASS: actual Save/Commit preserves semantically valid backup across unrelated menu edits and repairs; unknown fields/default sections retained; actual terrain parser; other parsers, catalog and disk doubled
|
||||
.....TTS request rejected: authentication failed (403)
|
||||
TTS request completed (200)
|
||||
....TTS request completed (200)
|
||||
TTS request completed (200)
|
||||
..
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 1.062s
|
||||
|
||||
OK
|
||||
PASS: all 37 fixed messages have validated exact audio, native graph identities and source-bundle inclusion
|
||||
PASS: production incremental decoder preserves binary data, bounds each slice, yields on elapsed time and rejects malformed or oversized payloads
|
||||
PASS: production speech transfer checks order, exact part sizes and stable bounded totals without changing audio
|
||||
PASS: production client callbacks only queue; shared updates prepare one bounded slice, preserve bytes, handle file failures and cancel safely before playback
|
||||
PASS: production soldier timeout preserves queued/completed preparation, expires stalled requests and removes stopped graphs only once
|
||||
PASS: actual welcome tick waits for URL/readiness/server permit, preserves local once-only state across worlds and refuses stopped callbacks
|
||||
PASS: account greeting survives client/controller/round changes; owner validation, delayed readiness, idempotent retry, stale replies and bounded ledger
|
||||
PASS: original body/equipment retained past old timeout; expiry, death, canonical account/body, occupied controller, failed handoff, missing/dead/expired body replacement and extraction/duplicate-audit guards
|
||||
frame_ms=33.3333 buffered_step_variation=0.0336441 baseline=1.32469
|
||||
frame_ms=16.6667 buffered_step_variation=0.0660537 baseline=0.822226
|
||||
frame_ms=6.94444 buffered_step_variation=0.0253502 baseline=0.427864
|
||||
PASS: actual view buffer validates samples, follows position/roll/FOV, rejects stale/foreign/reordered data, buffers jitter without drift, bounds memory and expires gaps
|
||||
PASS: actual relay rejects noncanonical sources, live/foreign/stale viewers, invalid/replayed/fast packets; bounds leases and owner-only target delivery
|
||||
PASS: production scope sampling preserves ordinary views, selects active ADS only, carries zoom/zeroing/illumination and rejects mismatched/unstreamed optics; native APIs doubled
|
||||
PASS: native head/helmet fade is local, target-scoped, restored on exit/switch and does not overwrite a later camera owner
|
||||
PASS: actual orbit branch rotates and zooms without a target; anchor tracking, bounds, collision and menu gating; corpse/vehicle orbit and living player-view fallback preserved
|
||||
PASS: production TTS settings/test/enable/failure/disable/timeout flows preserve fallback, secrets, authorization, saved state and late-callback cancellation
|
||||
PASS: TTS admin authorization, limits, case preservation and menu control contract
|
||||
PASS: actual atlas preparation shows disclosed markers on overview, regional and detail sheets; cover hidden; overlay matches map rectangle above print for square/wide/tall terrains
|
||||
PASS: actual objective overlay lifecycle preserves separate ownership, late readiness/reopen, data refresh, pan/zoom/culling, supported sibling/shared-frame parents, coordinate offsets, native task-clear isolation and terminal cleanup; native rendering remains unverified
|
||||
PASS: actual map element initializes each widget, retries missing widgets, updates position and changes only stale text/icon data; no native image-load claim
|
||||
PASS: all atlas identifiers, including the quoted question mark, match the generator
|
||||
PASS: actual native fixture root/config ownership and idempotent cleanup preserve foreign map, selector excludes ordinary route, fixed budgets/screenshots/UGC boundaries retained; native operations not executed
|
||||
PASS: actual full Inspect rejects canvas parenting, wrong active container/canvas, omitted origin offset, wrong rendered box and stale coordinates; differing origins and DPI accepted
|
||||
PASS: actual long-warning phases retain visible label through1500ms checkpoint then restore radio before close; synthetic marker separated from unmoved player
|
||||
PASS: actual Center keeps marker offset within large and small native viewports at both fixture zooms without altering disclosed coordinates
|
||||
PASS: missing, child-only, malformed, zero and duplicate prefab root IDs rejected
|
||||
PASS: delayed scene/inventory arrival, deferred preload, identity checks, stale replies, timeout and observer cleanup
|
||||
PASS: loading protection restores only its own damage change, rejects invalid admission actors, and tolerates repeat/deleted cleanup
|
||||
PASS: actual inventory manifest, delayed/missing/wrong-owner item links, finite cap, consumed-stock refresh and preload ordering
|
||||
PASS: spawn scene remains held through final acknowledgement and nearby use; leaving, reassignment, disconnect and teardown release it
|
||||
PASS: production prison AI hold/release, repeat activation, authority/faction/player exclusion, dead actor and stop cleanup
|
||||
PASS: actual protected/capped damage plus exact-actor terminal fixture bypass through delayed native damage, fail-closed ownership and untouched ordinary actor; no native claim
|
||||
PASS: actual full planner selection/commit body, 360 equivalence scenarios, orders/reservations/cooldowns identical; one128-unit scan vs >10000 repeated unit visits; no FPS claim
|
||||
PASS: actual observer monitor/recovery/cleanup rejects retained old controller, preserves new camera/editor/hints/timer, restarts once and retains normal recovery; native effects modeled from SDK, no runtime claim
|
||||
PASS: former chat controller releases only its own callbacks and preserves replacement menu; current-owner stop/scope and repeated teardown remain intact
|
||||
PASS: wrong observer fixture selector rejected before runtime/profile setup; no engine launched
|
||||
PASS: native camera fixture uses current generated sites instead of the obsolete fixed extraction pickup
|
||||
PASS: actual depot mixed-roster worker/item selection, ownership/refusal and radio/planning/two-leg state transitions, fixed deadline, late proof quarantine, finite import and no adoption after Stop
|
||||
PASS: actual depot HQ lifecycle, existing planner priority, server/mode/owner gates, idempotent polling and owner replacement
|
||||
PASS: actual HQ mine/magazine claim separation, real demand methods, exact token cleanup and original authority gates; native availability doubled
|
||||
PASS: actual full magazine/inert-PMN4 depot leaf, exact custody, isolated callbacks, finite reservation, false/unknown and Stop quarantine, once-only delivery and caps; native movement unqualified
|
||||
PASS: actual mine/magazine provenance and separated finite mine imports; actual authored identity capture, READY-only detached provenance, same shared stock admission, completed exact two-leg proof, lifetime caps and Stop no late adoption
|
||||
PASS: anger per car, all thresholds and remainders, disable/re-enable, wave cap, staged retries, empty-round reset, no backlog, four seats and nearest-player road distance
|
||||
PASS: motorbikes require all mounted addons and exactly two crew seats; base/wreck prefabs rejected
|
||||
..
|
||||
----------------------------------------------------------------------
|
||||
Ran 2 tests in 0.001s
|
||||
|
||||
OK
|
||||
PASS: road width/bridge/length checks, prison and post spacing, setting bounds/default, finite startup and owned HQ admission
|
||||
PASS: exact configurable width cutoff, separate quotas and independent disabling
|
||||
PASS: every saved setting has a fresh-profile constructor default
|
||||
PASS: actual roadblock scheduler yields initial deadline/attempt cap to background, budgets samples, pauses empty/full worlds, completes 30 after unlock, preserves safety and never replenishes losses; teardown cancels work
|
||||
PASS: actual staged post creation spawns at most one entity per callback, commits only all four/eight guards, all planned props and waypoint, and rolls back player approach, obstructions, spawn/replication/ledger failure and cancellation; all committed props bypass distance streaming
|
||||
PASS: both shipped checkpoint layouts preserve vehicle lane, opposing signs, staggered barriers, clear guard slots and separate props across 4–16m roads and all tested headings
|
||||
PASS: actual prop clearance excludes owned geometry while retaining moved-guard, foreign-obstruction, water and terrain rejection
|
||||
PASS: road-edge/intersection clearance, mine detour geometry, checkpoint hold authority and retask cancellation
|
||||
PASS: actual crash geometry, detached definition setup, frozen server choice and guarded phase policy; integration/source ordering checked
|
||||
PASS: actual GameMode readiness admission and common full-footprint survey require crash authorization and both surveyed areas
|
||||
PASS: actual start defaults/parse/save, failure retention and authorized command wiring; current/next feedback, aliases and no random choice; native UI and core mode freezing are separate
|
||||
PASS: native-rejected custom items remain available without startup delay; required map and async insertion safeguards retained
|
||||
PASS: exact starting-stock edits, quantities/type/total limits, duplicate rejection, saved custom/default modes, authority/read-only/save-failure retention and authenticated catalog routing
|
||||
PASS: actual immutable measured footprint/root/attachment matching, bounds/transforms, moving geometry, seated-body and cargo reciprocity, finite hierarchy caps; native geometry doubled
|
||||
PASS: actual BMP singleton geometry and typed current order; one survey, full straight segment, width, known history, reservations, settlement/clearance and work caps; placement/footprint tested separately
|
||||
PASS: actual five random-radius diagnostic wrappers, disabled transparency, cached opt-in, exact zero and exclusion branch, native arguments/returns/outarg preservation, single superclass call and shared16-log cap
|
||||
PASS: zero-radius trace disabled by default, scoped before setup, exact opt-in emission; no native launch
|
||||
PASS: complete actual supply-travel probe, immutable 6+2 formations and 25 actors, admission/travel deadlines, six observed native-boundary moves, stop/ownership/partial-substitution refusals
|
||||
PASS: actual distinct supply-travel hook, fixed420s selector, original observer protection/restoration, failure/terminal cleanup and no legacy convoy setup
|
||||
PASS: actual supply-travel selector requires Chat, one round and480s; existing outcomes unaffected; no native launch
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {coordinated-ai,crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,self-epinephrine,starter-backpack,speech-download,bundled-speech,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,sarka-hunters,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,roadblocks,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,inventory-hitzone,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
|
||||
[--roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--large-roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--speech-probe-url SPEECH_PROBE_URL]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--coordinated-blocked-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {coordinated-ai,crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,self-epinephrine,starter-backpack,speech-download,bundled-speech,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,sarka-hunters,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,roadblocks,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,inventory-hitzone,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
|
||||
[--roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--large-roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--speech-probe-url SPEECH_PROBE_URL]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--coordinated-blocked-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {coordinated-ai,crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,self-epinephrine,starter-backpack,speech-download,bundled-speech,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,sarka-hunters,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,roadblocks,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,inventory-hitzone,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
|
||||
[--roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--large-roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--speech-probe-url SPEECH_PROBE_URL]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--coordinated-blocked-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {coordinated-ai,crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,self-epinephrine,starter-backpack,speech-download,bundled-speech,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,sarka-hunters,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,roadblocks,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,inventory-hitzone,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
|
||||
[--roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--large-roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--speech-probe-url SPEECH_PROBE_URL]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--coordinated-blocked-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {coordinated-ai,crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,self-epinephrine,starter-backpack,speech-download,bundled-speech,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,sarka-hunters,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,roadblocks,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,inventory-hitzone,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
|
||||
[--roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--large-roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--speech-probe-url SPEECH_PROBE_URL]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--coordinated-blocked-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept and --convoy-cover are mutually exclusive
|
||||
PASS: actual native interception witness requires real radio cursor/lineage, original actor identities, fixed movement/hold/expiry/resume and immutable deadline; no movement/delivery injection
|
||||
PASS: actual CLI rejects wrong mode/project/rounds/899s/conflict before runtime; valid flag and terminal branch identify synthetic-observation qualification
|
||||
PASS: visible base hook and actual fixture override delegate once; delivery proof uses retained pre-super route only on successful production transition
|
||||
actual mounted HQ dispatch planning, radio, ownership and lifecycle checks passed
|
||||
PASS: actual mounted intercept eligibility/order chronology, fixed destinations, native road selection bounds, width, segment heading, clearance and settlement delegation; no native driving claim
|
||||
PASS: actual paired arc geometry,40m/80m spacing, separate original polylines, both-position validation and128road/4096segment budget; no native driving proof
|
||||
PASS: actual typed original BMP singleton, loss/footprint/custody guards and native cancellation, UAZ-only pair admission, rollback, native allocation/revocation boundaries, per-member ownership, hold and expiry
|
||||
PASS: actual Tick clock initialization admits fractional first ticks and expires without extending the original start
|
||||
PASS: actual finite conservation/deadline/callback policies; read-only selection, bounded once-only inventory submission and no can refill; native transfer not executed
|
||||
PASS: actual exact-context membership, bounded identity/reach gates, native start/cache/eligibility ordering and no duplicate/foreign action start; fuel manager identity and empty-can headroom guards checked
|
||||
PASS: actual detached node/value snapshot and conservation refuse mismatched lengths before indexed reads, retain original identities under native out-array aliasing and log bounded counts once; native cause remains unknown
|
||||
PASS: actual mine evidence sealing/recovery, historical coarse publication, caps, canonical ownership, marker join retry/owner-change/stop; native arming and replicated vector-array transport untested
|
||||
PASS: actual full document recovery retains authored/sealed targets, one shared spent ledger, retry/exhaustion semantics and canonical multi-player ownership alongside supplemental mine intel
|
||||
PASS: actual infantry search suspension, quiet grace, finite resume, expiry/replacement and defensive/ownership boundaries
|
||||
PASS: infantry combat gate precedes radio delivery and preserves non-task transports
|
||||
PASS: actual HQ contact transition wakes only fit squad members, cancels only task orders and logs changes once
|
||||
PASS: actual finite medicine grants, authored stock deduction, full-backpack refusal/pouch fallback, no loot replenishment, unresolved-operation quarantine and ownership/stop guards
|
||||
PASS: only recent native detected/identified threats suspend hunter travel; stale/disarmed/destroyed contacts cannot strand patrols
|
||||
PASS: actual hunter combat transition cancels only its travel once, holds through renewed contact and resumes after quiet; unregistered startup preserved
|
||||
PASS: actual movement recovery retries delivered orders three times, respects combat/speed/arrival/progress, then abandons the stalled vehicle
|
||||
PASS: actual abandonment releases once, detaches transport, requests native exits only for fit original AI aboard, and leaves players/captured crews alone
|
||||
PASS: captured sighting retention, immutable details, expiry, replay rejection, bounded sound uncertainty/cooldown, radio loss, priority and overdue-status fairness
|
||||
PASS: arrow press/release, held keys, opposing keys, disabled/menu input and firearm-only retention
|
||||
PASS: actual self-injection eligibility matrix and authority/rate limit; default-off persistence, authenticated menu route, owned finite injector and native effect/consumption boundaries
|
||||
PASS: town trigger and hard 700m exclusion for all observers, empty/invalid positions and final-check crossings
|
||||
PASS: object guard split, hard 1000m exclusion / 1400m activation, footprint support, slopes, holes and invalid traces
|
||||
PASS: actual fixed-post admission reserves only stationary guards from HQ retasking and tightens their defend radius
|
||||
PASS: production site classification accepts structures/descriptors and excludes industrial props, fragments, flags, ruins and vehicles
|
||||
PASS: increased site populations preserve the 32 fixed / 16 mobile field-soldier budget, with guards at every site
|
||||
PASS: exact finite site squads, invalid roster/count rejection, committed-site spacing and safe fallback boundary
|
||||
PASS: mortar couriers use the mobile site team and refuse permanent-only garrisons
|
||||
PASS: omitted preferred mortar depot selects a surviving owned camp/mobile team; no camp, foreign cache and permanent-only sites are unavailable; historical priority retained
|
||||
PASS: real-session mortar deadline, failed-support convoy admission and hunter survivor/recovery gates
|
||||
PASS: native-route retry preserves delivered target, limits attempts and suspends during combat
|
||||
PASS: stale/deleted AI utility cannot receive Complete; mortar HQ preflight withholds unsafe orders; mounted convoy cover never creates infantry Defend
|
||||
PASS: flight crew affiliation and group precede native boarding; preparation remains bounded even while passengers wait
|
||||
PASS: factionless/deleted map targets do not abort perception; faction lookup tolerates teardown; deleting helicopter releases without capture/engine access
|
||||
PASS: shoot adapter waits for a physical round; bounded same-shell retries, interrupted/never-started loads, committed no-retry, order/owner changes and normal native delegation
|
||||
PASS: observed mortar corrections, radio delivery, bounded expiry, aim preservation and out-of-order impacts; native flight untested
|
||||
PASS: splash reports retain HQ-estimated movement with matching position/time; stale, mismatched or unsupported estimates rejected
|
||||
PASS: missing/invalid faction crew defers before any native spawn or allowance insertion; all registered RHS factions have explicit soldier and medic profiles
|
||||
PASS: vehicle radio issued once; pending, refusal and looting cannot duplicate or fabricate a physical radio link
|
||||
PASS: actual vehicle-radio link requires the original seated crew, physical manpack and live uncaptured mission vehicle; looting, dismount, release and teardown remove it
|
||||
PASS: actual hunter release preserves survivors/HQ, releases driving ownership once, delegates capture/teardown, and excludes prison/patrol/mortar from generic objective defence
|
||||
PASS: actual hunter cancellation releases exactly the pending source/message once; teardown clears ownership without HQ/game/world
|
||||
PASS: actual player-entry hook latches original hunter capture before native callbacks; both release layers cancel ownership without new entities/refund; bounded current-owner guards and prior-release policy
|
||||
PASS: real opening road geometry enforces wide azimuths; fresh delivered contact preempts patrol cooldown, respects radio failures and does not starve in-flight interception
|
||||
PASS: delivered ground search survives the 60-second mortar cutoff, with five-minute/500m uncertainty bounds and no live target reads; mortar policy unchanged
|
||||
PASS: reserve uses HQ reports/dispatch deadlines, preserves radio uncertainty, spends once, respects cooldown/availability/three-reserve/15-vehicle caps
|
||||
PASS: searches expire ten minutes after observation, ignore replays, wait at arrival, widen within 1 km and bound road queries
|
||||
PASS: actual scoped 10% tighter REGULAR aim error and alert perception; preserves equipment multiplier and restores vanilla behavior when unbound
|
||||
PASS: physical inspection and parent-wreck retention; server-only searched/report delivery unlocks native cleanup once with a 300-second delay
|
||||
PASS: 570 folders cover 57 unfinished sites evenly; known/automatic targets excluded, late camps included, and exact issued/authored documents preserved
|
||||
PASS: bounded same-group empty-spawn retries, no casualty refill, queue retirement, delivery-gated intel, prepared-team reuse, throttled diagnostics and LOD release
|
||||
PASS: four-team/twelve-wave bounds; two-thirds nearby radio defence; nearest selection, radio failures, expiry, perimeter separation, protected duties and independent response budgets
|
||||
PASS: production airborne memory confidence, persistence, ground coverage, confirmed losses, artillery veto, cooldown and invalid-input rules
|
||||
PASS: production bounded approach deadline, empty-drop reuse, partial-drop protection; cover retains the carried HQ target until its deadline; airport reload waits until the drop pass and cover have finished
|
||||
PASS: air logistics reservation preserves delivered search until radio handoff, excludes guards/combat/in-flight orders, and quarantines unresolved native loads/moves
|
||||
PASS: actual ammunition cargo selector handles empty rifle/machinegun/sniper magazines, preserves loaded variants, excludes auxiliary launchers and tolerates missing native metadata
|
||||
PASS: original 15-minute launch/loss cadence, active/captured timer disarm, saved delay reset, stop, 300m orbit and bounded close-contact standoff at 30/60/120 Hz
|
||||
PASS: actual aircraft-removal notification guards owner/server/active/stop and schedules one full delay without replay extension
|
||||
PASS: actual helicopter delay applies resolved Random values, preserves countdown on save failure, and leaves active flights running
|
||||
PASS: hill prominence/elevation, actual road edges/heights/bends and server-only finite scout admission, pending stock, timeout and no replacements/refills
|
||||
PASS: mortar duty scope excludes players, other crews, stopped/client/inactive states; only destruction releases an active assignment, while the gunner may approach the gun
|
||||
PASS: random mode restrictions, full numeric ranges, independent calendar dates and strict daylight boundaries
|
||||
PASS: actual killais eligibility includes the 1000m boundary, excludes players/retained bodies/dead/non-character entities and checks full 3D distance
|
||||
PASS: actual generation scheduler bounds each tick, enforces deadline/candidate ceiling, validates fallback, commits only accepted positions, skips only dispensable sites, preserves required objectives/intel, and resets the next search budget
|
||||
PASS: actual background activation waits an hour empty without consuming placement time; disconnect does not reset active budget
|
||||
PASS: actual separation keeps randomized extraction within the escape boundary in both placement orders, including fallback
|
||||
PASS: scenario validation admits randomized extraction definitions and rejects unsupported randomized site kinds
|
||||
PASS: terrain placement samples world bounds, retains streaming candidates, bounds waits/work, rejects foreign fallbacks, preserves objectives/intel and validates completion
|
||||
PASS: actual navigation readiness supports static meshes, yields only for loadable streaming tiles and refuses unreachable positions
|
||||
PASS: automatic extraction samples the whole terrain immediately and retains geometry/navigation/flatness and fleet-space checks without airport bias
|
||||
PASS: universal connector, embedded/standalone exports, multiple terrains, stable IDs, native nav configs, missing-nav visibility, path validation and overwrite protection
|
||||
PASS: airfield detection accepts physical runways/towers and bounded authored markers, rejects unrelated props, water and out-of-world markers, and samples terrain height
|
||||
PASS: configured airport parsing, bounded readiness, stale admission rejection and cleanup wiring
|
||||
PASS: automatic default, explicit header/CLI opt-out, editor/authored-mode guards, optional airport override precedence and fresh-round saving guard
|
||||
PASS: singleton identity guards, paired faction deserialization and client world-cleanup wiring
|
||||
PASS: task/map/respawn getters survive delayed old destruction and preserve ordinary-mode behavior
|
||||
PASS: replication hierarchy refuses absent/aliased nodes and establishes delivery dependencies idempotently
|
||||
PASS: standalone old faction delegates collected once, with null/deleted owners ignored
|
||||
PASS: actual terrain takeover startup skips mode-less/menu worlds, always forwards super, retains eligible/unsupported/authored/client/editor semantics
|
||||
PASS: native name callback preserves authored modes, opt-outs and failures; terrain suffix follows world changes, cached resolution and confirmed takeover text restores on cleanup without changing scenario identity or overwriting later edits
|
||||
PASS: actual terrain parent traversal, Armenhof/Nogova names, Everon alias, missing-resource fallback, empty names and bounded cycles/depth
|
||||
PASS: actual loading title/description hooks follow late takeover, apply text limits and empty updates, retain native progress and tolerate missing headers/widgets/game
|
||||
PASS: saved terrain GUIDs, defaults, restart persistence, clearing, backup recovery, corrupt-file preservation, write failures, and client write denial
|
||||
PASS: startup terrain capture protects client/editor/menu worlds, default behavior, same-map loads and reload-loop recovery
|
||||
PASS: actual transition waits for native startup, disconnects without bans, requires an empty session, retains every loaded mod, bounds waiting and consumes requests once
|
||||
PASS: actual faction resolution reserves explicit roles, samples without replacement, substitutes disabled selections, and rejects duplicate/unknown/missing choices and insufficient pools
|
||||
PASS: Random all submits persistent random roles immediately; manual mixed choices, stale/unauthorized UI guards and debounce preserved
|
||||
PASS: actual content policy gates parent packs, individual factions, faction identity and finite group rotation with vanilla fallback
|
||||
PASS: actual delivered road eligibility, ahead projection without chords, reservations, stock road query bounds, terrain/water/obstruction refusal and clean outputs
|
||||
PASS: actual delivered-task lineage, expiry, old-order retention, native commit, release, road precision expiry and duplicate delivery
|
||||
PASS: actual original-roster local handoff,100m3D bound,busy carrier/budget exclusion,origin interruption including deletedsource,normal radio delivery and per-source replay history
|
||||
PASS: actual visual intake retains source/time/position/id, rejects replay, prefers usable own route, excludes simultaneous callers and conservatively resets negative-sweep dwell
|
||||
PASS: actual fixture local/radio gating, immutable source/time/position, interrupted-report exclusion and exact-owner cleanup
|
||||
PASS: local-handoff runner refuses wrong project/round count/insufficient deadline before runtime work
|
||||
PASS: actual fixture allocator terminal/unsubmitted guard, original-group lookup and both candidate gates
|
||||
PASS: actual report-derived waypoint insertion/order and tighter positive radii; no formation navigation claim
|
||||
PASS: actual Place/Stop waits native pose update, bounds four attempts, preserves original position, restores pending/settled placement and respects ownership/accepted-move quarantine
|
||||
PASS: actual fixture current/original recipient ownership, unresolved transfer cleanup, exact-token release and idempotent Stop
|
||||
PASS: actual fixture phased-cargo readiness, bounded callbacks, captured-stock mixed-caliber selection/continuation, reservation cleanup and component magazine counts
|
||||
PASS: actual inventory-fixture setup uses ordinary prison unlock before constructing its convoy-waiting probe; failed unlock cannot run fixture
|
||||
PASS: actual authored storage anchors, native trace flags, own-hierarchy exclusion, external wall/vehicle obstruction, range, unknown geometry and bounded context refusal
|
||||
PASS: actual Compatible and bounded stock preflight before report/claim consumption, later compatible truck, launcher controls, convoy binding, finite identities, disjoint tokens, shared report replay/cooldown, original recipients and HQ cleanup
|
||||
PASS: actual finite convoy supply pool; immutable slots, shared demand state, sparse/capped discovery and permanent shutdown
|
||||
PASS: actual HQ rotates finite donors, skips unavailable/contacted trucks, uses delivered reports and dispatches at most one trip per planning cadence
|
||||
PASS: actual original turret identity, native/canonical guards, scoped maximum-skill profile, reset, dismount/reboard, requested-skill preservation and restoration
|
||||
PASS: bounded HQ startup/memory windows and outcome-specific full-route deadlines
|
||||
PASS: explicit escape-route skips only administrator stress, preserving original full-fixture wait/failure paths
|
||||
PASS: normal escape route keeps ordinary catalog and generated placement; historical selectors remain unchanged
|
||||
PASS: actual patrol fixture leaves prison before responder HQ proof, followed by separate permanent-patrol observation
|
||||
PASS: exact patrol-hq finite responder preparation and native search-radius receipt verification
|
||||
PASS: actual read migrates old valid settings, preserves explicit disabled state, rejects invalid data; next-round feedback and fixed menu remain honest
|
||||
PASS: actual automatic convoy timing/authority/admission/one-attempt/manual-task/stop policy; native deployment unproved
|
||||
PASS: late authoritative failure reason refreshes open result; detach, mode change and success subscriptions preserved
|
||||
infantry resupply actual rules, radio transitions, owned cleanup and unresolved-operation tests passed
|
||||
PASS: actual resupply Roster preserves permanent release, original slot mapping and bounded ownership
|
||||
PASS: actual designated zero/one original carrier selection, settled startup, shared finite claims, no refund after submission
|
||||
PASS: actual HQ startup grant readiness forwarding is authoritative and fail-closed
|
||||
PASS: actual finite PMN4 designated-zero/one entitlement, pinned original ownership, shared commit, physical custody, callback quarantine/deletion and no retry
|
||||
PASS: actual bounded empty-return and finite delivery; phase-isolated callbacks, exact ownership proof, stop quarantine and original actor/vehicle boundaries
|
||||
PASS: actual shared finite identity reservation; competing consumers, submission permanence, stale cleanup and96-item bound
|
||||
PASS: actual carried-mounted swap, shared committed claim, physical slot reach, exact two-way proof, uncertainty and terminal cleanup
|
||||
PASS: actual mounted pickup, exact finite ownership, pre-submission commit, physical custody, bounded callback and quarantine lifecycle; no native coverage claim
|
||||
PASS: actual mounted courier admission, radio, individual orders, two-stage transfer, reboarding, token cleanup and quarantine lifecycle
|
||||
PASS: actual scoped crew permit and native board completion/failure preserves foreign seats without teleport fallback
|
||||
PASS: actual shared mounted stock/history ownership, atomic exact HQ pair claim, and bounded stopped-owner proof polling
|
||||
PASS: actual carried/mounted early ammunition policy and status-first shared uplink; complete threshold, phases, cooldown, failures requested check-ins and non-urgent detached carried-mine status
|
||||
PASS: actual group radio startup preservation, finite native grants, callback quarantine, frozen selection/actor ownership and bounded observation
|
||||
PASS: actual maintenance native-stock check rejects missing/duplicate/wrong-identity/unowned/depleted/malformed stock and is read-only; native runtime not executed
|
||||
..................
|
||||
----------------------------------------------------------------------
|
||||
Ran 18 tests in 0.248s
|
||||
|
||||
OK
|
||||
PASS: actual radio node rejects current incapacitation, death, ownership and faction changes despite cached inventory; one-second capability refresh remains explicit
|
||||
PASS: Southern finite maintenance stock preserves weapons/clues and optional transport, historical Western fixture stays separate; native capacity/consumption untested
|
||||
PASS: optional transport deferred behind required readiness, bounded once-only spawn/omission, isolated cleanup, occupied-candidate retention and required-default preservation
|
||||
PASS: actual diagnostic fallback runs only on failed missing-context call, derives unique native pilot door, preserves stock eligibility and restores prior index on success/failure; diagnostics mutate no game state.
|
||||
PASS: actual native-prelude cleanup restores only original changed damage, refuses stale/incapacitated/aboard teleport; bounded five-seat/four-door fixture wiring checked. Native execution remains pending.
|
||||
PASS: actual CreateTransport requires successful scoped Configure after handbrake, preserves ordinary vehicles, tracks spawned entity before failures and never treats failed lock registration as ready.
|
||||
PASS: actual preparation Configure guards/idempotence/breach preservation, security eligibility/final current-body server mutation and all scoped action guards; all five seat/four door resource overrides. Native hold, prefab merge, replication and boarding remain unverified.
|
||||
PASS: production vehicle alarm single trigger/replica completion/no replay, fixed deadline/readiness wait, failed audio, dedicated server, moving exact handle, destruction/native end/deletion/clock and mission teardown. Native sound and multiplayer delivery require engine qualification.
|
||||
PASS: production alarm emitter/receiver original time/location, explicit native queue only, 32-entry cap, 50m local witness eligibility, bound perception, native-super preservation; actual engine broadcast/hearing remains unverified.
|
||||
PASS: actual optional candidate barrier, exact callback/custody proof and unchanged mine/primary snapshots; no native transfer claim
|
||||
Native finite mine-stock runner: parser, scope, exclusions and command pass
|
||||
PASS: actual bounded native mounted proof/detached payload/deadline/cleanup methods, production-only setup and isolated runner selector
|
||||
PASS: actual one-existing-convoy candidate readiness, sender-root identity, incomplete cargo refusal and fixed three-candidate bound
|
||||
PASS: actual BMP capture requires complete armed exact original resource; pinned delivery/slot checks and isolated CLI flag
|
||||
PASS: actual opt-in pre-unlock isolation refuses wrong mode/phase/flag and existing hunters; no baseline service changes
|
||||
PASS: actual once-only native dry query, exact before/after slots, native refusal, shutdown; shared bounded discovery and distinct opt-in verdict
|
||||
PASS: actual completion selector and pre-cleanup variant capture preserve separate radio and eligibility verdicts
|
||||
PASS: actual cargo diagnostic stages separate absent/foreign magazines, used/empty/invalid rounds, well mismatch and exact truck storage/attachment without mutation
|
||||
PASS: actual native courier witness rejects missing radio/custody/swap/reboard evidence; CLI opt-in bounded; native success remains unqualified
|
||||
PASS: actual courier constructor/Tick waits for preparation, returns before physical checks, preserves fixed deadline and sticky stop/failure; Enfusion startup awaits native verification
|
||||
PASS: actual arranged native alarm fixture deadline, single emit, natural-route observation, original timestamp/area/detail assertions, natural observer proximity/activation wait, failure cleanup and independent canonical-body restoration; native delivery itself remains unqualified.
|
||||
PASS: actual convoy cover observation/snapshot/uplink/HOLD/RESUME/cleanup transitions; native boundaries mocked, non-convoy runner opt-in refused
|
||||
Enemy optics actual-service ownership, preservation, callback, deadline and bounded-inspection policies passed
|
||||
PASS: actual delivered cover freshness/lineage/replay and canonical executor; owned waypoint-only hold, one resume at preserved route index, invalid ownership/crew/ledger refusal and fail-closed native recreation
|
||||
PASS: actual Stinger show/set/help state precise actor-roll effects; read-only help, bounded values, malformed syntax and failed-save preservation; no rerolls/gameplay edits and no native persistence claim
|
||||
PASS: new/retasked search and radio delivery ammo gates; active tasks and delivered release preserved
|
||||
HQ convoy delivered-report planning and downlink regressions passed
|
||||
PASS: actual own-inventory ammo inspection deduplicates loaded/carried/shared wells, separates chambers/launchers, freezes scalar snapshots and treats unsupported/capped/foreign inventory as unknown
|
||||
PASS: actual carried PMN4 inventory, original-owner guards, bounded deduplication, independent unknown state and detached counts
|
||||
PASS: actual mounted hierarchy sampling, ownership exclusion, deduplication, completeness/caps, quarter threshold and detached validation; no runtime policy or ammunition mutation
|
||||
PASS: WORKBENCH opt-in diagnostics distinguish cycles/cap/storage/manager/mount failures without repeated native traversal
|
||||
PASS: actual HQ original convoy-root admission rejects wrong force/server/group and never supplies replacement lookup
|
||||
PASS: production mounted structural seat scan ignores >128 carried/cargo descendants, shares exact native mount/magazine ownership, preserves attachment seats and exact occupants, rejects unknown/cyclic/oversize structures; native binding still requires qualification.
|
||||
PASS: native body fixture uses existing immutable actors, real production LOS/queued uplink, pre-delivery isolation, actual status overlap, bounded cleanup and no fabricated reports/spawns
|
||||
PASS: actual native fixture lookup selects exact BODY kind/identity/message from bounded evaluations, never sighting-only Get
|
||||
PASS: actual ammo snapshot comparison checks every scalar/category flag; native probe requires real roster rescan, loaded-round lower bound and separate immutable pending/Watch objects
|
||||
PASS: actual delivered slot-union bodies preserve overlap/disjoint evidence, replay idempotence, status subset integrity, full-wipe closure and formation-local bounds
|
||||
test_review_added_allowed_media_invalidates_snapshot (__main__.ReviewTests.test_review_added_allowed_media_invalidates_snapshot) ... ok
|
||||
test_review_added_source_directory_rejected (__main__.ReviewTests.test_review_added_source_directory_rejected) ... ok
|
||||
test_review_loose_root_resource_and_symlink_rejected (__main__.ReviewTests.test_review_loose_root_resource_and_symlink_rejected) ... ok
|
||||
test_review_metadata_media_and_sidecars_remain_allowed_and_bound (__main__.ReviewTests.test_review_metadata_media_and_sidecars_remain_allowed_and_bound) ... ok
|
||||
test_review_missing_link_rejected (__main__.ReviewTests.test_review_missing_link_rejected) ... ok
|
||||
test_review_package_guard_sees_new_scripts (__main__.ReviewTests.test_review_package_guard_sees_new_scripts) ... ok
|
||||
test_review_retargeted_private_link_rejected (__main__.ReviewTests.test_review_retargeted_private_link_rejected) ... ok
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 7 tests in 0.057s
|
||||
|
||||
OK
|
||||
PASS: actual report methods reproduce old starvation; status-first scheduler delivers check-ins and requires 30s without combat or actual visible contacts before negative reports
|
||||
PASS: actual actor group lookup retains controlled character membership when seated/inherited vehicle agents differ; missing control or parent refuses
|
||||
.................
|
||||
----------------------------------------------------------------------
|
||||
Ran 17 tests in 5.938s
|
||||
|
||||
OK
|
||||
PASS: actual convoy motion thresholds, native-only proof boundaries, physical cargo/crew ownership and pre-launch runner restrictions
|
||||
PASS: actual new measured ClearFootprint 25/441 sample grids, measured extents/height, water/invalid world/terrain/trace refusal plus legacy filled rotated-footprint TraceBox and nine terrain/water samples; broad tree/cable bounds alone accepted, actual collision/nonfinite trace refused, nonzero sweep and ENTS/OCEAN flags, bounded diagnostic query and reset
|
||||
PASS: actual road interpolation/projection/orientation, six35m starts,200m forward tail, preserved bends, short/far/degenerate/nonfinite/overdense/hairpin refusal and deterministic candidate ties
|
||||
PASS: actual authenticated convoy dispatch, active/ready admission gates, canonical receipt, safe unconsumed preflight retry, pool refusal, retained partial failure and consumed no-retry
|
||||
PASS: actual native readiness exact membership, one-time per-vehicle ledger admission/reservation, partial readiness retry without duplicate records and one-pass56-item cargo allocation without replenishment
|
||||
PASS: actual per-vehicle readiness reasons, native agent/activity counts, intended-seat diagnostics, five-second throttle and read-only observation
|
||||
PASS: actual convoy dispatch validates before receipt consumption, consumes once before native mutation, retains all10 partial-failure paths, accepts the selected non-USSR enemy, and allocates exact10 bodies without capacity shrinking
|
||||
PASS: own memberless prefab disables automatic spawn before initialization; actual admission rejects populated, immediate or authored-slot templates before finite crew creation
|
||||
PASS: actual native seated-group arrival outside35m, native waypoint removal, idempotent advance, and convoy waypoint idempotence/arrival/deadline, missing/dead/captured/reparented crew refusal, failed native waypoint release, original vehicle/member preservation and no replacement
|
||||
PASS: actual convoy/team Release retains original active survivors and HQ identity, rejects takeover/terminal/unknown roster, preserves exact logistics quarantine and normal eligibility
|
||||
PASS: actual convoy receipt identity/one-use, shared60-body and128-formation caps, outstanding/native-ledger accounting, exact10-body composition, source reuse, mode/client guards and no consumed receipt refunds
|
||||
PASS: actual supply route cycling/arrival/stops, finite startup bounds, contact freshness, dismount hold, quiet interval, interrupted boarding, timeout and lost-truck release
|
||||
PASS: moving-convoy perception boundaries and scoped individual/group abandonment priorities
|
||||
PASS: actual supply startup reasons expose unchanged body budget/requirement, journal only failure changes, preserve retry cadence/caps and report the true final refusal
|
||||
PASS: actual combat start releases only exact intercept claims before owning route/orders; foreign claim defers combat takeover
|
||||
PASS: actual StartOne plus actual pool preserve unconsumed receipt retry, reject consumed replay, skip impossible new-budget surveys, retain equality, retry caps and journal dedup; no FPS claim
|
||||
PASS: actual admission seeds use exact installed loaded prefab, reject replacement/foreign/projectile paths and preserve bounded immutable identity
|
||||
PASS: actual primary-before-mounted one-shot batch, shared96/128 caps, physical snapshot headroom, original ownership, callback refusal and admission pinning
|
||||
PASS: actual bounded HQ query validates only existing original binding without admission or replacement lookup
|
||||
PASS: exact optional PMN4 startup, primary callback independence, original owner,128 capacity/callback limits, terminal no-retry and callback-proven freeze
|
||||
PASS: production convoy spacing, physical arrival, stable follower targets, supply ownership, leader promotion and bounded stuck recovery
|
||||
PASS: convoy combat keeps native manoeuvres for unchanged contacts and refreshes when contact moves
|
||||
PASS: native convoy proof excludes pre-departure movement and ends via explicit fixture reset, not prohibited player death
|
||||
PASS: boarding retries only after approach/seat progress stops, capped at three, with delayed native reissue and completed-team preservation
|
||||
PASS: slow only owned vehicles near fit dismounted infantry; ignore passengers, casualties and released teams/vehicles
|
||||
PASS: restore missing native driving registration only for healthy owned seated crews; preserve existing association and refuse invalid/released vehicles
|
||||
PASS: actual convoy support preserves visual cover and ongoing approach, retries masked arrived positions, withholds unsafe moves and preserves ammo withdrawal
|
||||
PASS: production support geometry rejects occupied, disallowed, blocked and too-close positions; only explicit intermediate approaches waive the firing-lane requirement
|
||||
PASS: actual body observer enforces owned physical roster, local death-only candidates, native trace gating, budget/cadence/caps, immutable body-only snapshots, radio retries and confirmed suppression
|
||||
PASS: own initial roster, explicit retained corpse evidence, unconscious/missing/ref transfer guards, fixed strength, no replacement adoption, detached samples, surviving radio sender, immutable convoy root/ledger, mounted capture release and lost-root unknown
|
||||
PASS: delivered-only status snapshots, two missed check-ins/reply deadline, last reported coordinates, episode/replay guards, confirmed-loss idempotence, detached/validated mounted payload replacement 256-record cap and detached carried-mine radio delivery/chronology
|
||||
PASS: actual failed-retask deadline rollback plus assignment cancellation/release preserves radio ownership, native waypoint lifecycle and failed-order retry boundaries
|
||||
PASS: actual force ledger, finite casualties/identity/cap, routes/arrival/elevation/overshoot, server and physical guards, staggered 256-record simulated hour without world queries
|
||||
PASS: actual equipment coordinator registration dedupe, startup delay, five member scans, finite component retries, unregister/stop terminal behavior and 256-group bound
|
||||
PASS: actual percentage selection, native/preferred launcher preservation, failure/removal fallback, pending-operation quarantine, capture, finite two-mine grants and no replenishment
|
||||
PASS: automatic inventory one-shot roll, exact item ownership, finite compatible ammo, rejection, capture/stop, deletion, loot and late callback quarantine
|
||||
PASS: enabled/valid catalog eligibility, category restrictions, content filtering, GUID deduplication across factions and bounded catalogs and exact weighted ticket boundaries (100:1, zero excluded)
|
||||
PASS: actual engineer native group-envelope admission and phase cancellation, preparation/deadline, original custody/identity, once-only callback removal, cancellation quarantine, withdrawal/clearance, native refusal and owned-action cleanup; native execution untested
|
||||
PASS: actual mine selector respects road and settlement flank safety; native boundaries doubled
|
||||
PASS: actual HQ and post ledger: second delivered post, one query/tick,2 active/32 jobs,4 consumed lifetime attempts, no-stock/query refusal consumption, pending old job and original identity constraints
|
||||
PASS: actual mine post ledger immutable history, strict chronology/evidence, aliases, >160m separation, detached sites and finite4/32 consumed attempts
|
||||
PASS: actual objective heading/threat/approach rules, persistent doctrine weight, fresh-contact coverage invalidation, stale-sweep rejection and atomic radio retask ownership
|
||||
PASS: actual bounded delivered-negative coverage, replay/freshness/expiry/invalid guards, oldest eviction, small-circle and nearest-unswept selection, reserved-cell exclusion and cleanup
|
||||
PASS: actual five/six bounded hypotheses, observation-relative ETA, future lead, hiding/reverse, local negative weighting, immutable report lineage, road bends/heights and finite cache budgets
|
||||
PASS: actual10/40m local negative patches, same-cell hidden-ground preservation, proportional residual belief, replay, chronology, physical-report guards, caps and cleanup
|
||||
PASS: actual operation selection/replay, pending reservations, detached reports, identity/sequence/time gates, terminal lifecycle, bounded ledger, finite roles, no shadow mutation or hidden-player inputs
|
||||
PASS: actual squad judgment, stable caution, delivered casualty/contact/ammo trends, isolation, replay/time validation, recovery hysteresis, no invented healing or enemy knowledge
|
||||
PASS: actual terrain survey chooses usable cover/concealment, preserves search and bound envelopes, honours finite support, delivered evidence, ownership, async tiles and shared geometry budget
|
||||
PASS: actual-action speech, finite current cover, local search wording, silence after replacement/transfer/stale queue, stable cooldown and optional direct speech
|
||||
PASS: actual hunter reservation ledger, pending/delivered replacement, independent six/eight caps, stale/empty status, finite observation deadline, no hidden force-position lookup
|
||||
PASS: actual coordinated adapter report gates, local evidence, delivered-force snapshots, ownership/lease checks, continuous-contact arbitration, legacy isolation and shadow no-native-order boundary
|
||||
PASS: actual execution lifecycle, original physical arrivals, failed movement, quiet footprint, local support expiry and delivered report acknowledgments
|
||||
PASS: native support wiring requires own activity, soldier suppression, actual projectile event and immutable roster; no waypoint-completion arrival shortcut
|
||||
PASS: actual finite native LOD leases restore prior overrides and protect transferred agents, player ownership and intervening overrides
|
||||
PASS: actual waypoint pause/resume owns only its finite order, preserves unrelated routes and cannot resurrect a superseded or deleted hold
|
||||
PASS: installed native priorities authorize group suppression71 over ordinary combat70, below native healing80; tagged soldier suppression91 yields ammo100, retreat110, medics111 and immediate danger (action SHA256=eb9ba812538707940b90d2386432faeb8c8aca3c83a547d5b59bf7af4887627c)
|
||||
PASS: actual suppression and projectile methods retain a fixed eight-second last-seen area, deny blind support, require exact owned behavior, preserve finite ammo/shot budgets and bound retries
|
||||
.............
|
||||
----------------------------------------------------------------------
|
||||
Ran 13 tests in 0.675s
|
||||
|
||||
OK
|
||||
PASS: actual coordinated runner admission and explicit blocked-only engine flag; no native launch
|
||||
PASS: actual HQ active/pending reservations, interruption, committed replacement, bounded coverage and unchanged force counts
|
||||
PASS: actual bounded pursuit roles/objectives/scores, stale search degradation, physical/busy/home guards, finite lifetime and two-bearing escape gap; no hidden player reads or spawning
|
||||
PASS: actual finite45..110 radius and both ordinary search queue snapshot expressions
|
||||
PASS: actual HQ memory rules/service preserve delivered snapshots, chronology, replay bounds, decay, motion limits, identity and negative-search revisions
|
||||
...........
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 0.281s
|
||||
|
||||
OK
|
||||
PASS: actual session Tick + journal router delivers each grant completion and new HQ line once, without repeats on empty/unavailable feeds or unauthorized ticks
|
||||
.....
|
||||
----------------------------------------------------------------------
|
||||
Ran 5 tests in 0.594s
|
||||
|
||||
OK
|
||||
PASS: actual current-controller/admin/mode authorization, per-round anti-replay, token-rotation refusal, command/snapshot throttles and client scope; owner-only replies and player-tool cleanup wiring
|
||||
PASS: mission provider registration is idempotent, optional dispatch is ordered, status aggregates, journals preserve cursors, aliases stay with their addons and topic help is bounded
|
||||
PASS: actual menu command routing covers all menu settings, rejects unsupported keys, gates companions, and matches unique authored widgets
|
||||
PASS: explicit weapon retention buttons use the same ready/authorized server command path
|
||||
PASS: restart toggle submits authorized settings commands; Mission controls fit without overlap
|
||||
PASS: item editor, preset controls and dynamic item-row layout are structurally valid
|
||||
PASS: selected choices remain green/red and fully visible when disabled; unselected choices return to neutral
|
||||
PASS: probability editor and weighted item-row layout have all bound controls
|
||||
PASS: catalog requests use authenticated sessions, independent admin page selections, loaded-mod allowlisting, bounded pages and allowlisted item mutations
|
||||
PASS: actual item rules, shared-source conflicts, missing/returning mods, bulk reset, independent named presets, bounds, malformed data and failed-save state preservation
|
||||
PASS: actual summaries preserve queued/delivered meaning, clear counts and IDs; raw records, legacy display, cursor gaps and RPC limits remain intact
|
||||
PASS: actual admin body authorization, god restoration, vanilla item deposit, callback completion/failure, timeout quarantine and stop/revocation paths
|
||||
PASS: same-body revoke/regrant preserves pending insertions and timeout quarantine; new-body binding isolates late callbacks and never inherits god mode
|
||||
PASS: actual Intel commands distinguish status/start/failure, preserve authorization gate and reject malformed requests; spent ledger is idempotent, server-only and bounded
|
||||
PASS: actual reroll snapshot, authority, cancellation, ownership, accepted operations, quarantine, bounded work and stop methods; no native runtime claim
|
||||
PASS: production Intel feedback coalescing, rough secrecy, rate limit, bounded dedupe, local/remote delivery and round cleanup; native UI/RPC not exercised
|
||||
PASS: actual per-squad bounded report selector rotates visible targets, survives ordering/turnover, records only queued attempts, and preserves radio intake ordering
|
||||
PASS: actual action denial/clearing, server request failure, single submitted-result feedback, current rescuer identity and terminal/stop suppression; native UI/RPC pending
|
||||
PASS: actual physical denial precedence and transport-seat occupancy/reservation/access/lock checks
|
||||
PASS: actual initial admission exhaustion and ServerTick grace; new/pending/empty/controller/life guards, normal death preserved
|
||||
......................
|
||||
----------------------------------------------------------------------
|
||||
Ran 22 tests in 0.245s
|
||||
|
||||
OK
|
||||
......................
|
||||
----------------------------------------------------------------------
|
||||
Ran 22 tests in 23.629s
|
||||
|
||||
OK
|
||||
..................
|
||||
----------------------------------------------------------------------
|
||||
Ran 18 tests in 2.500s
|
||||
|
||||
OK
|
||||
.........
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 2.086s
|
||||
|
||||
OK
|
||||
...............
|
||||
----------------------------------------------------------------------
|
||||
Ran 15 tests in 1.057s
|
||||
|
||||
OK
|
||||
PASS: actual field result/braking observer and Chat dispatch rules; one finite fixed candidate, deferred callback failure and guarded cleanup; no native measurement
|
||||
PASS: actual opt-in terrain audit records one fixed1681-point grid, preserves original survey refusal/success and exact no-allocation scope; malformed heights stop without retry; no native data acquired
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.561s
|
||||
|
||||
OK
|
||||
PASS: actual field PI/ramp/vector caps, antiwindup, braking hypothesis, immutable admission limits and segment bounds; no native physics tested
|
||||
PASS: actual100m whole-field survey sampling/4096cap, rotated coverage, all-node terrain and native trace refusal; original certificate lineage retained; no native qualification
|
||||
PASS: actual QualifyField preserves original identity/footprint/time, orders complete surveys before issuance, and refuses failed stages/moved body/expired or changed world; native boundaries faked
|
||||
PASS: WORKBENCH first-refusal diagnostics preserve ordinary predicates, query order/count/budget and opt-in scope; no native logging run
|
||||
PASS: actual field startup delegation, immutable lease/target, braking/settling/cancel transitions, early abort, callback scope, physical terminal policy and shared landing demand; native boundaries faked
|
||||
PASS: actual inherited airborne pre-CLIMB cancellation enables verified native autohover once, refuses failed enable and never writes after capture
|
||||
PASS: actual Core maintenance/default/tick/stop methods; empty/populated authority, terminal reentry, no tactical resume or new scheduler; native boundaries substituted
|
||||
PASS: actual finite registration, unique claims/tokens, retention/cancel/stop, readiness gating, capture/expiry retirement and bounded cross-kind order history and typed field/route construction; native boundaries faked
|
||||
PASS: actual WORKBENCH route observer returns exact retained route subtype and refuses absent/field controllers
|
||||
.....
|
||||
----------------------------------------------------------------------
|
||||
Ran 5 tests in 0.570s
|
||||
|
||||
OK
|
||||
......................
|
||||
----------------------------------------------------------------------
|
||||
Ran 22 tests in 0.167s
|
||||
|
||||
OK
|
||||
................
|
||||
----------------------------------------------------------------------
|
||||
Ran 16 tests in 8.958s
|
||||
|
||||
OK
|
||||
......
|
||||
----------------------------------------------------------------------
|
||||
Ran 6 tests in 0.020s
|
||||
|
||||
OK
|
||||
PASS: actual production bridge lookup, lease/world/mode/seat/capture guards, no allocation, native super ordering and read-only fixture hooks
|
||||
...............
|
||||
----------------------------------------------------------------------
|
||||
Ran 15 tests in 0.061s
|
||||
|
||||
OK
|
||||
.............
|
||||
----------------------------------------------------------------------
|
||||
Ran 13 tests in 4.455s
|
||||
|
||||
OK
|
||||
PASS: actual route gain/caps/braking, callback selection, old landing/cancellation control and matching read-only telemetry
|
||||
..............................
|
||||
----------------------------------------------------------------------
|
||||
Ran 30 tests in 0.407s
|
||||
|
||||
OK
|
||||
..............
|
||||
----------------------------------------------------------------------
|
||||
Ran 14 tests in 0.189s
|
||||
|
||||
OK
|
||||
.........
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 0.106s
|
||||
|
||||
OK
|
||||
PASS: actual gate observer binds native registered action/context and current life, reads accumulated progress, refuses stale bindings and never revives outside original bounds
|
||||
PASS: actual read-only look observer methods enforce explicit scope, pinned native camera/body/identity, normalized pose, terminal cancellation and original sample/time bounds
|
||||
...........
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 0.065s
|
||||
|
||||
OK
|
||||
.......................
|
||||
----------------------------------------------------------------------
|
||||
Ran 23 tests in 0.031s
|
||||
|
||||
OK
|
||||
PASS: actual initial WAITING task/guide copy, configured duration, unchanged interruption and rounded progress; native task assertion pending
|
||||
........
|
||||
----------------------------------------------------------------------
|
||||
Ran 8 tests in 0.012s
|
||||
|
||||
OK
|
||||
PASS: actual inventory adapter scope, grid placement, sole compatible host, refresh reuse, rollback, foreign hierarchy refusal and exactly-once native delegation; native compatibility pending
|
||||
.................................................................................
|
||||
----------------------------------------------------------------------
|
||||
Ran 81 tests in 0.498s
|
||||
|
||||
OK
|
||||
......
|
||||
----------------------------------------------------------------------
|
||||
Ran 6 tests in 0.070s
|
||||
|
||||
OK
|
||||
.................
|
||||
----------------------------------------------------------------------
|
||||
Ran 17 tests in 0.004s
|
||||
|
||||
OK
|
||||
...........
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 0.073s
|
||||
|
||||
OK
|
||||
.........
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 0.322s
|
||||
|
||||
OK
|
||||
PASS: actual observer nonce, admission pins, baseline/menu sequencing, snapshots, bounded clocks/samples, cleanup and one-attempt latch; native untested
|
||||
PASS: actual corridor caps/height/hold and whole-rectangle survey bounds, terrain refusal, native trace refusal and exact certificate lineage; native route unqualified
|
||||
PASS: actual route entry, fixed corridor/target, hover hold, cancellation landing freeze, shared lease/capture/deadline gate and unchanged native startup/tick sequence
|
||||
PASS: finite opt-in route fixture, original native input order, meaningful physical-arrival evidence and guarded cleanup; no native launch
|
||||
PASS: actual Chat route step result dispatch and scoped completion/cleanup wiring; six real early-parser refusal paths leave no prefix/profile output
|
||||
PASS: actual retained-service fixture entry, immutable controller/token/deadline/count bindings, observer getter and cleanup ownership ordering; native route validation pending
|
||||
PASS: actual measured cancellation gate, one-shot retained service Stop, no premature drain, immutable lease, fresh real controller readback and separate physical cancellation result policy
|
||||
PASS: actual rough-intel objective selection, exact precedence, source grid dimensions and unchanged other-phase dispatch; native UI pending
|
||||
.................................
|
||||
----------------------------------------------------------------------
|
||||
Ran 33 tests in 0.081s
|
||||
|
||||
OK
|
||||
...............
|
||||
----------------------------------------------------------------------
|
||||
Ran 15 tests in 0.031s
|
||||
|
||||
OK
|
||||
PASS: actual preparation status scope, persistent updates, spinner restoration, placeholder replacement/deletion/destruction, native observation persistence/timeout; rendering remains native-pending
|
||||
PASS: replaced respawn system receives frame updates, disabled updater wakes, stale/non-Escape binding refused; terminal and stale preload leases release black overlay
|
||||
PASS: actual guide ownership and scoped timer cancellation, current-controller preservation/reacquisition, hint retry/dedup and observer boundaries; native UI not exercised
|
||||
PASS: actual native-end shutdown, existing terminal snapshots, reentrancy, unchanged native end data and stale preparation guards
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 1.178s
|
||||
|
||||
OK
|
||||
PASS: actual three-state result wording and UI refresh; stale winner IDs never manufacture escape
|
||||
...........
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 0.094s
|
||||
|
||||
OK
|
||||
PASS: actual immutable target, bounded autohover demand, drift refusal, five-second hold and unchanged qualification/deadline
|
||||
PASS: actual admission attempt budget bounds blocked/missing prerequisites; preparation, spent life and async pending remain protected
|
||||
PASS: delayed admission retry retains controller ownership across same-account recycled connection IDs
|
||||
PASS: actual scene deadline overrides delayed native preload only for rejection; late completion cannot assign, ordinary verified admission preserved
|
||||
PASS: actual action permission matrix unchanged; useful phase/intel/consciousness denials, stale reason cleared, native door denial preserved; no native UI claim
|
||||
.....
|
||||
----------------------------------------------------------------------
|
||||
Ran 5 tests in 0.191s
|
||||
|
||||
OK
|
||||
PASS: actual aircraft cancellation/stage rules, ground-only completion, expiry/capture faults, input ownership and no physical shortcuts
|
||||
PASS: actual exact-instance single-use qualification, native-clock staleness/movement refusal, footprint bounds and ownership-safe ground/fault cleanup
|
||||
PASS: actual optional screenshot helper flag/identity/world/life revalidation, one queued attempt, delayed capture and mission/world cleanup; no native image/presentation claim
|
||||
PASS: actual yard diagnostic exact registered prison ownership, eight native-bound corner projections, no root-sibling escape, bounded duplicate/deep/wide hierarchy traversal; native projection/mask still unmeasured
|
||||
PASS: actual CurrentActor, SpawnPosition and observer-selection methods reject pending/unregistered/replaced/recycled/foreign bodies; canonical live selection and roster-corpse cycling, unconscious following and prison/geometry fallback preserved; native boundaries adapted
|
||||
PASS: actual native-map fixture ownership, cleanup and callback evidence fail closed; native execution remains separate
|
||||
PASS: actual shared-map callbacks bind exact map/config/root, preserve replacement UI/camera, defer focus, and remove only owned delayed work
|
||||
PASS: actual Intel/HQ methods and one-shot qualified readiness handoff deliver late actors once; duplicate readiness, accepted spawn, pickup/drop, death and original negative rolls do not mint assignments
|
||||
PASS: Workbench-only read accessor rejects unknown/nonserver identities; Chat observes all distinct ready crew before existing shell-depletion mutation
|
||||
PASS: actual native-event latch survives deselection, requires exact activity/order, detaches before cleanup, preserves failure/timeout and never infers completion from physical shot count
|
||||
.........
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 0.099s
|
||||
|
||||
OK
|
||||
PASS: actual refresh-fixture gates pin immutable observations/actual downlinks/original activity, reject unaccepted or relabelled commits, stop queueing early and require all queued contacts claimed before replay
|
||||
..........................
|
||||
----------------------------------------------------------------------
|
||||
Ran 26 tests in 0.190s
|
||||
|
||||
OK
|
||||
PASS: actual refresh scheduler/delivery/cancellation/projectile methods reject interrupted or replayed reports, retain committed ownership, preserve immutable snapshots/aim geometry and isolate stopped or replaced orders; native radio/crew behavior remains separate
|
||||
.....................
|
||||
----------------------------------------------------------------------
|
||||
Ran 21 tests in 0.034s
|
||||
|
||||
OK
|
||||
...........
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 0.033s
|
||||
|
||||
OK
|
||||
PASS: actual full-salvo gates require eight fresh committed physical launches, natural closure and exact finite inventory; reject partial/extra/replayed events
|
||||
PASS: actual reason/availability guidance and refresh matrix; no-target copy omits cycling, hint retry retained, existing command/admin paths unchanged; native UI pending
|
||||
PASS: actual client camera policy closes immediately on healing or mission end; late unconscious metadata cannot keep the view active
|
||||
PASS: actual open-chat capture/context renewal and camera/menu priority, text-entry isolation, held-key release; actual revival camera handoff with editor close/retry, missing camera, replacement body and stopped round
|
||||
................usage: test_native_package.py [-h] [--project {core}] --session SESSION
|
||||
--compat COMPAT [--steam STEAM]
|
||||
[--timeout TIMEOUT]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
[--silent-workbench | --exit-after-init]
|
||||
[--continue-on-failure]
|
||||
test_native_package.py: error: argument --exit-after-init: not allowed with argument --silent-workbench
|
||||
................................
|
||||
----------------------------------------------------------------------
|
||||
Ran 48 tests in 21.682s
|
||||
|
||||
OK
|
||||
.......
|
||||
----------------------------------------------------------------------
|
||||
Ran 7 tests in 0.218s
|
||||
|
||||
OK
|
||||
..................
|
||||
----------------------------------------------------------------------
|
||||
Ran 18 tests in 5.618s
|
||||
|
||||
OK
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.256s
|
||||
|
||||
OK
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.053s
|
||||
|
||||
OK
|
||||
PASS: actual finite-courier age, token, exact ownership/callback and delivered-status admission reject stale, replayed, captured, canceled and ambiguous work
|
||||
PASS: actual native-gun ownership gate rejects player/foreign/replaced/dead occupant, faction change, missing seat and missing registry
|
||||
PASS: four-battery courier selection preserves pending trip/report/transfer identity, skips unavailable crews, and selects the next depleted battery without new stock
|
||||
PASS: 64 bounded distinct storage candidates; native gates, five-store barrier and finite-stock ownership retained; native placement pending
|
||||
PASS: 128 coarse+80 local refinement+169 airport grid candidates retain all native clearance gates; real terrain untested
|
||||
PASS: actual prison registration/crossing policies reject missing/duplicate/destroyed initial gate, incomplete ownership/scan, outside-only body, jumps and stale samples; physical exit independent of later gate damage
|
||||
PASS: actual prison door execution blocks direct AI/UI bypass while locked and delegates unchanged native action once after unlock and permission approval
|
||||
..................
|
||||
----------------------------------------------------------------------
|
||||
Ran 18 tests in 1.699s
|
||||
|
||||
OK
|
||||
.....
|
||||
----------------------------------------------------------------------
|
||||
Ran 5 tests in 1.032s
|
||||
|
||||
OK
|
||||
PASS: native local-admission snapshot rejects changed life/key/body/participant/pending state; authentication is not simulated
|
||||
PASS: actual mortar report ledger prevents duplicate response after cancellation, expiry and interleaved reports; native scheduler separate
|
||||
.........
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 0.013s
|
||||
|
||||
OK
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.121s
|
||||
|
||||
OK
|
||||
PASS: actual aim renewal requires fresh same-report solve and original-command equivalence; native firing untested
|
||||
.........
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 0.057s
|
||||
|
||||
OK
|
||||
PASS: actual startup/generation/ownership/timeout/callback policies and native-counter wait; integration preserves one-shot allocation and pending-crew cancellation
|
||||
PASS: rapid mortar cycle counts eight physical rounds once and waits for native completion without a ninth aim or shell
|
||||
PASS: actual probe binds native events to fresh immutable commits, permits delayed emission, rejects unrelated expiry closure and premature stop
|
||||
PASS: actual noSplash Load body requires both explicit diagnostic and noSplash, preserves vanilla otherwise, and handles repeated Load/reload
|
||||
PASS: actual fixture method permits one native resilience operation and restores either prior protection state, including failure paths
|
||||
PASS: actual safe-exit boundary policy, native action/door selection, stop/cache cleanup, separate old mechanism and opt-in runner contracts
|
||||
PASS: actual one-shot deadline/stability policies and preparation ownership, fuel, cleanup integration contracts
|
||||
PASS: pending-only cancellation retires copied instance intent, preserves physical/control actors, and stops once
|
||||
PASS: actual short-cast hit, upward support normal, no self support and no dynamic support
|
||||
PASS: actual committed-ticket structure preserves reservation after death, rejects missing bodies/seats and ends at observation expiry
|
||||
PASS: actual pending callback expires an empty-server reservation once, preserves its full lease, and cancels on completion/Stop
|
||||
PASS: rescue lease expiry/reordering, fresh five-second settling, independent rescue ranges and grounded upright aircraft motion boundaries
|
||||
PASS: requested guard population requires complete physical conscious membership before deadline
|
||||
......................................
|
||||
----------------------------------------------------------------------
|
||||
Ran 38 tests in 0.018s
|
||||
|
||||
OK
|
||||
..........
|
||||
----------------------------------------------------------------------
|
||||
Ran 10 tests in 0.002s
|
||||
|
||||
OK
|
||||
.....
|
||||
----------------------------------------------------------------------
|
||||
Ran 5 tests in 0.836s
|
||||
|
||||
OK
|
||||
PASS: authored radio/optional-site bounds and physical horizontal/vertical boundaries
|
||||
...
|
||||
----------------------------------------------------------------------
|
||||
Ran 3 tests in 0.001s
|
||||
|
||||
OK
|
||||
PASS: all phase transitions, terminal states, defence boundaries, stale/future observations, intel discovery
|
||||
PASS: Core document-discovery alias, companion-only alias exclusion, strict integer parsing and setting boundaries
|
||||
PASS: player admission phase/life/identity/controller matrix, preload displacement limits, pending reservation overlap and owner exclusion
|
||||
PASS: actual gate and pre-inventory document guards reject noncanonical/faction/life/disconnect/server mismatches; canonical reconnect and unconscious carried intel preserved
|
||||
PASS: WB-only native fault injection restores both body mutations before checks/returns and requires eligible held-document negative/positive proof; runtime pending
|
||||
PASS: actual discovery coordinates disclose stable 500m cell center until identified, then exact point, including negative/boundary coordinates
|
||||
PASS: hidden/anonymous/rough/identified markers, toggle transitions, prepared sites, no identity leakage, intel discovery and replicated authority wiring
|
||||
PASS: actual local admission context/selection/latch, same-round late identity, replacement/mode failure, fresh round and untouched network path
|
||||
PASS: prison search packs 16 unique 3m-spaced inside-wall centers, prioritizes inner/edge positions and never bypasses clearance
|
||||
PASS: physical body occupancy rejects overlap, permits diagonal neighboring slots, and excludes own body and unrelated broad-phase bounds
|
||||
PASS: recovery state excludes dead bodies, preserves reservations, requires controlled rescuers and distinguishes empty/all-dead teams
|
||||
PASS: actual native-probe lifecycle/counters with doubled boundaries; fixed deadline, exact seven sources, true forwarding, async close, no late updates and selector wiring
|
||||
PASS: actual one-argument adapter, explicit refresh, native initialization flag, duplicate/blood ownership, rebind/detach/destruction and foreign-mode transparency
|
||||
PASS: authority-scoped slow recovery, bleeding pauses resilience, medicine unaffected, player-only lethal damage cap without healing
|
||||
PASS: bleeding severity survives low health, retains armour, causes no knockout and restores the actual damage/blood-loss cap
|
||||
PASS: viable passive recovery survives native delay; bleeding, disabled/full effects and low-blood resilience do not block defeat
|
||||
PASS: every minute round-trips, malformed clocks rejected, defaults limited to added keys, progression bounds and day duration aligned
|
||||
PASS: native settings policy matches calendar boundaries 1900-2050, date/profile parsing is strict, authored defaults preserve old worlds
|
||||
PASS: view-distance bounds, default, save failures, command parsing, temporary ownership, server/platform limits and lifecycle wiring
|
||||
.....
|
||||
----------------------------------------------------------------------
|
||||
Ran 5 tests in 0.514s
|
||||
|
||||
OK
|
||||
.
|
||||
----------------------------------------------------------------------
|
||||
Ran 1 test in 0.319s
|
||||
|
||||
OK
|
||||
PASS: radio authorization/discovery/phase matrix, exact distance limits, defender handover, interruption, empty samples, clock regression and duration boundary
|
||||
PASS: actual radio feedback policy, initial wait, interruption persistence, resumption and terminal/new-round reset
|
||||
...............
|
||||
----------------------------------------------------------------------
|
||||
Ran 15 tests in 2.132s
|
||||
|
||||
OK
|
||||
..............................................
|
||||
----------------------------------------------------------------------
|
||||
Ran 46 tests in 0.801s
|
||||
|
||||
OK
|
||||
PASS: legacy values preserved, unsupported fields reported, invalid data rejected, existing files protected, runtime bounds aligned
|
||||
PASS: failed initial settings promotion leaves defaults writable after restart; prior/fallback saves survive copy, readback and mismatch faults
|
||||
PASS: real-carrier shortest-hop paths, 500m boundary, three-hop cap, no-manpack failure, three-second originating-call interruption, unchanged downlink hop timing, completed-hop survival, interrupted final uplink, radio loss, capture, motion, timeout, reset and network bounds
|
||||
PASS: migrated aircraft availability policy (controller migration still pending)
|
||||
PASS: migrated salvo offsets are deterministic, spread and bounded (native firing and complete salvo qualification are separate)
|
||||
PASS: 48 prefabs have unique saved root entity IDs
|
||||
PASS: 299 original script entries tracked across 18 unfinished responsibilities
|
||||
PASS: 1 isolated addons, acyclic dependencies, 158 unique resources, exact vanilla/authorized external references
|
||||
All repository checks passed. Native compilation and multiplayer tests are separate requirements.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"exit_code": 1,
|
||||
"seconds": 213.34,
|
||||
"input_files": 1229,
|
||||
"changed_inputs": [],
|
||||
"native_run": false,
|
||||
"local_socket_tests_allowed": true
|
||||
}
|
||||
@@ -0,0 +1,746 @@
|
||||
Menu layouts and palette are up to date.
|
||||
.......
|
||||
----------------------------------------------------------------------
|
||||
Ran 7 tests in 0.055s
|
||||
|
||||
OK
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.000s
|
||||
|
||||
OK
|
||||
....../usr/lib/python3.14/tempfile.py:538: ResourceWarning: Implicitly cleaning up <HTTPError 429: 'limited'>
|
||||
_warnings.warn(self.warn_message, ResourceWarning)
|
||||
..........
|
||||
----------------------------------------------------------------------
|
||||
Ran 16 tests in 0.126s
|
||||
|
||||
OK
|
||||
PASS: authoritative kills/deaths, duplicate-event protection, friendly kills, suicide, GM and vehicle exclusions, down/recovery edges, disconnected escapees and terminal gates
|
||||
PASS: production roster reconciliation preserves disconnected names and reconnect counters, refuses connection-ID inheritance, freezes records and bounds retained participants
|
||||
PASS: held/tapped AI horn limits, half-second pulses, 30-second cooldown, clock reset, player/passenger/aircraft/replica exclusion and ended mission cleanup
|
||||
PASS: telemetry outcomes, exactly-once finish, opt-out gate, stale callbacks, HTTP status handling and bounded retry
|
||||
PASS: durable installation credential, restart/endpoint/identity isolation, write failure, corruption, bounded retention and disabled-send gates
|
||||
PASS: running dedicated configuration, automatic server config/lobby name, explicit override, startup absence, rename and payload bound
|
||||
PASS: map/server/mission/event/outcome validation, bounded counters, stale delivery exclusion, current-round refresh and unavailable recovery
|
||||
PASS: deployment init waits for mode, runs once, cancels on deletion/world change and bounds retries; respawn RPC registration stays immediate
|
||||
PASS: native chat retained on both peers, nested ownership detached, absent chat supplied by replicated fallback, authored mission chat preserved
|
||||
PASS: configurable independent restarts, idle clock reset and live setting changes; last disconnect, pending admission/spectator population, five-hour boundary, repeated empty rounds, preparation, authority and duplicate-end guards
|
||||
PASS: faction aircraft profiles provide 12+ cargo capacity; FIA/ION crew comes only from the selected faction
|
||||
PASS: fleet space is required before pickup registration; dispatch rechecks/replaces only the secondary within the original 48-candidate footprint budget
|
||||
Policy-only arrival from 90 m offset / 150 m height at 15 Hz: original 65.60s, rescue 32.20s
|
||||
Policy-only arrival from 90 m offset / 150 m height at 30 Hz: original 65.73s, rescue 32.30s
|
||||
Policy-only arrival from 90 m offset / 150 m height at 60 Hz: original 65.72s, rescue 32.33s
|
||||
Policy-only arrival from 90 m offset / 150 m height at 120 Hz: original 65.72s, rescue 32.33s
|
||||
PASS: faster rescue descent, continuous near-ground braking, alignment gate, unchanged recovery/escort/default profile, and bounded settling at 15/30/60/120 Hz
|
||||
PASS: split-fleet boarding, escort rejection, lost transport failure and both transports airborne for thirty seconds
|
||||
PASS: actual nearest usable registered-fleet selection, patient reservation priority, independent ranges, audited benches/skids and captured-aircraft handshake guards
|
||||
PASS: production Cessna boarding requires exact observed occupancy, activates before requesting, caps retries at three with 5s spacing, and preserves transition, ownership, health and seat restrictions; engine behavior is faked
|
||||
PASS: traffic distance/grace, all-observer veto, player claims, foreign custody, bounded spawn cadence, failure/stall retention and shutdown preserve nearby/claimed entities
|
||||
PASS: actual observer collection includes spectator targets and controlled bodies; missing views/controllers and open editor cameras veto spawn/cleanup
|
||||
PASS: civilian traffic defaults to three; menu command resolves to persisted 0..6 setting with zero disabling new cars
|
||||
PASS: bounded exit-road selection can turn along a coastline when the opposite road is unavailable; no-route case is withheld
|
||||
PASS: managed traffic pins both native garbage entries; release/retirement removes only those pins, including partial creation
|
||||
PASS: native garage families only; rubble/furniture/military garages rejected; oversized and invalid vehicle bounds rejected
|
||||
PASS: bodies and spectator targets are collected; unknown, nonfinite and editor views veto spawning/cleanup; no connected players yields an empty known view
|
||||
PASS: permanent entry/movement/occupancy claims; far hidden grace cleanup; proximity/visibility/unknown-view resets; one staged operation per update, no same-frame catch-up, stop and client guards
|
||||
PASS: saved garage menu settings configure the round once; unit conversion and cleanup radius scale correctly; count/chance zero disable startup; clients and stopped rounds do no work
|
||||
PASS: exhausted/blocked opening keeps configured radius; distant objective fallback rejected; bounds, player clearance, separation, force cap and retry delay retained
|
||||
PASS: separated rear vehicle approaches, opposite infantry sectors, radio-gated ownership, failed-order preservation, visual cover or bounded supported reconnaissance, bounded dismount/search/regroup and loss cleanup
|
||||
PASS: production dismount/boarding allocation, all crew allowances, waypoint ownership, one-time vehicle detach/restore and capture/teardown guards
|
||||
PASS: covering support requires the original conscious turret gunner, valid mounted driver, live crew and delivered assignment
|
||||
PASS: alternate positions exclude failed and occupied stages, roll back on failed planning/allocation, and preserve the total time budget
|
||||
PASS: blocked crew deadline survives combat interruptions, defers unsafe exits, resets after recovery; failed stages survive assignments with bounded expiry
|
||||
PASS: native-callback cleanup, bounded retries and budget, pending quarantine, objective/ownership/lifecycle protection, no evidence retirement or forced entity deletion
|
||||
PASS: radio intel boundary, exclusions, preparation cap, next-round configuration, sticky unlock, redirection/evidence, fixed retention, automatic recovery and lifecycle guards
|
||||
PASS: actual terrain refusal reasons, counted summaries, site/attempt/time context, 30-second rate limit and per-site reset
|
||||
PASS: actual low/negative dry terrain, height-correct shallow/lake/ocean/interior water refusal and downstream startup dry-ground gates
|
||||
PASS: failure-only menu, repeated-frame/dialog focus, pause fallback, exact error, Esc routing, single local exit, stale/recovered mode guards and listener cleanup; native rendering unverified
|
||||
PASS: only original fit loaded healthy uncaptured gunners stay mounted; driver can leave; infantry readiness excludes the retained gunner but regroup requires all survivors
|
||||
PASS: actual HQ allocator selects reachable reports, distinct cover/flanks, simultaneous fronts, bounded reservations and failed-radio/placement rollback
|
||||
PASS: shared own-force attack spacing, own-group refresh, exact release, expiry/deletion, finite capacity and fresh confirmed sighting-only flank permission
|
||||
PASS: actual convoy foot transport detachment is idempotent; regroup restores only its live friendly uncaptured original truck
|
||||
PASS: opposing native flank orders are transactional; arrived teams sweep twice, travelling/boarding teams retain orders, failed redirects retry and replayed contacts are ignored
|
||||
PASS: expired-report approach, arrival-only search, completion, newer/older/replayed reports, visual priority, interrupted search and bounded travel
|
||||
PASS: drone cooldown, capacity, freshness, replay, bounded retries, round cap, stop, optional API and radio boundaries
|
||||
PASS: production camera cone/range rejects behind-camera and distant actors; control directions, damping and limits
|
||||
PASS: production drone radio queue rejects wrong phase/authority/group, busy or unconscious radios and absent routes; snapshots only eligible observations
|
||||
PASS: target equipment counts as character contact; unrelated blockers and cyclic hierarchies stay blocked
|
||||
PASS: burial requires a conscious current player, actual held shovel, dead nearby unobstructed corpse and no vehicle; authority and duplicate deletion guards preserve player/tool
|
||||
PASS: nearest reported idle team, blocked teams, guards, active/pending orders, combat, radio routes, stale status and distance limit
|
||||
PASS: six editor listeners transferred idempotently, unrelated handlers retained, authority guard and lifecycle ordering
|
||||
PASS: takeover reconnect creates only missing managers, restores native roles, never grants non-admin access, skips stale/disconnected/client states
|
||||
PASS: Game Master button becomes enabled on native permission arrival and disabled on revocation; no permission bypass
|
||||
PASS: native creation called once per editor; pending/duplicate ownership waits, host works, retry is bounded and stale-world callbacks cannot create editors
|
||||
PASS: catalog-independent cleanup removes original subscriptions once, handles never-initialized/preload items, preserves live validation and opted-out/editor behavior
|
||||
PASS: shared config transaction rejects client writes, preserves first-save/prior/fallback state across open, write, backup, partial-copy, readback and mismatch failures
|
||||
PASS: actual Save/Commit preserves semantically valid backup across unrelated menu edits and repairs; unknown fields/default sections retained; actual terrain parser; other parsers, catalog and disk doubled
|
||||
.....TTS request rejected: authentication failed (403)
|
||||
TTS request completed (200)
|
||||
....TTS request completed (200)
|
||||
TTS request completed (200)
|
||||
..
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 1.064s
|
||||
|
||||
OK
|
||||
PASS: all 37 fixed messages have validated exact audio, native graph identities and source-bundle inclusion
|
||||
PASS: production incremental decoder preserves binary data, bounds each slice, yields on elapsed time and rejects malformed or oversized payloads
|
||||
PASS: production speech transfer checks order, exact part sizes and stable bounded totals without changing audio
|
||||
PASS: production client callbacks only queue; shared updates prepare one bounded slice, preserve bytes, handle file failures and cancel safely before playback
|
||||
PASS: production soldier timeout preserves queued/completed preparation, expires stalled requests and removes stopped graphs only once
|
||||
PASS: actual welcome tick waits for URL/readiness/server permit, preserves local once-only state across worlds and refuses stopped callbacks
|
||||
PASS: account greeting survives client/controller/round changes; owner validation, delayed readiness, idempotent retry, stale replies and bounded ledger
|
||||
PASS: original body/equipment retained past old timeout; expiry, death, canonical account/body, occupied controller, failed handoff, missing/dead/expired body replacement and extraction/duplicate-audit guards
|
||||
frame_ms=33.3333 buffered_step_variation=0.0336441 baseline=1.32469
|
||||
frame_ms=16.6667 buffered_step_variation=0.0660537 baseline=0.822226
|
||||
frame_ms=6.94444 buffered_step_variation=0.0253502 baseline=0.427864
|
||||
PASS: actual view buffer validates samples, follows position/roll/FOV, rejects stale/foreign/reordered data, buffers jitter without drift, bounds memory and expires gaps
|
||||
PASS: actual relay rejects noncanonical sources, live/foreign/stale viewers, invalid/replayed/fast packets; bounds leases and owner-only target delivery
|
||||
PASS: production scope sampling preserves ordinary views, selects active ADS only, carries zoom/zeroing/illumination and rejects mismatched/unstreamed optics; native APIs doubled
|
||||
PASS: native head/helmet fade is local, target-scoped, restored on exit/switch and does not overwrite a later camera owner
|
||||
PASS: actual orbit branch rotates and zooms without a target; anchor tracking, bounds, collision and menu gating; corpse/vehicle orbit and living player-view fallback preserved
|
||||
PASS: production TTS settings/test/enable/failure/disable/timeout flows preserve fallback, secrets, authorization, saved state and late-callback cancellation
|
||||
PASS: TTS admin authorization, limits, case preservation and menu control contract
|
||||
PASS: actual atlas preparation shows disclosed markers on overview, regional and detail sheets; cover hidden; overlay matches map rectangle above print for square/wide/tall terrains
|
||||
PASS: actual objective overlay lifecycle preserves separate ownership, late readiness/reopen, data refresh, pan/zoom/culling, supported sibling/shared-frame parents, coordinate offsets, native task-clear isolation and terminal cleanup; native rendering remains unverified
|
||||
PASS: actual map element initializes each widget, retries missing widgets, updates position and changes only stale text/icon data; no native image-load claim
|
||||
PASS: all atlas identifiers, including the quoted question mark, match the generator
|
||||
PASS: actual native fixture root/config ownership and idempotent cleanup preserve foreign map, selector excludes ordinary route, fixed budgets/screenshots/UGC boundaries retained; native operations not executed
|
||||
PASS: actual full Inspect rejects canvas parenting, wrong active container/canvas, omitted origin offset, wrong rendered box and stale coordinates; differing origins and DPI accepted
|
||||
PASS: actual long-warning phases retain visible label through1500ms checkpoint then restore radio before close; synthetic marker separated from unmoved player
|
||||
PASS: actual Center keeps marker offset within large and small native viewports at both fixture zooms without altering disclosed coordinates
|
||||
PASS: missing, child-only, malformed, zero and duplicate prefab root IDs rejected
|
||||
PASS: delayed scene/inventory arrival, deferred preload, identity checks, stale replies, timeout and observer cleanup
|
||||
PASS: loading protection restores only its own damage change, rejects invalid admission actors, and tolerates repeat/deleted cleanup
|
||||
PASS: actual inventory manifest, delayed/missing/wrong-owner item links, finite cap, consumed-stock refresh and preload ordering
|
||||
PASS: spawn scene remains held through final acknowledgement and nearby use; leaving, reassignment, disconnect and teardown release it
|
||||
PASS: production prison AI hold/release, repeat activation, authority/faction/player exclusion, dead actor and stop cleanup
|
||||
PASS: actual protected/capped damage plus exact-actor terminal fixture bypass through delayed native damage, fail-closed ownership and untouched ordinary actor; no native claim
|
||||
PASS: actual full planner selection/commit body, 360 equivalence scenarios, orders/reservations/cooldowns identical; one128-unit scan vs >10000 repeated unit visits; no FPS claim
|
||||
PASS: actual observer monitor/recovery/cleanup rejects retained old controller, preserves new camera/editor/hints/timer, restarts once and retains normal recovery; native effects modeled from SDK, no runtime claim
|
||||
PASS: former chat controller releases only its own callbacks and preserves replacement menu; current-owner stop/scope and repeated teardown remain intact
|
||||
PASS: wrong observer fixture selector rejected before runtime/profile setup; no engine launched
|
||||
PASS: native camera fixture uses current generated sites instead of the obsolete fixed extraction pickup
|
||||
PASS: actual depot mixed-roster worker/item selection, ownership/refusal and radio/planning/two-leg state transitions, fixed deadline, late proof quarantine, finite import and no adoption after Stop
|
||||
PASS: actual depot HQ lifecycle, existing planner priority, server/mode/owner gates, idempotent polling and owner replacement
|
||||
PASS: actual HQ mine/magazine claim separation, real demand methods, exact token cleanup and original authority gates; native availability doubled
|
||||
PASS: actual full magazine/inert-PMN4 depot leaf, exact custody, isolated callbacks, finite reservation, false/unknown and Stop quarantine, once-only delivery and caps; native movement unqualified
|
||||
PASS: actual mine/magazine provenance and separated finite mine imports; actual authored identity capture, READY-only detached provenance, same shared stock admission, completed exact two-leg proof, lifetime caps and Stop no late adoption
|
||||
PASS: anger per car, all thresholds and remainders, disable/re-enable, wave cap, staged retries, empty-round reset, no backlog, four seats and nearest-player road distance
|
||||
PASS: motorbikes require all mounted addons and exactly two crew seats; base/wreck prefabs rejected
|
||||
..
|
||||
----------------------------------------------------------------------
|
||||
Ran 2 tests in 0.001s
|
||||
|
||||
OK
|
||||
PASS: road width/bridge/length checks, prison and post spacing, setting bounds/default, finite startup and owned HQ admission
|
||||
PASS: exact configurable width cutoff, separate quotas and independent disabling
|
||||
PASS: every saved setting has a fresh-profile constructor default
|
||||
PASS: actual roadblock scheduler yields initial deadline/attempt cap to background, budgets samples, pauses empty/full worlds, completes 30 after unlock, preserves safety and never replenishes losses; teardown cancels work
|
||||
PASS: actual staged post creation spawns at most one entity per callback, commits only all four/eight guards, all planned props and waypoint, and rolls back player approach, obstructions, spawn/replication/ledger failure and cancellation; all committed props bypass distance streaming
|
||||
PASS: both shipped checkpoint layouts preserve vehicle lane, opposing signs, staggered barriers, clear guard slots and separate props across 4–16m roads and all tested headings
|
||||
PASS: actual prop clearance excludes owned geometry while retaining moved-guard, foreign-obstruction, water and terrain rejection
|
||||
PASS: road-edge/intersection clearance, mine detour geometry, checkpoint hold authority and retask cancellation
|
||||
PASS: actual crash geometry, detached definition setup, frozen server choice and guarded phase policy; integration/source ordering checked
|
||||
PASS: actual GameMode readiness admission and common full-footprint survey require crash authorization and both surveyed areas
|
||||
PASS: actual start defaults/parse/save, failure retention and authorized command wiring; current/next feedback, aliases and no random choice; native UI and core mode freezing are separate
|
||||
PASS: native-rejected custom items remain available without startup delay; required map and async insertion safeguards retained
|
||||
PASS: exact starting-stock edits, quantities/type/total limits, duplicate rejection, saved custom/default modes, authority/read-only/save-failure retention and authenticated catalog routing
|
||||
PASS: actual immutable measured footprint/root/attachment matching, bounds/transforms, moving geometry, seated-body and cargo reciprocity, finite hierarchy caps; native geometry doubled
|
||||
PASS: actual BMP singleton geometry and typed current order; one survey, full straight segment, width, known history, reservations, settlement/clearance and work caps; placement/footprint tested separately
|
||||
PASS: actual five random-radius diagnostic wrappers, disabled transparency, cached opt-in, exact zero and exclusion branch, native arguments/returns/outarg preservation, single superclass call and shared16-log cap
|
||||
PASS: zero-radius trace disabled by default, scoped before setup, exact opt-in emission; no native launch
|
||||
PASS: complete actual supply-travel probe, immutable 6+2 formations and 25 actors, admission/travel deadlines, six observed native-boundary moves, stop/ownership/partial-substitution refusals
|
||||
PASS: actual distinct supply-travel hook, fixed420s selector, original observer protection/restoration, failure/terminal cleanup and no legacy convoy setup
|
||||
PASS: actual supply-travel selector requires Chat, one round and480s; existing outcomes unaffected; no native launch
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {coordinated-ai,crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,self-epinephrine,starter-backpack,speech-download,bundled-speech,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,sarka-hunters,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,roadblocks,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,inventory-hitzone,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
|
||||
[--roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--large-roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--speech-probe-url SPEECH_PROBE_URL]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--coordinated-blocked-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {coordinated-ai,crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,self-epinephrine,starter-backpack,speech-download,bundled-speech,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,sarka-hunters,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,roadblocks,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,inventory-hitzone,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
|
||||
[--roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--large-roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--speech-probe-url SPEECH_PROBE_URL]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--coordinated-blocked-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {coordinated-ai,crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,self-epinephrine,starter-backpack,speech-download,bundled-speech,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,sarka-hunters,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,roadblocks,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,inventory-hitzone,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
|
||||
[--roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--large-roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--speech-probe-url SPEECH_PROBE_URL]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--coordinated-blocked-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {coordinated-ai,crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,self-epinephrine,starter-backpack,speech-download,bundled-speech,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,sarka-hunters,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,roadblocks,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,inventory-hitzone,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
|
||||
[--roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--large-roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--speech-probe-url SPEECH_PROBE_URL]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--coordinated-blocked-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept requires Chat --smoke convoy, one round and timeout at least900 seconds
|
||||
usage: test_native_mounted_intercept.py [-h] [--steam STEAM]
|
||||
[--external-addons EXTERNAL_ADDONS]
|
||||
--compat COMPAT --profile PROFILE
|
||||
[--smoke {coordinated-ai,crash-start,crash-geometry,normal-escape-route,escape-route,optional-site-skip,infantry-combat,medical-combat,hunter-faction,unconscious-camera,self-epinephrine,starter-backpack,speech-download,bundled-speech,objective-map,town-garrisons,site-garrisons,radio-interaction,enemy-loadout,aggression,sarka-hunters,air-logistics,air-assault,air-recon,airfield-markers,opening-tools,mortar-station,generated-sites,roadblocks,hq-local-handoff,infantry-transfer,hq-body,convoy,supply-convoys,supply-travel,mounted-ammo,alarm-hearing,hq-memory,hq-awareness,aircraft-field,aircraft-route,native-end-active,native-end-preparing,aircraft-control,aircraft-cancel,aircraft-translate,map-ownership,mortar-refresh,mortar-salvo,mortar-courier,station-teardown,inventory-hitzone,prison-breach,powered-flight,powered-translate,local-admission,mortar-expiry,mortar-transfer,mortar-fire,patrol-hq,victory,lost-helicopter,player-death,radio-network,hq-response,mortar-inventory,startup-failure,site-survey,cache-loss,extraction-capacity,early-helicopter-loss,extraction-startup-failure,extraction-boundary-failure,transport-loss,transport-survey,lifecycle,objective-ui,recovery,prisoner-kit,medical,casualty-load,casualty-direct,casualty-bench,casualty-remove,environment,environment-restart,patrols,radio-document-loss,radio-document-loss-partial,guard-cancel,casualty-service}]
|
||||
[--roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--large-roadblock-probe-count {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}]
|
||||
[--speech-probe-url SPEECH_PROBE_URL]
|
||||
[--trace-random-radius]
|
||||
[--maintenance-refuel]
|
||||
[--mounted-swap-eligibility]
|
||||
[--mounted-bmp] [--mine-stock]
|
||||
[--mounted-courier]
|
||||
[--mounted-intercept] [--convoy-cover]
|
||||
[--field-terrain-audit]
|
||||
[--field-service-cancel]
|
||||
[--route-service-cancel]
|
||||
[--station-teardown-diagnostics]
|
||||
[--flight-autohover]
|
||||
[--flight-action-inputs]
|
||||
[--flight-input-diagnostics]
|
||||
[--recon-takeover-only]
|
||||
[--body-recovery-only]
|
||||
[--coordinated-blocked-only]
|
||||
[--rounds ROUNDS] [--timeout TIMEOUT]
|
||||
[--project {core,chat}]
|
||||
test_native_mounted_intercept.py: error: --mounted-intercept and --convoy-cover are mutually exclusive
|
||||
PASS: actual native interception witness requires real radio cursor/lineage, original actor identities, fixed movement/hold/expiry/resume and immutable deadline; no movement/delivery injection
|
||||
PASS: actual CLI rejects wrong mode/project/rounds/899s/conflict before runtime; valid flag and terminal branch identify synthetic-observation qualification
|
||||
PASS: visible base hook and actual fixture override delegate once; delivery proof uses retained pre-super route only on successful production transition
|
||||
actual mounted HQ dispatch planning, radio, ownership and lifecycle checks passed
|
||||
PASS: actual mounted intercept eligibility/order chronology, fixed destinations, native road selection bounds, width, segment heading, clearance and settlement delegation; no native driving claim
|
||||
PASS: actual paired arc geometry,40m/80m spacing, separate original polylines, both-position validation and128road/4096segment budget; no native driving proof
|
||||
PASS: actual typed original BMP singleton, loss/footprint/custody guards and native cancellation, UAZ-only pair admission, rollback, native allocation/revocation boundaries, per-member ownership, hold and expiry
|
||||
PASS: actual Tick clock initialization admits fractional first ticks and expires without extending the original start
|
||||
PASS: actual finite conservation/deadline/callback policies; read-only selection, bounded once-only inventory submission and no can refill; native transfer not executed
|
||||
PASS: actual exact-context membership, bounded identity/reach gates, native start/cache/eligibility ordering and no duplicate/foreign action start; fuel manager identity and empty-can headroom guards checked
|
||||
PASS: actual detached node/value snapshot and conservation refuse mismatched lengths before indexed reads, retain original identities under native out-array aliasing and log bounded counts once; native cause remains unknown
|
||||
PASS: actual mine evidence sealing/recovery, historical coarse publication, caps, canonical ownership, marker join retry/owner-change/stop; native arming and replicated vector-array transport untested
|
||||
PASS: actual full document recovery retains authored/sealed targets, one shared spent ledger, retry/exhaustion semantics and canonical multi-player ownership alongside supplemental mine intel
|
||||
PASS: actual infantry search suspension, quiet grace, finite resume, expiry/replacement and defensive/ownership boundaries
|
||||
PASS: infantry combat gate precedes radio delivery and preserves non-task transports
|
||||
PASS: actual HQ contact transition wakes only fit squad members, cancels only task orders and logs changes once
|
||||
PASS: actual finite medicine grants, authored stock deduction, full-backpack refusal/pouch fallback, no loot replenishment, unresolved-operation quarantine and ownership/stop guards
|
||||
PASS: only recent native detected/identified threats suspend hunter travel; stale/disarmed/destroyed contacts cannot strand patrols
|
||||
PASS: actual hunter combat transition cancels only its travel once, holds through renewed contact and resumes after quiet; unregistered startup preserved
|
||||
PASS: actual movement recovery retries delivered orders three times, respects combat/speed/arrival/progress, then abandons the stalled vehicle
|
||||
PASS: actual abandonment releases once, detaches transport, requests native exits only for fit original AI aboard, and leaves players/captured crews alone
|
||||
PASS: captured sighting retention, immutable details, expiry, replay rejection, bounded sound uncertainty/cooldown, radio loss, priority and overdue-status fairness
|
||||
PASS: arrow press/release, held keys, opposing keys, disabled/menu input and firearm-only retention
|
||||
PASS: actual self-injection eligibility matrix and authority/rate limit; default-off persistence, authenticated menu route, owned finite injector and native effect/consumption boundaries
|
||||
PASS: town trigger and hard 700m exclusion for all observers, empty/invalid positions and final-check crossings
|
||||
PASS: object guard split, hard 1000m exclusion / 1400m activation, footprint support, slopes, holes and invalid traces
|
||||
PASS: actual fixed-post admission reserves only stationary guards from HQ retasking and tightens their defend radius
|
||||
PASS: production site classification accepts structures/descriptors and excludes industrial props, fragments, flags, ruins and vehicles
|
||||
PASS: increased site populations preserve the 32 fixed / 16 mobile field-soldier budget, with guards at every site
|
||||
PASS: exact finite site squads, invalid roster/count rejection, committed-site spacing and safe fallback boundary
|
||||
PASS: mortar couriers use the mobile site team and refuse permanent-only garrisons
|
||||
PASS: omitted preferred mortar depot selects a surviving owned camp/mobile team; no camp, foreign cache and permanent-only sites are unavailable; historical priority retained
|
||||
PASS: real-session mortar deadline, failed-support convoy admission and hunter survivor/recovery gates
|
||||
PASS: native-route retry preserves delivered target, limits attempts and suspends during combat
|
||||
PASS: stale/deleted AI utility cannot receive Complete; mortar HQ preflight withholds unsafe orders; mounted convoy cover never creates infantry Defend
|
||||
PASS: flight crew affiliation and group precede native boarding; preparation remains bounded even while passengers wait
|
||||
PASS: factionless/deleted map targets do not abort perception; faction lookup tolerates teardown; deleting helicopter releases without capture/engine access
|
||||
PASS: shoot adapter waits for a physical round; bounded same-shell retries, interrupted/never-started loads, committed no-retry, order/owner changes and normal native delegation
|
||||
PASS: observed mortar corrections, radio delivery, bounded expiry, aim preservation and out-of-order impacts; native flight untested
|
||||
PASS: splash reports retain HQ-estimated movement with matching position/time; stale, mismatched or unsupported estimates rejected
|
||||
PASS: missing/invalid faction crew defers before any native spawn or allowance insertion; all registered RHS factions have explicit soldier and medic profiles
|
||||
PASS: vehicle radio issued once; pending, refusal and looting cannot duplicate or fabricate a physical radio link
|
||||
PASS: actual vehicle-radio link requires the original seated crew, physical manpack and live uncaptured mission vehicle; looting, dismount, release and teardown remove it
|
||||
PASS: actual hunter release preserves survivors/HQ, releases driving ownership once, delegates capture/teardown, and excludes prison/patrol/mortar from generic objective defence
|
||||
PASS: actual hunter cancellation releases exactly the pending source/message once; teardown clears ownership without HQ/game/world
|
||||
PASS: actual player-entry hook latches original hunter capture before native callbacks; both release layers cancel ownership without new entities/refund; bounded current-owner guards and prior-release policy
|
||||
PASS: real opening road geometry enforces wide azimuths; fresh delivered contact preempts patrol cooldown, respects radio failures and does not starve in-flight interception
|
||||
PASS: delivered ground search survives the 60-second mortar cutoff, with five-minute/500m uncertainty bounds and no live target reads; mortar policy unchanged
|
||||
PASS: reserve uses HQ reports/dispatch deadlines, preserves radio uncertainty, spends once, respects cooldown/availability/three-reserve/15-vehicle caps
|
||||
PASS: searches expire ten minutes after observation, ignore replays, wait at arrival, widen within 1 km and bound road queries
|
||||
PASS: actual scoped 10% tighter REGULAR aim error and alert perception; preserves equipment multiplier and restores vanilla behavior when unbound
|
||||
PASS: physical inspection and parent-wreck retention; server-only searched/report delivery unlocks native cleanup once with a 300-second delay
|
||||
PASS: 570 folders cover 57 unfinished sites evenly; known/automatic targets excluded, late camps included, and exact issued/authored documents preserved
|
||||
PASS: bounded same-group empty-spawn retries, no casualty refill, queue retirement, delivery-gated intel, prepared-team reuse, throttled diagnostics and LOD release
|
||||
PASS: four-team/twelve-wave bounds; two-thirds nearby radio defence; nearest selection, radio failures, expiry, perimeter separation, protected duties and independent response budgets
|
||||
PASS: production airborne memory confidence, persistence, ground coverage, confirmed losses, artillery veto, cooldown and invalid-input rules
|
||||
PASS: production bounded approach deadline, empty-drop reuse, partial-drop protection; cover retains the carried HQ target until its deadline; airport reload waits until the drop pass and cover have finished
|
||||
PASS: air logistics reservation preserves delivered search until radio handoff, excludes guards/combat/in-flight orders, and quarantines unresolved native loads/moves
|
||||
PASS: actual ammunition cargo selector handles empty rifle/machinegun/sniper magazines, preserves loaded variants, excludes auxiliary launchers and tolerates missing native metadata
|
||||
PASS: original 15-minute launch/loss cadence, active/captured timer disarm, saved delay reset, stop, 300m orbit and bounded close-contact standoff at 30/60/120 Hz
|
||||
PASS: actual aircraft-removal notification guards owner/server/active/stop and schedules one full delay without replay extension
|
||||
PASS: actual helicopter delay applies resolved Random values, preserves countdown on save failure, and leaves active flights running
|
||||
PASS: hill prominence/elevation, actual road edges/heights/bends and server-only finite scout admission, pending stock, timeout and no replacements/refills
|
||||
PASS: mortar duty scope excludes players, other crews, stopped/client/inactive states; only destruction releases an active assignment, while the gunner may approach the gun
|
||||
PASS: random mode restrictions, full numeric ranges, independent calendar dates and strict daylight boundaries
|
||||
PASS: actual killais eligibility includes the 1000m boundary, excludes players/retained bodies/dead/non-character entities and checks full 3D distance
|
||||
PASS: actual generation scheduler bounds each tick, enforces deadline/candidate ceiling, validates fallback, commits only accepted positions, skips only dispensable sites, preserves required objectives/intel, and resets the next search budget
|
||||
PASS: actual background activation waits an hour empty without consuming placement time; disconnect does not reset active budget
|
||||
PASS: actual separation keeps randomized extraction within the escape boundary in both placement orders, including fallback
|
||||
PASS: scenario validation admits randomized extraction definitions and rejects unsupported randomized site kinds
|
||||
PASS: terrain placement samples world bounds, retains streaming candidates, bounds waits/work, rejects foreign fallbacks, preserves objectives/intel and validates completion
|
||||
PASS: actual navigation readiness supports static meshes, yields only for loadable streaming tiles and refuses unreachable positions
|
||||
PASS: automatic extraction samples the whole terrain immediately and retains geometry/navigation/flatness and fleet-space checks without airport bias
|
||||
PASS: universal connector, embedded/standalone exports, multiple terrains, stable IDs, native nav configs, missing-nav visibility, path validation and overwrite protection
|
||||
PASS: airfield detection accepts physical runways/towers and bounded authored markers, rejects unrelated props, water and out-of-world markers, and samples terrain height
|
||||
PASS: configured airport parsing, bounded readiness, stale admission rejection and cleanup wiring
|
||||
PASS: automatic default, explicit header/CLI opt-out, editor/authored-mode guards, optional airport override precedence and fresh-round saving guard
|
||||
PASS: singleton identity guards, paired faction deserialization and client world-cleanup wiring
|
||||
PASS: task/map/respawn getters survive delayed old destruction and preserve ordinary-mode behavior
|
||||
PASS: replication hierarchy refuses absent/aliased nodes and establishes delivery dependencies idempotently
|
||||
PASS: standalone old faction delegates collected once, with null/deleted owners ignored
|
||||
PASS: actual terrain takeover startup skips mode-less/menu worlds, always forwards super, retains eligible/unsupported/authored/client/editor semantics
|
||||
PASS: native name callback preserves authored modes, opt-outs and failures; terrain suffix follows world changes, cached resolution and confirmed takeover text restores on cleanup without changing scenario identity or overwriting later edits
|
||||
PASS: actual terrain parent traversal, Armenhof/Nogova names, Everon alias, missing-resource fallback, empty names and bounded cycles/depth
|
||||
PASS: actual loading title/description hooks follow late takeover, apply text limits and empty updates, retain native progress and tolerate missing headers/widgets/game
|
||||
PASS: saved terrain GUIDs, defaults, restart persistence, clearing, backup recovery, corrupt-file preservation, write failures, and client write denial
|
||||
PASS: startup terrain capture protects client/editor/menu worlds, default behavior, same-map loads and reload-loop recovery
|
||||
PASS: actual transition waits for native startup, disconnects without bans, requires an empty session, retains every loaded mod, bounds waiting and consumes requests once
|
||||
PASS: actual faction resolution reserves explicit roles, samples without replacement, substitutes disabled selections, and rejects duplicate/unknown/missing choices and insufficient pools
|
||||
PASS: Random all submits persistent random roles immediately; manual mixed choices, stale/unauthorized UI guards and debounce preserved
|
||||
PASS: actual content policy gates parent packs, individual factions, faction identity and finite group rotation with vanilla fallback
|
||||
PASS: actual delivered road eligibility, ahead projection without chords, reservations, stock road query bounds, terrain/water/obstruction refusal and clean outputs
|
||||
PASS: actual delivered-task lineage, expiry, old-order retention, native commit, release, road precision expiry and duplicate delivery
|
||||
PASS: actual original-roster local handoff,100m3D bound,busy carrier/budget exclusion,origin interruption including deletedsource,normal radio delivery and per-source replay history
|
||||
PASS: actual visual intake retains source/time/position/id, rejects replay, prefers usable own route, excludes simultaneous callers and conservatively resets negative-sweep dwell
|
||||
PASS: actual fixture local/radio gating, immutable source/time/position, interrupted-report exclusion and exact-owner cleanup
|
||||
PASS: local-handoff runner refuses wrong project/round count/insufficient deadline before runtime work
|
||||
PASS: actual fixture allocator terminal/unsubmitted guard, original-group lookup and both candidate gates
|
||||
PASS: actual report-derived waypoint insertion/order and tighter positive radii; no formation navigation claim
|
||||
PASS: actual Place/Stop waits native pose update, bounds four attempts, preserves original position, restores pending/settled placement and respects ownership/accepted-move quarantine
|
||||
PASS: actual fixture current/original recipient ownership, unresolved transfer cleanup, exact-token release and idempotent Stop
|
||||
PASS: actual fixture phased-cargo readiness, bounded callbacks, captured-stock mixed-caliber selection/continuation, reservation cleanup and component magazine counts
|
||||
PASS: actual inventory-fixture setup uses ordinary prison unlock before constructing its convoy-waiting probe; failed unlock cannot run fixture
|
||||
PASS: actual authored storage anchors, native trace flags, own-hierarchy exclusion, external wall/vehicle obstruction, range, unknown geometry and bounded context refusal
|
||||
PASS: actual Compatible and bounded stock preflight before report/claim consumption, later compatible truck, launcher controls, convoy binding, finite identities, disjoint tokens, shared report replay/cooldown, original recipients and HQ cleanup
|
||||
PASS: actual finite convoy supply pool; immutable slots, shared demand state, sparse/capped discovery and permanent shutdown
|
||||
PASS: actual HQ rotates finite donors, skips unavailable/contacted trucks, uses delivered reports and dispatches at most one trip per planning cadence
|
||||
PASS: actual original turret identity, native/canonical guards, scoped maximum-skill profile, reset, dismount/reboard, requested-skill preservation and restoration
|
||||
PASS: bounded HQ startup/memory windows and outcome-specific full-route deadlines
|
||||
PASS: explicit escape-route skips only administrator stress, preserving original full-fixture wait/failure paths
|
||||
PASS: normal escape route keeps ordinary catalog and generated placement; historical selectors remain unchanged
|
||||
PASS: actual patrol fixture leaves prison before responder HQ proof, followed by separate permanent-patrol observation
|
||||
PASS: exact patrol-hq finite responder preparation and native search-radius receipt verification
|
||||
PASS: actual read migrates old valid settings, preserves explicit disabled state, rejects invalid data; next-round feedback and fixed menu remain honest
|
||||
PASS: actual automatic convoy timing/authority/admission/one-attempt/manual-task/stop policy; native deployment unproved
|
||||
PASS: late authoritative failure reason refreshes open result; detach, mode change and success subscriptions preserved
|
||||
infantry resupply actual rules, radio transitions, owned cleanup and unresolved-operation tests passed
|
||||
PASS: actual resupply Roster preserves permanent release, original slot mapping and bounded ownership
|
||||
PASS: actual designated zero/one original carrier selection, settled startup, shared finite claims, no refund after submission
|
||||
PASS: actual HQ startup grant readiness forwarding is authoritative and fail-closed
|
||||
PASS: actual finite PMN4 designated-zero/one entitlement, pinned original ownership, shared commit, physical custody, callback quarantine/deletion and no retry
|
||||
PASS: actual bounded empty-return and finite delivery; phase-isolated callbacks, exact ownership proof, stop quarantine and original actor/vehicle boundaries
|
||||
PASS: actual shared finite identity reservation; competing consumers, submission permanence, stale cleanup and96-item bound
|
||||
PASS: actual carried-mounted swap, shared committed claim, physical slot reach, exact two-way proof, uncertainty and terminal cleanup
|
||||
PASS: actual mounted pickup, exact finite ownership, pre-submission commit, physical custody, bounded callback and quarantine lifecycle; no native coverage claim
|
||||
PASS: actual mounted courier admission, radio, individual orders, two-stage transfer, reboarding, token cleanup and quarantine lifecycle
|
||||
PASS: actual scoped crew permit and native board completion/failure preserves foreign seats without teleport fallback
|
||||
PASS: actual shared mounted stock/history ownership, atomic exact HQ pair claim, and bounded stopped-owner proof polling
|
||||
PASS: actual carried/mounted early ammunition policy and status-first shared uplink; complete threshold, phases, cooldown, failures requested check-ins and non-urgent detached carried-mine status
|
||||
PASS: actual group radio startup preservation, finite native grants, callback quarantine, frozen selection/actor ownership and bounded observation
|
||||
PASS: actual maintenance native-stock check rejects missing/duplicate/wrong-identity/unowned/depleted/malformed stock and is read-only; native runtime not executed
|
||||
..................
|
||||
----------------------------------------------------------------------
|
||||
Ran 18 tests in 0.248s
|
||||
|
||||
OK
|
||||
PASS: actual radio node rejects current incapacitation, death, ownership and faction changes despite cached inventory; one-second capability refresh remains explicit
|
||||
PASS: Southern finite maintenance stock preserves weapons/clues and optional transport, historical Western fixture stays separate; native capacity/consumption untested
|
||||
PASS: optional transport deferred behind required readiness, bounded once-only spawn/omission, isolated cleanup, occupied-candidate retention and required-default preservation
|
||||
PASS: actual diagnostic fallback runs only on failed missing-context call, derives unique native pilot door, preserves stock eligibility and restores prior index on success/failure; diagnostics mutate no game state.
|
||||
PASS: actual native-prelude cleanup restores only original changed damage, refuses stale/incapacitated/aboard teleport; bounded five-seat/four-door fixture wiring checked. Native execution remains pending.
|
||||
PASS: actual CreateTransport requires successful scoped Configure after handbrake, preserves ordinary vehicles, tracks spawned entity before failures and never treats failed lock registration as ready.
|
||||
PASS: actual preparation Configure guards/idempotence/breach preservation, security eligibility/final current-body server mutation and all scoped action guards; all five seat/four door resource overrides. Native hold, prefab merge, replication and boarding remain unverified.
|
||||
PASS: production vehicle alarm single trigger/replica completion/no replay, fixed deadline/readiness wait, failed audio, dedicated server, moving exact handle, destruction/native end/deletion/clock and mission teardown. Native sound and multiplayer delivery require engine qualification.
|
||||
PASS: production alarm emitter/receiver original time/location, explicit native queue only, 32-entry cap, 50m local witness eligibility, bound perception, native-super preservation; actual engine broadcast/hearing remains unverified.
|
||||
PASS: actual optional candidate barrier, exact callback/custody proof and unchanged mine/primary snapshots; no native transfer claim
|
||||
Native finite mine-stock runner: parser, scope, exclusions and command pass
|
||||
PASS: actual bounded native mounted proof/detached payload/deadline/cleanup methods, production-only setup and isolated runner selector
|
||||
PASS: actual one-existing-convoy candidate readiness, sender-root identity, incomplete cargo refusal and fixed three-candidate bound
|
||||
PASS: actual BMP capture requires complete armed exact original resource; pinned delivery/slot checks and isolated CLI flag
|
||||
PASS: actual opt-in pre-unlock isolation refuses wrong mode/phase/flag and existing hunters; no baseline service changes
|
||||
PASS: actual once-only native dry query, exact before/after slots, native refusal, shutdown; shared bounded discovery and distinct opt-in verdict
|
||||
PASS: actual completion selector and pre-cleanup variant capture preserve separate radio and eligibility verdicts
|
||||
PASS: actual cargo diagnostic stages separate absent/foreign magazines, used/empty/invalid rounds, well mismatch and exact truck storage/attachment without mutation
|
||||
PASS: actual native courier witness rejects missing radio/custody/swap/reboard evidence; CLI opt-in bounded; native success remains unqualified
|
||||
PASS: actual courier constructor/Tick waits for preparation, returns before physical checks, preserves fixed deadline and sticky stop/failure; Enfusion startup awaits native verification
|
||||
PASS: actual arranged native alarm fixture deadline, single emit, natural-route observation, original timestamp/area/detail assertions, natural observer proximity/activation wait, failure cleanup and independent canonical-body restoration; native delivery itself remains unqualified.
|
||||
PASS: actual convoy cover observation/snapshot/uplink/HOLD/RESUME/cleanup transitions; native boundaries mocked, non-convoy runner opt-in refused
|
||||
Enemy optics actual-service ownership, preservation, callback, deadline and bounded-inspection policies passed
|
||||
PASS: actual delivered cover freshness/lineage/replay and canonical executor; owned waypoint-only hold, one resume at preserved route index, invalid ownership/crew/ledger refusal and fail-closed native recreation
|
||||
PASS: actual Stinger show/set/help state precise actor-roll effects; read-only help, bounded values, malformed syntax and failed-save preservation; no rerolls/gameplay edits and no native persistence claim
|
||||
PASS: new/retasked search and radio delivery ammo gates; active tasks and delivered release preserved
|
||||
HQ convoy delivered-report planning and downlink regressions passed
|
||||
PASS: actual own-inventory ammo inspection deduplicates loaded/carried/shared wells, separates chambers/launchers, freezes scalar snapshots and treats unsupported/capped/foreign inventory as unknown
|
||||
PASS: actual carried PMN4 inventory, original-owner guards, bounded deduplication, independent unknown state and detached counts
|
||||
PASS: actual mounted hierarchy sampling, ownership exclusion, deduplication, completeness/caps, quarter threshold and detached validation; no runtime policy or ammunition mutation
|
||||
PASS: WORKBENCH opt-in diagnostics distinguish cycles/cap/storage/manager/mount failures without repeated native traversal
|
||||
PASS: actual HQ original convoy-root admission rejects wrong force/server/group and never supplies replacement lookup
|
||||
PASS: production mounted structural seat scan ignores >128 carried/cargo descendants, shares exact native mount/magazine ownership, preserves attachment seats and exact occupants, rejects unknown/cyclic/oversize structures; native binding still requires qualification.
|
||||
PASS: native body fixture uses existing immutable actors, real production LOS/queued uplink, pre-delivery isolation, actual status overlap, bounded cleanup and no fabricated reports/spawns
|
||||
PASS: actual native fixture lookup selects exact BODY kind/identity/message from bounded evaluations, never sighting-only Get
|
||||
PASS: actual ammo snapshot comparison checks every scalar/category flag; native probe requires real roster rescan, loaded-round lower bound and separate immutable pending/Watch objects
|
||||
PASS: actual delivered slot-union bodies preserve overlap/disjoint evidence, replay idempotence, status subset integrity, full-wipe closure and formation-local bounds
|
||||
test_review_added_allowed_media_invalidates_snapshot (__main__.ReviewTests.test_review_added_allowed_media_invalidates_snapshot) ... ok
|
||||
test_review_added_source_directory_rejected (__main__.ReviewTests.test_review_added_source_directory_rejected) ... ok
|
||||
test_review_loose_root_resource_and_symlink_rejected (__main__.ReviewTests.test_review_loose_root_resource_and_symlink_rejected) ... ok
|
||||
test_review_metadata_media_and_sidecars_remain_allowed_and_bound (__main__.ReviewTests.test_review_metadata_media_and_sidecars_remain_allowed_and_bound) ... ok
|
||||
test_review_missing_link_rejected (__main__.ReviewTests.test_review_missing_link_rejected) ... ok
|
||||
test_review_package_guard_sees_new_scripts (__main__.ReviewTests.test_review_package_guard_sees_new_scripts) ... ok
|
||||
test_review_retargeted_private_link_rejected (__main__.ReviewTests.test_review_retargeted_private_link_rejected) ... ok
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 7 tests in 0.060s
|
||||
|
||||
OK
|
||||
PASS: actual report methods reproduce old starvation; status-first scheduler delivers check-ins and requires 30s without combat or actual visible contacts before negative reports
|
||||
PASS: actual actor group lookup retains controlled character membership when seated/inherited vehicle agents differ; missing control or parent refuses
|
||||
.................
|
||||
----------------------------------------------------------------------
|
||||
Ran 17 tests in 6.327s
|
||||
|
||||
OK
|
||||
PASS: actual convoy motion thresholds, native-only proof boundaries, physical cargo/crew ownership and pre-launch runner restrictions
|
||||
PASS: actual new measured ClearFootprint 25/441 sample grids, measured extents/height, water/invalid world/terrain/trace refusal plus legacy filled rotated-footprint TraceBox and nine terrain/water samples; broad tree/cable bounds alone accepted, actual collision/nonfinite trace refused, nonzero sweep and ENTS/OCEAN flags, bounded diagnostic query and reset
|
||||
PASS: actual road interpolation/projection/orientation, six35m starts,200m forward tail, preserved bends, short/far/degenerate/nonfinite/overdense/hairpin refusal and deterministic candidate ties
|
||||
PASS: actual authenticated convoy dispatch, active/ready admission gates, canonical receipt, safe unconsumed preflight retry, pool refusal, retained partial failure and consumed no-retry
|
||||
PASS: actual native readiness exact membership, one-time per-vehicle ledger admission/reservation, partial readiness retry without duplicate records and one-pass56-item cargo allocation without replenishment
|
||||
PASS: actual per-vehicle readiness reasons, native agent/activity counts, intended-seat diagnostics, five-second throttle and read-only observation
|
||||
PASS: actual convoy dispatch validates before receipt consumption, consumes once before native mutation, retains all10 partial-failure paths, accepts the selected non-USSR enemy, and allocates exact10 bodies without capacity shrinking
|
||||
PASS: own memberless prefab disables automatic spawn before initialization; actual admission rejects populated, immediate or authored-slot templates before finite crew creation
|
||||
PASS: actual native seated-group arrival outside35m, native waypoint removal, idempotent advance, and convoy waypoint idempotence/arrival/deadline, missing/dead/captured/reparented crew refusal, failed native waypoint release, original vehicle/member preservation and no replacement
|
||||
PASS: actual convoy/team Release retains original active survivors and HQ identity, rejects takeover/terminal/unknown roster, preserves exact logistics quarantine and normal eligibility
|
||||
PASS: actual convoy receipt identity/one-use, shared60-body and128-formation caps, outstanding/native-ledger accounting, exact10-body composition, source reuse, mode/client guards and no consumed receipt refunds
|
||||
PASS: actual supply route cycling/arrival/stops, finite startup bounds, contact freshness, dismount hold, quiet interval, interrupted boarding, timeout and lost-truck release
|
||||
PASS: moving-convoy perception boundaries and scoped individual/group abandonment priorities
|
||||
PASS: actual supply startup reasons expose unchanged body budget/requirement, journal only failure changes, preserve retry cadence/caps and report the true final refusal
|
||||
PASS: actual combat start releases only exact intercept claims before owning route/orders; foreign claim defers combat takeover
|
||||
PASS: actual StartOne plus actual pool preserve unconsumed receipt retry, reject consumed replay, skip impossible new-budget surveys, retain equality, retry caps and journal dedup; no FPS claim
|
||||
PASS: actual admission seeds use exact installed loaded prefab, reject replacement/foreign/projectile paths and preserve bounded immutable identity
|
||||
PASS: actual primary-before-mounted one-shot batch, shared96/128 caps, physical snapshot headroom, original ownership, callback refusal and admission pinning
|
||||
PASS: actual bounded HQ query validates only existing original binding without admission or replacement lookup
|
||||
PASS: exact optional PMN4 startup, primary callback independence, original owner,128 capacity/callback limits, terminal no-retry and callback-proven freeze
|
||||
PASS: production convoy spacing, physical arrival, stable follower targets, supply ownership, leader promotion and bounded stuck recovery
|
||||
PASS: convoy combat keeps native manoeuvres for unchanged contacts and refreshes when contact moves
|
||||
PASS: native convoy proof excludes pre-departure movement and ends via explicit fixture reset, not prohibited player death
|
||||
PASS: boarding retries only after approach/seat progress stops, capped at three, with delayed native reissue and completed-team preservation
|
||||
PASS: slow only owned vehicles near fit dismounted infantry; ignore passengers, casualties and released teams/vehicles
|
||||
PASS: restore missing native driving registration only for healthy owned seated crews; preserve existing association and refuse invalid/released vehicles
|
||||
PASS: actual convoy support preserves visual cover and ongoing approach, retries masked arrived positions, withholds unsafe moves and preserves ammo withdrawal
|
||||
PASS: production support geometry rejects occupied, disallowed, blocked and too-close positions; only explicit intermediate approaches waive the firing-lane requirement
|
||||
PASS: actual body observer enforces owned physical roster, local death-only candidates, native trace gating, budget/cadence/caps, immutable body-only snapshots, radio retries and confirmed suppression
|
||||
PASS: own initial roster, explicit retained corpse evidence, unconscious/missing/ref transfer guards, fixed strength, no replacement adoption, detached samples, surviving radio sender, immutable convoy root/ledger, mounted capture release and lost-root unknown
|
||||
PASS: delivered-only status snapshots, two missed check-ins/reply deadline, last reported coordinates, episode/replay guards, confirmed-loss idempotence, detached/validated mounted payload replacement 256-record cap and detached carried-mine radio delivery/chronology
|
||||
PASS: actual failed-retask deadline rollback plus assignment cancellation/release preserves radio ownership, native waypoint lifecycle and failed-order retry boundaries
|
||||
PASS: actual force ledger, finite casualties/identity/cap, routes/arrival/elevation/overshoot, server and physical guards, staggered 256-record simulated hour without world queries
|
||||
PASS: actual equipment coordinator registration dedupe, startup delay, five member scans, finite component retries, unregister/stop terminal behavior and 256-group bound
|
||||
PASS: actual percentage selection, native/preferred launcher preservation, failure/removal fallback, pending-operation quarantine, capture, finite two-mine grants and no replenishment
|
||||
PASS: automatic inventory one-shot roll, exact item ownership, finite compatible ammo, rejection, capture/stop, deletion, loot and late callback quarantine
|
||||
PASS: enabled/valid catalog eligibility, category restrictions, content filtering, GUID deduplication across factions and bounded catalogs and exact weighted ticket boundaries (100:1, zero excluded)
|
||||
PASS: actual engineer native group-envelope admission and phase cancellation, preparation/deadline, original custody/identity, once-only callback removal, cancellation quarantine, withdrawal/clearance, native refusal and owned-action cleanup; native execution untested
|
||||
PASS: actual mine selector respects road and settlement flank safety; native boundaries doubled
|
||||
PASS: actual HQ and post ledger: second delivered post, one query/tick,2 active/32 jobs,4 consumed lifetime attempts, no-stock/query refusal consumption, pending old job and original identity constraints
|
||||
PASS: actual mine post ledger immutable history, strict chronology/evidence, aliases, >160m separation, detached sites and finite4/32 consumed attempts
|
||||
PASS: actual objective heading/threat/approach rules, persistent doctrine weight, fresh-contact coverage invalidation, stale-sweep rejection and atomic radio retask ownership
|
||||
PASS: actual bounded delivered-negative coverage, replay/freshness/expiry/invalid guards, oldest eviction, small-circle and nearest-unswept selection, reserved-cell exclusion and cleanup
|
||||
PASS: actual five/six bounded hypotheses, observation-relative ETA, future lead, hiding/reverse, local negative weighting, immutable report lineage, road bends/heights and finite cache budgets
|
||||
PASS: actual10/40m local negative patches, same-cell hidden-ground preservation, proportional residual belief, replay, chronology, physical-report guards, caps and cleanup
|
||||
PASS: actual operation selection/replay, pending reservations, detached reports, identity/sequence/time gates, terminal lifecycle, bounded ledger, finite roles, no shadow mutation or hidden-player inputs
|
||||
PASS: actual squad judgment, stable caution, delivered casualty/contact/ammo trends, isolation, replay/time validation, recovery hysteresis, no invented healing or enemy knowledge
|
||||
PASS: actual terrain survey chooses usable cover/concealment, preserves search and bound envelopes, honours finite support, delivered evidence, ownership, async tiles and shared geometry budget
|
||||
PASS: actual-action speech, finite current cover, local search wording, silence after replacement/transfer/stale queue, stable cooldown and optional direct speech
|
||||
PASS: actual hunter reservation ledger, pending/delivered replacement, independent six/eight caps, stale/empty status, finite observation deadline, no hidden force-position lookup
|
||||
PASS: actual coordinated adapter report gates, local evidence, delivered-force snapshots, ownership/lease checks, continuous-contact arbitration, legacy isolation and shadow no-native-order boundary
|
||||
PASS: actual execution lifecycle, original physical arrivals, failed movement, quiet footprint, local support expiry and delivered report acknowledgments
|
||||
PASS: native support wiring requires own activity, soldier suppression, actual projectile event and immutable roster; no waypoint-completion arrival shortcut
|
||||
PASS: actual finite native LOD leases restore prior overrides and protect transferred agents, player ownership and intervening overrides
|
||||
PASS: actual waypoint pause/resume owns only its finite order, preserves unrelated routes and cannot resurrect a superseded or deleted hold
|
||||
PASS: installed native priorities authorize group suppression71 over ordinary combat70, below native healing80; tagged soldier suppression91 yields ammo100, retreat110, medics111 and immediate danger (action SHA256=eb9ba812538707940b90d2386432faeb8c8aca3c83a547d5b59bf7af4887627c)
|
||||
PASS: actual suppression and projectile methods retain a fixed eight-second last-seen area, deny blind support, require exact owned behavior, preserve finite ammo/shot budgets and bound retries
|
||||
.............
|
||||
----------------------------------------------------------------------
|
||||
Ran 13 tests in 0.717s
|
||||
|
||||
OK
|
||||
PASS: actual coordinated runner admission and explicit blocked-only engine flag; no native launch
|
||||
PASS: actual HQ active/pending reservations, interruption, committed replacement, bounded coverage and unchanged force counts
|
||||
PASS: actual bounded pursuit roles/objectives/scores, stale search degradation, physical/busy/home guards, finite lifetime and two-bearing escape gap; no hidden player reads or spawning
|
||||
PASS: actual finite45..110 radius and both ordinary search queue snapshot expressions
|
||||
PASS: actual HQ memory rules/service preserve delivered snapshots, chronology, replay bounds, decay, motion limits, identity and negative-search revisions
|
||||
...........
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 0.266s
|
||||
|
||||
OK
|
||||
PASS: actual session Tick + journal router delivers each grant completion and new HQ line once, without repeats on empty/unavailable feeds or unauthorized ticks
|
||||
.....
|
||||
----------------------------------------------------------------------
|
||||
Ran 5 tests in 0.653s
|
||||
|
||||
OK
|
||||
PASS: actual current-controller/admin/mode authorization, per-round anti-replay, token-rotation refusal, command/snapshot throttles and client scope; owner-only replies and player-tool cleanup wiring
|
||||
PASS: mission provider registration is idempotent, optional dispatch is ordered, status aggregates, journals preserve cursors, aliases stay with their addons and topic help is bounded
|
||||
PASS: actual menu command routing covers all menu settings, rejects unsupported keys, gates companions, and matches unique authored widgets
|
||||
PASS: explicit weapon retention buttons use the same ready/authorized server command path
|
||||
PASS: restart toggle submits authorized settings commands; Mission controls fit without overlap
|
||||
PASS: item editor, preset controls and dynamic item-row layout are structurally valid
|
||||
PASS: selected choices remain green/red and fully visible when disabled; unselected choices return to neutral
|
||||
PASS: probability editor and weighted item-row layout have all bound controls
|
||||
PASS: catalog requests use authenticated sessions, independent admin page selections, loaded-mod allowlisting, bounded pages and allowlisted item mutations
|
||||
PASS: actual item rules, shared-source conflicts, missing/returning mods, bulk reset, independent named presets, bounds, malformed data and failed-save state preservation
|
||||
PASS: actual summaries preserve queued/delivered meaning, clear counts and IDs; raw records, legacy display, cursor gaps and RPC limits remain intact
|
||||
PASS: actual admin body authorization, god restoration, vanilla item deposit, callback completion/failure, timeout quarantine and stop/revocation paths
|
||||
PASS: same-body revoke/regrant preserves pending insertions and timeout quarantine; new-body binding isolates late callbacks and never inherits god mode
|
||||
PASS: actual Intel commands distinguish status/start/failure, preserve authorization gate and reject malformed requests; spent ledger is idempotent, server-only and bounded
|
||||
PASS: actual reroll snapshot, authority, cancellation, ownership, accepted operations, quarantine, bounded work and stop methods; no native runtime claim
|
||||
PASS: production Intel feedback coalescing, rough secrecy, rate limit, bounded dedupe, local/remote delivery and round cleanup; native UI/RPC not exercised
|
||||
PASS: actual per-squad bounded report selector rotates visible targets, survives ordering/turnover, records only queued attempts, and preserves radio intake ordering
|
||||
PASS: actual action denial/clearing, server request failure, single submitted-result feedback, current rescuer identity and terminal/stop suppression; native UI/RPC pending
|
||||
PASS: actual physical denial precedence and transport-seat occupancy/reservation/access/lock checks
|
||||
PASS: actual initial admission exhaustion and ServerTick grace; new/pending/empty/controller/life guards, normal death preserved
|
||||
......................
|
||||
----------------------------------------------------------------------
|
||||
Ran 22 tests in 0.244s
|
||||
|
||||
OK
|
||||
......................
|
||||
----------------------------------------------------------------------
|
||||
Ran 22 tests in 23.167s
|
||||
|
||||
OK
|
||||
..................
|
||||
----------------------------------------------------------------------
|
||||
Ran 18 tests in 2.572s
|
||||
|
||||
OK
|
||||
.........
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 1.968s
|
||||
|
||||
OK
|
||||
...............
|
||||
----------------------------------------------------------------------
|
||||
Ran 15 tests in 0.967s
|
||||
|
||||
OK
|
||||
PASS: actual field result/braking observer and Chat dispatch rules; one finite fixed candidate, deferred callback failure and guarded cleanup; no native measurement
|
||||
PASS: actual opt-in terrain audit records one fixed1681-point grid, preserves original survey refusal/success and exact no-allocation scope; malformed heights stop without retry; no native data acquired
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.562s
|
||||
|
||||
OK
|
||||
PASS: actual field PI/ramp/vector caps, antiwindup, braking hypothesis, immutable admission limits and segment bounds; no native physics tested
|
||||
PASS: actual100m whole-field survey sampling/4096cap, rotated coverage, all-node terrain and native trace refusal; original certificate lineage retained; no native qualification
|
||||
PASS: actual QualifyField preserves original identity/footprint/time, orders complete surveys before issuance, and refuses failed stages/moved body/expired or changed world; native boundaries faked
|
||||
PASS: WORKBENCH first-refusal diagnostics preserve ordinary predicates, query order/count/budget and opt-in scope; no native logging run
|
||||
PASS: actual field startup delegation, immutable lease/target, braking/settling/cancel transitions, early abort, callback scope, physical terminal policy and shared landing demand; native boundaries faked
|
||||
PASS: actual inherited airborne pre-CLIMB cancellation enables verified native autohover once, refuses failed enable and never writes after capture
|
||||
PASS: actual Core maintenance/default/tick/stop methods; empty/populated authority, terminal reentry, no tactical resume or new scheduler; native boundaries substituted
|
||||
PASS: actual finite registration, unique claims/tokens, retention/cancel/stop, readiness gating, capture/expiry retirement and bounded cross-kind order history and typed field/route construction; native boundaries faked
|
||||
PASS: actual WORKBENCH route observer returns exact retained route subtype and refuses absent/field controllers
|
||||
.....
|
||||
----------------------------------------------------------------------
|
||||
Ran 5 tests in 0.568s
|
||||
|
||||
OK
|
||||
......................
|
||||
----------------------------------------------------------------------
|
||||
Ran 22 tests in 0.168s
|
||||
|
||||
OK
|
||||
................
|
||||
----------------------------------------------------------------------
|
||||
Ran 16 tests in 9.332s
|
||||
|
||||
OK
|
||||
......
|
||||
----------------------------------------------------------------------
|
||||
Ran 6 tests in 0.019s
|
||||
|
||||
OK
|
||||
PASS: actual production bridge lookup, lease/world/mode/seat/capture guards, no allocation, native super ordering and read-only fixture hooks
|
||||
...............
|
||||
----------------------------------------------------------------------
|
||||
Ran 15 tests in 0.051s
|
||||
|
||||
OK
|
||||
.............
|
||||
----------------------------------------------------------------------
|
||||
Ran 13 tests in 4.381s
|
||||
|
||||
OK
|
||||
PASS: actual route gain/caps/braking, callback selection, old landing/cancellation control and matching read-only telemetry
|
||||
..............................
|
||||
----------------------------------------------------------------------
|
||||
Ran 30 tests in 0.355s
|
||||
|
||||
OK
|
||||
..............
|
||||
----------------------------------------------------------------------
|
||||
Ran 14 tests in 0.210s
|
||||
|
||||
OK
|
||||
.........
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 0.110s
|
||||
|
||||
OK
|
||||
PASS: actual gate observer binds native registered action/context and current life, reads accumulated progress, refuses stale bindings and never revives outside original bounds
|
||||
PASS: actual read-only look observer methods enforce explicit scope, pinned native camera/body/identity, normalized pose, terminal cancellation and original sample/time bounds
|
||||
...........
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 0.066s
|
||||
|
||||
OK
|
||||
.......................
|
||||
----------------------------------------------------------------------
|
||||
Ran 23 tests in 0.031s
|
||||
|
||||
OK
|
||||
PASS: actual initial WAITING task/guide copy, configured duration, unchanged interruption and rounded progress; native task assertion pending
|
||||
........
|
||||
----------------------------------------------------------------------
|
||||
Ran 8 tests in 0.011s
|
||||
|
||||
OK
|
||||
PASS: actual inventory adapter scope, grid placement, sole compatible host, refresh reuse, rollback, foreign hierarchy refusal and exactly-once native delegation; native compatibility pending
|
||||
.................................................................................
|
||||
----------------------------------------------------------------------
|
||||
Ran 81 tests in 0.510s
|
||||
|
||||
OK
|
||||
......
|
||||
----------------------------------------------------------------------
|
||||
Ran 6 tests in 0.069s
|
||||
|
||||
OK
|
||||
.................
|
||||
----------------------------------------------------------------------
|
||||
Ran 17 tests in 0.004s
|
||||
|
||||
OK
|
||||
...........
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 0.073s
|
||||
|
||||
OK
|
||||
.........
|
||||
----------------------------------------------------------------------
|
||||
Ran 9 tests in 0.319s
|
||||
|
||||
OK
|
||||
PASS: actual observer nonce, admission pins, baseline/menu sequencing, snapshots, bounded clocks/samples, cleanup and one-attempt latch; native untested
|
||||
PASS: actual corridor caps/height/hold and whole-rectangle survey bounds, terrain refusal, native trace refusal and exact certificate lineage; native route unqualified
|
||||
PASS: actual route entry, fixed corridor/target, hover hold, cancellation landing freeze, shared lease/capture/deadline gate and unchanged native startup/tick sequence
|
||||
PASS: finite opt-in route fixture, original native input order, meaningful physical-arrival evidence and guarded cleanup; no native launch
|
||||
PASS: actual Chat route step result dispatch and scoped completion/cleanup wiring; six real early-parser refusal paths leave no prefix/profile output
|
||||
PASS: actual retained-service fixture entry, immutable controller/token/deadline/count bindings, observer getter and cleanup ownership ordering; native route validation pending
|
||||
PASS: actual measured cancellation gate, one-shot retained service Stop, no premature drain, immutable lease, fresh real controller readback and separate physical cancellation result policy
|
||||
PASS: actual rough-intel objective selection, exact precedence, source grid dimensions and unchanged other-phase dispatch; native UI pending
|
||||
.................................
|
||||
----------------------------------------------------------------------
|
||||
Ran 33 tests in 0.089s
|
||||
|
||||
OK
|
||||
...............
|
||||
----------------------------------------------------------------------
|
||||
Ran 15 tests in 0.030s
|
||||
|
||||
OK
|
||||
PASS: actual preparation status scope, persistent updates, spinner restoration, placeholder replacement/deletion/destruction, native observation persistence/timeout; rendering remains native-pending
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_preparation_status.py", line 126, in <module>
|
||||
assert 'm_fAutoReloadTime 10' in prefab
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
AssertionError
|
||||
PASS: 48 prefabs have unique saved root entity IDs
|
||||
PASS: 299 original script entries tracked across 18 unfinished responsibilities
|
||||
PASS: 1 isolated addons, acyclic dependencies, 158 unique resources, exact vanilla/authorized external references
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/check.py", line 149, in <module>
|
||||
if __name__=='__main__':check()
|
||||
~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/check.py", line 147, in check
|
||||
subprocess.run([sys.executable,str(ROOT/'tests'/name)],check=True)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/usr/lib/python3.14/subprocess.py", line 578, in run
|
||||
raise CalledProcessError(retcode, process.args,
|
||||
output=stdout, stderr=stderr)
|
||||
subprocess.CalledProcessError: Command '['/usr/bin/python3', '/home/jakub/devel/escapistsrereintroduced/tests/test_preparation_status.py']' returned non-zero exit status 1.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"exit_code": 1,
|
||||
"seconds": 35.18,
|
||||
"input_files": 1229,
|
||||
"changed_inputs": [],
|
||||
"native_run": false,
|
||||
"local_socket_tests_allowed": true
|
||||
}
|
||||
@@ -0,0 +1,184 @@
|
||||
Menu layouts and palette are up to date.
|
||||
.......
|
||||
----------------------------------------------------------------------
|
||||
Ran 7 tests in 0.047s
|
||||
|
||||
OK
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.000s
|
||||
|
||||
OK
|
||||
....../usr/lib/python3.14/tempfile.py:538: ResourceWarning: Implicitly cleaning up <HTTPError 429: 'limited'>
|
||||
_warnings.warn(self.warn_message, ResourceWarning)
|
||||
..........
|
||||
----------------------------------------------------------------------
|
||||
Ran 16 tests in 0.142s
|
||||
|
||||
OK
|
||||
PASS: authoritative kills/deaths, duplicate-event protection, friendly kills, suicide, GM and vehicle exclusions, down/recovery edges, disconnected escapees and terminal gates
|
||||
PASS: production roster reconciliation preserves disconnected names and reconnect counters, refuses connection-ID inheritance, freezes records and bounds retained participants
|
||||
PASS: held/tapped AI horn limits, half-second pulses, 30-second cooldown, clock reset, player/passenger/aircraft/replica exclusion and ended mission cleanup
|
||||
PASS: telemetry outcomes, exactly-once finish, opt-out gate, stale callbacks, HTTP status handling and bounded retry
|
||||
PASS: durable installation credential, restart/endpoint/identity isolation, write failure, corruption, bounded retention and disabled-send gates
|
||||
PASS: running dedicated configuration, automatic server config/lobby name, explicit override, startup absence, rename and payload bound
|
||||
PASS: map/server/mission/event/outcome validation, bounded counters, stale delivery exclusion, current-round refresh and unavailable recovery
|
||||
PASS: deployment init waits for mode, runs once, cancels on deletion/world change and bounds retries; respawn RPC registration stays immediate
|
||||
PASS: native chat retained on both peers, nested ownership detached, absent chat supplied by replicated fallback, authored mission chat preserved
|
||||
PASS: configurable independent restarts, idle clock reset and live setting changes; last disconnect, pending admission/spectator population, five-hour boundary, repeated empty rounds, preparation, authority and duplicate-end guards
|
||||
PASS: faction aircraft profiles provide 12+ cargo capacity; FIA/ION crew comes only from the selected faction
|
||||
PASS: fleet space is required before pickup registration; dispatch rechecks/replaces only the secondary within the original 48-candidate footprint budget
|
||||
Policy-only arrival from 90 m offset / 150 m height at 15 Hz: original 65.60s, rescue 32.20s
|
||||
Policy-only arrival from 90 m offset / 150 m height at 30 Hz: original 65.73s, rescue 32.30s
|
||||
Policy-only arrival from 90 m offset / 150 m height at 60 Hz: original 65.72s, rescue 32.33s
|
||||
Policy-only arrival from 90 m offset / 150 m height at 120 Hz: original 65.72s, rescue 32.33s
|
||||
PASS: faster rescue descent, continuous near-ground braking, alignment gate, unchanged recovery/escort/default profile, and bounded settling at 15/30/60/120 Hz
|
||||
PASS: split-fleet boarding, escort rejection, lost transport failure and both transports airborne for thirty seconds
|
||||
PASS: actual nearest usable registered-fleet selection, patient reservation priority, independent ranges, audited benches/skids and captured-aircraft handshake guards
|
||||
PASS: production Cessna boarding requires exact observed occupancy, activates before requesting, caps retries at three with 5s spacing, and preserves transition, ownership, health and seat restrictions; engine behavior is faked
|
||||
PASS: traffic distance/grace, all-observer veto, player claims, foreign custody, bounded spawn cadence, failure/stall retention and shutdown preserve nearby/claimed entities
|
||||
PASS: actual observer collection includes spectator targets and controlled bodies; missing views/controllers and open editor cameras veto spawn/cleanup
|
||||
PASS: civilian traffic defaults to three; menu command resolves to persisted 0..6 setting with zero disabling new cars
|
||||
PASS: bounded exit-road selection can turn along a coastline when the opposite road is unavailable; no-route case is withheld
|
||||
PASS: managed traffic pins both native garbage entries; release/retirement removes only those pins, including partial creation
|
||||
PASS: native garage families only; rubble/furniture/military garages rejected; oversized and invalid vehicle bounds rejected
|
||||
PASS: bodies and spectator targets are collected; unknown, nonfinite and editor views veto spawning/cleanup; no connected players yields an empty known view
|
||||
PASS: permanent entry/movement/occupancy claims; far hidden grace cleanup; proximity/visibility/unknown-view resets; one staged operation per update, no same-frame catch-up, stop and client guards
|
||||
PASS: saved garage menu settings configure the round once; unit conversion and cleanup radius scale correctly; count/chance zero disable startup; clients and stopped rounds do no work
|
||||
PASS: exhausted/blocked opening keeps configured radius; distant objective fallback rejected; bounds, player clearance, separation, force cap and retry delay retained
|
||||
PASS: separated rear vehicle approaches, opposite infantry sectors, radio-gated ownership, failed-order preservation, visual cover or bounded supported reconnaissance, bounded dismount/search/regroup and loss cleanup
|
||||
PASS: production dismount/boarding allocation, all crew allowances, waypoint ownership, one-time vehicle detach/restore and capture/teardown guards
|
||||
PASS: covering support requires the original conscious turret gunner, valid mounted driver, live crew and delivered assignment
|
||||
PASS: alternate positions exclude failed and occupied stages, roll back on failed planning/allocation, and preserve the total time budget
|
||||
PASS: blocked crew deadline survives combat interruptions, defers unsafe exits, resets after recovery; failed stages survive assignments with bounded expiry
|
||||
PASS: native-callback cleanup, bounded retries and budget, pending quarantine, objective/ownership/lifecycle protection, no evidence retirement or forced entity deletion
|
||||
PASS: radio intel boundary, exclusions, preparation cap, next-round configuration, sticky unlock, redirection/evidence, fixed retention, automatic recovery and lifecycle guards
|
||||
PASS: actual terrain refusal reasons, counted summaries, site/attempt/time context, 30-second rate limit and per-site reset
|
||||
PASS: actual low/negative dry terrain, height-correct shallow/lake/ocean/interior water refusal and downstream startup dry-ground gates
|
||||
PASS: failure-only menu, repeated-frame/dialog focus, pause fallback, exact error, Esc routing, single local exit, stale/recovered mode guards and listener cleanup; native rendering unverified
|
||||
PASS: only original fit loaded healthy uncaptured gunners stay mounted; driver can leave; infantry readiness excludes the retained gunner but regroup requires all survivors
|
||||
PASS: actual HQ allocator selects reachable reports, distinct cover/flanks, simultaneous fronts, bounded reservations and failed-radio/placement rollback
|
||||
PASS: shared own-force attack spacing, own-group refresh, exact release, expiry/deletion, finite capacity and fresh confirmed sighting-only flank permission
|
||||
PASS: actual convoy foot transport detachment is idempotent; regroup restores only its live friendly uncaptured original truck
|
||||
PASS: opposing native flank orders are transactional; arrived teams sweep twice, travelling/boarding teams retain orders, failed redirects retry and replayed contacts are ignored
|
||||
PASS: expired-report approach, arrival-only search, completion, newer/older/replayed reports, visual priority, interrupted search and bounded travel
|
||||
PASS: drone cooldown, capacity, freshness, replay, bounded retries, round cap, stop, optional API and radio boundaries
|
||||
PASS: production camera cone/range rejects behind-camera and distant actors; control directions, damping and limits
|
||||
PASS: production drone radio queue rejects wrong phase/authority/group, busy or unconscious radios and absent routes; snapshots only eligible observations
|
||||
PASS: target equipment counts as character contact; unrelated blockers and cyclic hierarchies stay blocked
|
||||
PASS: burial requires a conscious current player, actual held shovel, dead nearby unobstructed corpse and no vehicle; authority and duplicate deletion guards preserve player/tool
|
||||
PASS: nearest reported idle team, blocked teams, guards, active/pending orders, combat, radio routes, stale status and distance limit
|
||||
PASS: six editor listeners transferred idempotently, unrelated handlers retained, authority guard and lifecycle ordering
|
||||
PASS: takeover reconnect creates only missing managers, restores native roles, never grants non-admin access, skips stale/disconnected/client states
|
||||
PASS: Game Master button becomes enabled on native permission arrival and disabled on revocation; no permission bypass
|
||||
PASS: native creation called once per editor; pending/duplicate ownership waits, host works, retry is bounded and stale-world callbacks cannot create editors
|
||||
PASS: catalog-independent cleanup removes original subscriptions once, handles never-initialized/preload items, preserves live validation and opted-out/editor behavior
|
||||
PASS: shared config transaction rejects client writes, preserves first-save/prior/fallback state across open, write, backup, partial-copy, readback and mismatch failures
|
||||
PASS: actual Save/Commit preserves semantically valid backup across unrelated menu edits and repairs; unknown fields/default sections retained; actual terrain parser; other parsers, catalog and disk doubled
|
||||
.....TTS request rejected: authentication failed (403)
|
||||
TTS request completed (200)
|
||||
....TTS request completed (200)
|
||||
TTS request completed (200)
|
||||
..
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 1.068s
|
||||
|
||||
OK
|
||||
PASS: all 37 fixed messages have validated exact audio, native graph identities and source-bundle inclusion
|
||||
PASS: production incremental decoder preserves binary data, bounds each slice, yields on elapsed time and rejects malformed or oversized payloads
|
||||
PASS: production speech transfer checks order, exact part sizes and stable bounded totals without changing audio
|
||||
PASS: production client callbacks only queue; shared updates prepare one bounded slice, preserve bytes, handle file failures and cancel safely before playback
|
||||
PASS: production soldier timeout preserves queued/completed preparation, expires stalled requests and removes stopped graphs only once
|
||||
PASS: actual welcome tick waits for URL/readiness/server permit, preserves local once-only state across worlds and refuses stopped callbacks
|
||||
PASS: account greeting survives client/controller/round changes; owner validation, delayed readiness, idempotent retry, stale replies and bounded ledger
|
||||
PASS: original body/equipment retained past old timeout; expiry, death, canonical account/body, occupied controller, failed handoff, missing/dead/expired body replacement and extraction/duplicate-audit guards
|
||||
frame_ms=33.3333 buffered_step_variation=0.0336441 baseline=1.32469
|
||||
frame_ms=16.6667 buffered_step_variation=0.0660537 baseline=0.822226
|
||||
frame_ms=6.94444 buffered_step_variation=0.0253502 baseline=0.427864
|
||||
PASS: actual view buffer validates samples, follows position/roll/FOV, rejects stale/foreign/reordered data, buffers jitter without drift, bounds memory and expires gaps
|
||||
PASS: actual relay rejects noncanonical sources, live/foreign/stale viewers, invalid/replayed/fast packets; bounds leases and owner-only target delivery
|
||||
PASS: production scope sampling preserves ordinary views, selects active ADS only, carries zoom/zeroing/illumination and rejects mismatched/unstreamed optics; native APIs doubled
|
||||
PASS: native head/helmet fade is local, target-scoped, restored on exit/switch and does not overwrite a later camera owner
|
||||
PASS: actual orbit branch rotates and zooms without a target; anchor tracking, bounds, collision and menu gating; corpse/vehicle orbit and living player-view fallback preserved
|
||||
PASS: production TTS settings/test/enable/failure/disable/timeout flows preserve fallback, secrets, authorization, saved state and late-callback cancellation
|
||||
PASS: TTS admin authorization, limits, case preservation and menu control contract
|
||||
PASS: actual atlas preparation shows disclosed markers on overview, regional and detail sheets; cover hidden; overlay matches map rectangle above print for square/wide/tall terrains
|
||||
PASS: actual objective overlay lifecycle preserves separate ownership, late readiness/reopen, data refresh, pan/zoom/culling, supported sibling/shared-frame parents, coordinate offsets, native task-clear isolation and terminal cleanup; native rendering remains unverified
|
||||
PASS: actual map element initializes each widget, retries missing widgets, updates position and changes only stale text/icon data; no native image-load claim
|
||||
PASS: all atlas identifiers, including the quoted question mark, match the generator
|
||||
PASS: actual native fixture root/config ownership and idempotent cleanup preserve foreign map, selector excludes ordinary route, fixed budgets/screenshots/UGC boundaries retained; native operations not executed
|
||||
PASS: actual full Inspect rejects canvas parenting, wrong active container/canvas, omitted origin offset, wrong rendered box and stale coordinates; differing origins and DPI accepted
|
||||
PASS: actual long-warning phases retain visible label through1500ms checkpoint then restore radio before close; synthetic marker separated from unmoved player
|
||||
PASS: actual Center keeps marker offset within large and small native viewports at both fixture zooms without altering disclosed coordinates
|
||||
PASS: missing, child-only, malformed, zero and duplicate prefab root IDs rejected
|
||||
PASS: delayed scene/inventory arrival, deferred preload, identity checks, stale replies, timeout and observer cleanup
|
||||
PASS: loading protection restores only its own damage change, rejects invalid admission actors, and tolerates repeat/deleted cleanup
|
||||
PASS: actual inventory manifest, delayed/missing/wrong-owner item links, finite cap, consumed-stock refresh and preload ordering
|
||||
PASS: spawn scene remains held through final acknowledgement and nearby use; leaving, reassignment, disconnect and teardown release it
|
||||
PASS: production prison AI hold/release, repeat activation, authority/faction/player exclusion, dead actor and stop cleanup
|
||||
PASS: actual protected/capped damage plus exact-actor terminal fixture bypass through delayed native damage, fail-closed ownership and untouched ordinary actor; no native claim
|
||||
PASS: actual full planner selection/commit body, 360 equivalence scenarios, orders/reservations/cooldowns identical; one128-unit scan vs >10000 repeated unit visits; no FPS claim
|
||||
/tmp/err-policy-47tb2b7p/check.cpp: In member function ‘void Controller::ERR_UpdateObserverClient()’:
|
||||
/tmp/err-policy-47tb2b7p/check.cpp:99:21: error: ‘GetTickCount’ is not a member of ‘System’
|
||||
99 | int now = System::GetTickCount();
|
||||
| ^~~~~~~~~~~~
|
||||
/tmp/err-policy-47tb2b7p/check.cpp:103:7: error: ‘m_ERRPendingRecoveryStatus’ was not declared in this scope; did you mean ‘m_ERRShownRecoveryStatus’?
|
||||
103 | if (m_ERRPendingRecoveryStatus != recovery || now < m_ERRRecoveryStatusSince)
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
| m_ERRShownRecoveryStatus
|
||||
/tmp/err-policy-47tb2b7p/check.cpp:103:55: error: ‘m_ERRRecoveryStatusSince’ was not declared in this scope; did you mean ‘m_ERRRecoveryDeadline’?
|
||||
103 | if (m_ERRPendingRecoveryStatus != recovery || now < m_ERRRecoveryStatusSince)
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~
|
||||
| m_ERRRecoveryDeadline
|
||||
/tmp/err-policy-47tb2b7p/check.cpp:108:72: error: ‘m_ERRRecoveryStatusSince’ was not declared in this scope; did you mean ‘m_ERRRecoveryDeadline’?
|
||||
108 | if (!contextChanged && m_ERRShownRecoveryStatus != recovery && now - m_ERRRecoveryStatusSince < 3000) return;
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~
|
||||
| m_ERRRecoveryDeadline
|
||||
/tmp/err-policy-47tb2b7p/check.cpp:115:26: error: no matching function for call to ‘SCR_HintManagerComponent::ShowCustom(string&, const char [11], int, bool&)’
|
||||
115 | if (!hints->ShowCustom(message, "Spectating", 12, m_ERRObserverReady)) return;
|
||||
| ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
• there is 1 candidate
|
||||
• candidate 1: ‘bool SCR_HintManagerComponent::ShowCustom(string, string, int)’
|
||||
/tmp/err-policy-47tb2b7p/check.cpp:26:144:
|
||||
26 | struct SCR_HintManagerComponent{int attempts=0;static SCR_HintManagerComponent*GetInstance(){static SCR_HintManagerComponent h;return &h;}bool ShowCustom(string,string,int){attempts++;return true;}};
|
||||
| ^~~~~~~~~~
|
||||
• candidate expects 3 arguments, 4 provided
|
||||
/tmp/err-policy-47tb2b7p/check.cpp: In member function ‘void Controller::ERR_CloseObserverCamera()’:
|
||||
/tmp/err-policy-47tb2b7p/check.cpp:149:3: error: ‘m_ERRPendingRecoveryStatus’ was not declared in this scope; did you mean ‘m_ERRShownRecoveryStatus’?
|
||||
149 | m_ERRPendingRecoveryStatus = "";
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
| m_ERRShownRecoveryStatus
|
||||
/tmp/err-policy-47tb2b7p/check.cpp:150:3: error: ‘m_ERRRecoveryStatusSince’ was not declared in this scope; did you mean ‘m_ERRRecoveryDeadline’?
|
||||
150 | m_ERRRecoveryStatusSince = 0;
|
||||
| ^~~~~~~~~~~~~~~~~~~~~~~~
|
||||
| m_ERRRecoveryDeadline
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_observer_ownership.py", line 23, in <module>
|
||||
run(r'''#include <cassert>
|
||||
~~~^^^^^^^^^^^^^^^^^^^^^^^
|
||||
#include <set>
|
||||
^^^^^^^^^^^^^^
|
||||
...<120 lines>...
|
||||
}
|
||||
^
|
||||
''')
|
||||
^^^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/policy_harness.py", line 13, in run
|
||||
subprocess.run(['g++','-std=c++17','-Wall','-Werror',str(p/'check.cpp'),'-o',str(p/'check')],check=True)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/usr/lib/python3.14/subprocess.py", line 578, in run
|
||||
raise CalledProcessError(retcode, process.args,
|
||||
output=stdout, stderr=stderr)
|
||||
subprocess.CalledProcessError: Command '['g++', '-std=c++17', '-Wall', '-Werror', '/tmp/err-policy-47tb2b7p/check.cpp', '-o', '/tmp/err-policy-47tb2b7p/check']' returned non-zero exit status 1.
|
||||
PASS: 48 prefabs have unique saved root entity IDs
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/check.py", line 149, in <module>
|
||||
if __name__=='__main__':check()
|
||||
~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/check.py", line 79, in check
|
||||
subprocess.run([sys.executable,str(ROOT/'tests/test_observer_ownership.py')],check=True)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/usr/lib/python3.14/subprocess.py", line 578, in run
|
||||
raise CalledProcessError(retcode, process.args,
|
||||
output=stdout, stderr=stderr)
|
||||
subprocess.CalledProcessError: Command '['/usr/bin/python3', '/home/jakub/devel/escapistsrereintroduced/tests/test_observer_ownership.py']' returned non-zero exit status 1.
|
||||
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"exit_code": 1,
|
||||
"seconds": 22.06,
|
||||
"input_files": 1229,
|
||||
"changed_inputs": [],
|
||||
"native_run": false
|
||||
}
|
||||
@@ -0,0 +1,127 @@
|
||||
Menu layouts and palette are up to date.
|
||||
.......
|
||||
----------------------------------------------------------------------
|
||||
Ran 7 tests in 0.052s
|
||||
|
||||
OK
|
||||
....
|
||||
----------------------------------------------------------------------
|
||||
Ran 4 tests in 0.001s
|
||||
|
||||
OK
|
||||
....../usr/lib/python3.14/tempfile.py:538: ResourceWarning: Implicitly cleaning up <HTTPError 429: 'limited'>
|
||||
_warnings.warn(self.warn_message, ResourceWarning)
|
||||
..........
|
||||
----------------------------------------------------------------------
|
||||
Ran 16 tests in 0.134s
|
||||
|
||||
OK
|
||||
PASS: authoritative kills/deaths, duplicate-event protection, friendly kills, suicide, GM and vehicle exclusions, down/recovery edges, disconnected escapees and terminal gates
|
||||
PASS: production roster reconciliation preserves disconnected names and reconnect counters, refuses connection-ID inheritance, freezes records and bounds retained participants
|
||||
PASS: held/tapped AI horn limits, half-second pulses, 30-second cooldown, clock reset, player/passenger/aircraft/replica exclusion and ended mission cleanup
|
||||
PASS: telemetry outcomes, exactly-once finish, opt-out gate, stale callbacks, HTTP status handling and bounded retry
|
||||
PASS: durable installation credential, restart/endpoint/identity isolation, write failure, corruption, bounded retention and disabled-send gates
|
||||
PASS: running dedicated configuration, automatic server config/lobby name, explicit override, startup absence, rename and payload bound
|
||||
PASS: map/server/mission/event/outcome validation, bounded counters, stale delivery exclusion, current-round refresh and unavailable recovery
|
||||
PASS: deployment init waits for mode, runs once, cancels on deletion/world change and bounds retries; respawn RPC registration stays immediate
|
||||
PASS: native chat retained on both peers, nested ownership detached, absent chat supplied by replicated fallback, authored mission chat preserved
|
||||
PASS: configurable independent restarts, idle clock reset and live setting changes; last disconnect, pending admission/spectator population, five-hour boundary, repeated empty rounds, preparation, authority and duplicate-end guards
|
||||
PASS: faction aircraft profiles provide 12+ cargo capacity; FIA/ION crew comes only from the selected faction
|
||||
PASS: fleet space is required before pickup registration; dispatch rechecks/replaces only the secondary within the original 48-candidate footprint budget
|
||||
Policy-only arrival from 90 m offset / 150 m height at 15 Hz: original 65.60s, rescue 32.20s
|
||||
Policy-only arrival from 90 m offset / 150 m height at 30 Hz: original 65.73s, rescue 32.30s
|
||||
Policy-only arrival from 90 m offset / 150 m height at 60 Hz: original 65.72s, rescue 32.33s
|
||||
Policy-only arrival from 90 m offset / 150 m height at 120 Hz: original 65.72s, rescue 32.33s
|
||||
PASS: faster rescue descent, continuous near-ground braking, alignment gate, unchanged recovery/escort/default profile, and bounded settling at 15/30/60/120 Hz
|
||||
PASS: split-fleet boarding, escort rejection, lost transport failure and both transports airborne for thirty seconds
|
||||
PASS: actual nearest usable registered-fleet selection, patient reservation priority, independent ranges, audited benches/skids and captured-aircraft handshake guards
|
||||
PASS: production Cessna boarding requires exact observed occupancy, activates before requesting, caps retries at three with 5s spacing, and preserves transition, ownership, health and seat restrictions; engine behavior is faked
|
||||
PASS: traffic distance/grace, all-observer veto, player claims, foreign custody, bounded spawn cadence, failure/stall retention and shutdown preserve nearby/claimed entities
|
||||
PASS: actual observer collection includes spectator targets and controlled bodies; missing views/controllers and open editor cameras veto spawn/cleanup
|
||||
PASS: civilian traffic defaults to three; menu command resolves to persisted 0..6 setting with zero disabling new cars
|
||||
PASS: bounded exit-road selection can turn along a coastline when the opposite road is unavailable; no-route case is withheld
|
||||
PASS: managed traffic pins both native garbage entries; release/retirement removes only those pins, including partial creation
|
||||
PASS: native garage families only; rubble/furniture/military garages rejected; oversized and invalid vehicle bounds rejected
|
||||
PASS: bodies and spectator targets are collected; unknown, nonfinite and editor views veto spawning/cleanup; no connected players yields an empty known view
|
||||
PASS: permanent entry/movement/occupancy claims; far hidden grace cleanup; proximity/visibility/unknown-view resets; one staged operation per update, no same-frame catch-up, stop and client guards
|
||||
PASS: saved garage menu settings configure the round once; unit conversion and cleanup radius scale correctly; count/chance zero disable startup; clients and stopped rounds do no work
|
||||
PASS: exhausted/blocked opening keeps configured radius; distant objective fallback rejected; bounds, player clearance, separation, force cap and retry delay retained
|
||||
PASS: separated rear vehicle approaches, opposite infantry sectors, radio-gated ownership, failed-order preservation, visual cover or bounded supported reconnaissance, bounded dismount/search/regroup and loss cleanup
|
||||
PASS: production dismount/boarding allocation, all crew allowances, waypoint ownership, one-time vehicle detach/restore and capture/teardown guards
|
||||
PASS: covering support requires the original conscious turret gunner, valid mounted driver, live crew and delivered assignment
|
||||
PASS: alternate positions exclude failed and occupied stages, roll back on failed planning/allocation, and preserve the total time budget
|
||||
PASS: blocked crew deadline survives combat interruptions, defers unsafe exits, resets after recovery; failed stages survive assignments with bounded expiry
|
||||
PASS: native-callback cleanup, bounded retries and budget, pending quarantine, objective/ownership/lifecycle protection, no evidence retirement or forced entity deletion
|
||||
PASS: radio intel boundary, exclusions, preparation cap, next-round configuration, sticky unlock, redirection/evidence, fixed retention, automatic recovery and lifecycle guards
|
||||
PASS: actual terrain refusal reasons, counted summaries, site/attempt/time context, 30-second rate limit and per-site reset
|
||||
PASS: actual low/negative dry terrain, height-correct shallow/lake/ocean/interior water refusal and downstream startup dry-ground gates
|
||||
PASS: failure-only menu, repeated-frame/dialog focus, pause fallback, exact error, Esc routing, single local exit, stale/recovered mode guards and listener cleanup; native rendering unverified
|
||||
PASS: only original fit loaded healthy uncaptured gunners stay mounted; driver can leave; infantry readiness excludes the retained gunner but regroup requires all survivors
|
||||
PASS: actual HQ allocator selects reachable reports, distinct cover/flanks, simultaneous fronts, bounded reservations and failed-radio/placement rollback
|
||||
PASS: shared own-force attack spacing, own-group refresh, exact release, expiry/deletion, finite capacity and fresh confirmed sighting-only flank permission
|
||||
PASS: actual convoy foot transport detachment is idempotent; regroup restores only its live friendly uncaptured original truck
|
||||
PASS: opposing native flank orders are transactional; arrived teams sweep twice, travelling/boarding teams retain orders, failed redirects retry and replayed contacts are ignored
|
||||
PASS: expired-report approach, arrival-only search, completion, newer/older/replayed reports, visual priority, interrupted search and bounded travel
|
||||
PASS: drone cooldown, capacity, freshness, replay, bounded retries, round cap, stop, optional API and radio boundaries
|
||||
PASS: production camera cone/range rejects behind-camera and distant actors; control directions, damping and limits
|
||||
PASS: production drone radio queue rejects wrong phase/authority/group, busy or unconscious radios and absent routes; snapshots only eligible observations
|
||||
PASS: target equipment counts as character contact; unrelated blockers and cyclic hierarchies stay blocked
|
||||
PASS: burial requires a conscious current player, actual held shovel, dead nearby unobstructed corpse and no vehicle; authority and duplicate deletion guards preserve player/tool
|
||||
PASS: nearest reported idle team, blocked teams, guards, active/pending orders, combat, radio routes, stale status and distance limit
|
||||
PASS: six editor listeners transferred idempotently, unrelated handlers retained, authority guard and lifecycle ordering
|
||||
PASS: takeover reconnect creates only missing managers, restores native roles, never grants non-admin access, skips stale/disconnected/client states
|
||||
PASS: Game Master button becomes enabled on native permission arrival and disabled on revocation; no permission bypass
|
||||
PASS: native creation called once per editor; pending/duplicate ownership waits, host works, retry is bounded and stale-world callbacks cannot create editors
|
||||
PASS: catalog-independent cleanup removes original subscriptions once, handles never-initialized/preload items, preserves live validation and opted-out/editor behavior
|
||||
PASS: shared config transaction rejects client writes, preserves first-save/prior/fallback state across open, write, backup, partial-copy, readback and mismatch failures
|
||||
PASS: actual Save/Commit preserves semantically valid backup across unrelated menu edits and repairs; unknown fields/default sections retained; actual terrain parser; other parsers, catalog and disk doubled
|
||||
.....TTS request rejected: authentication failed (403)
|
||||
TTS request completed (200)
|
||||
.E..E.
|
||||
======================================================================
|
||||
ERROR: test_large_cached_audio_downloads_in_bounded_parts (__main__.WelcomeTests.test_large_cached_audio_downloads_in_bounded_parts)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_welcome_voice.py", line 108, in test_large_cached_audio_downloads_in_bounded_parts
|
||||
server = tool.ThreadingHTTPServer(('127.0.0.1', 0), tool.handler_for(audio, cache))
|
||||
File "/usr/lib/python3.14/socketserver.py", line 453, in __init__
|
||||
self.socket = socket.socket(self.address_family,
|
||||
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
|
||||
self.socket_type)
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/usr/lib/python3.14/socket.py", line 236, in __init__
|
||||
_socket.socket.__init__(self, family, type, proto, fileno)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
PermissionError: [Errno 1] Operation not permitted
|
||||
|
||||
======================================================================
|
||||
ERROR: test_real_chunked_http_generation_and_playback (__main__.WelcomeTests.test_real_chunked_http_generation_and_playback)
|
||||
----------------------------------------------------------------------
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tests/test_welcome_voice.py", line 180, in test_real_chunked_http_generation_and_playback
|
||||
server = tool.ThreadingHTTPServer(('127.0.0.1', 0), tool.handler_for(clip(), cache))
|
||||
File "/usr/lib/python3.14/socketserver.py", line 453, in __init__
|
||||
self.socket = socket.socket(self.address_family,
|
||||
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
|
||||
self.socket_type)
|
||||
^^^^^^^^^^^^^^^^^
|
||||
File "/usr/lib/python3.14/socket.py", line 236, in __init__
|
||||
_socket.socket.__init__(self, family, type, proto, fileno)
|
||||
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
PermissionError: [Errno 1] Operation not permitted
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Ran 11 tests in 0.014s
|
||||
|
||||
FAILED (errors=2)
|
||||
Traceback (most recent call last):
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/check.py", line 149, in <module>
|
||||
if __name__=='__main__':check()
|
||||
~~~~~^^
|
||||
File "/home/jakub/devel/escapistsrereintroduced/tools/check.py", line 53, in check
|
||||
subprocess.run([sys.executable,str(ROOT/'tests/test_welcome_voice.py')],check=True)
|
||||
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/usr/lib/python3.14/subprocess.py", line 578, in run
|
||||
raise CalledProcessError(retcode, process.args,
|
||||
output=stdout, stderr=stderr)
|
||||
subprocess.CalledProcessError: Command '['/usr/bin/python3', '/home/jakub/devel/escapistsrereintroduced/tests/test_welcome_voice.py']' returned non-zero exit status 1.
|
||||
@@ -0,0 +1 @@
|
||||
PASS: native-callback cleanup, bounded retries and budget, pending quarantine, objective/ownership/lifecycle protection, no evidence retirement or forced entity deletion
|
||||
@@ -0,0 +1 @@
|
||||
PASS: production Intel feedback coalescing, rough secrecy, rate limit, bounded dedupe, local/remote delivery and round cleanup; native UI/RPC not exercised
|
||||
@@ -0,0 +1 @@
|
||||
PASS: radio intel boundary, exclusions, preparation cap, next-round configuration, sticky unlock, redirection/evidence, fixed retention, automatic recovery and lifecycle guards
|
||||
Reference in New Issue
Block a user